Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-08-2015
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Poder: 11
wilcg Va por buen camino
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;
Responder Con Cita
  #2  
Antiguo 01-08-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #3  
Antiguo 02-08-2015
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
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;
Responder Con Cita
  #4  
Antiguo 02-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 03-08-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
  #6  
Antiguo 03-08-2015
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Poder: 11
wilcg Va por buen camino
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.

Última edición por wilcg fecha: 03-08-2015 a las 04:35:37.
Responder Con Cita
  #7  
Antiguo 03-08-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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!
Responder Con Cita
  #8  
Antiguo 03-08-2015
wilcg wilcg is offline
Miembro
 
Registrado: abr 2014
Posts: 107
Poder: 11
wilcg Va por buen camino
AgustinOrtu, ya comprendí gracias a ti y a los demás por sus valiosos aportes.
Responder Con Cita
  #9  
Antiguo 03-08-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El registro a modificar (o los registros que quieras modificar) van en el where.
Cita:
Empezado por Casimiro Notevi Ver Mensaje
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.
Responder Con Cita
  #10  
Antiguo 03-08-2015
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Cita:
Empezado por ecfisa Ver Mensaje
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!
Responder Con Cita
  #11  
Antiguo 03-08-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Claro, la culpa siempre es de los otros
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
cual es la mejor forma de trabajar con blob anubis Lazarus, FreePascal, Kylix, etc. 44 22-09-2012 17:23:53
Cual es la mejor forma de conectar con la BD GerTorresM Conexión con bases de datos 1 11-01-2010 16:51:47
Cual es la Mejor forma de Agregar,Modificar y Eliminar en ADO ? LENOCB Varios 50 07-01-2008 04:04:47
cual es la mejor forma de logearse a mysql... Arturo MySQL 1 11-10-2006 17:45:01
cual es la mejor forma ? martita Varios 14 07-07-2005 19:35:55


La franja horaria es GMT +2. Ahora son las 16:45:46.


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
Copyright 1996-2007 Club Delphi