Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Pasar parámetros a sentencia SQL con DBExpress (https://www.clubdelphi.com/foros/showthread.php?t=51373)

Josepo 13-12-2007 17:46:39

Pasar parámetros a sentencia SQL con DBExpress
 
Toda la tarde leyendo y haciendo pruebas y no hay manera :mad:

Símplemente quiero pasar como parámetro a una sentencia SQL el campo primario escogido de un DBGrid para eliminar el registro de la tabla.

Si paso ese campo a la sentencia SQL como una variable, no hay problema, se ejecuta y borra el registro:

Código Delphi [-]
var   CodigoABorrar: Integer; begin   CodigoABorrar :=  DbGrid1.DataSource.DataSet.FieldByName('cli_id').AsInteger;
  if Application.MessageBox('¿Deseas borrar el cliente seleccionado?', 'Confirmar', MB_ICONQUESTION or MB_YESNO) = idYes then   begin     QrBuscaCliente.SQL.Clear;  
    QrBuscaCliente.SQL.Add('DELETE FROM cliente WHERE cli_id='+ codigoABorrar);
    QrBuscaCliente.ExecSql;
  end;


Pero si lo paso como parámetro, me dice que éste es desconocido:

Código Delphi [-]
 var   codigoABorrar: Integer; begin   CodigoABorrar :=  DbGrid1.DataSource.DataSet.FieldByName('cli_id').AsInteger;
  if Application.MessageBox('¿Deseas borrar el cliente seleccionado?', 'Confirmar', MB_ICONQUESTION or MB_YESNO) = idYes then   begin     QrBuscaCliente.SQL.Clear;     cdsBuscaCliente.Params.ParamByName('cli_id').asInteger:= codigoABorrar;
    QrBuscaCliente.SQL.Add('DELETE FROM cliente WHERE cli_id = :cli_id');
    QrBuscaCliente.ExecSql;
  end;


Donde cdsBuscaCliente es un TClientDataSet y QrBuscaCliente es un TSQLQuery.

Otras cosas que he hecho dentro de las pruebas:
  • En QrBuscaCliente (TSQLQuery), propiedad Params, añado un parámetro llamado cli_id, que corresponde al campo del mismo nombre con Datatype ftInteger
  • En cdsBuscaCliente (TClientDataSet), botón derecho sobre componente y clic a Fetch Params, y obtengo los creados en el query.
Algo no he entendido bien sobre los parámetros, según he visto en el foro cambia ligeramente de unos componentes a otros.

¿alguna sugerencia?

BertHauser 13-12-2007 19:59:40

A ver
 
Estimado:
¿Porque no crea directamente la consulta EN el componente en vez de crearla "al vuelo"?. Acuérdese de poner también que el parámetro es de tipo "input".

BertHäuser

Oriol Carreras 13-12-2007 20:06:49

Simplemente lo que pasa, es que cuando se modifica la propiedad Sql se vuelven a regenerar los parametros, i vacia su valor.
Prueba de poner el sql primero, i luego asigna el valor al parametro.


Tambien puedes dejar el codigo fuente igual, i poner la propiedad SqlQuery.ParamCheck a FALSE. Esto lo que hace es que no se autogeneran los parametros cuando se reescribe el Sql.


Código:

if Application.MessageBox('¿Deseas borrar el cliente seleccionado?', 'Confirmar', MB_ICONQUESTION or MB_YESNO) = idYes
then  begin   
  QrBuscaCliente.SQL.Clear;
  QrBuscaCliente.SQL.Add('DELETE FROM cliente WHERE cli_id = :cli_id');
  cdsBuscaCliente.Params.ParamByName('cli_id').asInteger:= codigoABorrar;
  QrBuscaCliente.ExecSql;
end;

un saludo.

uri.

Josepo 14-12-2007 10:27:54

Gracias por vuestro interés, he ha sido útil.

BertHauser, puse el parámetro a input como dijiste.

Cita:

¿Porque no crea directamente la consulta EN el componente en vez de crearla "al vuelo"?
No acabo de entender qué significa, si lo que quieres decir es en tiempo de diseño, en la propiedad SQL del query, el caso es que no la creo allí porque ya hay otra sentencia SQL que se ejecuta al arrancar (hay un SELECT) y lo que yo hago es aprovechar el mismo componente para, en este caso, hacer un DELETE ("al vuelo").

Oriol, es como tú has dicho, ja funciona. Por algún motivo creí que antes de pasar la instrucción SQL se debía de pasar el parámetro. Funciona correctamente si lo paso con el parámetro del query:

Código Delphi [-]
QrBuscaCliente.ParamByName('cli_id').asInteger:= codigoABorrar;

No funciona si utilizo el parámetro del ClientDataSet

Código Delphi [-]
cdlBuscaCliente.Params.ParamByName('cli_id').asInteger:= codigoABorrar;

Eso me hace plantear una nueva pregunta: ¿qué diferencia hay entre los parámetros del DBQuery con los del ClientDataSet? :confused:

Otra pregunta: cuando ejecuto, borra correctamente el registro de la línea seleccionada en la base de datos, pero en la grid no desaparece. He utilizado DBGrid1.Refresh; también he probado poner False y True el clientDataSet pero así lo único que consigo es tener una excepción Cursor not returned from Query, y posteriormente deja de visualizar lo que había en la grid. ¿hay alguna forma de refrescar si volver a hacer un SELECT sql? :confused:

Gracias.


La franja horaria es GMT +2. Ahora son las 00: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