executar procedure
Olá,
Sou iniciante em Delphi 7 e fiz uma descrição sobre minha dificuldade. Desculpe por não saber explicar direito o problema.
Estou tentando executar uma procedure do banco (firebird), mas não estou conseguindo ativar o componente SQLStoredProc.
Criei um form onde informarei o codigo da conta e a data inicial.
Inseri um SQLStoredProc, informei o SQLConnection, o StoredProcName.
Quando vou ativar o componente dá erro de null devido o parametro estar vazio.
Informei para o primeiro parametro (codigo_conta) DataType Integer. Value 1 e Type Integer.
Tentei fazer a mesma coisa para o segundo parametro (data_inicial) mas no Type = Date o value fica preenchido com 00.00.00 e não em formato data.
Terminada esta configuração tento ativar SQLStoredProc mas mostra o seguinte erro:
SQLStoredProc1: Cursor not returned from Query.
**Procedure**
ALTER PROCEDURE RECALCULA_SALDOS ( CODIGO_CONTA INTEGER, DATA_INICIAL DATE) AS DECLARE VARIABLE SALDO_INICIAL DECIMAL(15,2); DECLARE VARIABLE TOTAL_ENTRADAS DECIMAL(15,2); DECLARE VARIABLE TOTAL_SAIDAS DECIMAL(15,2); DECLARE VARIABLE TEM_SALDO INTEGER; DECLARE VARIABLE DATA_SALDO DATE; DECLARE VARIABLE ANO_INICIAL INTEGER; DECLARE VARIABLE SALDO_EXISTS INTEGER; DECLARE VARIABLE SALDO_FINAL DECIMAL(15,2); begin ano_inicial = 0; saldo_inicial = 0; total_entradas = 0; total_saidas = 0; tem_saldo = 0; data_inicial = :data_inicial - 1;
--VERIFICA SE EXIST SALDO DIA ANTERIOR A DATA INFORMADA PARA RECALCULO --SE NAO EXISISTIR VOLTA UM DIA NA DATA E VERIFICA NOVAMENTE ATE ENCONTRAR UM SALDO while (:tem_saldo = 0) do begin SELECT SUM(SALDO) FROM SALDOS WHERE COD_CONTA = :CODIGO_CONTA AND DATA = :data_inicial INTO :tem_saldo;
If (:tem_saldo > 0) then tem_saldo = 1; If (:tem_saldo = 0) then data_inicial = :data_inicial - 1; if (:data_inicial < '01.01.2008') then tem_saldo = 1; end
--PEGA SALDO INICIAL (na data que foi encontrado o saldo) SELECT SALDO FROM saldos WHERE cod_conta = :codigo_conta and DATA = :data_inicial INTO :saldo_inicial;
--SOMA ENTRADAS (a partir de 1 dia apos a data do saldo) SELECT COALESCE(SUM(VALOR),0) AS TOTAL_ENTRADA FROM mov_bancaria mov, naturezas nat WHERE mov.cod_conta = :codigo_conta and mov.cod_natureza = nat.codigo and nat.entrada_saida = 'E' and data > :data_inicial INTO :total_entradas;
--SOMA SAIDAS SELECT COALESCE(SUM(VALOR),0) AS TOTAL_ENTRADA FROM mov_bancaria mov, naturezas nat WHERE mov.cod_conta = :codigo_conta and mov.cod_natureza = nat.codigo and nat.entrada_saida = 'S' and data > :data_inicial INTO :total_saidas;
--ATUALIZA SALDO DA CONTA DO DIA SELECT count(*) FROM saldos WHERE cod_conta = :codigo_conta and data = (SELECT cast ('now' as date) from rdb$database) into :saldo_exists;
If (:saldo_exists <= 0) then begin insert into SALDOS (DATA,COD_CONTA,SALDO) VALUES ((SELECT cast ('now' as date) from rdb$database),:codigo_conta,0); end
saldo_final = :saldo_inicial + :total_entradas - :total_saidas;
UPDATE saldos SET SALDO = :saldo_final WHERE cod_conta = :codigo_conta and data = (SELECT cast ('now' as date) from rdb$database); suspend; end ^
Voltar ao topo
DevMedia Group www.devmedia.com.br | www.javafree.org | www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038 var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); try { var pageTracker = _gat._getTracker("UA-15997918-1"); pageTracker._trackPageview(); } catch(err) {}
Sou iniciante em Delphi 7 e fiz uma descrição sobre minha dificuldade. Desculpe por não saber explicar direito o problema.
Estou tentando executar uma procedure do banco (firebird), mas não estou conseguindo ativar o componente SQLStoredProc.
Criei um form onde informarei o codigo da conta e a data inicial.
Inseri um SQLStoredProc, informei o SQLConnection, o StoredProcName.
Quando vou ativar o componente dá erro de null devido o parametro estar vazio.
Informei para o primeiro parametro (codigo_conta) DataType Integer. Value 1 e Type Integer.
Tentei fazer a mesma coisa para o segundo parametro (data_inicial) mas no Type = Date o value fica preenchido com 00.00.00 e não em formato data.
Terminada esta configuração tento ativar SQLStoredProc mas mostra o seguinte erro:
SQLStoredProc1: Cursor not returned from Query.
**Procedure**
ALTER PROCEDURE RECALCULA_SALDOS ( CODIGO_CONTA INTEGER, DATA_INICIAL DATE) AS DECLARE VARIABLE SALDO_INICIAL DECIMAL(15,2); DECLARE VARIABLE TOTAL_ENTRADAS DECIMAL(15,2); DECLARE VARIABLE TOTAL_SAIDAS DECIMAL(15,2); DECLARE VARIABLE TEM_SALDO INTEGER; DECLARE VARIABLE DATA_SALDO DATE; DECLARE VARIABLE ANO_INICIAL INTEGER; DECLARE VARIABLE SALDO_EXISTS INTEGER; DECLARE VARIABLE SALDO_FINAL DECIMAL(15,2); begin ano_inicial = 0; saldo_inicial = 0; total_entradas = 0; total_saidas = 0; tem_saldo = 0; data_inicial = :data_inicial - 1;
--VERIFICA SE EXIST SALDO DIA ANTERIOR A DATA INFORMADA PARA RECALCULO --SE NAO EXISISTIR VOLTA UM DIA NA DATA E VERIFICA NOVAMENTE ATE ENCONTRAR UM SALDO while (:tem_saldo = 0) do begin SELECT SUM(SALDO) FROM SALDOS WHERE COD_CONTA = :CODIGO_CONTA AND DATA = :data_inicial INTO :tem_saldo;
If (:tem_saldo > 0) then tem_saldo = 1; If (:tem_saldo = 0) then data_inicial = :data_inicial - 1; if (:data_inicial < '01.01.2008') then tem_saldo = 1; end
--PEGA SALDO INICIAL (na data que foi encontrado o saldo) SELECT SALDO FROM saldos WHERE cod_conta = :codigo_conta and DATA = :data_inicial INTO :saldo_inicial;
--SOMA ENTRADAS (a partir de 1 dia apos a data do saldo) SELECT COALESCE(SUM(VALOR),0) AS TOTAL_ENTRADA FROM mov_bancaria mov, naturezas nat WHERE mov.cod_conta = :codigo_conta and mov.cod_natureza = nat.codigo and nat.entrada_saida = 'E' and data > :data_inicial INTO :total_entradas;
--SOMA SAIDAS SELECT COALESCE(SUM(VALOR),0) AS TOTAL_ENTRADA FROM mov_bancaria mov, naturezas nat WHERE mov.cod_conta = :codigo_conta and mov.cod_natureza = nat.codigo and nat.entrada_saida = 'S' and data > :data_inicial INTO :total_saidas;
--ATUALIZA SALDO DA CONTA DO DIA SELECT count(*) FROM saldos WHERE cod_conta = :codigo_conta and data = (SELECT cast ('now' as date) from rdb$database) into :saldo_exists;
If (:saldo_exists <= 0) then begin insert into SALDOS (DATA,COD_CONTA,SALDO) VALUES ((SELECT cast ('now' as date) from rdb$database),:codigo_conta,0); end
saldo_final = :saldo_inicial + :total_entradas - :total_saidas;
UPDATE saldos SET SALDO = :saldo_final WHERE cod_conta = :codigo_conta and data = (SELECT cast ('now' as date) from rdb$database); suspend; end ^
Voltar ao topo
DevMedia Group www.devmedia.com.br | www.javafree.org | www.mrbool.com
2010 - Todos os Direitos Reservados a DevMedia Group - (21) 3382-5038 var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); try { var pageTracker = _gat._getTracker("UA-15997918-1"); pageTracker._trackPageview(); } catch(err) {}
Daniel
Curtidas 0
Respostas
Emerson Nascimento
27/08/2010
usa stored procedure não retorna dados, então não precisa do suspend.
como ela não retorna dados, deve ser executada com Execute, ExecSQL ou qualquer outro comando de execução. não deve ser usado Open, que é destinado somente àqueles procedimentos que retornam dados para um dataset.
como ela não retorna dados, deve ser executada com Execute, ExecSQL ou qualquer outro comando de execução. não deve ser usado Open, que é destinado somente àqueles procedimentos que retornam dados para um dataset.
GOSTEI 0
Emerson Nascimento
27/08/2010
eu também simplificaria um pouco o código para melhorar a performance:
ALTER PROCEDURE RECALCULA_SALDOS (
CODIGO_CONTA INTEGER,
DATA_INICIAL DATE)
AS
DECLARE VARIABLE SALDO_INICIAL DECIMAL(15,2);
DECLARE VARIABLE TOTAL_ENTRADAS DECIMAL(15,2);
DECLARE VARIABLE TOTAL_SAIDAS DECIMAL(15,2);
DECLARE VARIABLE SALDO_FINAL DECIMAL(15,2);
begin
saldo_inicial = 0;
total_entradas = 0;
total_saidas = 0;
--VERIFICA SE EXISTE SALDO NO DIA ANTERIOR A DATA INFORMADA PARA RECALCULO
--E PEGA O SALDO INICIAL
SELECT FIRST 1 COALESCE(DATA,'01.01.2008'), COALESCE(SUM(SALDO),0)
FROM saldos
WHERE COD_CONTA = :CODIGO_CONTA
AND DATA BETWEEN '01.01.2008' AND (:data_inicial - 1)
GROUP BY DATA
HAVING SUM(SALDO) > 0
ORDER BY DATA DESC
INTO :data_inicial, :saldo_inicial;
--SOMA ENTRADAS E SAIDAS (a partir de 1 dia apos a data do saldo)
SELECT
SUM(CASE WHEN nat.entrada_saida='E' then mov.VALOR else 0 end) AS TOTAL_ENTRADA,
SUM(CASE WHEN nat.entrada_saida='S' then mov.VALOR else 0 end) AS TOTAL_SAIDA
FROM mov_bancaria mov, naturezas nat
WHERE mov.cod_conta = :codigo_conta
and mov.cod_natureza = nat.codigo
and data > :data_inicial
INTO :total_entradas, :total_saidas;
saldo_final = :saldo_inicial + :total_entradas - :total_saidas;
--ATUALIZA SALDO DA CONTA DO DIA
if EXISTS(SELECT count(*) FROM saldos WHERE cod_conta = :codigo_conta and data = CURRENT_DATE) then
UPDATE saldos SET SALDO = :saldo_final WHERE cod_conta = :codigo_conta and data = CURRENT_DATE;
else
INSERT into SALDOS(DATA, COD_CONTA, SALDO) VALUES (CURRENT_DATE, :codigo_conta, :saldo_final);
end
ALTER PROCEDURE RECALCULA_SALDOS (
CODIGO_CONTA INTEGER,
DATA_INICIAL DATE)
AS
DECLARE VARIABLE SALDO_INICIAL DECIMAL(15,2);
DECLARE VARIABLE TOTAL_ENTRADAS DECIMAL(15,2);
DECLARE VARIABLE TOTAL_SAIDAS DECIMAL(15,2);
DECLARE VARIABLE SALDO_FINAL DECIMAL(15,2);
begin
saldo_inicial = 0;
total_entradas = 0;
total_saidas = 0;
--VERIFICA SE EXISTE SALDO NO DIA ANTERIOR A DATA INFORMADA PARA RECALCULO
--E PEGA O SALDO INICIAL
SELECT FIRST 1 COALESCE(DATA,'01.01.2008'), COALESCE(SUM(SALDO),0)
FROM saldos
WHERE COD_CONTA = :CODIGO_CONTA
AND DATA BETWEEN '01.01.2008' AND (:data_inicial - 1)
GROUP BY DATA
HAVING SUM(SALDO) > 0
ORDER BY DATA DESC
INTO :data_inicial, :saldo_inicial;
--SOMA ENTRADAS E SAIDAS (a partir de 1 dia apos a data do saldo)
SELECT
SUM(CASE WHEN nat.entrada_saida='E' then mov.VALOR else 0 end) AS TOTAL_ENTRADA,
SUM(CASE WHEN nat.entrada_saida='S' then mov.VALOR else 0 end) AS TOTAL_SAIDA
FROM mov_bancaria mov, naturezas nat
WHERE mov.cod_conta = :codigo_conta
and mov.cod_natureza = nat.codigo
and data > :data_inicial
INTO :total_entradas, :total_saidas;
saldo_final = :saldo_inicial + :total_entradas - :total_saidas;
--ATUALIZA SALDO DA CONTA DO DIA
if EXISTS(SELECT count(*) FROM saldos WHERE cod_conta = :codigo_conta and data = CURRENT_DATE) then
UPDATE saldos SET SALDO = :saldo_final WHERE cod_conta = :codigo_conta and data = CURRENT_DATE;
else
INSERT into SALDOS(DATA, COD_CONTA, SALDO) VALUES (CURRENT_DATE, :codigo_conta, :saldo_final);
end
GOSTEI 0