PDA

Ver la Versión Completa : ¿Como realizar bien un UPDATE?


judoboy
12-05-2003, 18:57:02
Hola tengo problemas a la hora de hacer un UPDATE.
El asunto es el siguiente, quiero actualizar el stock de unos artículos. El UPDATE lo hago cogiendo los datos de un DBGrid.

Yo hago esto



Data:=DBGLineasPedido.DataSource.DataSet;
Data.First;

while not (Data.Eof) do

begin
//HAGO en UPDATE

Data.Next;

end;



Pero me pasa lo siguiente en lugar de actualicar el stock de cada artículo con su correspondiente cantidad,me suma las cantidades de todos los artículos y con esa misma cantidad me actualiza el stock de todos los artículos.

No sé si me he explicado bien.

Seguramente se podrá hacer de otra forma mediante TRIGGERs o algo, pero es que mediante triggers no me entero.

Un Saludo.

judoboy
12-05-2003, 19:01:33
El update lo hago así

'UPDATE ARTICULOS SET STOCK=STOCK+"'+DBGLineasPedido.Fields[2].Value+'"';


donde Cantidad ocupa la tercera posición en el dbgrid.

roman
12-05-2003, 19:44:49
Posteado originalmente por judoboy
El update lo hago así

'UPDATE ARTICULOS SET STOCK=STOCK+"'+DBGLineasPedido.Fields[2].Value+'"';


donde Cantidad ocupa la tercera posición en el dbgrid.

¿Y no le falta una cláusula WHERE a tu instrucción? Sin ella el UPDATE se hace sobre todos los registros.

// Saludos

judoboy
13-05-2003, 09:14:14
Ya pero que pongo en la cláusula WHERE, porque yo quiero que me hago los artículos como digo que estan en el DBGrid.

Es que no se que puedo poner para que identifique a un artículo y luego al otro.

__cadetill
13-05-2003, 09:48:13
Quiza el codigo del articulo que tienes en la linea de detalle?

Vamos, no se como habras hecho las relaciones entre las tablas, pero es lo mas logico que se me ocurre

judoboy
13-05-2003, 10:11:16
He probado esto


SentenciaSqlStock:='UPDATE ARTICULOS SET
STOCK_OBRA_RECIBIR=STOCK_OBRA_RECIBIR-
"'+UModuloDatos.TL_P_ProvCANTIDAD.AsString+'"
WHERE CODIGO_ARTICULO="'+UModuloDatos.TableArticulosCODIGO_ARTICULO.Value+'"';


Y lo que me hace es actualizarme el útimo articulo con la suma de las cantidades de los otros. Mientras que los demás no actualiza nada.

__cadetill
13-05-2003, 10:25:18
Buff, pos ahora creo que me he perdido yo. No se lo que quieres hacer exactamente :(

A ver si nos lo puedes explicar un tanto mejor

P.D. : mira de editar tu mensaje anterior y poner en varias lineas el codigo que has puesto, que lo de la barra de desplazamiento horizontal es un coñazo para seguir en codigo. Gracias

judoboy
13-05-2003, 10:45:13
Intentaré explicarme mejor.
Quiero actualizar el stock de mis artículos cuando estén servidos.
Pero no consigo hacerlo bien.

Muestro en un DBGrid los artículos para que el usuario los vea.
Y a continuación filtro por el pedido para realizar solo el UPDATE de los artículos de dicho pedido.

Ejemplo: tengo un pedido con 2 artículos uno tiene cantidad 4 y el otro tiene cantidad 5.

Si hago el UPDATE sin la clausula where me actualiza ambos artículos con la suma de las dos cantidades es decir, en 9 artículos más.

Mientras que si hago el UPDATE con la clásula where que puesto antes, solo me actualiza el 2º artículo pero con la suma de las dos cantidades, es decir, me suma 9 al stock del 2º artículo, pero en el 1º no hace nada.

Lo que quiero es que me actualice 4 en el 1º artículo y 5 en el 2º,
en este ejemplo claro está.


Me he explicado mejor?

__cadetill
13-05-2003, 13:23:27
Si utilizas un SGBD, te recomiendo los triggers. Si no, no te quedara mas remedio que hacer un bucle recorriendo todo el detalle del pedido y, por cada linea, lanzar el SQL de Update con la clausula where del codigo del articulo. Pero claro, este bucle no puedes (un consejo mio, claro) ponerlo en ningun evento del TDataSet o TDataSource, mejor ponlo en un boton o al validar la pantalla o algo por el estilo.

Espero que ahora si arreglemos tu problema ;)

P.D. : gracias por editar el post :D

jceluce
13-05-2003, 13:36:44
Yo haría algo así:

Data:=DBGLineasPedido.DataSource.DataSet;
Data.First;

while not (Data.Eof) do

begin
//HAGO en UPDATE

//Supongo que es CODIGO de Articulo está en la primer columna
//del DBGrid (DBGLineasPedido.Fields[0].Value)

Query1.Sql.Text := 'UPDATE ARTICULOS SET STOCK=STOCK+"'+DBGLineasPedido.Fields[2].Value+'"' +
'WHERE CODIGO_ARTICULO = "'+DBGLineasPedido.Fields[0].Value+'"';




Data.Next;

end;

judoboy
13-05-2003, 13:59:06
Jceluce, te quiero, ya me funciona bien :D :D :cool:

judoboy
13-05-2003, 14:02:38
Por cierto no os pongais celosos los demás: cadetill, roman..;)