Hola, luego de muchos años vuelvo a programar algo y como resultado de esta inactividad hay muchas cosas que he olvidado y me he esta costando.
Resulta que tengo una función en la que realizo una búsqueda según la cadena ingresada, la muestro a continuación:
Código SQL
[-]
CREATE OR REPLACE FUNCTION public.sp_buscar_persona(in bapel character varying, OUT codigo character varying, OUT nombre character varying,
OUT apelpat character varying, OUT apelmat character varying, OUT dpto character varying)
RETURNS SETOF record
LANGUAGE plpgsql
AS $function$
declare reg record;
begin
if (bapel != '') then
for reg in select tbl_persona.cod_persona,tbl_persona.appat_persona,tbl_persona.apmat_persona,tbl_persona.nom_persona, tbl_dpto.nom_dpto
FROM tbl_dpto INNER JOIN tbl_persona ON tbl_dpto.id_dpto = tbl_persona.id_dpto where appat_persona like bapel||'%' loop
codigo:=reg.cod_persona;
nombre:=reg.nom_persona;
apelpat:=reg.appat_persona;
apelmat:=reg.apmat_persona;
dpto:=reg.nom_dpto;
return next; end loop; return;
if (codigo is null) then
codigo = '';
end if;
end if
end
$function$
;
luego, en lazarus llamo la función usando un TZStoredProc de ZEOS para mostrarlos en un StringGrid, para lo que uso el siguiente código:
Código Delphi
[-]
x:=1
sp_buscar_persona.ParamByName('bapel').AsString:=ed_busqueda.Text;
sp_buscar_persona.Prepare;
sp_buscar_persona.ExecProc;
codigo:=sp_buscar_persona.ParamByName('codigo').Value;
sp_buscar_persona.Active:=true;
for j := 0 to sp_buscar_persona.RecordCount - 1 do
if not sp_buscar_persona.EOF then
Begin
sg_persona.RowCount:=x+1;
For i := 0 to sp_buscar_persona.Fields.Count - 1 do
begin
sg_persona.Cells[1,x]:=sp_buscar_persona.ParamByName('codigo').Value;
sg_persona.Cells[2,x]:=sp_buscar_persona.ParamByName('nombre').Value;
sg_persona.Cells[3,x]:=sp_buscar_persona.ParamByName('apelpat').Value;
sg_persona.Cells[4,x]:=sp_buscar_persona.ParamByName('apelmat').Value;
sg_persona.Cells[5,x]:=sp_buscar_persona.ParamByName('dpto').Value;
end;
inc(x);
sp_buscar_persona.Next;
end
Pero en lugar de mostrarme todos los registros que da la función SQL, sólo me muestra un registro y ¡encima lo duplica!, si alguien puede darme una idea para poder mostrar todos los registros que satisfagan la consulta les estaré muy agradecido.
Por cierto, utilizo la mezcla de FOR con el IF THEN porque cuando uso
Código Delphi
[-]
while not sp_buscar_persona.EOF do
se cuelga el programita.
Saludos,
David