Como montar uma SP para Contas a Receber

Firebird

15/02/2006

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


Helio Nascimento

Helio Nascimento

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

15/02/2006

tente algo assim:
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

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.

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_

_rodfaria_

15/02/2006

Que tal usar ASCII_CHAR e descartar estes if´s ?

Parcela= :contrato||´-´||ASCII_CHAR(64+numparc)||´/´||letra;


65 é A
66 é B
e assim por diante.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

15/02/2006

realmente, [b:0abd3d5404]se essa função ASCII_CHAR() fosse nativa[/b:0abd3d5404], a procedure ficaria assim:
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

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 .

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

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


GOSTEI 0
POSTAR