Código SQL no Firebird 2.1

Firebird

22/11/2008

Olá amigos.

Preciso criar um código sql que se pareça com um código em delphi que já possuo.

Trata-se se uma rotina que verifica se o associado fez o pagamento da sua mensalidade, e verifica quais os meses que estão sem pagar. No banco, só constam os pagamentos realizados, ou seja, a rotina vai checar se existe o registro de pagamento, e caso não exista ela alimenta uma tabela no próprio FB com a informação do registro que não foi encontrado, e portanto está em débito.

Essa rotina varre toda a tabela CONTRATOS. A tabela em que constam os pagamentos é a PLANOSPAGAMENTOS, e as duas estão ligadas por uma chave estrangeira (CODCONTRATO).

O motivo desse código precisar ser processado no próprio banco é aliviar a rede, já que o mesmo varre a tabela de contratos que possui milhares de registros, verificando a cada contrato se o pagamento de todos os meses está em dia.

Alguém tem alguma boa idéia para isso?

Grato.


Edsoncabral

Edsoncabral

Curtidas 0

Respostas

Edsoncabral

Edsoncabral

22/11/2008

Um exemplo de código que posso usar para listar os pagamentos efetuados é:
select CONTRATOS.CODIGO, CONTRATOS.CODCLIENTETITULAR, PLANOSPAGAMENTOS.ANOREFERENCIA, PLANOSPAGAMENTOS.MESREFERENCIA from CONTRATOS,planospagamentos where contratos.CODIGO = PLANOSPAGAMENTOS.CONTRATO


Mas eu quero na verdade o contrário. Quero poder listar os pagamentos que não são listados no resultado da consulta, considerando a data inicial e final para a consulta.


GOSTEI 0
Edsoncabral

Edsoncabral

22/11/2008

Criei o código abaixo, mas está dando erro.
Alguém pode me ajudar aí?

O erro é:
This operation is not defined for system tables.
unsuccessful metadata update.
Name longer than database column size.

O código é:
create procedure SP_PROCESSA_PRESTACOES_ATRASADAS
as
declare variable DATA1PARCELA DATE;
declare variable DATAINICIAL DATE;
declare variable DATAFINAL DATE;
declare variable CONTADOR_PAG INTEGER;
declare variable LOJA DM_KEYNO;
declare variable CONTRATO DM_KEYNO;
declare variable MESREFERENCIA SMALLINT;
declare variable ANOREFERENCIA SMALLINT;
declare variable VALOR DM_CURRENCY;

begin
  DATAFINAL = CURRENT_DATE;
  for select DATVENC1PARCELA, CODIGO, CODLOJA, VALORMENSALIDADE
    from CONTRATOS into DATA1PARCELA, CONTRATO, LOJA, VALOR  do
  begin
    DATAINICIAL = DATA1PARCELA;
    while (DATAINICIAL < DATAFINAL) do
    begin
      MESREFERENCIA = EXTRACT(MONTH from DATAINICIAL);
      ANOREFERENCIA = EXTRACT(YEAR from DATAINICIAL);

      select count(*) from PLANOSPAGAMENTOS where
        (PLANOSPAGAMENTOS.ANOREFERENCIA = ANOREFERENCIA) and (PLANOSPAGAMENTOS.MESREFERENCIA = MESREFERENCIA)
      into CONTADOR_PAG;

      if (CONTADOR_PAG = 0) then
      begin
        insert into
          TEMP_PRESATRASADAS(LOJA, CONTRATO, MESREFERENCIA, ANOREFERENCIA, VALOR)
        values
          (:LOJA, :CONTRATO, :MESREFERENCIA, :ANOREFERENCIA, :VALOR);
      end
      DATAINICIAL = F_ADDMONTH(DATAFINAL, 1);
    end
  end
end




GOSTEI 0
Edsoncabral

Edsoncabral

22/11/2008

Olá amigos.
O erro estava no nome da procedure, que estava muito grande.
Bastou usar o nome com 5 letras a menos que resolveu.

Ah, e quem quiser usar o código o mesmo é totalmente funcional.
Ele usa a UDF FreeUDFLib.dll para retornar o valor da função F_ADDMONTH.

Abraço a todos.

Edson Cabral
Criterion Software


GOSTEI 0
Rodolpho123

Rodolpho123

22/11/2008

Olá amigos. O erro estava no nome da procedure, que estava muito grande. Bastou usar o nome com 5 letras a menos que resolveu.


A nomenclatura de objetos do banco de dados tem como tamanho máximo 30 caracteres...


GOSTEI 0
POSTAR