Código SQL no Firebird 2.1
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.
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
Curtidas 0
Respostas
Edsoncabral
22/11/2008
Um exemplo de código que posso usar para listar os pagamentos efetuados é:
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.
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
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 é:
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
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
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
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