13 декабря, среда 16:10
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

Расшифровка рассчета %%

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Расшифровка рассчета %%

    Задача:
    Выдать клиенту сумму процентов, которые он должен уплатить, с расшифровкой расчета.

    После консультаций с Кворумом родилось следующее:

    1. Создаем в БД типы объектов
    Код:
    CREATE OR REPLACE 
    TYPE nm_trashrec IS OBJECT (
        ArrPerc                       NUMBER,
        ArrDay                        NUMBER,
        ArrStav                       NUMBER,
        ArrDate                       DATE,
        ArrLim                        NUMBER,
        ArrYear                       NUMBER)
    /
    Код:
    CREATE OR REPLACE 
    TYPE nm_trashbox IS TABLE OF NM_TRASHREC
    /
    2. Добавляем в пакет CREDPERCOBJ ф-ию

    Код:
      FUNCTION nm_GetPercDecipher
      RETURN nm_TrashBox;
    
    
      FUNCTION nm_GetPercDecipher
       RETURN nm_TrashBox
      IS
       v_nm_TrashBox nm_TrashBox := nm_TrashBox();
       v_RashBox nm_trashrec := nm_trashrec(0, 0, 0, SYSDATE, 0, 0);
       i NUMERIC(15) := 1;
      BEGIN
    
       WHILE (i = RashBox.COUNT) LOOP
    
         v_RashBox.ARRPERC := RashBox(i).ARRPERC;
         v_RashBox.ARRDAY  := RashBox(i).ARRDAY;
         v_RashBox.ARRSTAV := RashBox(i).ARRSTAV;
         v_RashBox.ARRDATE := RashBox(i).ARRDATE;
         v_RashBox.ARRLIM  := RashBox(i).ARRLIM;
         v_RashBox.ARRYEAR := RashBox(i).ARRYEAR;
         
         v_nm_TrashBox.EXTEND;
         v_nm_TrashBox(i) := v_RashBox;
    
         i := i + 1;
       END LOOP;
       
       RETURN v_nm_TrashBox;
      END;
    3. Теперь можно получить отчет:

    Опускаю часть кода для экономии места :-))

    dtBegDate, F2 - Начало/Окончание периода
    Код:
      if Not PrCalcPerc_InitOpen
        { PutWarning('Ошибка "PrCalcPerc_InitOpen"');
          Call ExitProc;
        };
    
      PrCalcPerc_SetCont(1, Pointer(CredCont.GetBuffer), Pointer(CrSchem.GetBuffer));
      if Not PrCalcPerc_BuildLimModel(1, dtBegDate)
       { PutError('Ошибка при прогнозе процентов по договору #' + CredCont.ContNum);
         Call ExitProc;
       };
    
    
    // Запрос для получения расшифровок
      sSql := 'select * from TABLE(cast(CREDPERCOBJ.nm_GetPercDecipher() as nm_TrashBox))';
    
    
    
      // Бокс для расшифровки %%
      DisposeLS(csLSPerc);
      sLSPar := PPack(@ls_dPerc)          + abDouble  +
                PPack(@ls_lDay)           + abLongInt +
                PPack(@ls_dStav)          + abDouble  +
                PPack(@ls_dtDate)         + abDate    +
                PPack(@ls_dLim)           + abDouble  +
                PPack(@ls_lYear)          + abLongInt;
      if Not CreateLongSaver(csLSPerc, sLSPar, chr(3) + chr(0), 100, 100, True)
       { StrMessage('Ошибка "CreateLongSaver"', mfEOk);
         Call ExitProc;
       };
    
      if Not SetTarLS(csLSPerc)
       { StrMessage('Ошибка "SetTarLS(csLSPerc)"', mfEOk);
         Call ExitProc;
       };
    
      Sum := 0.0; WasSumming := False;
    
      if PrCalcPerc_GetFirstPeriodIn(SeeCurrOperDay, dtBegDate, F2)
      Do {
           // Сумма %% за период начисления (месяц, квартал, ...) в зав. от схемы
           dSumPerc := PrCalcPerc_PercPeriod(1, PrCalcPerc_BegDate, PrCalcPerc_EndDate);
    
    
            ClearFarmSQL;
            AddFarmSql(sSql);
    
            LS_DELETEALL(csLSPerc);
            // А здесь мы получаем искомые "волшебные пузырьки"
            if Not TLSFillBySQL
             { StrMessage('Ошибка "TLSFillBySQL"', mfEOk);
               ShowFarmSQL;
               Call ExitProc;
             };
    
            //dtBeg := PrCalcPerc_BegDate;
            if Ls_GetFirst(csLSPerc)
            Do {
    
                 write(String(Add_Day(ls_dtDate, -(ls_lDay - 1)),'DD.MM.YYYY'));
                 write(String(ls_dtDate,'DD.MM.YYYY'));
                 write(String(ls_lDay, '6667'));
                 write(String(ls_dStav, '667.88'));
                 write(string(ls_dLim, csFmt));
                 write(string(ls_dPerc, csFmt));
    
                 Sum := Sum + abs(ls_dPerc);
    
               } While (LS_GetNext(csLSPerc));
    
          } While PrCalcPerc_GetNextPeriodIn(dtBegDate, F2);

  • #2
    А так это можно сделать из Pl/sql

    Код:
    DECLARE 
     dtBeg DATE := TO_DATE('03022004', 'DDMMYYYY');
     dtEnd DATE := TO_DATE('31012005', 'DDMMYYYY');
     sContNum VARCHAR(9) := '   13-4/Л'; -- Договор
     dSum NUMBER; 
    
     iDTek DATE :=  OpenDay.SeeCurrOperDay;
     v_dtBeg DATE;
     
     glBegDate DATE; 
     glEndDate DATE; 
     oProDate DATE;
     
     v_nm_TrashBox nm_TrashBox := nm_TrashBox();
     v_RashBox nm_trashrec := nm_trashrec(0, 0, 0, SYSDATE, 0, 0);
     
     i NUMERIC(15);
     
     nRet NUMERIC;
     
     sBuf VARCHAR(255);
     x NUMERIC;
     
    BEGIN
      nRet := CREDPERCOBJ.SetCalcParam(1, sContNum); 
      IF nRet = 0 THEN
        dbms_output.put_line('CREDPERCOBJ.SetCalcParam = 0');
        RETURN;
      END IF;
      
      v_dtBeg  := CREDPERCOBJ.PercStartDate(OpenDay.SeeCurrOperDay);
      
      IF v_dtBeg  dtBeg THEN
      	v_dtBeg := dtBeg;
      END IF;
      
    	IF v_dtBeg > dtEnd then
    		dbms_output.put_line(' v_dtBeg > dtEnd');
    		RETURN;
    	END IF; 
    	
    	dSum := 0;
    
      IF CREDPERCOBJ.BuildSubLimModel(iDTek, Flat.D3000, 0) > 1 THEN
        RETURN;
      END IF;
      
      IF CREDPERCOBJ.GetFirstPeriodIn(iDTek, v_dtBeg, dtEnd) = 1 THEN
    
        LOOP
        
          CREDPERCOBJ.GetDateParam(glBegDate, glEndDate, oProDate); 
    			
        
    	    x := CREDPERCOBJ.PercPeriod(glBegDate, glEndDate);
          v_nm_TrashBox := CREDPERCOBJ.nm_GetPercDecipher();        
        
    	FOR i IN 1..v_nm_TrashBox.COUNT LOOP
    		v_RashBox := v_nm_TrashBox(i);
    		
    		sBuf := TO_CHAR(v_RashBox.ArrDate - (v_RashBox.ARRDAY - 1)) || ' | ';
       	sBuf := sBuf || TO_CHAR(v_RashBox.ArrDate) || ' | ';
       	sBuf := sBuf || TO_CHAR(v_RashBox.ArrDAY) || ' | ';
       	sBuf := sBuf || TO_CHAR(v_RashBox.ArrStav, '9999.99') || ' | ';
       	sBuf := sBuf || TO_CHAR(v_RashBox.ArrLim, '99999999.99') || ' | ';
       	sBuf := sBuf || TO_CHAR(v_RashBox.ArrPerc, '99999999.99') || ' | ';
    
      	dSum := dSum + abs(v_RashBox.ArrPerc);
    		
    		sBuf := sBuf || TO_CHAR(dSum, '99999999.99') || ' | ';
    		dbms_output.put_line(sBuf);
    	END LOOP;
    		  
          EXIT WHEN  CREDPERCOBJ.GetNextPeriodIn(v_dtBeg, dtEnd) > 1;
        END LOOP;
      END IF;
      
      dbms_output.put_line(to_char(dSum, '99999999.999'));
       
    END;

    Комментарий

    Пользователи, просматривающие эту тему

    Свернуть

    Присутствует 1. Участников: 0, гостей: 1.

    Обработка...
    X