Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Cual es la mejor forma de modificar un registro? (https://www.clubdelphi.com/foros/showthread.php?t=88796)

wilcg 01-08-2015 18:43:22

Cual es la mejor forma de modificar un registro?
 
Hola, quiero saber cual es la manera correcta y eficiente para modificar un registro.
tengo estos códigos pero no estoy seguro si es la mejor forma. en mi aplicación quiero implementar un código que sea eficiente, la base de datos que uso es firebird.
Código Delphi [-]
  with Query do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select * From Productos');
    SQL.Add('WHERE codigo = ' + codProducto);
    Open;
    Edit;
    FieldByName('fecha_alta').Value := FormatDateTime('DD/MM/YYYY', Date);
    FieldByName('detalle').AsString := Memo1.Lines.Text;
    FieldByName('categoria').AsString := Edit1.Text;
    Post;
  end;
Ó
Código Delphi [-]
with Query do
  begin
    Close;
    SQL.Clear;
    SQL.Text := 'Select * From Productos Order by codigo desc';
    Active := True;
    if Locate('codigo',codProducto,[]) then
    begin
      Open;
      Edit;
      FieldByName('fecha_alta').Value := FormatDateTime('DD/MM/YYYY', Date);
      FieldByName('detalle').AsString := Memo1.Lines.Text;
      FieldByName('categoria').AsString := Edit1.Text;
      Post;
    end;
  end;

Casimiro Notevi 01-08-2015 19:16:17

Ninguna de las dos.

Para modificar datos hay que usar "update", no select.
Código SQL [-]
update productos set fechaalta=:v1, detalle=:v2, categoria=:v3 where codigo=:v4

gatosoft 02-08-2015 18:07:17

No es eficiente... primero, porque intentas manejar un query como si fuese una tabla. Desde hace mucho se ha dicho que el manejo de componentes TTables, en la mayoría de los casos no es recomendado.

Por otro lado, no todos los componentes TQuery te permiten editar sus salidas, debido a que hay resultados complejos que pueden venir de diferentes tablas.

Además no es eficiente que hagas una consulta de todos los Productos... para modificar solo uno de ellos.

En tu segundo código veo una línea que sobra... y es el Open: cuando invocas el "active", implícitamente estas haciendo un open.

Finalmente, Retomando lo que propone Casimiro, deberías hacer algo como:

Código Delphi [-]
 with Query do
  begin
    Close;
    SQL.Clear;
    SQL.Add('update productos set fechaalta=:v1, detalle=:v2, categoria=:v3 where codigo=:v4');
    prepare
    Parambyname('fecha_alta').Value := FormatDateTime('DD/MM/YYYY', Date);
    Parambyname('detalle').AsString := Memo1.Lines.Text;
    Parambyname('categoria').AsString := Edit1.Text;
    ExecSQL;
  end;

ecfisa 02-08-2015 22:12:47

Hola wilcg.

La forma óptima de realizar una modificación mediante un query es la que te indicaron Casimiro y gatosoft.

Pero veo un detalle en el último código, y es que la función ParamByName espera el nombre de parámetro no el de columna, es decir:
Código Delphi [-]
  ...
   ParamByName('v1').Value := FormatDateTime('DD/MM/YYYY', Date);
  ...

Saludos :)

AgustinOrtu 03-08-2015 01:10:35

Yo no usaria FormatDateTime para mandar un parametro de tipo fecha, eso es trabajo de los componentes ADO y el motor SQL

Es decir:

Código Delphi [-]
  ParamByName('Fecha').Value := Now;

Debe funcionar bien ya sea para un ADOQuery, para un IBQuery, para un FDQuery, etc. La idea de los parametros ademas de su seguridad es la flexibilidad que otorgan al abstraerse del tipo de datos y el "como los quiere" el motor bd

wilcg 03-08-2015 04:32:07

Gracias a todos por su ayuda, pero hay algo que no me queda claro.
Como determino el registro que boy a modificar? , teniendo en cuenta que quiero modificar en la consulta un solo registro de muchos. Es por eso que en la consulta le indico que registro quiero modificar por medio de: codProducto que es una variable que contendrá el ID del registro a modificar.

AgustinOrtu 03-08-2015 05:40:03

Se lo indicas con un parametro

Casimiro te propuso usar una sentencia UPDATE .. WHERE. Es el WHERE justamente en donde se indica cual(es) son las fila(s) a modificar

Imaginate una sentencia SQL como esta:

Código SQL [-]
UPDATE Productos SET Precio = 10

Eso hace que todos los productos tengan precio 10

Código SQL [-]
UPDATE Productos SET Precio = :UnPrecio

Esa sentencia hace que todos los productos tengan el valor que se manda en el paraemtro UnPrecio

Código SQL [-]
UPDATE Productos SET Precio = :UnPrecio WHERE Id = :UnId

Y por ultimo, utilizando el WHERE puedo indicar a que producto quiero modificarle el precio. Ese WHERE del update "es el mismo" que el del SELECT; lo que te devolveria el SELECT es lo que seria afectado por el WHERE

Creo que te vendria bien un manual de SQL :)

Saludos!

wilcg 03-08-2015 06:03:32

AgustinOrtu, ya comprendí gracias a ti y a los demás por sus valiosos aportes. ^\||/

Casimiro Notevi 03-08-2015 09:35:57

El registro a modificar (o los registros que quieras modificar) van en el where.
Cita:

Empezado por Casimiro Notevi (Mensaje 495135)
Ninguna de las dos.
Para modificar datos hay que usar "update", no select.Código SQL [-]update productos set fechaalta=:v1, detalle=:v2, categoria=:v3 where codigo=:v4

Edito: Veo que ya te han contestado.
Así que aprovecharé para recomendarte lo mejor de lo mejor: esto.

gatosoft 03-08-2015 16:48:47

Cita:

Empezado por ecfisa (Mensaje 495160)
Hola wilcg.

La forma óptima de realizar una modificación mediante un query es la que te indicaron Casimiro y gatosoft.

Pero veo un detalle en el último código, y es que la función ParamByName espera el nombre de parámetro no el de columna, es decir:
Código Delphi [-]
  ...
   ParamByName('v1').Value := FormatDateTime('DD/MM/YYYY', Date);
  ...

Saludos :)


Tienes razón Eficsa, hice un copypaste de lo que escribio casimiro y el código original copiado por wilcg y no lo analicé... buen apunte!

Casimiro Notevi 03-08-2015 17:44:46

Claro, la culpa siempre es de los otros :p:p:p


La franja horaria es GMT +2. Ahora son las 18:42:32.

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