Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #2  
Antiguo 23-10-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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 . El bloque begin end se ejecuta siempre.
Responder Con Cita
  #4  
Antiguo 23-10-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #5  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!

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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #6  
Antiguo 23-10-2008
Avatar de boreg
boreg boreg is offline
Miembro
 
Registrado: oct 2007
Ubicación: México, México
Posts: 76
Poder: 17
boreg Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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 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.

Última edición por coso fecha: 23-10-2008 a las 20:28:14.
Responder Con Cita
  #8  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Otra cosa...¿el locate debe hacerse al campo bascula? ¿strPeso no lo usas? y...¿los strid que envias a la funcion son los correctos?
Responder Con Cita
  #9  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #10  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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'.
Responder Con Cita
  #11  
Antiguo 23-10-2008
Avatar de boreg
boreg boreg is offline
Miembro
 
Registrado: oct 2007
Ubicación: México, México
Posts: 76
Poder: 17
boreg Va por buen camino
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) haz, por lo menos, un commitretain.

Saludos
Responder Con Cita
  #12  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #13  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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)
Responder Con Cita
  #14  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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!
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #15  
Antiguo 23-10-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 20
FGarcia Va por buen camino
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.
__________________
ESTO ES UN FORO ... NO UN MÓVIL
¿Por qué no escribir de una manera comprensible para que los humanos lo podamos entender?
Responder Con Cita
  #16  
Antiguo 23-10-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
yo me alegro por ti q lo hayas solucionado. saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar el contenido de un DataSet a otro DataSet Javi2 Varios 82 22-11-2022 09:26:16
Intento insertar y/o editar en un DBGrid y no me permite. joal Conexión con bases de datos 2 05-04-2007 18:17:59
Problema con insertar instruccion en un dataset el_barto Conexión con bases de datos 2 13-07-2005 00:16:41
insertar un nuevo sql en un DataSet.insertsql el_barto Conexión con bases de datos 2 17-06-2005 23:14:02
editar un exe piskapocha Varios 2 31-03-2004 22:20:39


La franja horaria es GMT +2. Ahora son las 11:28:14.


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
Copyright 1996-2007 Club Delphi