Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   Manipular resultado array, con un ADOStoredProc (https://www.clubdelphi.com/foros/showthread.php?t=82460)

willwallace 08-03-2013 22:46:57

Manipular resultado array, con un ADOStoredProc
 
Estimados requiro su ayuda,
Tengo una funcion en postgres la cual me retorna un array[2] y no se como recuperarlo en delphi.
Ejemplo:
Funcion Postgres
Código SQL [-]
CREATE OR REPLACE FUNCTION array(a float, b float, fecha date)
  RETURNS double precision[] AS
$BODY$
declare
  c                   float;  
  d                       float;
  vectoresultado   float[];

        
begin
  c=a/b;
        d=a*b;
    
  vectoresultado[1]=c;
  vectoresultado[2]=d;
  
  return vectoresultado;

end;
$BODY$
  LANGUAGE plpgsql VOLATILE

y luego ejecuto la funcion en delphi
Código Delphi [-]

  dm.AdoStorecProc.Close();
        dm.AdoStorecProc.Parameters.Items[1].Value:=StrtoFloat(Edit1.Text);
        dm.AdoStorecProc.Parameters.Items[2].Value:=StrtoFloat(Edit2.Text);
        dm.AdoStorecProc.Prepared;
        dm.AdoStorecProc.ExecProc();

Y quisiera asignar los dos valores retornados a otros edits
Por favor quien puede darme una mano, Tengo entendido que los resultados son retornados en el item[0] dela funcion pero no se manipularlos
Código SQL [-]
dm.AdoStorecProc.Parameters.Items[0].Value
Gracias

Al González 09-03-2013 00:36:09

No conozco PostgreSQL y no sé si esto será de mucha ayuda, pero en caso de que sea como dices, que existe un "parámetro 0" y éste contiene el resultado, entonces muy probablemente se trate de un Variant matriz ("array"). De tal suerte que una expresión como la siguiente te devolvería uno de los valores de esa matriz:
Código Delphi [-]
dm.AdoStorecProc.Parameters.Items [0].Value [n]

Siendo "n" 0 o 1, o bien 1 o 2 (intenta con 1 primero).

Ojalá sea por ahí, saludos. :)

willwallace 09-03-2013 16:54:33

Gracias estimado, tiene logica lo probare y le aviso

willwallace 09-03-2013 23:16:56

Hola estimado colega, le cuento que intente de la siguiente manera..
Código Delphi [-]
Edit1.Text:=dm.AdoStorecProc.Parameters.Items[0].value[1];
y me retorna el siguiente mensaje "Invalid argument." pense que era por el tipo valor float en un edit por eso intente de la siguiente manera.
Código Delphi [-]
   Edit1.Text:=FloatToStr(dm.AdoStorecProc.Parameters.Items[0].value[1]);
pero persiste el mismo mensaje "Invalid argument." No se me ocurre de que otra forma hacer. Por favor espero otras ideas que me puedan ayudar a encontrar la solucion. Saludos y Gracias de antemano

Al González 09-03-2013 23:40:16

¿Puedes ver la propiedad dm.AdoStorecProc.Parameters con el inspector de objetos (en tiempo de diseño)? ¿Cuántos parámetros hay? ¿Qué valores tienen estos en sus propiedades DataType y Direction?

Una prueba, ¿podrías decirnos qué valor arroja la siguiente expresión después de ejecutar el procedimiento?
Código Delphi [-]
VarType (dm.AdoStorecProc.Parameters.Items[0].Value)

willwallace 11-03-2013 03:25:42

Buenas noches
Si verifico las propiedades en parametros me muestra 4 los cuales son "0:ftString direccion=pdReturnValue; a:ftFloat direccion=pdInput; b:ftFloat direccion=pdInput; fecha:ftDateTime direccion=pdInput"

la expresion
Código Delphi [-]
VarType (dm.AdoStorecProc.Parameters.Items[0].Value);
No me visualiza resultado alguno, cuando lo coloco de esta manera:
Código Delphi [-]
 ShowMessage(VarType (dm.AdoStorecProc.Parameters.Items[0].Value));
me da error e indica "Incompatible types:'string and Word' "
y cuando lo pongo de esta forma:
Código Delphi [-]
ShowMessage(dm.AdoStorecProc.Parameters.Items[0].Value);
me muestra resultado de la siguiente forma "{2.1,8.4}" para los valores ingresados 4.2 y 2 la clave esta en manipular estos valores para asignarlos a un edit, que aun no lo logro.
Gracias por la atencion, estare atento

Al González 11-03-2013 17:28:22

Gracias willwallace.

Eso quiere decir que el resultado viene como cadena de caracteres. Para lo último que comentas, te pongo un sencillo ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var
  I :Integer;
  R, S1, S2 :String;
begin
  R := '{2.1,8.4}';
  I := Pos (',', R);
  S1 := Copy (R, 2, I - 2);
  S2 := Copy (R, I + 1, Length (R) - (I + 1));
  ShowMessage (S1);
  ShowMessage (S2);
end;

willwallace 11-03-2013 19:55:53

Muchas gracias, esa fue la solucion, para entenderla realmente tuve q investigar como funciona "Pos"y"Copy" pero me fue de gran ayuda logrando lo deseado


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

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