dificuldade com SP
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]
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
Curtidas 0
Respostas
Lindomar.des
07/08/2005
(Sobe)
GOSTEI 0
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);
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
07/08/2005
sremulador
Obrigado pela atenção. Seguirei sua dica.
Obrigado pela atenção. Seguirei sua dica.
GOSTEI 0
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.
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
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)´ ´
tente ao invés de usar um ibstoredprocedure use um tibquery ou tibsql.
´SELECT * FROM ´sua_STORED_PROCEDURE(:PARAMETRO1, :PARAMETRO2)´ ´
GOSTEI 0
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
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
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.
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
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
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.
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
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
07/08/2005
gandalf.nho,
Obrigado pela atenção, acho que com isso esclareci minhas dúvidas.
Vou seguir sua orientção.
Obrigado pela atenção, acho que com isso esclareci minhas dúvidas.
Vou seguir sua orientção.
GOSTEI 0