Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear una Consulta Tquey con parámetros (https://www.clubdelphi.com/foros/showthread.php?t=46644)

GerTorresM 06-08-2007 00:35:05

Crear una Consulta Tquey con parámetros
 
Hola a todos

Estoy intentando crear un consulta que maneja parámetros, para el efecto empleo el siguiente codigo:

Código:

QDisponibilidades:= Tquery.Create(self);
 with QDisponibilidades do
  begin
    DatabaseName:= 'DBMilenium';
    close;
      sql.Clear;
      sql.Add(' SELECT Disponibilidad.CodigoDisponibilidad,  Disponibilidad.FechaExpedicion, Disponibilidad.Objeto, Disponibilidad.Valor, AnteproyectoGastos.CodigoPresupuestal '+
              ' FROM (Recurso INNER JOIN (AnteproyectoGastos INNER JOIN GastosRecursos ON AnteproyectoGastos.CodigoPresupuestal = GastosRecursos.CodigoPresupuestal) ON Recurso.CodigoRecurso = GastosRecursos.CodigoRecurso) INNER JOIN '+
              ' (Disponibilidad INNER JOIN DisponibilidadRubro ON Disponibilidad.CodigoDisponibilidad = DisponibilidadRubro.CodigoDisponibilidad) ON (AnteproyectoGastos.CodigoPresupuestal = DisponibilidadRubro.CodigoPresupuestal) AND '+
              ' (Recurso.CodigoRecurso = DisponibilidadRubro.CodigoRecurso) '+
              ' WHERE AnteproyectoGastos.CodigoPresupuestal=:CodigoPresupuestal'
              ' order by Disponibilidad.CodigoDisponibilidad');
      try
        ParamaByName('CodigoPresupuestal').Value:= ECodigoPresupuestal.Text;
        Open;
      if RecordCount < 1 then
          MessageDlg('No existen dispobilidades con este rubro',MTInformation,[MbOk],0);
      Except
      end;
end;

Bien el caso en concreto es el siguiente:

Cuando ejecuto el código, me envia una error, por que no existe el párametro, entonces como puedo crear el parametro antes de ejecutar la consulta?


Gracías de Antemano

GertorresM
Colombia

Caral 06-08-2007 00:49:36

Hola
Sin saber que base de datos usas, que componentes es un poco dificil, ya que en access pasan cosas diferentes que en sql u firebird en cuanto a parametros.
Por curiosidad coloca la sentencia sql en el sql string del query, esto creara el parametro, ejecutalo de nuevo, tal vez camine.
Saludos

GerTorresM 06-08-2007 03:11:25

Re.
 
En la actualidad estoy utilizando lo siguiente

Delphi 6 Enterprise
Conexion Mediante BDE
Base de Datos MS Access

y aprovecho para preguntarte lo mismo cuando uso PostGreSQL, mediante el empleo de herramientas Zeos

egbaquela 06-08-2007 05:10:14

Crear una Consulta Tquey con parámetros
 
Posiblemente sea un error al copiar el código, pero la propiedad "ParamByName" la escribiste mal, quizas sea eso.
Igual trata de usar espacios entre el '=' y el ':' en la sentencia SQL (donde referencias al parámetro), a veces lo interpreta mal.
Saludos, Gabriel.

Amos 06-08-2007 14:24:12

Hola GerTorresM cuando yo uso este tipo de parametros lo que hago es definir el tipo de dato, dependiendo de la columna en tu BD.

Supongo que tu columna CodigoPresupuestal es de tipo String entonces la columna es como String, por lo tanto sería:

Código Delphi [-]
ParamaByName('CodigoPresupuestal').AsString:= ECodigoPresupuestal.Text;

Espero te ayude.

GerTorresM 06-08-2007 15:58:34

Tema Concluido
 
Gracias por toda la colaboración dada, al parecer era un error al digitar el código, lo he corregido y funciona de las mil maravillas, aprovecho para lanzar otra pregunta:

cuando se ejecuta la consulta ésta llena un DBGrid, un de los campos es de fecha y se la llenado previamente con un DateTimePicker, por lo tanto el registro guarda la hora y fecha, bien en el grilla de datos (DBGrid) aprece en este campo tanto hora como fecha, como podría establer una mascara para la fecha si los campos que llenan el dbgrid propienen de la consulta que estaba creando anteriormente.


Gracias de Antemano


GerTorresM
Colombia

ContraVeneno 06-08-2007 16:10:46

Un comentario nada más. Como supongo ya sabes, puedes agregar una sentencia SQL a un TQuery utilizando la propiedad Text, o en tu caso, utilizando la función Add, la diferencia entre uno y otro, es que Text te lo pone todo en una sola línea de texto y utilizando Add, la instrucción estará dividida en líneas.

En tu caso, estas utilizando Add como se utilizaría Text, perdiendo así la ventaja que tiene Add sobre Text, vamos, que es como tener un coche y nunca usarlo.

Yo te recomendaría que utilizaras Add en cada línea de la instrucción SQL:
Código Delphi [-]
  

sql.Add(' SELECT Disponibilidad.CodigoDisponibilidad,  Disponibilidad.FechaExpedicion, Disponibilidad.Objeto, Disponibilidad.Valor, AnteproyectoGastos.CodigoPresupuestal ');
sql.Add(' FROM (Recurso INNER JOIN (AnteproyectoGastos INNER JOIN GastosRecursos ON AnteproyectoGastos.CodigoPresupuestal = GastosRecursos.CodigoPresupuestal) ON Recurso.CodigoRecurso = GastosRecursos.CodigoRecurso) ');
SQL.Add(' INNER JOIN (Disponibilidad INNER JOIN DisponibilidadRubro ON Disponibilidad.CodigoDisponibilidad = DisponibilidadRubro.CodigoDisponibilidad) ON (AnteproyectoGastos.CodigoPresupuestal = DisponibilidadRubro.CodigoPresupuestal) ');
SQL.Add(' AND (Recurso.CodigoRecurso = DisponibilidadRubro.CodigoRecurso) ');
sql.Add(' WHERE AnteproyectoGastos.CodigoPresupuestal=:CodigoPresupuestal');
sql.Add(' order by Disponibilidad.CodigoDisponibilidad');

GerTorresM 06-08-2007 18:59:28

Gracias por el consejo
 
Muchas gracias por tu consejo, estoy seguro que esto facilitara el manetnimiento del código


GerTorresM

Amos 07-08-2007 15:06:31

Si quieres mostrar solo la fecha en una columna en el DBGrid entonces:

Tienes que agregar las columnas a tu Query para conseguir modificar la forma en que se muestran las columnas, esto se consigue realizando un doble-clic en el TQuery

Despues con el botón derecho en el dialogo que se muestra utilizar "Add fields...". Seleccionas las columnas que desees.

Entonces edita la propiedad "DisplayFormat" y le colocas una mascara como esta :"dd/mmm/yyyy", con esto consigo que se muestra la columna fecha como "12/May/2007"

Espero que te sirva y que me entiendas:D

GerTorresM 08-08-2007 13:06:09

Gracias por las respuestas
 
Gracías por tu tiempo y por la respuesta, si cuando trabajas bajando los componentes de las barra de herramientas, es muy funcional la aplicación de lo escrito en tu respuesta, pero cuando estas creando el objeto en tiempo de ejecución resulta poco aplicable.

Lo que sucede en este caso es que la consulta puede llegar a variar ya que la escribe el usuario, entonces como te das cuenta no sabes los nombres de los campos resultantes y muchos menos los tipos de datos que te devuleve.

Desde este punto de vista es que pregunto si puedo de alguna manera agregar los campos y establecer de acuerdo al tipo de dato manejado algún tipo de formato de datos.


La franja horaria es GMT +2. Ahora son las 13:15:16.

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