Store procedure / DBExpress
01/10/2004
0
Adicionei um componente TSqlStoreProc ao Delphi e setei as propriedades SQLConnection e StoreProcName devidamente.
Ao setar a propriedade Active para true, aparece a seguinte mensagem de erro:
´Cursor not returned from Query´
Alguém pode me ajudar a contornar este problema para que eu possa utilizar a store procedure no meu programa?
Luker
Posts
01/10/2004
Gandalf.nho
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;
04/10/2004
Osocram
begin
//passar valor 0 = retorna valor atual
//passar valor 1 = retora e grava no gerador o novo numero.
//importante gravar no tag do SP o index do field do campo a ser incrementado
with SPInc do begin
if Active then
close;
ParamByName(´val´).AsInteger := valor;
ExecProc;
Result := Params[1].AsInteger;
end;// with
end;
Clique aqui para fazer login e interagir na Comunidade :)