Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Editar e Insertar con un Dataset (https://www.clubdelphi.com/foros/showthread.php?t=61045)

FGarcia 23-10-2008 01:58:07

Editar e Insertar con un Dataset
 
Nuevamente solicitando ayuda con esto de los IBX y FB 2.0 D7.

tengo este codigo:

Código Delphi [-]
//Llamo a este procedimiento y le envio dos parametros
procedure TdmDatos.ActualizaTotales(strID, strPeso: string);
begin
  //Con el DataSet Totales
  with dstTotales do
    begin
      //Intentamos localizar la existencia de un registro con esta ID
      if Locate('Bascula',strID,[loCaseInsensitive]) then
        //SI existe recupero los valores de estos dos campos y cambio a EDICION
        begin
          showmessage('SI existe'); //Esto solo para verificar que si ingresa al 
ciclo
          accCuenta := dstTotalesACCOPERACION.Value;
          gblCuenta := dstTotalesGBLOPERACION.Value ;
          Edit;
        end
      else
        showmessage('NO existe'); //Esto solo para verificar que si ingresa al ciclo
        //SI NO existe cambio a modo INSERTAR NUEVO
        begin
          Append;
          accCuenta := 0;
          gblCuenta := 0;
          dstTotalesBASCULA.Value := StrToInt(strID);
        end;
      Inc(accCuenta);
      Inc(gblCuenta);
      dstTotalesACCOPERACION.Value := accCuenta;
      dstTotalesGBLOPERACION.Value := gblCuenta;
      
      //Guardo los datos nuevos
      dstTotales.Post;
    end;
end;

y espero obtener esto

Cita:

//Espero obtener algo asi (DESPUES DE VARIAS OPERACIONES):
ID |ACCOPERACION |GBLOPERACION
1 | 20 | 20
2 | 20 | 20
3 | 20 | 20
4 | 20 | 20

//Sin embargo obtengo esto
ID |ACCOPERACION |GBLOPERACION
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1
¿Cual es mi error? ¿el dataset no es apropiado para esto? ya probe con un IBQuery y me devuelve los mismos resultados. Se agradece su ayuda y sugerencias.

Delphius 23-10-2008 02:33:02

Hola FGarcia,
¿No será tal vez que estas sentencias:

Código Delphi [-]
Inc(accCuenta);
Inc(gblCuenta);
dstTotalesACCOPERACION.Value := accCuenta;
dstTotalesGBLOPERACION.Value := gblCuenta;
      
//Guardo los datos nuevos
dstTotales.Post;

deberían ir dentro del begin-end de la parte else?:confused:

Saludos,

coso 23-10-2008 12:17:39

Código Delphi [-]
 else
        showmessage('NO existe'); //Esto solo para verificar que si ingresa al ciclo
        //SI NO existe cambio a modo INSERTAR NUEVO
        begin
          Append;
          accCuenta := 0;
          gblCuenta := 0;
          dstTotalesBASCULA.Value := StrToInt(strID);
        end;

en el else solo se ejecuta el showmessage :rolleyes:. El bloque begin end se ejecuta siempre.

Caro 23-10-2008 14:27:02

Hola, opino lo mismo que el amiguito coso. el problema esta en el else, el else solo ejecutara el Showmessage y como el begin y end quedan sueltos eso se ejecutara siempre, pon el showmessage dentro tu bloque begin.

Código Delphi [-]
else
    begin
         showmessage('NO existe'); //Esto solo para verificar que si ingresa al ciclo
        //SI NO existe cambio a modo INSERTAR NUEVO
          Append;
          accCuenta := 0;
          gblCuenta := 0;
          dstTotalesBASCULA.Value := StrToInt(strID);
    end;

Saluditos

FGarcia 23-10-2008 16:34:12

Ok! si, ese era un error que de tanto manipular ya no veia, sin embargo aun corrigiendolo el resultado no es el esperado, es decir...¡sigue sin funcionar!:(:mad:

ahora solo inserta los primeros 4 registros y no vuelve a insertar nada ( de hecho ahi comenze) el showmessage los coloque a modo de test de que sí ingresa al ciclo y lo hace bien, pero no guarda los datos que se van a editar. Ya ejecute un debug paso a paso y todo funciona bien, los datos se incrementan segun espero mas no son registrados en la bd.

Cita:

//Espero obtener algo asi (DESPUES DE VARIAS OPERACIONES):

ID |ACCOPERACION |GBLOPERACION
1 | 20 | 20
2 | 20 | 20
3 | 20 | 20
4 | 20 | 20

//Sin embargo obtengo esto

ID |ACCOPERACION |GBLOPERACION
1 | 1 | 1
2 | 1 | 1
3 | 1 | 1
4 | 1 | 1

Estoy seguro que es una tontera la que estoy haciendo pero no la veo. Les agradezco la ayuda.

boreg 23-10-2008 17:19:10

Según lo que veo el codigo hace lo que debería de hacer, incrementa en 1 el valor de los campos ACCOPERACION y GBLOPERACION, si no existe se agrega un registro con el nuevo ID e incrementa 1 desde 0 los mismos campos.
Quizás el error está en que te falta agregar las operaciones que mencionaste en un principio ("//Espero obtener algo asi (DESPUES DE VARIAS OPERACIONES):"), tambien veo que en el locate estas buscando en el campo "BASCULA" y en los datos nos estás mencionando el Campo "ID". Sería bueno que nos dijeras el valor que tienen los campos (ACCOPERACION y GBLOPERACION) antes de que hagas la edicion, si no es cero quizás haya algo mas que se nos escapa a la vista.

Saludos

coso 23-10-2008 18:48:57

probaria esto

Código Delphi [-]
procedure TdmDatos.ActualizaTotales(strID, strPeso: string);
begin
      if dstTotales.Locate('BASCULA',Trim(strID),[loCaseInsensitive,loPartialKey]) then
      begin
          accCuenta := dstTotales.FieldByName('ACCOPERACION').Asinteger;
          gblCuenta := dstTotales.FieldByName('GBLOPERACION').Asinteger;
          dstTotales.Edit;
      end
      else
      begin
          accCuenta := 0;
          gblCuenta := 0;
          dstTotales.Append;
          dstTotales.FieldValues['BASCULA'] := StrToInt(strID);
      end;
      Inc(accCuenta);
      Inc(gblCuenta);
      dstTotales.FieldValues['ACCOPERACION'] := accCuenta;
      dstTotales.FieldValues['GBLOPERACION'] := gblCuenta;
      
      dstTotales.Post;
end;

poca modificacion :confused: podria ser el trim, o las mayusculas de BASCULA. He usado FieldValues solo para asegurar que existen los campos, y eliminar el with por legibilidad, nada mas.

coso 23-10-2008 18:50:47

Otra cosa...¿el locate debe hacerse al campo bascula? ¿strPeso no lo usas? y...¿los strid que envias a la funcion son los correctos?

FGarcia 23-10-2008 20:02:12

gracias nuevamente por el interes.

boreg: el nombre del campo es bascula, en la "tabla" que puse de ejemplo lo cambie por ID (un errorcillo), he realizado hasta 60 operaciones pero las cuentas no pasan de 1.
La tabla la vacio antes de cada prueba que he realizado por lo que empiezo desde 0 los valores de los campos ACCOperacion y GBLOperacion.

coso: probe tus modificaciones pero sigue haciendo lo mismo.

El campo bascula es un campo de tipo integer que solo va a poseer 4 valores (1,2,3,4) de ahi el ID.
Cada operacion realizada por esa bascula se va a contar y se colocara en dos campos ACCOperacion y GBLOperacion.
el campo strPeso es similar solo que el acumulara un float, actualmente no lo uso pues quiero primero definir lo del contador.

100% certificado que los datos que llegan son correctos.:(


p.d. Esto ya lo hice una vez con access, ahora que lo quiero colocar en firebird estoy mas perdido que un oso polar en el sahara.:cool:

coso 23-10-2008 20:11:41

si bascula es de tipo integer no tendrias que hacer...
locate('bascula',strtoint(strid),[])? creo que si no lo que estas haciendo es comparar el valor numerico de la cadena '1'.

boreg 23-10-2008 20:12:46

No se como funcionan los IBX pero, quizás no te está actualizando el valor de los campos con el POST prueba con un APPLYUPDATES y si usas algún componente de transaccion o estás abriendo una transaccion desde el componente de conexión (no se como se manejen las transacciones con IBX:p) haz, por lo menos, un commitretain.

Saludos

FGarcia 23-10-2008 22:42:55

Pues no.

El CommitRetaining lo ejecuto despues del post en el evento afterpost del dataset.

Segun F1 :

Cita:

function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean;
por lo tanto no es necesario hacer el StrToInt(strID)

sniff, sniff, sniff ¡¡quiero a mi máma!!

coso 23-10-2008 22:44:11

pero...pero...si pones el strId tal cual...te esta comparando el valor numerico de la cadena ...pruebalo, a ver q pasa...

('1' es 31,'12' es 63...etc)

FGarcia 23-10-2008 22:54:44

pues no, ¡es exactamente el mismo resultado!

Te comento que he realizado el paso a paso y los resultados son congruentes con lo que espero (insercion y edicion), sin embargo al revisar la bd desde IBExpert estos no son reflejados, solo se realiza la insercion de los primeros 4 registros, la edicion posterior no. No he encontrado alguna referencia a algún proceso especial para el edit.

Nuevamente gracias por tu interes!

FGarcia 23-10-2008 23:24:48

GRRRRRRRRRRRRRRR!!
¡¡¡ESTUPIDO, ESTUPIDO, ESTUPIDO!!!

Me fui un rato a leer este hilo y carajo se me quito el cortocircuito cerebral que traia (¿realmente se quito?). En el Dataset editor estaba declarada esta sentencia:

Código SQL [-]
update TOTALES
set
  BASCULA = :BASCULA
  ACCOPERACION = :ACCOPERACION,
  ACCTOTAL = :ACCTOTAL,
  GBLOPERACION = :GBLOPERACION,
  GBLTOTAL = :GBLTOTAL
where
  ID = :OLD_ID

y Modificaque a esto

Código SQL [-]
update TOTALES
set
  ACCOPERACION = :ACCOPERACION,
  ACCTOTAL = :ACCTOTAL,
  GBLOPERACION = :GBLOPERACION,
  GBLTOTAL = :GBLTOTAL
where
   BASCULA = :BASCULA

El campo ID es un consecutivo autogenerado por fb en realidad no me sirve para nada (lo mantengo para no tener que reestructurar la tabla por si las dudas mas adelante), Todo funcionando OK.

Gracias por la ayuda a todos los que se interesaron.

coso 23-10-2008 23:27:05

yo me alegro por ti :D:D q lo hayas solucionado. saludos.


La franja horaria es GMT +2. Ahora son las 08:46:33.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi