AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2013, 14:55   #1  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Вообщем, нужно выводить тотал, не могу понять почему, но у меня не выходит вывести правильный...
код.

Код:
  IF HideNull THEN
  BEGIN
    TempColumnDimOption.RESET;
    IF TempColumnDimOption.FINDSET THEN
    REPEAT
       IF ColumnDimOption=ColumnDimOption::Period THEN
       BEGIN
         Date1:=TempColumnDimOption."Period Start";
         Date2:=TempColumnDimOption."Period End";
       END;

       CASE ColumnDimOption OF
         ColumnDimOption::Element:
           element1:=TempColumnDimOption.Code;
         ColumnDimOption::"Element Group":
           elementgroup1:=TempColumnDimOption.Code;
         ColumnDimOption::Employee:
           emp1:=TempColumnDimOption.Code;
         ColumnDimOption::"Org. Unit":
           organizatunit1:=TempColumnDimOption.Code;
       END;

       SumAmount1:=CalcPayroll1(COMPANYNAME,Date1,Date2,element1,emp1,organizatunit1,elementgroup1);

       TotalSum+=SumAmount1;
    UNTIL TempColumnDimOption.NEXT=0;
  END;


  IF ((TotalSum<>0) AND HideNull) OR (NOT HideNull) THEN
  BEGIN
    xlWorkSheet.Cells.Item(i,2,FORMAT(TempLineDimOption.Code));
    xlWorkSheet.Range(ColInInteger(2)+FORMAT(i)+':'+ColInInteger(2)+FORMAT(i))._BorderAround(1,2);
    xlWorkSheet.Range(ColInInteger(2)+FORMAT(i)+':'+ColInInteger(2)+FORMAT(i)).EntireColumn.AutoFit;

    Col:=3;
    TempColumnDimOption.RESET;
    cnt:=TempColumnDimOption.COUNT;
    IF TempColumnDimOption.FINDSET THEN
    REPEAT
        IF ColumnDimOption=ColumnDimOption::Period THEN
        BEGIN
          Date1:=TempColumnDimOption."Period Start";
          Date2:=TempColumnDimOption."Period End";
        END;

        CASE ColumnDimOption OF
          ColumnDimOption::Element:
            element1:=TempColumnDimOption.Code;
          ColumnDimOption::"Element Group":
            elementgroup1:=TempColumnDimOption.Code;
          ColumnDimOption::Employee:
            emp1:=TempColumnDimOption.Code;
          ColumnDimOption::"Org. Unit":
            organizatunit1:=TempColumnDimOption.Code;
        END;

        SumAmount1:=0;

        SumAmount1:=CalcPayroll1(COMPANYNAME,Date1,Date2,element1,emp1,organizatunit1,elementgroup1);
        TotalSum+=SumAmount1;

        IF SumAmount1<>0 THEN
            xlWorkSheet.Cells.Item(i,Col,FORMAT(SumAmount1));
        xlWorkSheet.Range(ColInInteger(Col)+FORMAT(i)+':'+ColInInteger(Col)+FORMAT(i))._BorderAround(1,2);
        xlWorkSheet.Range(ColInInteger(Col)+FORMAT(i)+':'+ColInInteger(Col)+FORMAT(i)).EntireColumn.AutoFit;

        Col:=Col+1;
    UNTIL TempColumnDimOption.NEXT=0;
    i:=i+1;
xlWorkSheet.Cells.Item(i,Col-1,FORMAT(TotalSum));
xlWorkSheet.Range(ColInInteger(Col-1)+FORMAT(i)+':'+ColInInteger(Col-1)+FORMAT(i)).EntireColumn.AutoFit;
  END;
UNTIL TempLineDimOption.NEXT=0;
Старый 20.11.2013, 16:31   #2  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
У вас не весь код приведен. Нет начала цикла по TempLineDimOption. TotalSum вы выводите внутри цикла, может вы просто не обнуляете эту переменную в цикле? Или она должна считаться с нарастающим итогом?
Старый 20.11.2013, 16:31   #3  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Чего дебаггер показывает? Заполняется TotalSum?
Старый 20.11.2013, 17:44   #4  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
все не могу сделать тотал для каждой строки/столбца...

вот код, еще раз..(
Код:
xlWorkSheet.Cells.Item(1,2,'Àíàëèç çàðïëàòû ïî èçìåðåíèÿì');
xlWorkSheet.Cells.Item(2,2,'Ïåðèîä ñ '+FORMAT(periodstart)+' ïî '+FORMAT(periodend));
xlWorkSheet.Range(ColInInteger(2)+FORMAT(1)+':'+ColInInteger(2)+FORMAT(1)).Font.Bold:=TRUE;
xlWorkSheet.Range(ColInInteger(2)+FORMAT(2)+':'+ColInInteger(2)+FORMAT(2)).EntireColumn.AutoFit;
xlWorkSheet.Cells.Item(toprow,2,'Íàçâàíèå');
xlWorkSheet.Range(ColInInteger(2)+FORMAT(toprow)+':'+ColInInteger(2)+FORMAT(toprow)).Font.Bold:=TRUE;
xlWorkSheet.Range(ColInInteger(2)+FORMAT(toprow)+':'+ColInInteger(2)+FORMAT(toprow)).HorizontalAlignment:=-4108;
xlWorkSheet.Range(ColInInteger(2)+FORMAT(toprow)+':'+ColInInteger(2)+FORMAT(toprow)).VerticalAlignment:=-4108;
xlWorkSheet.Range(ColInInteger(2)+FORMAT(toprow)+':'+ColInInteger(2)+FORMAT(toprow+2))._BorderAround(1,2);
xlWorkSheet.Range(ColInInteger(2)+FORMAT(toprow)+':'+ColInInteger(2)+FORMAT(toprow+2)).Merge;

TempColumnDimOption.RESET;
TempLineDimOption.RESET;

TempColumnDimOption.DELETEALL;
TempLineDimOption.DELETEALL;

pav.RESET;
pav.SETRANGE(Code,salary);
pav.FINDFIRST;

totaltotal:=0;
TotalSum:=0;

CASE LineDimOption OF
 LineDimOption::Element:
 BEGIN
   PayrollElement.RESET;
   IF element<>'' THEN
     PayrollElement.SETFILTER(Code,element);
   IF PayrollElement.FINDSET THEN
   REPEAT
   
   TempLineDimOption.INIT;
   TempLineDimOption.Code:=PayrollElement.Code;
   TempLineDimOption.Name:=PayrollElement.Code;
   TempLineDimOption.INSERT;

  UNTIL PayrollElement.NEXT=0;


 END;
 LineDimOption::"Element Group":
 BEGIN
   PayrollElementGroup.RESET;
   IF elementgroup<>'' THEN
     PayrollElementGroup.SETFILTER(Code,elementgroup);
   IF PayrollElementGroup.FINDSET THEN
   REPEAT
   
   TempLineDimOption.INIT;
   TempLineDimOption.Code:=PayrollElementGroup.Code;
   TempLineDimOption.Name:=PayrollElementGroup.Code;
   TempLineDimOption.INSERT;

  UNTIL PayrollElementGroup.NEXT=0;


 END;
 LineDimOption::Employee:
 BEGIN
   Employee.RESET;
   IF emp<>'' THEN
     Employee.SETFILTER("No.",emp);
   IF Employee.FINDSET THEN
   REPEAT
   
   TempLineDimOption.INIT;
   TempLineDimOption.Code:=Employee."No.";
   TempLineDimOption.Name:=Employee."Full Name";
   TempLineDimOption.INSERT;
  UNTIL Employee.NEXT=0;


 END;
 LineDimOption::"Org. Unit":
 BEGIN
   OrganizationUnit.RESET;
   IF organizatunit<>'' THEN
     OrganizationUnit.SETFILTER(Code,organizatunit);
   IF OrganizationUnit.FINDSET THEN
   REPEAT
   
   TempLineDimOption.INIT;
   TempLineDimOption.Code:=OrganizationUnit.Code;
   TempLineDimOption.Name:=OrganizationUnit.Code;
   TempLineDimOption.INSERT;

  UNTIL OrganizationUnit.NEXT=0;


 END;
 LineDimOption::Period:
 BEGIN
  CurDate:=periodstart;

  ii:=1;
  CASE PeriodType OF
   PeriodType::Day:
     Formula:='<1D>';
   PeriodType::Week:
     Formula:='<1W>';
   PeriodType::Month:
     Formula:='<1M>';
   PeriodType::Quarter:
     Formula:='<1Q>';
   PeriodType::Year:
     Formula:='<1Y>';
  END;

  REPEAT

    CASE PeriodType OF
     PeriodType::Day:
       LastDate:=CurDate;
     PeriodType::Week:
       LastDate:=CALCDATE('<1W-1D>',CurDate);
     PeriodType::Month:
       LastDate:=CALCDATE('<1M-1D>',CurDate);
     PeriodType::Quarter:
       LastDate:=CALCDATE('<1Q-1D>',CurDate);
     PeriodType::Year:
       LastDate:=CALCDATE('<1Y-1D>',CurDate);
    END; 
     
   TempLineDimOption.INIT;
   TempLineDimOption.Code:=FORMAT(ii);
   TempLineDimOption.Name:=FORMAT(CurDate);
   TempLineDimOption."Period Start":=CurDate;
   TempLineDimOption."Period End":=LastDate;
   TempLineDimOption.INSERT;

    ii:=ii+1;
    CurDate:=CALCDATE(Formula,CurDate);
  UNTIL CurDate>periodend;
 END;
END;


CASE ColumnDimOption OF
 ColumnDimOption::Element:
 BEGIN
   PayrollElement.RESET;
   IF element<>'' THEN
     PayrollElement.SETFILTER(Code,element);
   IF PayrollElement.FINDSET THEN
   REPEAT

   TempColumnDimOption.INIT;
   TempColumnDimOption.Code:=PayrollElement.Code;
   TempColumnDimOption.Name:=PayrollElement.Code;
   TempColumnDimOption.INSERT;

  UNTIL PayrollElement.NEXT=0;


 END;
 ColumnDimOption::"Element Group":
 BEGIN
   PayrollElementGroup.RESET;
   IF elementgroup<>'' THEN
     PayrollElementGroup.SETFILTER(Code,elementgroup);
   IF PayrollElementGroup.FINDSET THEN
   REPEAT
   
   TempColumnDimOption.INIT;
   TempColumnDimOption.Code:=PayrollElementGroup.Code;
   TempColumnDimOption.Name:=PayrollElementGroup.Code;
   TempColumnDimOption.INSERT;

  UNTIL PayrollElementGroup.NEXT=0;


 END;
 ColumnDimOption::Employee:
 BEGIN
   Employee.RESET;
   IF emp<>'' THEN
     Employee.SETFILTER("No.",emp);
   IF Employee.FINDSET THEN
   REPEAT
   
   TempColumnDimOption.INIT;
   TempColumnDimOption.Code:=Employee."No.";
   TempColumnDimOption.Name:=Employee."Full Name";
   TempColumnDimOption.INSERT;
  UNTIL Employee.NEXT=0;


 END;
 ColumnDimOption::"Org. Unit":
 BEGIN
   OrganizationUnit.RESET;
   IF organizatunit<>'' THEN
     OrganizationUnit.SETFILTER(Code,organizatunit);
   IF OrganizationUnit.FINDSET THEN
   REPEAT
   
   TempColumnDimOption.INIT;
   TempColumnDimOption.Code:=OrganizationUnit.Code;
   TempColumnDimOption.Name:=OrganizationUnit.Code;
   TempColumnDimOption.INSERT;

  UNTIL OrganizationUnit.NEXT=0;


 END;
 ColumnDimOption::Period:
 BEGIN
  CurDate:=periodstart;

  ii:=1;
  CASE PeriodType OF
   PeriodType::Day:
     Formula:='<1D>';
   PeriodType::Week:
     Formula:='<1W>';
   PeriodType::Month:
     Formula:='<1M>';
   PeriodType::Quarter:
     Formula:='<1Q>';
   PeriodType::Year:
     Formula:='<1Y>';
  END;

  REPEAT

    CASE PeriodType OF
     PeriodType::Day:
       LastDate:=CurDate;
     PeriodType::Week:
       LastDate:=CALCDATE('<1W-1D>',CurDate);
     PeriodType::Month:
       LastDate:=CALCDATE('<1M-1D>',CurDate);
     PeriodType::Quarter:
       LastDate:=CALCDATE('<1Q-1D>',CurDate);
     PeriodType::Year:
       LastDate:=CALCDATE('<1Y-1D>',CurDate);
    END; 
     
   TempColumnDimOption.INIT;
   TempColumnDimOption.Code:=FORMAT(ii);
   TempColumnDimOption.Name:=FORMAT(CurDate);
   TempColumnDimOption."Period Start":=CurDate;
   TempColumnDimOption."Period End":=LastDate;
   TempColumnDimOption.INSERT;

    ii:=ii+1;
    CurDate:=CALCDATE(Formula,CurDate);

  UNTIL CurDate>periodend;
 END;
END;


Col:=3;
TempColumnDimOption.RESET;
cnt:=TempColumnDimOption.COUNT;
IF TempColumnDimOption.FINDSET THEN
REPEAT
  xlWorkSheet.Cells.Item(toprow,Col,FORMAT(TempColumnDimOption.Name));
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow)).Font.Bold:=TRUE;
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow)).HorizontalAlignment:=-4108;
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow)).VerticalAlignment:=-4108;
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow+2))._BorderAround(1,2);
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow+2)).Merge;
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(toprow)+':'+ColInInteger(Col)+FORMAT(toprow)).EntireColumn.AutoFit;

  Col:=Col+1;
UNTIL TempColumnDimOption.NEXT=0;

w:=0;
Window.OPEN('Ïîñòðîåíèå îò÷åòà @1@@@@@@@@@@@@@@@@@@@@@');
i:=7;

TempLineDimOption.RESET;
cnt:=TempLineDimOption.COUNT;
IF TempLineDimOption.FINDSET THEN
  REPEAT
  w+=1;
  Window.UPDATE(1,ROUND(w/cnt*10000,1));

  element1:='';
  emp1:='';
  organizatunit1:='';
  elementgroup1:='';

  CASE LineDimOption OF
    LineDimOption::Element:
      element1:=TempLineDimOption.Code;
    LineDimOption::"Element Group":
      elementgroup1:=TempLineDimOption.Code;
    LineDimOption::Employee:
      emp1:=TempLineDimOption.Code;
    LineDimOption::"Org. Unit":
      organizatunit1:=TempLineDimOption.Code;
  END;

  Date1:=periodstart;
  Date2:=periodend;

  IF LineDimOption=LineDimOption::Period THEN
  BEGIN
    Date1:=TempLineDimOption."Period Start";
    Date2:=TempLineDimOption."Period End";
  END;

  TotalSum:=0;

  IF HideNull THEN
  BEGIN
    TempColumnDimOption.RESET;
    IF TempColumnDimOption.FINDSET THEN
    REPEAT
       IF ColumnDimOption=ColumnDimOption::Period THEN
       BEGIN
         Date1:=TempColumnDimOption."Period Start";
         Date2:=TempColumnDimOption."Period End";
       END;

       CASE ColumnDimOption OF
         ColumnDimOption::Element:
           element1:=TempColumnDimOption.Code;
         ColumnDimOption::"Element Group":
           elementgroup1:=TempColumnDimOption.Code;
         ColumnDimOption::Employee:
           emp1:=TempColumnDimOption.Code;
         ColumnDimOption::"Org. Unit":
           organizatunit1:=TempColumnDimOption.Code;
       END;

       SumAmount1:=CalcPayroll1(COMPANYNAME,Date1,Date2,element1,emp1,organizatunit1,elementgroup1);

       TotalSum+=SumAmount1;
       totaltotal+=SumAmount1;
    UNTIL TempColumnDimOption.NEXT=0;
  END;


  IF ((TotalSum<>0) AND HideNull) OR (NOT HideNull) THEN
  BEGIN
    xlWorkSheet.Cells.Item(i,2,FORMAT(TempLineDimOption.Name));
    xlWorkSheet.Range(ColInInteger(2)+FORMAT(i)+':'+ColInInteger(2)+FORMAT(i))._BorderAround(1,2);
    xlWorkSheet.Range(ColInInteger(2)+FORMAT(i)+':'+ColInInteger(2)+FORMAT(i)).EntireColumn.AutoFit;
    Col:=3;
    TempColumnDimOption.RESET;
    cnt:=TempColumnDimOption.COUNT;
    IF TempColumnDimOption.FINDSET THEN
    REPEAT
        IF ColumnDimOption=ColumnDimOption::Period THEN
        BEGIN
          Date1:=TempColumnDimOption."Period Start";
          Date2:=TempColumnDimOption."Period End";
        END;

        CASE ColumnDimOption OF
          ColumnDimOption::Element:
            element1:=TempColumnDimOption.Code;
          ColumnDimOption::"Element Group":
            elementgroup1:=TempColumnDimOption.Code;
          ColumnDimOption::Employee:
            emp1:=TempColumnDimOption.Code;
          ColumnDimOption::"Org. Unit":
            organizatunit1:=TempColumnDimOption.Code;
        END;

        SumAmount1:=CalcPayroll1(COMPANYNAME,Date1,Date2,element1,emp1,organizatunit1,elementgroup1);
        IF SumAmount1<>0 THEN
            xlWorkSheet.Cells.Item(i,Col,FORMAT(SumAmount1));
        xlWorkSheet.Range(ColInInteger(Col)+FORMAT(i)+':'+ColInInteger(Col)+FORMAT(i))._BorderAround(1,2);
        xlWorkSheet.Range(ColInInteger(Col)+FORMAT(i)+':'+ColInInteger(Col)+FORMAT(i)).EntireColumn.AutoFit;

        Col:=Col+1;
    UNTIL TempColumnDimOption.NEXT=0;
    i:=i+1;
  END;
UNTIL TempLineDimOption.NEXT=0;

xlWorkSheet.Cells.Item(i,Col-1,FORMAT(totaltotal));
xlWorkSheet.Range(ColInInteger(Col-1)+FORMAT(i)+':'+ColInInteger(Col-1)+FORMAT(i)).EntireColumn.AutoFit;
Window.CLOSE;
Старый 20.11.2013, 18:10   #5  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Либо может есть какая то функция в навике? которая сможет свести строки/столбцы и подсчитать этот TOTAL
Старый 20.11.2013, 18:22   #6  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Нашел формулу в екселе

Код:
Sub Ìàêðîñ2()
'
' Ìàêðîñ2 Ìàêðîñ
'

'
    Range("C11").Select
    ActiveCell.FormulaR1C1 = "=SUM(R[-10]C[-1]:worshippy:/>[-1]C[-1])"
    Range("C12").Select
End Sub
Только вот не знаю как перенести ее в навик(
Старый 20.11.2013, 18:24   #7  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Таблицы скулевые. Можно вообще скрипт в VBA написать при желании..
Но у нас НАВ.
Так что говорит дебаггер? Я пока не понял. Переменная вообще не заполняется? Или заполняется, но неверно? Пробегитесь, посмотрите - поймете, в чем ошибка я думаю. Чего на кофейной гуще гадать.
Старый 20.11.2013, 18:32   #8  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Цитата:
Сообщение от romeo Посмотреть сообщение
Таблицы скулевые. Можно вообще скрипт в VBA написать при желании..
Но у нас НАВ.
Так что говорит дебаггер? Я пока не понял. Переменная вообще не заполняется? Или заполняется, но неверно? Пробегитесь, посмотрите - поймете, в чем ошибка я думаю. Чего на кофейной гуще гадать.
короче, переменная заполняется, дебагер ничего в этом случае не говорит (молчит), да и мне нужен тотал не для всех сумм, а отдельно для каждой строки по тем же фильтрам, что у меня через CASE идут..
точно такое же и для столбцов.
Старый 21.11.2013, 09:05   #9  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
В приведенном во втором случае коде, вы вообще не выводите переменную TotalSum, вы выводите только totaltotal в конце всех строк.
Формулу в Excel можно вывести с помощью:
Код:
XLSheet.Range('A1').FormulaR1C1 := 'тут ваша формула';
Старый 21.11.2013, 12:48   #10  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Цитата:
Сообщение от Constantine Посмотреть сообщение
В приведенном во втором случае коде, вы вообще не выводите переменную TotalSum, вы выводите только totaltotal в конце всех строк.
Формулу в Excel можно вывести с помощью:
Код:
XLSheet.Range('A1').FormulaR1C1 := 'тут ваша формула';
Спасибо огромное.
сделал вот так
Код:
  xlWorkSheet.Range(ColInInteger(Col)+FORMAT(i)+':'+
      ColInInteger(Col)+FORMAT(i)).FormulaR1C1(STRSUBSTNO(Text002,i-firstrow,1));
есть еще один вопрос, как сделать заполнение цветом*??
и ,00 (два ноля после суммы)
Старый 21.11.2013, 15:45   #11  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Заливка:

Код:
Red := 255;
Green := 5287936;
xlSheet.Range('A1').Interior.Color := Red;
xlSheet.Range('B1').Interior.Color := Green;
Формат:

Код:
xlRange.NumberFormat := '0.00';
Старый 21.11.2013, 16:38   #12  
524td is offline
524td
Участник
 
19 / 10 (1) +
Регистрация: 18.11.2013
Цитата:
Сообщение от Constantine Посмотреть сообщение
Заливка:

Код:
Red := 255;
Green := 5287936;
xlSheet.Range('A1').Interior.Color := Red;
xlSheet.Range('B1').Interior.Color := Green;
Формат:

Код:
xlRange.NumberFormat := '0.00';
спасибо огромное, хоть и уже сделал
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 14:36.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.