PDA

Ver la Versión Completa : AdoQuery y Parametros


serhasae
12-10-2020, 02:49:43
ATasm.Active:=False;

ATasm.SQL.Clear;

ATasm.SQL.Text:='SELECT T.PMAX, T.PRECIO '+
'FROM TASM AS T '+
'WHERE T.AGENCIA=:AG AND T.DESTINO=:XS AND (:ES>=T.EMIN AND :ES<=T.EMAX);';


ATasm.Parameters.ParamByName('AG').Value:='ASMMAS';
ATasm.Parameters.ParamByName('XS').Value:='NAP';
ATasm.Parameters.ParamByName('ES').Value:=180.4;

ATasm.Prepared:=True;

ATasm.Active:=True;


Me dice que no encuentra el parametro ES.
He probado a dejarlo sin los parentesis y sigue dando error, los parametros son 2 de tipo string y 1 de tipo float.


Me estoy volviendo loco, a ver si alguien me explica en que estoy fallando, Saludos Marcos si sigues por aqui.

Gracias.

Sergio.

serhasae
12-10-2020, 08:26:34
Lo he solucionado cambiando los parametros por variables y pasandolo todo como texto, pero no entiendo como solucionar este error con los parametros y porque sucede.

Casimiro Notevi
12-10-2020, 11:59:22
No uso ADO, pero por probar:
ATasm.Close;
ATasm.SQL.Text:='SELECT T.PMAX, T.PRECIO '+
'FROM TASM AS T '+
'WHERE T.AGENCIA=:AG AND T.DESTINO=:XS AND (:ES>=T.EMIN AND :EZ<=T.EMAX);';
ATasm.Parameters.ParamByName('AG').Value:='ASMMAS';
ATasm.Parameters.ParamByName('XS').Value:='NAP';
ATasm.Parameters.ParamByName('ES').Value:=180.4;
ATasm.Parameters.ParamByName('EZ').Value:=180.4;
ATasm.Open;

dec
12-10-2020, 12:51:30
Hola a todos,

No soy un experto en el tema, pero, ¿tal vez habría que cambiar el orden de los parámetros? Es decir, en lugar de esto:


(:ES >= T.EMIN AND :ES <= T.EMAX)


... usar esto otro:


(T.EMIN <= :ES AND T.EMAX >= :ES)

fjcg02
12-10-2020, 15:13:13
Si no estoy equivocado, no se puede utilizar dos veces el mismo parametro.

Si le cambias el nombre y le asignas el mismo valor, seguramenta funcionará.


Saludos

Casimiro Notevi
12-10-2020, 18:24:03
Si no estoy equivocado, no se puede utilizar dos veces el mismo parametro.
Si le cambias el nombre y le asignas el mismo valor, seguramenta funcionará.
SaludosJusto lo que he indicado, seguro que es eso.

dec
12-10-2020, 18:38:07
Hola a todos,

Justo lo que he indicado, seguro que es eso.

De ahí que añadiese el parámetro "EZ"... digo, "este hombre, que hace..."... y resulta que estabas acaso dando en el clavo. :D

Tal vez sea entonces eso, en efecto. No le encuentro mucho sentido a tener que indicar diferentes argumentos... al fin y al cabo se trata de "cambiar el parámetro por el valor correspondiente", y, no veo ahí porqué hay que tener diferentes parámetros para los mismos valores...

Claro que tampoco encuentro mucho sentido a lo que yo he propuesto... cambiar el orden de los parámetros... tal vez que estoy acostumbrado a dicho orden, y, el otro me ha llamado la atención, pero, como digo, tampoco vería mucho sentido a una obligación así.

En fin, vamos a ver al final en qué queda todo. :)

Neftali [Germán.Estévez]
13-10-2020, 13:49:45
Creo que aquí hay varios problemas. Algunos ya se han comentado

1) Los parámetros son para valores de la consulta, no para los nombres de campos. Por eso:

(:ES >= T.EMIN AND :ES <= T.EMAX)
Esto te está fallando por el parámetro ES.

Para esto sólo te queda utilizar variables para los nombres de campo (tal como has comentado).
Pero yo seguiría utilizando los parámetros para los valores. Ya que esto tiene muchas ventajas.

2) Por otro lado tienes 2 veces el mismo parámetro. ES
Como han comentado la opción es cambiar los nombres de los parámetros o también se puede utilizar un bucle FOR para todos los parámetros iguales. Eso te permitiría una solución más genérica.

Puedes hacer algo como esto:


var
p:TParameters;
i: Integer;
begin
...

p := TADOQuery(aDataset).Parameters;
for i := 0 to (p.Count - 1) do begin
if (AnsiCompareText(p[i].Name, 'SE') = 0) then
p[i].Value := aCodigo;
end;

serhasae
22-10-2020, 23:04:45
Gracias lo pruebo y os comento. Saludos.

serhasae
22-10-2020, 23:20:02
Nunca hubiera pensado que el orden importa. Gracias Dec era eso. Solución:

ATasm.Close;
ATasm.SQL.Text:='SELECT T.PMAX, T.PRECIO '+
'FROM TASM AS T '+
'WHERE T.AGENCIA=:AG AND T.DESTINO=:XS AND (T.EMIN <= :ES AND T.EMAX >= :ES);';
ATasm.Parameters.ParamByName('AG').Value:='ASMMAS';
ATasm.Parameters.ParamByName('XS').Value:='NAP';
ATasm.Parameters.ParamByName('ES').Value:=180.4;

ATasm.Open;


Gracias a todos.