Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Update repetido el primero Funciona pero el segundo no (https://www.clubdelphi.com/foros/showthread.php?t=95942)

giantonti1801 04-11-2022 02:15:19

Update repetido el primero Funciona pero el segundo no
 
Hola amigo tengo una consulta tengo esta instrucion pegada a un boton

Código Delphi [-]
 Begin
           ADOQueryUpdate.Open;
            ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
            ADOQueryUpdate.Parameters.ParamByName ('Estatus').Value := 'OLD';
            ADOQueryUpdate.Parameters.ParamByName ('Usuario').value := Label4.Caption;
            ADOQueryUpdate.Parameters.ParamByName ('Item').value := Label3.Caption;
            ADOQueryUpdate.ExecSQL;
            ShowMessage ('LO GRABE');
                begin
                ADOQuery1.Close;
                ADOQuery1.Open;
                    begin
                     Label1.Caption := 'A00' + ADOQuery1.fieldbyname('Item').asstring;
                     Label3.Caption := ADOQuery1.fieldbyname('Item').asstring;
                     Image3.Visible := true;
                     ShowMessage ('SIGUIENTE');
                     
                     end

Cuando lo ejecuto por primera vez me funciona perfecto pero al ejecutarlo por segunda vez me da error, posiblemente hay algo que esto dejando abierto o cerrado o no lo se pero no me deja avanzar,

giantonti1801 04-11-2022 02:23:30

Update fecha actual
 
hola amigo, quiero al momento de hace un update colocar tambien que me guarde DATETIME() NOW

Código Delphi [-]
ADOQueryUpdate.Open;
            ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
            ADOQueryUpdate.Parameters.ParamByName ('Estatus').Value := 'OLD';
            ADOQueryUpdate.Parameters.ParamByName ('Usuario').value := Label4.Caption;
            ADOQueryUpdate.Parameters.ParamByName ('Item').value := Label3.Caption;
            ADOQueryUpdate.ExecSQL;

quiero incorporarlo aqui en esta instrucion mi campo en la base de datos es de tipo TIMESTAMP yo se que la mejor forma de hacer es a travez de un tiger en la base de datos pero no supe hacerlo. Cabe destacar que ya tengo un campo de la base de datos de tipo timestamp la cual se guarda la fecha y hora al momento de crear un registro, pero quiero hacer uno tambien que guarde la fecha y la hora de las modificaciones.

duilioisola 04-11-2022 08:53:20

Deberías mencionar el texto del error, pero yo apostaría a que te dice que el SQL no está bien formado.

Código Delphi [-]
Begin
   ADOQueryUpdate.Open;
   // Primero borro lo que hubiera, ya que la segunda vez se agregará otra línea al SQL
   ADOQueryUpdate.SQL.Clear;
   ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
...

También supongo que para poder modificar el SQL deberías tener el ADOQuery Cerrado (haciendo ADOQueryUpdate.Close).

duilioisola 04-11-2022 09:02:32

Para que guarde la fecha de modificación lo mejor, como comentas, es hacerlo por trigger.
Suele ser sencillo. Por ejemplo, en Firebird sería algo así
Código SQL [-]
create trigger ticket_bu0 for ticket active before update position 0
as
begin
    new.fecha_ultima_modificacion = 'NOW';
end

Si lo quieres hacer en el update sería parecido:
Código Delphi [-]
ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario, fecha_ultima_modificacion = ''NOW'' WHERE Item = :Item');

A tener en cuenta: ¿Qué fecha deseas utilizar?
La del servidor de base de datos o la del ordenador que ejecuta la aplicación.
Puede ser que el ordenador esté en España y el servidor hospedado en Estados Unidos, con una diferencia horaria que necesitas tener en consideración.

Si deseas la fecha del ordenador, deberás pasarla por parámetro:
Código Delphi [-]
ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario, fecha_ultima_modificacion = :fecha_ultima_modificacion WHERE Item = :Item');
...
ADOQueryUpdate.Parameters.ParamByName ('fecha_ultima_modificacion').Value := Now;

Casimiro Notevi 04-11-2022 09:52:20

Cita:

Empezado por giantonti1801 (Mensaje 548962)
...

Creo que ya es momento de que le eches un vistazo a nuestra guía de estilo, gracias.

giantonti1801 04-11-2022 12:15:36

Cita:

Empezado por duilioisola (Mensaje 548964)
Deberías mencionar el texto del error, pero yo apostaría a que te dice que el SQL no está bien formado.

Código Delphi [-]
Begin
   ADOQueryUpdate.Open;
   // Primero borro lo que hubiera, ya que la segunda vez se agregará otra línea al SQL
   ADOQueryUpdate.SQL.Clear;
   ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
...

También supongo que para poder modificar el SQL deberías tener el ADOQuery Cerrado (haciendo ADOQueryUpdate.Close).

gracias, pero en que momento o parte del codigo los cierro con ADOQueryUpdate.Close porque creeme no se si sera esto pero me sigue dando error.

Código Delphi [-]
ADOQueryUpdate.Open;
            ADOQueryUpdate.SQL.Clear;
            ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
            ADOQueryUpdate.Parameters.ParamByName ('Estatus').Value := 'OLD';
            ADOQueryUpdate.Parameters.ParamByName ('Usuario').value := Label4.Caption;
            ADOQueryUpdate.Parameters.ParamByName ('Item').value := Label3.Caption;
            ADOQueryUpdate.ExecSQL;

kuan-yiu 04-11-2022 15:18:48

Te estás complicando demasiado por querer ir rápido. Como te han recomendado te iría bien un repaso general sobre SQL y componentes Delphhi que manejan SQL.
Prueba cada sentencia SQL contra la BD que usas, consulta la ayuda de Delphi, la de la BD, busca en Google...

Siempre es bueno parametrizar (o sea poner "=:") porque evita ciertos errores y problemas.

Siempre que lo sepas PASA EL PARÁMETRO CON TIPO.
Usar ".Value" solo para casos muy concretos en los que no puedas concretar, porque sino puedes tener problemas con los nulos, los blancos... y deberías especificar el tipo de parámetro lo que lo complica todo mucho más y resulta innecesario para lo que necesitas.

".AsString" si es string, varchar...
".AsInteger" si es integer...
".AsFloat" si es extended, double...
Código Delphi [-]
// Aquí defines la consulta
ADOQueryUpdate.SQL.Clear;
ADOQueryUpdate.SQL.ADD('update tiket set Estatus = :Estatus,Usuario= :Usuario WHERE Item = :Item');
ADOQueryUpdate.prepare; // Con esto le dices que la vas a usar muchas veces

// Ejecutas SOLO esto por cada modificación
ADOQueryUpdate.ParamByName ('Estatus').AsString:= 'OLD';
ADOQueryUpdate.ParamByName ('Usuario').AsString:= Label4.Caption;
// Si 'Item' es tipo entero o float ponlo y transforma el caption como corresponda: strToInt(Label3.Caption)
ADOQueryUpdate.ParamByName ('Item').AsString:= Label3.Caption; 
ADOQueryUpdate.ExecSQL;

Casimiro Notevi 04-11-2022 18:11:04

Es que va dando palos de ciego por todos lados, así no sirve porque, aunque consiguiera hacerlo funcionar, no sabría el porqué funcionó.


La franja horaria es GMT +2. Ahora son las 21:10:58.

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