Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Novata con los Componentes IBX: IBDATASET

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Novata con los Componentes IBX: IBDATASET Responder citando

Tengo un problema y es que el cambio de chip para los componentes de interbase que utilizo para Firebird me parece que me varían bastante con respecto a lo que antes utilizaba de BDE.

El problema es que no encuentro donde tengo que modificar para que un IBDATASET sea editable ya que resulta que me sale

Read only dataset cannot modify

esto cuando quiero editar un campo.

Igualmente, me pasaba con IBQUERY pero ya he visto que solamente sirve para traer datos de sólo lectura y no es el componente que me puede sustituir al Query que tenia del BDE por lo que opto segun me aconsejais por IBDATASET.

La propiedad RequestLive que yo utilizaba anteriormente en los Query no la localizo en ninguna propiedad de IBDATASET.

Por otro lado, yo utilizaba el FindFirst(); FindNext(); que en Firebird no funciona como ya me habeis respondido pero entonces debo sustituir por LOCATE pero tengo un problema y es que se me coloca en el primer registro que encuentro pero ¿si quiero ver el siguiente que cumpla con la condición?

Otra duda que me surge es qué componentes existen para que la consulta se ejecute solo en el servidor por ejemplo para un listado de quickreport y que de esta manera vaya más rápido, yo pensaba que los IBQuery pero creo que estoy equivocada.

Gracias.
_________________
Asun
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Re: Novata con los Componentes IBX: IBDATASET Responder citando

SumSum escribió:

El problema es que no encuentro donde tengo que modificar para que un IBDATASET sea editable ya que resulta que me sale

Read only dataset cannot modify



debes verificar el modo de conexion del ibdDataSet, dentro de la opcion de busqueda puedes encontrar muchos ejemplos sobre transacciones

para que el ibdataset funcione correctamente, a parte de la sentencia SelectSQL tambien deben estar contempladas las de InsertSQL, UpdateSQL, RefreshSQL y DeleteSQL, todas ellas se acceden presionando el boton secundario del mouse sobre el componente IBDataSet

asi mismo los lugares donde debes presionar son los siguientes
Edit SQL - opcion para determinar la tabla a la que te conectas
DataSet Editor... opcion para generar de manera automatica los datos arriba mencionandos

SumSum escribió:
Por otro lado, yo utilizaba el FindFirst(); FindNext(); que en Firebird no funciona como ya me habeis respondido pero entonces debo sustituir por LOCATE pero tengo un problema y es que se me coloca en el primer registro que encuentro pero ¿si quiero ver el siguiente que cumpla con la condición?


usa la opcion STARTING WITH de firebird, para traer en un DATASET los registros que cumplan la condicion.


SumSum escribió:
Otra duda que me surge es qué componentes existen para que la consulta se ejecute solo en el servidor por ejemplo para un listado de quickreport y que de esta manera vaya más rápido, yo pensaba que los IBQuery pero creo que estoy equivocada.

Gracias.


para ello puedes usar triggers y/o procedures dentro del motor de firebird, para realizar estas operaciones...

usa la opcion buscar y ahi he dejado mucha informacion sobre procedures triggers GEN_ID etc etc

no pongo el enlace por que hoy ha siedo el unico dia que he podido entrar al foro, en los demas me sale un mensaje de error, por ello te envie un correo electronio para que pueda ayudarte, si no puedo seguir entrando en el foro.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Nuevamente, gracias por tu respuesta.

Tengo poco tiempo para cambiar a Firebird así que al final y al menos de momento cambié y pasé a utilizar TIBClientDataSet que creí que lo entendería mejor y de hecho me funciona muy bien con las funciones que tenía con los filtros pero vuelvo a estar atascada.... Confused y no sé bien por qué ya que con los siguientes comandos no me funcionan los Params:

TSQL="SELECT * FROM ENTRADA WHERE FRAPROVEE=0 AND ALTA='N' AND CODPROVEE>=:DESPRO AND CODPROVEE<=:HASPRO AND ALBARAN>=:DESALB AND ALBARAN<=:HASALB AND FECHA>=:DESFE AND FECHA<=:HASFE ORDER BY ALBARAN";

Datos->QALBREC->Close();
Datos->QALBREC->CommandText=TSQL;
Datos->QALBREC->Open();

Datos->QALBREC->Params->ParamByName("DESPRO")->AsInteger=StrToInt(DESPRO->Text);
Datos->QALBREC->Params->ParamByName("HASPRO")->AsInteger=StrToInt(HASPRO->Text);
Datos->QALBREC->Params->ParamByName("DESALB")->AsInteger=StrToInt(DESALB->Text);
Datos->QALBREC->Params->ParamByName("HASALB")->AsInteger=StrToInt(HASALB->Text);
Datos->QALBREC->Params->ParamByName("DESFE")->AsDateTime=StrToDate(DESFE->Text);
Datos->QALBREC->Params->ParamByName("HASFE")->AsDateTime=StrToDate(HASFE->Text);

Datos->QALBREC->Open();

Esto es que primero tengo que cerrar el IBClientDataSet para cambiar el CommandText y luego lo tengo que abrir para establecer los Params porque si no me salta un error de que no encuentra el parametro así que lo tengo que abrir y despues de decir cuales son los Params que quiero vuelvo a abrir pero para mi sorpresa no me respeta los límites y es más he comprobado que si vuelvo a ejecutar las sentencias me abre los datos con los parametros de la anterior ejecución. Shocked

He probado con FetchParams() antes de decirle qué Params quiero pero me salta igualmente un error.

Si no utilizo Params todo va bien es decir si hago algo como

TSQL="SELECT * FROM ENTRADA WHERE CODPROVEE>="+DESPRO;
Datos->QALBREC->Close();
Datos->QALBREC->CommandText=TSQL;
Datos->QALBREC->Open();

pero con esta forma de llamar a los datos si lo que quiero es delimitar por fechas... error
_________________
Asun
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

Yo trabajo practicamente solo con IbClientDataSets y no tengo problemas con los parámetros Rolling Eyes

Te recomiendo que no estes cambiando el sql de forma dinamica, ingresalo desde el inspector de objetos y define ahi el "tipo" de cada parámetro

Cuando necesites cambiar el valor de los parámetros solo cierras el clientdataset das los nuevos valores a los parámetros y lo vuelves a abrir

Ahora si en tu ventana debes "ver" un SQL u otro segun alguna condición por cada sql pon un clientadatset y para alternar la visulaización entre uno u el otro solo cambia la conexión en el objeto datasource, por ejemplo

Código:

if( cds )
  cds->Close();

if( condicion)
  cds = cdsVentasCredito;
else
  cds = cdsVentasContado;
DataSource1->DataSet = cds;
//Asumo que los dos clientadases tienen los mismos parámetros
cds->Params->ParamByName("DESPRO")->AsInteger=StrToInt(DESPRO->Text);
cds->Params->ParamByName("HASPRO")->AsInteger=StrToInt(HASPRO->Text);
cds->Open();
//Para grabar
cds->Post();
cds->ApplyUpdates(0);
//cds es un puntero del tipo TIbClientDataSet

Revisa esta enlace, puede servirte
https://cppbuilder.es/viewtopic.php?t=8480&highlight=

En el caso de escribir directamente fechas como parámetros debe ser de esta forma:
Fecha = 'mes/dia/año' osea
TSQL="SELECT * FROM ENTRADA WHERE CODPROVEE>="+DESPRO + " and FECHA = '" +
StrToDate(DESFE->Text).FormatString("mm/dd/yyyy") + "'";

En el enlace de más arriba hay una clase que he diseñado llamada TSQL puede ayudarte muchisimo Razz
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bien a veces me agrada teclear algo de codigo, por que siento que es mas facil de entender, dices que tienes problemas en abrir y cerrar un data set, bien pues efectivamente, asi es debe abrirse y cerrarse la tabla (<-- mal dicho, je je se dice consulta SQL), para que la consulta SQL tenga los valores requeridos, mira el siguiente metodo es llamado cada vez que el usuario teclea algo dentro de un Edit

Código:
void __fastcall TCCSGSeleccion::BuscarBase(AnsiString Cadena)
{
        AnsiString pEd = Cadena.Trim().UpperCase();
    // 1.- cerramos el dataset
    this->TablaBusqueda->Close();
        //2.- "Despreparo" la consulta je je
        //3.- Limpio la Sentencia SelectSQL para tener los datos previo
        //    almacenamiento de la Sentencia SelectSQL en un TStringList
        //    llamado Lineas
        this->TablaBusqueda->UnPrepare();
        this->TablaBusqueda->SelectSQL->Clear();
        //4.- Agrego la consulta guardada
        this->TablaBusqueda->SelectSQL->AddStrings(this->Lineas);
        // 5.- verifico el contendio para asignar los parametros
        // 6.- inserto un parametro de nombre :pdatos

        if(this->Lineas->Count>1)
            this->TablaBusqueda->SelectSQL->Add("and "+this->pF->Strings[this->Numero_Campo].Trim()+" STARTING WITH :pDatos");
        else
            this->TablaBusqueda->SelectSQL->Add("Where "+this->pF->Strings[this->Numero_Campo].Trim()+" STARTING WITH :pDatos");
        //  7.- agrego una clausua "Order By alguncampo" para que se ordene por ese campo
        this->TablaBusqueda->SelectSQL->Add("Order BY "+this->pF->Strings[this->Numero_Campo].Trim());
        //  8.- establezco el valor del parametro en la linea de abajo
        this->TablaBusqueda->Params->ByName("pDatos")->Value = pEd;
        //  9.- "Preparo" de nuevo la consulta
        this->TablaBusqueda->Prepare();
        // 10.- abro de nuevo el IBDataSet.
    this->TablaBusqueda->Open();
}


el resultado que obtengo lo muestro en un DBGrid de la siguiente manera

Cita:
DBGrid <-- DataSource <-- TablaBusqueda

traducimos la flecha (<--) como "que obtiene de"

Código:
DBGrid "que obtiene de" DataSource "que obtiene de" TablaBusqueda


es decir la manera de relacionar el dbgrid con los datos.

y en el evento OnKey(Down y UP) del TEdit viene algo como esto

Código:
//---------------------------------------------------------------------------
void __fastcall TCCSGSeleccion::Edit1KeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    AnsiString a=Key;
    switch(Key)
    {
        case VK_UP:
            this->DBGrid1->Perform(WM_KEYDOWN,VK_UP,0);
            Key=0;
            break;
        case VK_DOWN:
            this->DBGrid1->Perform(WM_KEYDOWN ,VK_DOWN,0);
            Key=0;
            break;
    }

}
//---------------------------------------------------------------------------
void __fastcall TCCSGSeleccion::Edit1KeyUp(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
    AnsiString a=Key;
    switch(Key)
    {
        case VK_UP:
            this->DBGrid1->Perform(WM_KEYUP,VK_UP,0);
            Key=0;
            break;
        case VK_DOWN:
            this->DBGrid1->Perform(WM_KEYUP,VK_DOWN,0);
            Key=0;
            break;
        default:
            // si hay 3 letras el Edit buscar
            // ya que si hay 1 entonces se viene toda la base
            // por la red
            if(this->Edit1->Text.Length()>2)
            {
                this->BuscarBase(this->Edit1->Text);
                Key=0;
            }
            break;

    }
}
//---------------------------------------------------------------------------


el codigo de las flechas es para moverme dentro del DBgrid cuando el usuario presione flecha arriba o flecha abajo en el Edit, haciendo la simulacion que se presiona dentro del DBGrid, asi el usuario puede moverse por el dbgrid y al mismo tiempo escribir dentro del Edit, puede agregarse el valor para la pagina arriba y pagina abajo.. pero eso ya es otro cuento...

saludos espero que con esto te quede un poco mas claro...
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mie 29 Mar, 2006 2:18 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Muchas gracias por vuestra gran ayuda. Ya voy entendiendo mejor los componentes de IBX.

Ya tengo la aplicación corriendo bajo Firebird instalada en el cliente y parece que las cosas marchan bien. Laughing
_________________
Asun
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.