Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-12-2007
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
Question Pasar parámetros a sentencia SQL con DBExpress

Toda la tarde leyendo y haciendo pruebas y no hay manera

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?
Responder Con Cita
  #2  
Antiguo 13-12-2007
BertHauser BertHauser is offline
Registrado
 
Registrado: dic 2007
Posts: 3
Poder: 0
BertHauser Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 13-12-2007
Oriol Carreras Oriol Carreras is offline
Registrado
 
Registrado: mar 2007
Posts: 3
Poder: 0
Oriol Carreras Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 14-12-2007
Josepo Josepo is offline
Miembro
 
Registrado: nov 2007
Ubicación: Barcelona
Posts: 14
Poder: 0
Josepo Va por buen camino
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?

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?

Gracias.
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
Pasar parametro a una sentencia sql molinero1 SQL 23 12-04-2007 17:55:22
Pasar parametros.... Coco_jac SQL 2 02-09-2006 04:28:16
Como obtener los parametros para dbexpress al conectarme por odbc..! Arturo Conexión con bases de datos 2 20-05-2006 00:51:42
Error con parámetros en SQL server y dbexpress jdiazan Conexión con bases de datos 0 09-07-2004 09:38:25
pasar una variable a una sentencia sql acrophet SQL 6 03-11-2003 17:01:02


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


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