Fórum Código SQL no Firebird 2.1 #60323
22/11/2008
0
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
Curtir tópico
+ 0Posts
22/11/2008
Edsoncabral
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
23/11/2008
Edsoncabral
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
23/11/2008
Edsoncabral
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
24/11/2008
Rodolpho123
A nomenclatura de objetos do banco de dados tem como tamanho máximo 30 caracteres...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)