Fórum No Delphi naum funciona - mas no IbManager sim #45984
11/08/2004
0
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
Curtir tópico
+ 0Posts
11/08/2004
Afarias
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+
Gostei + 0
11/08/2004
Nilson Jr
T+
Gostei + 0
04/10/2004
Luker
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;
Gostei + 0
04/10/2004
Gandalf.nho
Gostei + 0
04/10/2004
Luker
Agora deu certo...
Só faltava o ´suspend´ mesmo... é a primeira vez que utilizo store procedures... não sabia deste detalhe...
Deus lhe abençoe...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)