Ir al contenido



Foto

Problemas en actualizar datos con IBDataSet (IBX) y Firebird


  • Por favor identifícate para responder
15 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 17 mayo 2009 - 01:24

Pos eso amigos, estoy teniendo problemas en actualizar registros existentes con los componentes IBX más especí­fico con el IBDataset, he probado con Post, ModifySQL, UpdateRecord y ApplyUpdates y nada, en algunos casos la tabla se cierra al usar Commit pero no al usar CommitRetaining, code:



delphi
  1. procedure TFMantenimiento.imActualizarClick(Sender: TObject);
  2. begin
  3. if MessageDlg('¿Seguro deseas actualizar estos datos?',
  4.     mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  5. begin
  6.     cliCodigo.SetFocus;
  7.     CamposVacios(dsClientes);
  8.     try
  9.       dmData.QIBClientes.Post;
  10.     Except
  11.       on E: Exception do
  12.       if E.ClassNameIs('EDatabaseError') then
  13.         begin
  14.           ShowMessage('Se produjo un error al intentar conectarse a la base de datos.');
  15.           dmData.IBTrans.Rollback;
  16.           Abort;
  17.         end;
  18.     end;
  19.     dmData.IBTrans.CommitRetaining;
  20. end;
  21. end;



No sé qué pasa, ¿alquien me echa una manito? :D.

Saludos.
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 17 mayo 2009 - 01:51

Hola Fernando,
¿Te aseguraste de que el nivel de isolation es el adecuado? No veo que inicies la transacción. ¿Lo haces en otra parte? ¿En qué estado está el dataset?

Por otra parte... si usas Firebird 2.x toma con pinzas el uso de los IBX.

Saludos,
  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 17 mayo 2009 - 01:57

Hola Delphius la transaction está activa todo el tiempo, ¿a qué te refieres con isolation?, pues uso la versión 2.0 por lo que veo deberé usar los IBX con pinzas como dices, ¿quién habrá sido el que me indujo a usar los IBX si estaba contento con ZEOS? mmm ¿quién habrá sido?  ^o|.

Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 17 mayo 2009 - 02:10

Hola Delphius la transaction está activa todo el tiempo, ¿a qué te refieres con isolation?, pues uso la versión 2.0 por lo que veo deberé usar los IBX con pinzas como dices, ¿quién habrá sido el que me indujo a usar los IBX si estaba contento con ZEOS? mmm ¿quién habrá sido?  ^o|.

Saludos.

Pues con isolation me refiero al isolation level y las configuraciones que se debe establecer a las transacciones:
* Snapshot
* Read Commited
....

Recuerda que, en IBX, cuando confirmas una transacción ésta se cierra.

Pues amigo, desde siempre se habló que la compatibilidad de IBX y las versiones nuevas de Firebird es un tema cuestionado, y que lo mejor es prevenir. Yo no uso Firebird 2.x, mientras siga teniendo D6 no quiero arriesgarme.
Si bien ahora hay noticias de que se empezará a dar soporte oficial a Firebird, no se descarta que existan ciertas dificultades en versiones de D6+ y Firebird 2.x.

Hay quienes dicen que no tienen problemas con IBX y Firebird, pero no está demás prevenirse.

Si con ZEOS vas bien amigo, yo dirí­a que mejor sigas con él antes de arriesgar más al avanzar con IBX.
Como quien dirí­a: mejor malo conocido que bueno por conocer ;)... o algo así­.

Saludos,
  • 0

#5 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 17 mayo 2009 - 02:28

Bueno, por lo que veo me costará volver a ZEOS, lo más extraño es que la inserción funciona, bueno, no todo debe funcionar a la perfección.  :)

Saludos.
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 17 mayo 2009 - 02:48

Pues amigo... releyendo tus palabras.... a como lo veo creo que es lo esperado. ;)

De que se realiza, se realiza. La cuestión es que el Commit, confirma y sin mantener retenido el contexto; es decir confirma y no guarda la información de las operaciones realizadas. Una vez que se confirma la transacción se cierra el dataset. Si lo que buscas es confirmar y retener el contexto de dicha transacción hay que usar CommitRetaining.

Call CommitRetaining to permanently store to the database server all updates, insertions, and deletions of data associated with the current transaction and then retain the transaction context. The current transaction is the last transaction started by calling StartTransaction.

Note: Before calling CommitRetaining, an application may check the status of the InTransaction property. If an application calls CommitRetaining and there is no current transaction, an exception is raised.



Saludos,
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 18 mayo 2009 - 12:02

Hola Delphius la transaction está activa todo el tiempo, ¿a qué te refieres con isolation?, pues uso la versión 2.0 por lo que veo deberé usar los IBX con pinzas como dices, ¿quién habrá sido el que me indujo a usar los IBX si estaba contento con ZEOS? mmm ¿quién habrá sido?  ^o|.

Saludos.


Hola

No veo porque tengas que usar IBX con pinzas  ^o| *-) 8-), cierto que IBX tiene sus cosas ocultas pero ZEOS  +o( caray, mejor usa dbExpress :p

Bueno, por lo que veo me costará volver a ZEOS, lo más extraño es que la inserción funciona, bueno, no todo debe funcionar a la perfección.



Asi dicen los que a la primera cosa desconocida botan los guantes y se van por la mas fácil :p

Salud OS
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 18 mayo 2009 - 12:22

Hola

No veo porque tengas que usar IBX con pinzas   ^o| *-) 8-), cierto que IBX tiene sus cosas ocultas pero ZEOS  +o( caray, mejor usa dbExpress :p


Pues, yo no más decí­a... que mejor ser precavido. Hasta Firebird 1.5.5 se puede garantizar que el funcionamiento y la compatibilidad se mantiene... en los Delphi inferiores a 200x. En las versiones nuevas no se sabe hasta que punto son compatibles.

Deberí­a funcionar, puesto que Firebird siempre busca mantener compatibilidad hacia atrás; más no se puede garantizar que las nuevas versiones de IBX estén bien en sintoní­a con Firebird 2.x. En algunos sitios se estaba diciendo que en un futuro cercano IBX iba a dejar de soportar a Firebird ya que se iban a rediseñar sus componentes.

Ahora que se ha hecho público de que brindará soporte a Firebird es de esperar que así­ sea.

Yo no creo que existan demasiados problemas, pero algo de precaución no estarí­a demás.
  • 0

#9 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 18 mayo 2009 - 03:34

Yo utilizo Delphi2009/IBX/Firebird 2.1 y quitando que tuve que modificar unas partes del codigo de la IBSQL.pas cero problemas.
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 18 mayo 2009 - 06:25

Yo utilizo Delphi2009/IBX/Firebird 2.1 y quitando que tuve que modificar unas partes del codigo de la IBSQL.pas cero problemas.


Entonces podremos sentirnos más cómodos :)
Serí­a bueno que nos comentases que inconvenientes o que tipo de modificaciones tuviste que realizar. Creo que tus explicaciones podrán ser de ayuda para muchos.
Si lo consideras apropiado, se inicia un nuevo hilo sobre ésto.

Saludos,
  • 0

#11 Kipow

Kipow

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 228 mensajes
  • LocationGuatemala

Escrito 19 mayo 2009 - 06:18

Basicamente cambie esto:

En la unidad IBSQL.pas

version original


delphi
  1. procedure TIBXSQLVAR.SetAsVariant(Value: Variant);
  2. begin
  3.   if VarIsNull(Value) then
  4.     IsNull := True
  5.   else
  6.   case VarType(Value) of
  7.     varEmpty, varNull:
  8.       IsNull := True;
  9.     varSmallint, varInteger, varByte, varShortInt, varWord, varLongWord:
  10.       AsLong := Value;
  11.     varSingle, varDouble:
  12.       AsDouble := Value;
  13.     varCurrency:
  14.       AsCurrency := Value;
  15.     varBoolean:
  16.       if Value then
  17.         AsBoolean := true
  18.       else
  19.         AsBoolean := false;
  20.     varDate:
  21.       AsDateTime := Value;
  22.     varOleStr, varString:
  23.       AsString := Value;
  24.     varArray:
  25.       IBError(ibxeNotSupported, [nil]);
  26.     varByRef, varDispatch, varError, varUnknown, varVariant:
  27.       IBError(ibxeNotPermitted, [nil]);
  28.     varInt64:
  29.       AsInt64 := Value;
  30.     else
  31.       IBError(ibxeNotSupported, [nil]);
  32.   end;
  33. end;



Mi version.



delphi
  1. procedure TIBXSQLVAR.SetAsVariant(Value: Variant);
  2. var
  3.   TypeStr : string;
  4. begin
  5.   TypeSTR := VarTypeAsText(VarType(Value));
  6.   if VarIsNull(Value) then
  7.     IsNull := True
  8.   else
  9.   case VarType(Value) of
  10.     varEmpty, varNull:
  11.       IsNull := True;
  12.     varSmallint, varInteger, varByte, varShortInt, varWord, varLongWord:
  13.       AsLong := Value;
  14.     varSingle, varDouble :
  15.       AsDouble := Value;
  16.     varCurrency:
  17.       AsCurrency := Value;
  18.     varBoolean:
  19.       if Value then
  20.         AsBoolean := true
  21.       else
  22.         AsBoolean := false;
  23.     varDate:
  24.       AsDateTime := Value;
  25.     varOleStr, varString, varUString:
  26.       AsString := Value;
  27.     varArray:
  28.       IBError(ibxeNotSupported, [nil]);
  29.     varByRef, varDispatch, varError, varUnknown, varVariant:
  30.       IBError(ibxeNotPermitted, [nil]);
  31.     varInt64:
  32.       AsInt64 := Value;
  33.     else   
  34.     begin     
  35.           if TypeStr = 'FMTBcdVariantType' then       
  36.                 AsDouble := Value
  37.       else
  38.         IBError(ibxeNotSupported, [nil]);
  39.     end;
  40.   end;
  41. end;



Y otro asunto importante a considerar al menos a mi el IBEvent no me funciono como deberia, solamente puedo registrar 1 evento por componente, pues eso hice no me complique y registre 1 evento por componente (dinamicamente).

Saludos.
  • 0

#12 alexontiveros

alexontiveros

    Member

  • Miembros
  • PipPip
  • 11 mensajes
  • LocationMéxico

Escrito 10 junio 2009 - 06:12

Hola a todo el foro, amigo enecumene podrias ser mas especifico en cuanto al tipo de error, si no te esta guardando datos , si usas un Ibtable o un ibquery, que tipo de sentencia sql usas, si esta en una red o esta de manera local, etc, etc,  te mando un saludo y espero poder cooperar en esta comunidad.
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.130 mensajes
  • LocationMéxico

Escrito 10 junio 2009 - 06:16

Hola a todo el foro, amigo enecumene podrias ser mas especifico en cuanto al tipo de error, si no te esta guardando datos , si usas un Ibtable o un ibquery, que tipo de sentencia sql usas, si esta en una red o esta de manera local, etc, etc,  te mando un saludo y espero poder cooperar en esta comunidad.


Hola amigo Alex, me da gusto verte por estos lares, hacia tiempo que te habias desaparecido :D, bienvenido de nuevo y claro será un gusto tenerte por aquí­ mas seguido.

Salud OS
  • 0

#14 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.409 mensajes
  • LocationRepública Dominicana

Escrito 10 junio 2009 - 06:24

Hola Alex bienvenido al foro, pues ese es el problema no produce ningún tipo de error simplemente simula guardar los datos y cierra la tabla pero no guarda nada, en todo caso me volví­ a utilizar ZEOS hasta que me familiarice con IBX.

Saludos.
  • 0

#15 ramonrafe

ramonrafe

    Member

  • Miembros
  • PipPip
  • 24 mensajes
  • LocationEspaña

Escrito 14 noviembre 2009 - 01:06

Hola.

El error que comentas es muy similar al que me ha pasado a mí varias veces.

En mi caso, el problema fue que, después de modificar los campos de una tabla en Firebird, no había "incluido" esos campos correctamente en la lista de campos del IBDataSet. Lo que se consigue al hacer doble clic sobre el componente IBDataSet, haciendo clic con el botón derecho y seleccionando "add fields" o algo así (lo escribo de memoria).

También me ha ocurrido porque, después de haber hecho lo anterior, no actualicé las sentencias SQL en el IBDataSet. Haciendo clic con el botón derecho y seleccionando "DataSet editor", seleccionando los campos que interesan y actualizando las órdenes SQL con el botón "Generate SQL". Por ello, las sentencias SQL actualizaban unos campos (los antíguos), pero dejaban sin actualizar los campos nuevos.

Quizás también a tí se te olvido realizar alguno de estos pasos.

Ramón.

  • 0

#16 ivand

ivand

    Newbie

  • Miembros
  • Pip
  • 7 mensajes
  • LocationEcuador

Escrito 07 abril 2020 - 02:47

Know programo en delohi2009 firebird pero no puedo hacer que Ibevent funcione podrias indicarme porfa como has manejado el tema de los events

Gracias


  • 0