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 31-08-2011 00:06:44

Como actualizar registros!!!
 
hola a todos, y gracias por su tiempo, tengoun inconveniente en un formulario de facturacion, en donde voy cargando mercaderias de la tabla stock, funciona perfectamente, lo que necesito es que me descuente del stock la cantidad de las mercaderias que fui cargando en la tabla de facturacion,tengo una ejemplo pero solo me descuenta el ultimo registro cargado
Este es mi boton GUARDAR:
Código Delphi [-]
procedure TF_FACTURACION.GUARDARClick(Sender: TObject);
VAR
CANT: INTEGER;
begin
DM.Q_FACTURACION.Post;
DM.Transaction.CommitRetaining;
//////actualiza cantidad////////////////
DM.CONSULTA.CLOSE;
DM.CONSULTA.SQL.Clear;
DM.CONSULTA.SQL.Add('SELECT * FROM DETALLE_FACTURAS WHERE COD_FACT='+#39+COD_FACT.Text+#39' AND CODIGO='+#39+CODIGO2.Text+#39);
DM.CONSULTA.Open;

CANT:=DM.CONSULTA.FieldValues['CANTIDAD'];
DM.CONSULTA.CLOSE;
DM.CONSULTA.SQL.Clear;
DM.CONSULTA.SQL.Add('UPDATE STOCK SET CANTIDAD=CANTIDAD-'+inttostr(CANT)+' WHERE COD_STOCK='+#39+CODIGO2.text+#39);
DM.CONSULTA.ExecSQL;

end;
Como puedo hacer para que descuente todos los registros que cargue?
si no me explique bien, diganmepor favor, estoy aprendiendo todavia,y me cuesta mucho expresarme... gracias por su tiempo....

Casimiro Noteví 31-08-2011 00:15:21

Por favor, negrokau, tengo que recomendarte en cada mensaje que escribes que leas nuestra guía de estilo, en este caso, como casi siempre, no has puesto un título descriptivo a la pregunta. Está bien que se te pase alguna vez, pero es que lo haces siempre, ya pienso que lo haces a propósito.

negrokau 31-08-2011 00:20:05

Disculpa,aque te referis con título descriptivo?

negrokau 31-08-2011 01:06:06

disculpen, la verdad no lo hago a proposito, lo volvere a hacer de nuevo en un nuevo hilo, disculpen las molestias...

negrokau 31-08-2011 01:37:27

Como actualizar registros que tengan la misma clave!!
 
hola a todos, y gracias por su tiempo, tengo un inconveniente en un formulario de facturacion, en donde voy cargando registros de la tabla stock y va agregando en un dbgrid, lo que necesito es que me actualize en la tabla stock los registro que fui cargando en la tabla de facturacion, tengo varios Registros con la misma Clave, como actualizo todos los que tengan La misma Clave, tengo una ejemplo pero solo me descuenta el ultimo registro cargado
Este es mi boton GUARDAR:
Código Delphi [-]
procedure TF_FACTURACION.GUARDARClick(Sender: TObject); VAR CANT: INTEGER; begin DM.Q_FACTURACION.Post; DM.Transaction.CommitRetaining; //////actualiza cantidad//////////////// DM.CONSULTA.CLOSE; DM.CONSULTA.SQL.Clear; DM.CONSULTA.SQL.Add('SELECT * FROM DETALLE_FACTURAS WHERE COD_FACT='+#39+COD_FACT.Text+#39' AND CODIGO='+#39+CODIGO2.Text+#39); DM.CONSULTA.Open;  CANT:=DM.CONSULTA.FieldValues['CANTIDAD']; DM.CONSULTA.CLOSE; DM.CONSULTA.SQL.Clear; DM.CONSULTA.SQL.Add('UPDATE STOCK SET CANTIDAD=CANTIDAD-'+inttostr(CANT)+' WHERE COD_STOCK='+#39+CODIGO2.text+#39); DM.CONSULTA.ExecSQL;  end;

Este tema ya lo agregue pero como me dijeron que no tenia un titulo descriptivo lo volvi a alzar, espero que ahora si este bien, y le pido que el hilo anterior lo eliminen, muchas gracias

negrokau 31-08-2011 01:41:07

hola a todos, y gracias por su tiempo, tengo un inconveniente en un formulario de facturacion, en donde voy cargando registros de la tabla stock y va agregando en un dbgrid, lo que necesito es que me actualize en la tabla stock los registro que fui cargando en la tabla de facturacion, tengo varios Registros con la misma Clave, como actualizo todos los que tengan La misma Clave, tengo una ejemplo pero solo me descuenta el ultimo registro cargado
Este es mi boton GUARDAR:

Código Delphi [-]
procedure TF_FACTURACION.GUARDARClick(Sender: TObject);
VAR
CANT: INTEGER;
begin
DM.Q_FACTURACION.Post;
DM.Transaction.CommitRetaining;
//////actualiza cantidad////////////////
DM.CONSULTA.CLOSE;
DM.CONSULTA.SQL.Clear;
DM.CONSULTA.SQL.Add('SELECT * FROM DETALLE_FACTURAS WHERE COD_FACT='+#39+COD_FACT.Text+#39' AND CODIGO='+#39+CODIGO2.Text+#39);
DM.CONSULTA.Open;

CANT:=DM.CONSULTA.FieldValues['CANTIDAD'];
DM.CONSULTA.CLOSE;
DM.CONSULTA.SQL.Clear;
DM.CONSULTA.SQL.Add('UPDATE STOCK SET CANTIDAD=CANTIDAD-'+inttostr(CANT)+' WHERE COD_STOCK='+#39+CODIGO2.text+#39);
DM.CONSULTA.ExecSQL;

end;
Este tema ya lo agregue pero como me dijeron que no tenia un titulo descriptivo lo volvi a alzar, espero que ahora si este bien, y le pido que el hilo anterior lo eliminen, muchas gracias

oscarac 31-08-2011 04:27:35

que significa.... registros con la misma clave

amigo... no es el primer post que colocas... y creo que tampoco es la primera vez que te dicen esto:
te agradecería que fueras mas especifico, que para hacernos entender si es posible coloques gráficos o un dibujo de ejemplo, por mas que trato de interpretar lo que dices, no lo comprendo

duilioisola 31-08-2011 08:19:08

Código SQL [-]
UPDATE STOCK SET CANTIDAD=CANTIDAD- ?CANT WHERE COD_STOCK=?CODIGO
Esto te modifica todos los registros cuyo COD_STOCK=?CODIGO.
En este caso resta ?CANT a la CANTIDAD.

¿Qué es lo que quieres? El segundo SQL que publicas hace lo que pides...

Casimiro Noteví 31-08-2011 09:42:31

Cita:

Empezado por negrokau (Mensaje 410480)
disculpen, la verdad no lo hago a proposito, lo volvere a hacer de nuevo en un nuevo hilo, disculpen las molestias...

No, no, por favor, otro hilo no es necesario.

Cita:

Empezado por negrokau (Mensaje 410478)
Disculpa,aque te referis con título descriptivo?

Pero amigo, ¿has leído la guía de estilo alguna vez de las veces que te he recomendado que lo hagas?

Casimiro Noteví 31-08-2011 09:48:34

Un título descriptivo es el que resumen lo que se pregunta en el mensaje.

Si en el mensaje dices: ¿Cómo puedo cambiar de color las líneas de un dbgrid?.
Entonces en el título debes poner algo así como: Cómo cambiar color en líneas dbgrid.
Pero tu título (inadecuado) sería, por ejemplo: dbgrid

En este caso, si lo que preguntas es: lo que necesito es que me descuente del stock la cantidad de las mercaderias.
Pues un título descriptivo puede ser: Descontar cantidad de stock en tabla de mercaderías.
Pero un título inadecuado que no dice de qué trata el mensaje/pregunta es: Como actualizar registros!!!

Además que con '!!!' no estás preguntando nada, para preguntar es el signo de interrogación '¿?'.

Son sólo ejemplos, espero que lo entiendas, aunque está mucho mejor explicado en nuestra guía de estilo y no te llevará ni 3 minutos leerla.


p.d.: He unido los dos hilos porque es lo mismo.

defcon1_es 31-08-2011 10:17:31

¿No deberías hacer un bucle?
 
Te actualiza sólo 1 registro porque no recorres la query que trae los datos.
Yo usaría 2 querys, 1 para recorrer la tabla y otra para actualizar los datos.
La primera tendría como código SQL "fijo" lo siguiente:
Código SQL [-]
SELECT CANTIDAD FROM DETALLE_FACTURAS WHERE (COD_FACT=:ParCOD_FACT) AND (CODIGO = :ParCODIGO)
NOTA: Si solamente te hace falta el campo CANTIDAD, no hagas un SELECT *
y la segunda tendría este código
Código SQL [-]
UPDATE STOCK SET CANTIDAD=CANTIDAD-:ParCANTIDAD WHERE (COD_STOCK= :ParCODIGO)

Y en delphi
Código Delphi [-]
procedure TF_FACTURACION.GUARDARClick(Sender: TObject);
begin
  DM.Q_FACTURACION.Post;
  DM.Transaction.CommitRetaining;
//////actualiza cantidad////////////////
  DM.CONSULTA.CLOSE;
  DM.CONSULTA.ParamByName('ParCOD_FACT').AsString := COD_FACT.Text;
  DM.CONSULTA.ParamByName('ParCODIGO').AsString := CODIGO2.Text;
  DM.CONSULTA.Open;
  while not(DM.CONSULTA.Eof)do
  begin
    DM.CONSULTA2.CLOSE; 
    DM.CONSULTA2.ParamByName('ParCODIGO').AsString := CODIGO2.Text;
    DM.CONSULTA2.ParamByName('ParCANTIDAD').AsFloat := DM.CONSULTA.FieldByName('CANTIDAD').AsFloat;
    DM.CONSULTA2.ExecSQL;
    DM.CONSULTA.Next;
  end;
end;

negrokau 07-09-2011 22:22:26

gracias capo, me funciono de maravilla defcon1_es, gracias gracias....

oscarac 07-09-2011 22:33:04

Casimiro creo que Defcon1_es tiene una bola de cristal :D:D:D

negrokau 07-09-2011 22:35:00

:d:d:d:d:d:d:d:d

Casimiro Noteví 07-09-2011 22:56:43

Cita:

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

¡¡¡Qué callado se lo tenía!!! :eek::)

oscarac 07-09-2011 23:00:32

Cita:

Empezado por Casimiro Notevi (Mensaje 411184)
¡¡¡Qué callado se lo tenía!!! :eek::)

y asi como jugando ya llegue a 1k
vaya... el tiempo si que pasa;)

Casimiro Noteví 07-09-2011 23:04:20

Cita:

Empezado por oscarac (Mensaje 411188)
y asi como jugando ya llegue a 1k
vaya... el tiempo si que pasa;)


Jejeje... mira aquí. :)

negrokau 07-09-2011 23:12:03

yo de vuelta, me anduvo una vez pero ahora me salta este error:
CANNOT PERFORM THIS OPERATION ON A CLOSED DATASET
ya le di muchas vueltas y no encuentro el problema

oscarac 07-09-2011 23:13:21

eso pasa cuando la base de datos o la tabla esta cerrada

negrokau 07-09-2011 23:24:15

1 Archivos Adjunto(s)
aca mi salta el error

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 05:43:08.

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