Fórum No Delphi naum funciona - mas no IbManager sim #45984

11/08/2004

0

Criei esta store procedure, No IBmanager ela funciona bem, mas no Delphi ela não aparece nenhum dados.

Abaixo segue a SP e mais a baixo como a chamo no Delphi

Uso D7 + DbExpress + FB 1.5

CREATE PROCEDURE APURAFATU3 (
DINICIO TIMESTAMP,
DFIM TIMESTAMP)
RETURNS (
IANO INTEGER,
IMES INTEGER,
ITOTAL FLOAT,
IMEDIA FLOAT,
INUME INTEGER)
AS

BEGIN

FOR select extract (year from data_hora), extract(month from data_hora),
sum(total_vendas), avg(total_vendas), count(tipo)

from RESUMO_VENDAS

group by extract (year from data_hora), EXTRACT(MONTH FROM data_hora)

having

(EXTRACT(YEAR FROM data_hora) between EXTRACT(YEAR FROM :DINICIO) and EXTRACT(YEAR FROM :DFIM)) AND
(EXTRACT(MONTH FROM data_hora) between EXTRACT(MONTH FROM :DINICIO) and EXTRACT(MONTH FROM :DFIM))
into
:iano, :IMES, :ITOTAL, :IMEDIA, :INUME DO
SUSPEND;

end


**** Assim a chamo no Delphi

dm_rel.CDT_Apu2.Active:=false;
dm_rel.SQL_Apu2.Close;
dm_rel.SQL_Apu2.CommandText:=´SELECT * FROM APURAFATU3 (:DINICIO, :DFIM)´;
dm_rel.SQL_Apu2.ParamByName(´DINICIO´).AsDate:=datetimepicker1.Date;
dm_rel.SQL_Apu2.ParamByName(´DFIM´).AsDate :=datetimepicker2.Date;
dm_rel.SQL_Apu2.Open;
dm_rel.CDT_Apu2.Active:=true;
dm_rel.CDT_Apu2.Refresh;
dbgrid1.Refresh;
dm_rel.CDT_Apu2.First;
label5.Caption:=inttostr(dm_rel.CDT_Apu2.RecordCount);
label5.Refresh;


Nilson Jr

Nilson Jr

Responder

Posts

11/08/2004

Afarias

vc não deve atribuir os parâmetros no SQLQuery (ou SQLDataSet) e nem abrí-lo -- tudo isso deve ser feito no ClientDataSet!


dm_Rel.SQL_Apu2.CommandText := ´SELECT * FROM APURAFATU3 (:DINICIO, :DFIM)´; 

with dm_Rel.CDT_Apu2 do
begin
  Close;
  FetchParams;
  Params[0].AsDate := DateTimePicker1.Date; 
  Params[1].AsDate := DateTimePicker2.Date; 
  Open; 
  First; 
  Label5.Caption := IntToStr(RecordCount); 
end;





T+


Responder

Gostei + 0

11/08/2004

Nilson Jr

muito obrigado

T+


Responder

Gostei + 0

04/10/2004

Luker

A minha store procedure é a seguinte:

CREATE PROCEDURE TOTALPED (
PED CHAR(5),
TIPO CHAR(1))
RETURNS (
TOTAL_PED NUMERIC(10,4),
TOTAL_PERDAS NUMERIC(10,4))
AS
DECLARE VARIABLE PROD CHAR(6);
DECLARE VARIABLE QUANT INTEGER;
DECLARE VARIABLE PERDAS INTEGER;
DECLARE VARIABLE ITEM_PRECO NUMERIC(10,4);
DECLARE VARIABLE PRECO_PROD NUMERIC(10,4);
DECLARE VARIABLE BONIF NUMERIC(10,4);
DECLARE VARIABLE DESC_EXTRA NUMERIC(10,4);
DECLARE VARIABLE PRECO_FINAL NUMERIC(10,4);
begin
total_ped = 0;
total_perdas = 0;

for select ip.pedprocod, ip.pedquant, ip.pedpreco, ip.pedperdas
from itenspedidos ip
where ip.pednum = :ped and ip.pedespecie = :tipo
into :prod, :quant, :item_preco, :perdas
do begin

/* Cálculo do preço final do produto a partir de seu cadastro */
select p.propreco1, p.prodesboni, p.proextra
from produtos p
where p.ProCod = :prod
into :preco_prod, :bonif, :desc_extra;

preco_final = :preco_prod - (preco_prod * bonif/100);
preco_final = :preco_final - (preco_final * desc_extra/100);

/* Possui quantidade atendida */
if (quant > 0) then begin
/* Caso o preço do produto esteja definido no pedido ... */
if (item_preco 0) then
total_ped = total_ped + (quant * item_preco);
/* ... senão calcular preço do produto a partir de seu cadastro */
else
total_ped = total_ped + (quant * preco_final);
end

/* Caso tenha perda */
if (perdas > 0) then begin
total_perdas = total_perdas + (perdas * preco_final);
end

end /* for */

end

Ao testá-la no IB Expert dá tudo certinho. Ao executá-la no SQL Editor do próprio IB Expert utilizando o ´execute procedure TotalPed(parâmetros)´ também dá tudo certo. Mas ao utilizar o ´SELECT * FROM TotalPed (parâmetros)´ só retorna nulo.

Ao executar no Delphi utilizando um TSQLQuery do palheta DBEXpress utilizando o ´SELECT * FROM...´ só retorna 0.

Já tentei utilizando somente o TSQLQuery, mas vi no fórum que tenho que utilizar somente o TClientDataSet. Então utilizei o seguinte código:

type TTotalPed = array [1 .. 2] of real;

// Função que retorna o total do pedido e o total de perda do pedido:
function TFormPrincipal.RetTotalPedSQL(ped, tipo: string): TTotalPed;
var t : TTotalPed;
begin
with dm do begin
qryTotalPed.SQL.Text := ´SELECT * FROM TotalPed(:ped, :tipo)´;

cdsTotalPed.FetchParams();
cdsTotalPed.Params[0].AsString := ped;
cdsTotalPed.Params[1].AsString := tipo;
cdsTotalPed.Open();
cdsTotalPed.First();

t[1] := cdsTotalPed.FieldByName(´total_ped´).AsFloat;
t[2] := cdsTotalPed.FieldByName(´total_perdas´).AsFloat;

result := t;

cdsTotalPed.Close();
end;
end;


Responder

Gostei + 0

04/10/2004

Gandalf.nho

Se você quer usar sua procedure como SELECT, você deve usar SUSPEND no código da SP para processar cada linha de registros e enviar para a aplicação cliente


Responder

Gostei + 0

04/10/2004

Luker

Valeu Gandalf...

Agora deu certo...

Só faltava o ´suspend´ mesmo... é a primeira vez que utilizo store procedures... não sabia deste detalhe...

Deus lhe abençoe...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar