Store procedure / DBExpress

01/10/2004

Criei uma store procedure e ela está funcionando normalmente no IBExpert.

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

Respostas

01/10/2004

Gandalf.nho

Não se usa ACTIVE OU OPEN para esse tipo de componente. Geralmente é um comando do tipo ExecProc ou semelhante.


Responder Citar

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 Citar

04/10/2004

Osocram

Function T_CadGeneric.AutoIncrementa(valor:integer):integer;
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;


Responder Citar