Показать сообщение отдельно
Старый 11.11.2005, 13:36   #31  
Polar is offline
Polar
Участник
Аватар для Polar
 
281 / 74 (3) ++++
Регистрация: 28.07.2003
Адрес: Ростов-на-Дону
Function
GetPaymentString(CustomerNo:Code[10],CalcDate: Date,CustPostingGroup:Code[10]): Text[250]

CustomerNo код клиента
CalcDate дата на момент которой считать предоплату
CustPostingGroup учетная группа клиента
C\AL Locals
Customer record Customer
CLE record Cust. Ledger Entry
balance decimal

result returnvalue Text[250]

Код:
     result:='';

     IF customer.GET(CustomerNo) THEN
        BEGIN
         customer.SETRANGE("Date Filter",0D,CalcDate); // фильтр чтобы посчитать вычисимые  поля
         
         IF CustPostingGroup = '' THEN
            CustPostingGroup:=customer."Customer Posting Group";
           // если пустая учетная группа берем из настроек клиента.
           // если с клиентом работаем по разным счетам(субсчетам) например продаем услуги и товары 
           // в этом случае нам понадобится учетная группа клиента
         customer.CALCFIELDS("Net Change (LCY)"); //вычисляем баланс
          // во здесь аккуратнее стандартное поле не считает баланс по учетным группам
          // можно отредактировать в формулу вычисления или добавить свое поле 
          // чтобы считать именно предоплату по этой учетной группе (например за товар)
         IF customer."Net Change (LCY)" <0 THEN // есть предоплата
            BEGIN
              balance:=ABS(customer."Net Change (LCY)"); 
              CLE.SETRANGE("Document Type",CLE."Document Type"::Payment); 
              // фильтр по оплатам (будем печатать в сф только оплаты)
              CLE.SETRANGE("Customer No.",customer."No.");
              CLE.SETRANGE("Posting Date",0D,CalcDate);
              CLE.SETRANGE("Customer Posting Group", CustPostingGroup);
              IF CLE.FIND('-') THEN
                 REPEAT
                  CLE.MARK(TRUE);  // помечаем записи оплат, потом пойдем вычислять с последней 
                 UNTIL CLE.NEXT = 0;
              


              WHILE CLE.FIND('+') AND (balance>0) DO
              BEGIN
                CLE.CALCFIELDS("Remaining Amount"); // непримененная сумма, только для открытых операций
                IF CLE.Open THEN
                  balance:=balance - ABS(CLE."Remaining Amount") 
                ELSE
                  balance:=balance - ABS(CLE.Amount);
                result:=CLE."External Document No." + ' от '+FORMAT(CLE."Posting Date") + ','+result;
                CLE.MARK(FALSE);
                CLE.MARKEDONLY(TRUE);
              END;
            END;

        END;


Вот в принципе и вся логика для Навижина.
Если найдете косяки обязательно сообщите.
__________________
Удачи!

Последний раз редактировалось Polar; 11.11.2005 в 13:39.