PDA

Ver la Versión Completa : Realizar un Update en delphi con un query concondicion desde otro query!!!


rotsen26
06-03-2013, 00:43:53
Buenas tardes, como dice en el título, necesito hacer un update en un query con la condicion agarrandolo de otro query, si alguien puede ayudareme se lo agradecería mucho...

ecfisa
06-03-2013, 00:47:29
Buenas tardes, como dice en el título, necesito hacer un update en un query con la condicion agarrandolo de otro query, si alguien puede ayudareme se lo agradecería mucho...
Hola rotsen26.

Por favor reformula tu pregunta de forma mas detallada, realmente no se entiende el contenido.

Saludos.

rotsen26
06-03-2013, 00:51:10
with qry_consumo do
begin
close;
sql.text:=' update det_consumo set estatus='+Quotedstr('DEV')+
' where pk_consumo = pk_consumo ';
ExecSQL;

les pongo el codigo que estoy utilizando en la consulta... En el where pk_consumo = pk_consumo

el pk_consumo lo quero igualar con el pk_consumo pero este está en un query... y es por eso que no se como hacer referencia a ese campo dentro del query...

ecfisa
06-03-2013, 01:58:38
Hola rotsen26.

Si no te entiendo mal, creo que sería:

with qry_consumo do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE DET_CONSUMO SET ESTATUS = :PSTATUS');
SQL.Add('WHERE PK_CONSUMO = :PCONSUMO');
ParamByName('PSTATUS').AsString := 'DEV';
ParamByName('PCONSUMO').Value := El_Otro_Qry.FieldByName('PK_CONSUMO').Value;
ExecSQL;
end;


Saludos.

rotsen26
06-03-2013, 02:32:41
with qry_consumo do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE DET_CONSUMO SET ESTATUS = :PSTATUS');
SQL.Add('WHERE PK_CONSUMO = :PCONSUMO');
ParamByName('PSTATUS').AsString := 'DEV'; //marca error en el AsString
ParamByName('PCONSUMO').Value := El_Otro_Qry.FieldByName('PK_CONSUMO').Value;
ExecSQL;
end;

El error dice 'TParameter' deos not contain a member named 'AsString'

Saludos!!!

Te comente el error...

ecfisa
06-03-2013, 04:00:28
Hola rotsen26.

...
El error dice 'TParameter' deos not contain a member named 'AsString'

Saludos!!!

Te comente el error...
Es posible... el código que te puse es orientativo, no todos los componentes poseen las mismas propiedades y métodos. Algunos, como por ejemplo TADOQuery, no admiten la propiedad AsString en los parámetros. Y entre los detalles que has omitido está el tipo de componentes con los que te conectas (también que SGBD (http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datos) estas usando).

Intentá de este modo:
ParamByName('PSTATUS').Value:= 'DEV';
Si no funciona, comentanos con que componentes y SGBD estas trabajando

Prácticamente no hay límites en los caracteres que podes incluir en un mensaje, acostumbrate a detallar minuciosamente el problema y el ambiente en que se produce. Cuanta mas información brindes sobre la situación mas rápidamente se solucionará.

Saludos.:)

rotsen26
09-03-2013, 18:34:26
Hola rotsen26.

Es posible... el código que te puse es orientativo, no todos los componentes poseen las mismas propiedades y métodos. Algunos, como por ejemplo TADOQuery, no admiten la propiedad AsString en los parámetros. Y entre los detalles que has omitido está el tipo de componentes con los que te conectas (también que SGBD (http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datos) estas usando).

Intentá de este modo:
ParamByName('PSTATUS').Value:= 'DEV';
Si no funciona, comentanos con que componentes y SGBD estas trabajando

Prácticamente no hay límites en los caracteres que podes incluir en un mensaje, acostumbrate a detallar minuciosamente el problema y el ambiente en que se produce. Cuanta mas información brindes sobre la situación mas rápidamente se solucionará.

Saludos.:)



Exactamente ese código utilicé, y ya me funciona, bueno, me funciona a medias.. Porque de hace 2 días a hoy, hace la deolucion de mercancia, pero hace de todo lo que se había agregado, y antes solo me devolvía la que se seleccionaba...

Te pongo el codigo que estoy utilizando!!!

if sendMessage('Información','¿Está seguro de devolver el Artículo?',mb_yesno + mb_iconquestion)= IDNO then
exit;
with qry_dev do
begin
Close;
SQL.Clear;
SQL.Add('UPDATE DET_CONSUMO dc, det_alm_art daa SET dc.ESTATUS = :PSTATUS, dc.comentario=: DBMemo1, daa.existencia=:exi');
SQL.Add('WHERE PK_CONSUMO = :PCONSUMO');
Parameters.ParamByName('PSTATUS').Value := 'DEV';
Parameters.ParamByName('DBMemo1').Value := DBMemo1.Text;
Parameters.ParamByName('PCONSUMO').Value := qry_consumo.FieldByName('PK_CONSUMO').Value;
Parameters.ParamByName('exi').Value:=(qry_consumoexistencia.Value)+1;
ExecSQL;
end;


despegué los : de memo porque ponía una carita!!!

ecfisa
09-03-2013, 20:07:43
Hola rotsen26.

Esta es tu sentencia SQL:

UPDATE DET_CONSUMO dc, det_alm_art daa
SET dc.ESTATUS = :PSTATUS,
dc.comentario=: DBMemo1, /* Error: Aquí hay un espacio entre ':' y DBDemo1 */
daa.existencia=:exi
WHERE PK_CONSUMO = :PCONSUMO

Según entiendo, estas intentando modificar múltiples tablas con [UPDATE (http://www.w3schools.com/sql/sql_update.asp)] mediante esa sentencia SQL.
Al menos en los [SGBD (http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datos)] que conozco y hasta donde sé, no es posible.

Por otro lado todavia sigues sin mencionar cuál SGBD estas utilizando... Infiero que los componentes que utilizas deben ser ADO por el uso de la propiedad Parameters.

Es por eso que insistimos en la importancia de brindar la mayor información posible !!!

Saludos.

rotsen26
09-03-2013, 21:12:04
Hola rotsen26.

Esta es tu sentencia SQL:

UPDATE DET_CONSUMO dc, det_alm_art daa
SET dc.ESTATUS = :PSTATUS,
dc.comentario=: DBMemo1, /* Error: Aquí hay un espacio entre ':' y DBDemo1 */
daa.existencia=:exi
WHERE PK_CONSUMO = :PCONSUMO

Según entiendo, estas intentando modificar múltiples tablas con [UPDATE (http://www.w3schools.com/sql/sql_update.asp)] mediante esa sentencia SQL.
Al menos en los [SGBD (http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datos)] que conozco y hasta donde sé, no es posible.

Por otro lado todavia sigues sin mencionar cuál SGBD estas utilizando... Infiero que los componentes que utilizas deben ser ADO por el uso de la propiedad Parameters.

Es por eso que insistimos en la importancia de brindar la mayor información posible !!!

Saludos.

Por si no leíste al último hice un comentario el porque había despegado los :. Y estoy utilizando MySQL. Con ADOQuery y DataSource, el problema es que solo quiero quitar un regristro de la base de datos, pero al darle clic al boton se me quitan todos los que aparecen en el GRID...

ecfisa
09-03-2013, 22:17:47
.., el problema es que solo quiero quitar un regristro de la base de datos, pero al darle clic al boton se me quitan todos los que aparecen en el GRID...
Hola.

Si estas usando un sólo TADOQuery, tanto para mostrar los resultados como para realizar el update y este asociado a un DBGrid, tenes que salvar la sentencia SQL anterior y restaurarla luego de realizar la operación:

var
BackSQL: string;
begin
with qry_dev do
begin
BackSQL := SQL.Text;
(*
...
Aqui la operación anterior (tu código)
...
*)
Close;
SQL.Text:= BackSQL;
Open;
end;
...

Por si no leíste al último hice un comentario el porque había despegado los :
Había leido, pero no entendí a que te referías. Te comento que existen las etiquetas :D para eliminar ese efecto, ejemplo:

SQL.Add('UPDATE DET_CONSUMO dc, det_alm_art daa SET dc.ESTATUS = :PSTATUS, dc.comentario=:DBMemo1,...');

Encontrarás todo acerca ellas aqui: [Etiquetas vB (http://www.clubdelphi.com/foros/misc.php?do=bbcode)]


Por otro lado, según estos enlaces, parece que MySQL (motor que no conozco) si permite realizar ese tipo de sentencias:

UPDATE multiple tables with one UPDATE statement (http://forums.mysql.com/read.php?20,85813,85816#msg-85816)
MySQL, update multiple tables with one query (http://stackoverflow.com/questions/4361774/mysql-update-multiple-tables-with-one-query)
How to update two tables in one statement? (http://stackoverflow.com/questions/1871537/how-to-update-two-tables-in-one-statement)


Saludos.