Fórum executar procedure #384927

27/08/2010

0

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) {}
Daniel

Daniel

Responder

Posts

27/08/2010

Emerson Nascimento

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.




Responder

Gostei + 0

27/08/2010

Emerson Nascimento

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

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar