Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como actualizar registros!!! (https://www.clubdelphi.com/foros/showthread.php?t=75528)

negrokau 08-09-2011 00:07:30

que puedo hacer? cuando llega a:
Código Delphi [-]
procedure TF_REMISION.GUARDARClick(Sender: TObject);
begin
DM.Q_REMISION.Post;
DM.Transaction.CommitRetaining;
////////////////////////////////////////
//////actualiza cantidad////////////////
Q_GUARDAR1.CLOSE;
Q_GUARDAR1.ParamByName('ParCOD_REMI').AsString:=COD_REMI.Text;
Q_GUARDAR1.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];
Q_GUARDAR1.Open;
while not(Q_GUARDAR1.Eof)do
begin
Q_GUARDAR_RESTO.CLOSE;
Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];
Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD'];
Q_GUARDAR_RESTO.ExecSQL;
Q_GUARDAR_RESTO.Next;
end;
me salta el mensaje
Q_GUARDAR_RESTO:CANNOT PERFORM THIS OPERATION ON A CLOSED DATASET
alguna sugerencia?

Casimiro Noteví 08-09-2011 00:19:36

Es por lo que te ha dicho oscarac, está cerrado, así que tendrás que abrirlo.
Código Delphi [-]
procedure TF_REMISION.GUARDARClick(Sender: TObject); begin
  DM.Q_REMISION.Open;
  ...
  etc...

negrokau 08-09-2011 00:45:43

lo probe, como me sugeriste, pero lo mismo pasa, inclusive hice asi:
Código Delphi [-]
while not(Q_GUARDAR1.Eof)do
begin
Q_GUARDAR_RESTO.CLOSE;
Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];
Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD'];
Q_GUARDAR_RESTO.ExecSQL;
Q_GUARDAR_RESTO.Next;
Q_GUARDAR_RESTO.open;
end;
lo marque con F5 paraver paso a paso el proceso y ahi ya no para mas

Casimiro Noteví 08-09-2011 01:05:54

Tendría que ver todo el código para visualizar como lo haces, pero por lo poco que veo, el problema estará en otro lado.
¿Cuando llega a ese procedure está abierto el query?, pon un punto de ruptura y lo compruebas.

negrokau 08-09-2011 01:10:37

el query esta abierto desde el formactivate, lo con un punto de ruptura y cuando llega a:
Código Delphi [-]
Q_GUARDAR_RESTO.Next;
me salta el error, lo probe asi:
Código Delphi [-]
Q_GUARDAR_RESTO.open;
Q_GUARDAR_RESTO.Next;
y hace un bucle infinito

Casimiro Noteví 08-09-2011 01:27:25

¿Acaso usas ese query en otro sitio o para otra cosa que no sea guardar?
Pon el código fuente!!!

defcon1_es 08-09-2011 11:34:14

Cita:

Empezado por oscarac (Mensaje 411180)
Casimiro creo que Defcon1_es tiene una bola de cristal :D:D:D

Si, pero cada día funciona menos...

Volviendo al tema:
No puedes hacer un NEXT de la query que usas para guardar los cambios, porque (sorprendentemente) no tiene registros que recorrer!!

Código Delphi [-]
while not(Q_GUARDAR1.Eof)do begin   
Q_GUARDAR_RESTO.CLOSE;   
Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];  
Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD'];   
Q_GUARDAR_RESTO.ExecSQL;   
Q_GUARDAR1.Next;  //  Q_GUARDAR_RESTO.Next;  Tienes que recorrer la query Q_GUARDAR1, no la query Q_GUARDAR_RESTO
//  Q_GUARDAR_RESTO.open; 
end;

negrokau 08-09-2011 12:59:13

si, mirando otros hilos, me di cuenta de eso, lo cambie como esta y me actualiza solo el 1º registro, el 2º registro ya no actualiza.
Lo hice asi:
Código Delphi [-]
//////actualiza cantidad////////////////
Q_GUARDAR1.CLOSE;
Q_GUARDAR1.ParamByName('ParCOD_REMI').AsString:=DM.Q_DET_REMISION.FieldValues['COD_REMI'];
Q_GUARDAR1.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];
Q_GUARDAR1.Open;
Q_GUARDAR1.First; {este le agregue}
while not (Q_GUARDAR1.Eof) do
begin
Q_GUARDAR_RESTO.CLOSE;
Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=Q_GUARDAR1.ParamByName('ParCODIGO').AsString;
Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD'];
Q_GUARDAR_RESTO.ExecSQL;
Q_GUARDAR1.Next;  {este tambien lo agregue, como me sugeriste}
end;

oscarac 08-09-2011 15:06:32

aparentemente esta todo bien...
has depurado el programa (f7 u f8)?
has verificado la cantidad de registros de q_guardar1?

negrokau 08-09-2011 15:18:52

q_guardar1 solo guardar la cantidad, pero solo del 1º registro, lo comprobe con un dbgrid, y siempre cuando le doy guardar solo la cantidad del 1º registro guardar

oscarac 08-09-2011 15:23:53

Cita:

Empezado por negrokau (Mensaje 411254)
q_guardar1 solo guardar la cantidad, pero solo del 1º registro, lo comprobe con un dbgrid, y siempre cuando le doy guardar solo la cantidad del 1º registro guardar

disculpame,... pero aun no tmom mi cafe cargado para despertar,,,,
no entendi....

cuantos registros tiene q_Guardar1 ??? tiene 1? 2> 100? 1000?

negrokau 08-09-2011 15:29:20

Q_GUARDAR_RESTO solo actualiza, funciona, actualiza
solo que actualiza el 1º registro, si tengo mas de 1 registro solo actualiza el 1º, el resto ya no, es como si el bucle no funcionara, no pasa al siguiente registro
Código Delphi [-]
Q_GUARDAR1.next;

Casimiro Noteví 08-09-2011 15:33:45

Amigo mio, eso no funciona así... o no he entendido nada hasta ahora.
Ahora vuelvo...

oscarac 08-09-2011 15:34:34

ok vamos a trabajar como descartes

coloca como comentario las lineas donde Actualiza y fijate si el q_Guardar1 recorre todos los registros que tiene
Código Delphi [-]
 
 
//////actualiza cantidad////////////////
Q_GUARDAR1.CLOSE;
Q_GUARDAR1.ParamByName('ParCOD_REMI').AsString:=DM.Q_DET_REMISION.FieldValues['COD_REMI'];
Q_GUARDAR1.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO'];
Q_GUARDAR1.Open;
Q_GUARDAR1.First; 
while not (Q_GUARDAR1.Eof) do
begin
//Q_GUARDAR_RESTO.CLOSE;
//Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=Q_GUARDAR1.ParamByName('ParCODIGO').AsString;
//Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD'];
//Q_GUARDAR_RESTO.ExecSQL;
Q_GUARDAR1.Next;
end;

prueba y comentas

Casimiro Noteví 08-09-2011 15:41:20

Creo que casi es mejor un control remoto al ordenador de negrokau :)

oscarac 08-09-2011 15:42:59

Teamviewer o Logmein...

oye casimiro....
eso no seria una mala idea....

negrokau 08-09-2011 16:37:34

Cita:

Empezado por oscarac (Mensaje 411264)
ok vamos a trabajar como descartes

coloca como comentario las lineas donde Actualiza y fijate si el q_Guardar1 recorre todos los registros que tiene
Código Delphi [-]
//////actualiza cantidad////////////////
Q_GUARDAR1.CLOSE; 
Q_GUARDAR1.ParamByName('ParCOD_REMI').AsString:=DM.Q_DET_REMISION.FieldValues['COD_REMI']; 
Q_GUARDAR1.ParamByName('ParCODIGO').AsString:=DM.Q_DET_REMISION.FieldValues['CODIGO']; 
Q_GUARDAR1.Open; 
Q_GUARDAR1.First;  
while not (Q_GUARDAR1.Eof) do 
begin 
//Q_GUARDAR_RESTO.CLOSE; 
//Q_GUARDAR_RESTO.ParamByName('ParCODIGO').AsString:=Q_GUARDAR1.ParamByName('ParCODIGO').AsString; 
//Q_GUARDAR_RESTO.ParamByName('ParCANTIDAD').AsFloat:=Q_GUARDAR1.FieldValues['CANTIDAD']; 
//Q_GUARDAR_RESTO.ExecSQL; 
Q_GUARDAR1.Next; 
end;
prueba y comentas

si tiene 3 registros, debe recorrer 3 veces verdad?, Lo probe con f7 y solo lo recorre una vez...

Casimiro Noteví 08-09-2011 16:43:38

Cita:

Empezado por negrokau (Mensaje 411295)
si tiene 3 registros, debe recorrer 3 veces verdad?, Lo probe con f7 y solo lo recorre una vez...

¿Podemos ver el select que estás ejecutando?, porque lo único que queda son esas dos cosas, esa y que no tengas 3 registros, sólo 1.

negrokau 08-09-2011 17:13:51

Cita:

Empezado por Casimiro Notevi (Mensaje 411299)
¿Podemos ver el select que estás ejecutando?, porque lo único que queda son esas dos cosas, esa y que no tengas 3 registros, sólo 1.

este es el select del query:
Código SQL [-]
select CANTIDAD from DETALLE_REMISION WHERE (COD_REMI=:ParCOD_REMI) AND (CODIGO = :ParCODIGO)
es el select de Q_GUARDAR1

Casimiro Noteví 08-09-2011 17:19:24

Vale, ¿y qué parámetros le pasas para probarlo?

:ParCOD_REMI = ??????
:ParCODIGO = ??????

¿Y qué registros tienes en la tabla?


La franja horaria es GMT +2. Ahora son las 06:29:20.

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