PDA

Ver la Versión Completa : Manipular resultado array, con un ADOStoredProc


willwallace
08-03-2013, 22:46:57
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

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


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
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: 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..
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.
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? 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
VarType (dm.AdoStorecProc.Parameters.Items[0].Value);
No me visualiza resultado alguno, cuando lo coloco de esta manera: 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: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:
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