Fórum dificuldade com SP #52049
07/08/2005
0
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
Curtir tópico
+ 0Posts
08/08/2005
Lindomar.des
Gostei + 0
08/08/2005
Sremulador
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
08/08/2005
Lindomar.des
Obrigado pela atenção. Seguirei sua dica.
Gostei + 0
08/08/2005
Lindomar.des
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
09/08/2005
Fsflorencio
tente ao invés de usar um ibstoredprocedure use um tibquery ou tibsql.
´SELECT * FROM ´sua_STORED_PROCEDURE(:PARAMETRO1, :PARAMETRO2)´ ´
Gostei + 0
10/08/2005
Lindomar.des
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
10/08/2005
Fsflorencio
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
10/08/2005
Gandalf.nho
Gostei + 0
10/08/2005
Lindomar.des
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
10/08/2005
Gandalf.nho
Gostei + 0
10/08/2005
Lindomar.des
Obrigado pela atenção, acho que com isso esclareci minhas dúvidas.
Vou seguir sua orientção.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)