Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error SQL - UPDATE _ SET (https://www.clubdelphi.com/foros/showthread.php?t=91164)

pepe1853 22-11-2016 21:35:42

Error SQL - UPDATE _ SET
 
Buenas tardes , les comento mi inquietud no encuentro manera de ejecutar mi consulta update
al ejecutarla parece que funciona todo bien con el mensaje de una supuesta inserción, pero luego me figura el siguiente error Token unknow - line1, colum9 SET

Código Delphi [-]
procedure TForm4.btnAceptarClick(Sender: TObject);

   var
    pro_IDproducto:String;
    pro_Nombre: String;
    pro_IDproveedor: String;
    pro_precioventa: String;
    pro_preciocosto: String;
    pro_stock: String;
    pro_estado: String;
    pro_categoria: String;
    consulta: String;

    begin
    pro_IDproducto:= DBEdit8.Text;
    pro_nombre:= DBENombre.Text;
    pro_IDproveedor:= DBEdit1.Text;
    pro_precioventa:= DBEPVenta.Text;
    pro_preciocosto:= DBEPCosto.Text;
    pro_stock:= DBEStock.Text;
    pro_estado:= DBEEstado.Text;
    pro_categoria:=DBECategoria.Text;


consulta:='UPDATE PRODUCTOS SET PRO_IDPROVEEDOR=:'+pro_IDproveedor+', PRO_NOMBRE=:'+pro_nombre+', PRO_PRECIOVENTA=:'+pro_precioventa+',
PRO_PRECIOCOSTO=:+'pro_preciocosto+', PRO_STOCK=:'+pro_stock+', PRO_ESTADO=:'+pro_estado+', PRO_CATEGORIA=:'+pro_categoria+' WHERE PRO_IDPRODUCTO=:'+pro_IDproducto+'';

    SQLQPROVEEDORES.SQL.text:=consulta;
    SQLQPROVEEDORES.ExecSQL;
    SQLQPROVEEDORES.ApplyUpdates;
    ShowMessage(consulta);

Espero por favor que alguien me pueda auxiliar! Gracias de antemano.

creo que lo publique en el sector equivocado al tema,por favor alguien lo podría mover si es así gracias!

ecfisa 23-11-2016 00:01:34

Hola pepe 1853, bienvenido a los foros de Club Delphi :) y como acostumbramos con los que ingresan te invitamos a que leas nuestra guía de estilo.

No revisé a fondo el código de la sentencia SQL pero en principio tendrías que usar la función QuotedStr al modo de:
Código Delphi [-]
  consulta := 'UPDATE PRODUCTOS SET PRO_IDPROVEEDOR=: '+ QuotedStr(pro_IDproveedor) + ...
Pero, de todos modos te aconsejo que acostumbres a usar parámetros, evita la inyección SQL y además es mucho mas claro de visualizar.

La modidificación que deseas hacer usando parámetros, quedaría mas o menos así:
Código Delphi [-]
...
var
  qy: TSQLQuery;
begin
  qy := SQLQPROVEEDORES;
  qy.Close;
  qy.SQL.Clear;
  qy.SQL.Add('UPDATE PRODUCTOS');
  qy.SQL.Add('SET PRO_IDPROVEEDOR = :IDPROVEED, PRO_NOMBRE = :NOMBRE,');
  qy.SQL.Add('PRO_PRECIOVENTA = :PVENTA, PRO_PRECIOCOSTO = :PCOSTO,');
  qy.SQL.Add('PRO_STOCK = :STOCK, PRO_ESTADO = :ESTADO, PRO_CATEGORIA = :CATEG');
  qy.SQL.Add('WHERE PRO_IDPRODUCTO = :IDPRODUC');
  qy.ParamByName('IDPROVEED').Value := DBEdit1.Text;;
  qy.ParamByName('NOMBRE').Value    := DBENombre.Text;
  qy.ParamByName('PVENTA').Value    := DBEPVenta.Text;
  qy.ParamByName('PCOSTO').Value    := DBEPCosto.Text;
  qy.ParamByName('STOCK').Value     := DBEStock.Text;
  qy.ParamByName('ESTADO').Value    := DBEEstado.Text;
  qy.ParamByName('CATEG').Value     := DBECategoria.Text;
  qy.ParamByName('IDPRODUC').Value  := DBEdit8.Text;
  qy.ExecSQL;
...

Saludos :)

pepe1853 23-11-2016 05:24:38

Muchas gracias ecfisa por tu respuesta y la bienvenida :), tuve en cuenta todo lo que me comentaste, probé de las dos maneras, la primera por inyección agregándole la función que me señalaste, me funciona de igual manera que como lo tenia planteado anteriormente, parece que funciona pero cuanto toco refresh en la dbgrid me tira exactamente el mismo error, la segunda que me proporcionaste me tira el siguiente error "invalid varian type cast", ya no se que hacer, mi consulta insert funciona de maravilla pero con el update no logro hacerla funcionar. agrego como esta confeccionada mi tabla de datos por las dudas.
Código SQL [-]
PRO_IDPRODUCTO:  INTEGER
PRO_IDPROVEEDOR: INTEGER
PRO_NOMBRE: VARCHAR
PRO_PRECIOVENTA: FLOAT
PRO_PRECIOCOSTO: FLOAT
PRO_STOCK : SAMLLINT
PRO_ESTADO: CHAR(40)
PRO_CATEGORIA: CHAR (40)

Espero poder encontrar una solución, y muchísimas gracias por tu tiempo!
Saludos! :)

ecfisa 23-11-2016 06:24:11

Cita:

Empezado por pepe1853 (Mensaje 511126)
...
la segunda que me proporcionaste me tira el siguiente error "invalid varian type cast", ya no se que hacer, mi consulta insert funciona de maravilla pero con el update no logro hacerla funcionar. agrego como esta confeccionada mi tabla de datos por las dudas.
Código SQL [-]
PRO_IDPRODUCTO:  INTEGER
PRO_IDPROVEEDOR: INTEGER
PRO_NOMBRE: VARCHAR
PRO_PRECIOVENTA: FLOAT
PRO_PRECIOCOSTO: FLOAT
PRO_STOCK : SAMLLINT
PRO_ESTADO: CHAR(40)
PRO_CATEGORIA: CHAR (40)

Dado el mensaje de error que mencionas, intenta asignar los valores de las columnas indicando su tipo:
Código Delphi [-]
...  
  qy.ParamByName('IDPROVEED').AsInteger := StrToInt( DBEdit1.Text );     // o, DBEdit1.Field.AsInteger; ...
  qy.ParamByName('NOMBRE').AsString     := DBENombre.Text;
  qy.ParamByName('PVENTA').AsFloat      := StrToFloat( DBEPVenta.Text ); // o, DBEPVenta.Field.AsFloat; ...
  qy.ParamByName('PCOSTO').AsFloat      := StrToFloat( DBEPCosto.Text );
  qy.ParamByName('STOCK').AsInteger     := StrToInt( DBEStock.Text );
  qy.ParamByName('ESTADO').AsString     := DBEEstado.Text;
  qy.ParamByName('CATEG').AsString      := DBECategoria.Text;
  qy.ParamByName('IDPRODUC').AsInteger  := StrToInt(DBEdit8.Text);
...
Estoy suponiendo que usas los componentes dbExpress, lo anterior podría no ser así con otros. Por cierto, ¿ A que RDBMS te estas conectando ?

Saludos :)

pepe1853 23-11-2016 18:34:31

Muchísimas gracias ecfisa!!!! me funciono perfecto asignándole los valores de las columnas indicando su tipo , quedó de mil maravillas!! v:-)vv:-)vv:-)v||-||||-||||-||#:-)##:-)##:-)#


La franja horaria es GMT +2. Ahora son las 17:16:52.

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