Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   AdoQuery y Parametros (https://www.clubdelphi.com/foros/showthread.php?t=94900)

serhasae 12-10-2020 02:49:43

AdoQuery y Parametros
 
Código Delphi [-]
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:
Código Delphi [-]
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:

Código SQL [-]
(:ES >= T.EMIN AND :ES <= T.EMAX)

... usar esto otro:

Código SQL [-]
(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

Cita:

Empezado por fjcg02 (Mensaje 538702)
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

Justo lo que he indicado, seguro que es eso.

dec 12-10-2020 18:38:07

Hola a todos,

Cita:

Empezado por Casimiro Notevi (Mensaje 538703)
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:

Código SQL [-]
(: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:
Código Delphi [-]

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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 01:59:59.

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