 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
SumSum Lt JG


Registrado: 06 Oct 2002Mensajes: 52
|
Publicado: Jue 23 Mar, 2006 5:31 pm Asunto: Novata con los Componentes IBX: IBDATASET |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 24 Mar, 2006 1:54 am Asunto: Re: Novata con los Componentes IBX: IBDATASET |
|
|
| 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. _________________
 |
|
| Volver arriba |
|
 |
SumSum Lt JG


Registrado: 06 Oct 2002Mensajes: 52
|
Publicado: Dom 26 Mar, 2006 3:20 pm Asunto: |
|
|
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.... 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.
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 |
|
 |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Dom 26 Mar, 2006 8:10 pm Asunto: |
|
|
Yo trabajo practicamente solo con IbClientDataSets y no tengo problemas con los parámetros
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  |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Lun 27 Mar, 2006 5:09 am Asunto: |
|
|
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... _________________

Ultima edición por Cesar C. Salazar Gonzalez el Mie 29 Mar, 2006 2:18 am, editado 1 vez |
|
| Volver arriba |
|
 |
SumSum Lt JG


Registrado: 06 Oct 2002Mensajes: 52
|
Publicado: Mar 28 Mar, 2006 10:07 pm Asunto: |
|
|
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.  _________________ Asun |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|