dificuldade com SP

Firebird

07/08/2005

Colegas,

Estou com um problema e gostaria de saber o q estou fazendo de errado.

Tenho a seguinte SP que seleciona os cupons emitidos em uma determinada data e que estejam entre os valores passados.


begin
FOR SELECT DATA, GERFCE, DOCUMENTO, SUM(SUBTOTAL), COUNT(PRODUTO)
FROM MOVIMENTO
WHERE DATA BETWEEN :DATA_INICIAL AND :DATA_FINAL AND
GERFCE = :ECF AND FLAG = 0
GROUP BY DATA, GERFCE, DOCUMENTO
HAVING SUM(SUBTOTAL) BETWEEN :VALOR1 AND :VALOR2
ORDER BY DOCUMENTO
INTO :data, :gerfce, :documento, :totalcupom, :qtditems DO
suspend;
end

Passo os parametros: 17-numero da ecf
25/05/2005 - data inicial/final
139,24-(0,03) - valor inicial
139,24+(0,03) - valor final

* os tres centavos equivalem a diferença de
arredondamento para menos ou para mais.

A dificuldade que estou tendo é a seguinte:

executando a SP pelo IBExpert ela me retorna:

DATA GERFCE DOCUMENTO TOTALCUPOM QTDITEMS
25/05/2005 17 9978 139,24 46

isso é o correto.

Executando pela minha aplicação tenho:

dmMaster.IBSPSelecionaCupom.ParamByName(´ECF´).Value :=
dmMaster.IBDNFSaidaECF.Value;
dmMaster.IBSPSelecionaCupom.ParamByName(´DATA_INICIAL´).Value:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Value;
dmMaster.IBSPSelecionaCupom.ParamByName(´DATA_FINAL´).Value:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Value;
dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR1´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value - 0.03);
dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR2´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value + 0.03);


dmMaster.IBSPSelecionaCupom.Prepare; //ja tentei sem essa instrução
tambem
dmMaster.IBSPSelecionaCupom.ExecProc;

if not dmMaster.IBSPSelecionaCupom.IsEmpty then
.....instruções
else
MessageBox(application.handle, pchar(dmDBEXMaster.sUsuario +
´, não foi encontrado registros com esse cupom!´ + #13 +
´Favor verificar importação de venda´), ´Informação´, mb_ok +
MB_ICONINFORMATION);

dmMaster.IBSPSelecionaCupom.UnPrepare;

não esta retornando nenhum registro ou pelo menos parece não
retornar.

neste exemplo estou usando IBX mas já fiz testes com
DBExpress e acontece a mesma coisa.
uso D7+FB 1.5

Desde já agradeço a ajuda.

[color=green:2281059030]Movido de Delphi para Interbase/Firebird[/color:2281059030]


Lindomar.des

Lindomar.des

Curtidas 0

Respostas

Lindomar.des

Lindomar.des

07/08/2005

(Sobe)


GOSTEI 0
Sremulador

Sremulador

07/08/2005

dmMaster.IBSPSelecionaCupom.ParamByName(´ECF´).Value :=
dmMaster.IBDNFSaidaECF.Value;
[b:d4b2e7e670]dmMaster.IBSPSelecionaCupom.ParamByName(´DATA_INICIAL´).Asdate:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Asdate;
dmMaster.IBSPSelecionaCupom.ParamByName(´DATA_FINAL´).Asdate:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Asdate; [/b:d4b2e7e670]
dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR1´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value - 0.03);
dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR2´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value + 0.03);


GOSTEI 0
Lindomar.des

Lindomar.des

07/08/2005

sremulador

Obrigado pela atenção. Seguirei sua dica.


GOSTEI 0
Lindomar.des

Lindomar.des

07/08/2005

sremulador

dmMaster.IBSPSelecionaCupom.ParamByName(´ECF´).Value :=
dmMaster.IBDNFSaidaECF.Value;
[b:eb4e4f8158]dmMaster.IBSPSelecionaCupom.ParamByName.(´DATA_INICIAL´).Asdate:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Asdate;
dmMaster.IBSPSelecionaCupom.ParamByName(´DATA_FINAL´).Asdate:=
dmMaster.IBDNFSaidaDATACUPOMFISCAL.Asdate; [/b:eb4e4f8158]dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR1´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value - 0.03);
dmMaster.IBSPSelecionaCupom.ParamByName(´VALOR2´).Value :=
(dmMaster.IBDNFSaidaVALORCUPOMFISCAL.Value + 0.03);

Fiz o teste e não dão certo, continua ´retornando vazio´. além disso
na liha q vc postou:

[b:eb4e4f8158]dmMaster.IBDNFSaidaDATACUPOMFISCAL.Asdate[/b:eb4e4f8158]

não aceita ´AsDate´, somente ´AsDateTime´.

mais uma vez obrigado pela atenção. mas contiuo precisando de ajuda.


GOSTEI 0
Fsflorencio

Fsflorencio

07/08/2005

Caro amigo capixaba,

tente ao invés de usar um ibstoredprocedure use um tibquery ou tibsql.

´SELECT * FROM ´sua_STORED_PROCEDURE(:PARAMETRO1, :PARAMETRO2)´ ´


GOSTEI 0
Lindomar.des

Lindomar.des

07/08/2005

fsflorencio,

Atualmente utilizo TIBQuery e retorna as informações que preciso, porém, é um pouco lento. Sendo assim estou escrevento algumas sp´s para tentar melhorar o desenpenho. Mesmo que ainda não tenha conseguido o que quero, gostaria de saber se o que está acontecendo é normal. Eis o codigo completo da SP:

CREATE PROCEDURE SELECIONA_CUPOM(
DATA_INICIAL DATE,
DATA_FINAL DATE,
ECF SMALLINT,
VALOR1 FLOAT,
VALOR2 FLOAT)
RETURNS (
DATA DATE,
GERFCE SMALLINT,
DOCUMENTO VARCHAR(15),
TOTALCUPOM FLOAT,
QTDITEMS INTEGER)
AS
begin
FOR SELECT DATA, GERFCE, DOCUMENTO, SUM(SUBTOTAL), COUNT(PRODUTO) FROM MOVIMENTO
WHERE DATA BETWEEN :DATA_INICIAL AND :DATA_FINAL AND
GERFCE = :ECF AND FLAG = 0
GROUP BY DATA, GERFCE, DOCUMENTO
HAVING SUM(SUBTOTAL) BETWEEN :VALOR1 AND :VALOR2
ORDER BY DOCUMENTO
INTO :data, :gerfce, :documento, :totalcupom, :qtditems DO
suspend;
end


GOSTEI 0
Fsflorencio

Fsflorencio

07/08/2005

Entendo,

Penso que o problema seria na passagem dos parâmetros.

Me corrija se eu estiver errado, mas o componente IBSPSelecionaCupom é um TIBStoredProcedure, não é?

MInha idéia foi substituir este componente por um TIbSql ou TIbQuery, mas chamando a mesma stored procedure.
ex:

QUERY1.SQL.TEXT := ´SELECT * FROM SELECIONA_CUPOM( ´01/01/2005´, ´01/01/2005´, 1, 0, 1000) ´;

Você também pode testar isto em algum gerenciador de db pra ver se retorna alguma coisa. Se retornar, então concentre-se nos parâmetros que podem estar sendo passados de maneira errada.

Estamos à disposição.


GOSTEI 0
Gandalf.nho

Gandalf.nho

07/08/2005

O ideal é só usar IBStoredProc para SPs executáveis, para SPs selecionáveis (que parece ser o seu caso) use IBQuery


GOSTEI 0
Lindomar.des

Lindomar.des

07/08/2005

gandalf.nho, fsflorencio

Obrigado pela atenção.

fsflorencio:
[b:04d8565cf9]Penso que o problema seria na passagem dos parâmetros[/b:04d8565cf9]
-também desconfio disso

[b:04d8565cf9]Você também pode testar isto em algum gerenciador de db pra ver se retorna alguma coisa. Se retornar, então concentre-se nos parâmetros que podem estar sendo passados de maneira errada.[/b:04d8565cf9]

-testei essa SP no IBExpert e retorna o que eu quero.

gandalf.nho:
[b:04d8565cf9]O ideal é só usar IBStoredProc para SPs executáveis, para SPs selecionáveis (que parece ser o seu caso) use IBQuery[/b:04d8565cf9]

-atualmente utilizo IBQuery em minhas consultas, se estiver errado me corrija: quando uso IBQuery o processamento fica no cliente quando uso SP´s o processamento é feito no servidor por isso meu interesse em usar SP´s, inclusive estou portando minha aplicação de IBX para DBExpress e aproveitando para passar minhas Query´s para SP´s. Já até utilizo algumas com resultados satisfatorios em termo de velocidade,. mas essa estou apanhando dessa.

Concluindo,
-pelo codigo que postei e pelo conhecimento de vc´s a SP está escrita corretamente? Acredito que esteja pois no IBExpert funciona.

-pode ser alguma incompatibilidade dos componentes do Delphi com o FB 1.5?

-minha intenção em usar SP´s é centralizar o processamento no servidor.

Obrigado mais uma vez pela atenção.


GOSTEI 0
Gandalf.nho

Gandalf.nho

07/08/2005

Eu digo isso pq IBStoredProc não serve para SPs selecionáveis (que retornam mais de uma linha de registros), vc deve usar IBQuery nesses casos (SELECT * FROM nome_procedure(lista_parâmetros)). Não esqueça de que todas as querys são executadas no servidor, mesmo tendo sido passadas pela aplicação cliente. Eu particularmente procuro usar Query sempre que possível e usar SP só quando a SQL não consegue o resultado que preciso.


GOSTEI 0
Lindomar.des

Lindomar.des

07/08/2005

gandalf.nho,

Obrigado pela atenção, acho que com isso esclareci minhas dúvidas.
Vou seguir sua orientção.


GOSTEI 0
POSTAR