PDA

Ver la Versión Completa : Crear una Consulta Tquey con parámetros


GerTorresM
06-08-2007, 00:35:05
Hola a todos

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


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
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
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:

ParamaByName('CodigoPresupuestal').AsString:= ECodigoPresupuestal.Text;

Espero te ayude.

GerTorresM
06-08-2007, 15:58:34
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:


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
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
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.