Como montar uma SP para Contas a Receber
Caros Colegas :
Necessito montar uma SP para processar dados de Parcelamento de Empréstimos do tipo:
Valor 1.000,00 3 Parcelas Mensais - 1º Vcto. 45 dias
-Tenho que Dividir em 3 vezes sendo que as primeiras parcelas deverem serem de valor inteiro e as fracoes para a última parcela -
Assim:
1.000,00 / 3 = 333,33
-1º -Valor = 333,00
-2º -Valor = 333,00
-3º -Valor = 334,00 (1.000,00 -(333,00 x 2) )
- Tenho que numerar as parcelas com Letras do tipo - A/C - B/C - C/C
Assim:
Nº do Emprestimo = 655545
Fica Assim: 655545-A/C para a 1ª parcela
655545-B/C para a 2º parcela
655545-C/C para a 3º parcela
-Tenho que distribuir os vencimento assim :
- Data do Emprestimo + 45 dias para Vcto. da 1º parcelas
- Data da 1º Parcelas + 30 dias Vcto. da 2º parcela
- Data da 2º parcela + 30 dias Vcto. da 3ª Parcela.
É possível resolver este problema em uma SP - foi o processamento fica mais rápido.
Uso o Interbase 6,5.
Se alguem souber, por favor pode postar um código para mim .
Obrigado /Hélio
Necessito montar uma SP para processar dados de Parcelamento de Empréstimos do tipo:
Valor 1.000,00 3 Parcelas Mensais - 1º Vcto. 45 dias
-Tenho que Dividir em 3 vezes sendo que as primeiras parcelas deverem serem de valor inteiro e as fracoes para a última parcela -
Assim:
1.000,00 / 3 = 333,33
-1º -Valor = 333,00
-2º -Valor = 333,00
-3º -Valor = 334,00 (1.000,00 -(333,00 x 2) )
- Tenho que numerar as parcelas com Letras do tipo - A/C - B/C - C/C
Assim:
Nº do Emprestimo = 655545
Fica Assim: 655545-A/C para a 1ª parcela
655545-B/C para a 2º parcela
655545-C/C para a 3º parcela
-Tenho que distribuir os vencimento assim :
- Data do Emprestimo + 45 dias para Vcto. da 1º parcelas
- Data da 1º Parcelas + 30 dias Vcto. da 2º parcela
- Data da 2º parcela + 30 dias Vcto. da 3ª Parcela.
É possível resolver este problema em uma SP - foi o processamento fica mais rápido.
Uso o Interbase 6,5.
Se alguem souber, por favor pode postar um código para mim .
Obrigado /Hélio
Helio Nascimento
Curtidas 0
Respostas
Emerson Nascimento
15/02/2006
tente algo assim:
isso é somente um exemplo.
eu não consegui retornar as parcelas no formato LETRA/LETRA. só consegui no formato NUMERO/NUMERO.
agora é sua vez de quebrar a cabeça...
CREATE PROCEDURE PARCELAR_VALOR ( VALOR NUMERIC(10,2), /* valor a ser parcelado */ PARCELAS INTEGER, /* numero de parcelas */ DDL INTEGER, /* prazo para a primeira parcela */ INTERVALO INTEGER) /* dias de intervalo entre as parcelas */ RETURNS ( PARCELA VARCHAR(5), VENCIMENTO DATE, VALORPARCELA NUMERIC(10,2)) AS DECLARE VARIABLE VALOR_ULTIMA NUMERIC(10,2); DECLARE VARIABLE NUMPARC INTEGER; begin valorparcela = cast(valor / parcelas as integer); valor_ultima = valor - (valorparcela * (PARCELAS - 1)); numParc = 1; vencimento = current_date + ddl; while (numParc <= parcelas) do begin if (numParc = parcelas) then valorparcela = valor_ultima; Parcela = cast(numParc as varchar(2)) || ´/´ || cast(parcelas as varchar(2)); /* neste ponto você atualiza sua tabela */ suspend; numParc = numParc + 1; vencimento = vencimento + intervalo; end end
isso é somente um exemplo.
eu não consegui retornar as parcelas no formato LETRA/LETRA. só consegui no formato NUMERO/NUMERO.
agora é sua vez de quebrar a cabeça...
GOSTEI 0
Helio Nascimento
15/02/2006
Caro Emerson.n
Primeiro agradeço-lhe a sua boa vontade em me ajudar - e como foi muito inteligente a sua solucao para o desenvolvimento desta SP - Parabens. Depois fiz alteraçao que estou postando abaixo. Não ficou lá estas coisas em termo de codigo fonte, mas esta funcionando. Faça teste e se melhorar de-nos retorno . Obrigadoooooooo.
Primeiro agradeço-lhe a sua boa vontade em me ajudar - e como foi muito inteligente a sua solucao para o desenvolvimento desta SP - Parabens. Depois fiz alteraçao que estou postando abaixo. Não ficou lá estas coisas em termo de codigo fonte, mas esta funcionando. Faça teste e se melhorar de-nos retorno . Obrigadoooooooo.
CREATE PROCEDURE PARCELAR_VALOR ( VALOR NUMERIC(10,2), PARCELAS INTEGER, DDL INTEGER, INTERVALO INTEGER, CONTRATO VARCHAR(10)) RETURNS ( PARCELA VARCHAR(10), VENCIMENTO DATE, VALORPARCELA NUMERIC(10,2)) AS DECLARE VARIABLE VALOR_ULTIMA NUMERIC(10,2); DECLARE VARIABLE NUMPARC INTEGER; declare variable LETRA CHAR(1); begin valorparcela = cast(valor / parcelas as integer); valor_ultima = valor - (valorparcela * (PARCELAS - 1)); numParc = 1; vencimento = current_date + ddl; if (PARCELAS=1) then LETRA=´A´; else if (PARCELAS=2) then LETRA=´B´; ELSE if (PARCELAS=3) then LETRA=´C´; ELSE if (PARCELAS=4) then LETRA=´D´; ELSE if (PARCELAS=5) then LETRA=´E´; ELSE if (PARCELAS=6) then LETRA=´F´; ELSE if (PARCELAS=7) then LETRA=´G´; ELSE if (PARCELAS=8) then LETRA=´H´; ELSE if (PARCELAS=9) then LETRA=´I´; ELSE if (PARCELAS=10) then LETRA=´J´; ELSE if (PARCELAS=11) then LETRA=´K´; ELSE if (PARCELAS=12) then LETRA=´L´ ; while (numParc <= parcelas) do begin if (numParc = parcelas) then valorparcela = valor_ultima; /*Parcela = cast(numParc as varchar(2)) || ´/´ || cast(parcelas as varchar(2));*/ /*FORMATA O NUMERO DA DUPLICATA */ if (numparc=1) then Parcela= :contrato||´-´||´A´||´/´||letra; else if (numparc=2) then Parcela= :contrato||´-´||´B´||´/´||letra; else if (numparc=3) then Parcela= :contrato||´-´||´C´||´/´||letra; else if (numparc=4) then Parcela= :contrato||´-´||´D´||´/´||letra; else if (numparc=5) then Parcela= :contrato||´-´||´E´||´/´||letra; else if (numparc=6) then Parcela= :contrato||´-´||´F´||´/´||letra; else if (numparc=7) then Parcela= :contrato||´-´||´G´||´/´||letra; else if (numparc=8) then Parcela= :contrato||´-´||´H´||´/´||letra; else if (numparc=9) then Parcela= :contrato||´-´||´I´||´/´||letra; else if (numparc=10) then Parcela= :contrato||´-´||´J´||´/´||letra; else if (numparc=11) then Parcela= :contrato||´-´||´K´||´/´||letra; else if (numparc=12) then Parcela= :contrato||´-´||´L´||´/´||letra; /* neste ponto você atualiza sua tabela */ suspend; numParc = numParc + 1; vencimento = vencimento + intervalo; end end
GOSTEI 0
_rodfaria_
15/02/2006
Que tal usar ASCII_CHAR e descartar estes if´s ?
65 é A
66 é B
e assim por diante.
Parcela= :contrato||´-´||ASCII_CHAR(64+numparc)||´/´||letra;
65 é A
66 é B
e assim por diante.
GOSTEI 0
Emerson Nascimento
15/02/2006
realmente, [b:0abd3d5404]se essa função ASCII_CHAR() fosse nativa[/b:0abd3d5404], a procedure ficaria assim:
acontece que ASCII_CHAR é uma UDF, e é necessário ter a biblioteca correta para uso da mesma.
CREATE PROCEDURE PARCELAR_VALOR ( VALOR NUMERIC(10,2), PARCELAS INTEGER, DDL INTEGER, INTERVALO INTEGER, CONTRATO VARCHAR(10)) RETURNS ( PARCELA VARCHAR(10), VENCIMENTO DATE, VALORPARCELA NUMERIC(10,2)) AS DECLARE VARIABLE VALOR_ULTIMA NUMERIC(10,2); DECLARE VARIABLE NUMPARC INTEGER; DECLARE VARIABLE LETRAFINAL CHAR(1); begin valorparcela = cast(valor / parcelas as integer); valor_ultima = valor - (valorparcela * (PARCELAS - 1)); numParc = 1; vencimento = current_date + ddl; letrafinal = ASCII_CHAR(64 + parcelas); while (numParc <= parcelas) do begin if (numParc = parcelas) then valorparcela = valor_ultima; /*FORMATA O NUMERO DA DUPLICATA */ Parcela = :contrato || ´-´ || ASCII_CHAR(64 + numParc) || ´/´ || letrafinal; /* neste ponto você atualiza sua tabela */ suspend; numParc = numParc + 1; vencimento = vencimento + intervalo; end end
acontece que ASCII_CHAR é uma UDF, e é necessário ter a biblioteca correta para uso da mesma.
GOSTEI 0
Helio Nascimento
15/02/2006
Bem Colegas abaixo segue a ultima ´Versão´ desta SP - agradeço a colaboração dos Colegas (_RodFaria_) e do (Emerson.en) este último foi contactado via MSM e lá trocamos ideias. Valeu emerson.en e _RodFaria_ é assim que se vive um ajudando um outro no que pode.
Até breve.... Funciona belezinha... Ah - somente no FIREBIRD - os Testes no INTERBASE 6,5 não funcionou. Desinstalei o INTERBASE e instalei o FIREBIRD versaão 1.5.3 .
Até breve.... Funciona belezinha... Ah - somente no FIREBIRD - os Testes no INTERBASE 6,5 não funcionou. Desinstalei o INTERBASE e instalei o FIREBIRD versaão 1.5.3 .
CREATE PROCEDURE PARCELAR_VALOR ( VALOR NUMERIC(10,2), PARCELAS INTEGER, DDL INTEGER, INTERVALO INTEGER, CONTRATO VARCHAR(10)) RETURNS ( PARCELA VARCHAR(25), VENCIMENTO DATE, VALORPARCELA NUMERIC(10,2)) AS DECLARE VARIABLE VALOR_ULTIMA NUMERIC(10,2); DECLARE VARIABLE NUMPARC INTEGER; DECLARE VARIABLE LETRAFINAL CHAR(1); begin valorparcela = truncate (valor / parcelas ); valor_ultima = valor - (valorparcela * (PARCELAS - 1)); numParc = 1; vencimento = current_date + ddl; letrafinal = ASCII_CHAR(64 + parcelas); while (numParc <= parcelas) do begin if (numParc = parcelas) then valorparcela = valor_ultima; /*FORMATA O NUMERO Do titulo */ Parcela = :contrato || ´-´ || ASCII_CHAR(64 + numParc) || ´/´ || letrafinal; /* neste ponto você atualiza sua tabela */ suspend; numParc = numParc + 1; vencimento = vencimento + intervalo; end end
GOSTEI 0
Helio Nascimento
15/02/2006
Somente para complementar a SP acima:
as Funcões TRUNCATE/ ASCII_CHAR são UDF´S e estão dentro da FBUDB.SQL é só abrir com o EXPERT , localiza´-las e copia´las e copilá-las. ok byby
as Funcões TRUNCATE/ ASCII_CHAR são UDF´S e estão dentro da FBUDB.SQL é só abrir com o EXPERT , localiza´-las e copia´las e copilá-las. ok byby
GOSTEI 0