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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.04.2012, 06:40   #21  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Написала код, который рассчитывает сумму строк, также как если бы я просто указала на них в groupfooter. Если я расчитанное значение подставляю в body то вижу все итерации, если в groupfooter то вижу правильное значение, если в groupheader то только сумму первой строки, а не всех строк, подскажите как мне отобразить полную рассчитанную сумма в groupheader. Или же какие то другие способы группировать и выводить итоги над записями.
Старый 17.04.2012, 08:38   #22  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
Написала код, который рассчитывает сумму строк, также как если бы я просто указала на них в groupfooter.
Вы в своем коде наверное используете DataItem. Попробуйте объявить переменные Rec на нужные вам таблицы (как в DataItem) и посчитайте свои значения через них. Но тут получится,что NAV будет 2 раза считать одно и то же, один раз для заголовка, а второй раз - для Body, когда будет обходить все DataItem.

P.S. попробуйте отчет в Excel вывести, как мне кажется, получается более гибко.
Старый 17.04.2012, 08:47   #23  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от Constantine Посмотреть сообщение
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
Написала код, который рассчитывает сумму строк, также как если бы я просто указала на них в groupfooter.
Вы в своем коде наверное используете DataItem. Попробуйте объявить переменные Rec на нужные вам таблицы (как в DataItem) и посчитайте свои значения через них. Но тут получится,что NAV будет 2 раза считать одно и то же, один раз для заголовка, а второй раз - для Body, когда будет обходить все DataItem.

P.S. попробуйте отчет в Excel вывести, как мне кажется, получается более гибко.
В каком именно разделе мне писать код?
Старый 17.04.2012, 08:57   #24  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
В каком именно разделе мне писать код?
В Header, в который вы хотите вывести значения. Объявляете переменные, ставите на них нужные фильтры и потом

Код:
REPEAT
...
UNTIL ...NEXT = 0;
Ну или через CALCFIELDS или CALCSUMS, если позволяют ключи или нужные поля - FLOWFIELD.
Старый 17.04.2012, 10:17   #25  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от Constantine Посмотреть сообщение
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
В каком именно разделе мне писать код?
В Header, в который вы хотите вывести значения. Объявляете переменные, ставите на них нужные фильтры и потом

Код:
REPEAT
...
UNTIL ...NEXT = 0;
Ну или через CALCFIELDS или CALCSUMS, если позволяют ключи или нужные поля - FLOWFIELD.
Спасибо за ответ, код REPEAT.... работает, но он выводит неправильные значения. У меня заголовок имеет несколько значений, допустим если я не буду ставить группировку по учетной группе поставщика, то будет

Счет 60.....Сумма счета
- документ
- ...
- ...
Счет 66 ....Сумма счета

и т.д.

Каким образом, можно их друг от друга отделить, чтобы суммировать и выводить сумма для каждого счета в отдельности.

Написала вот такой код

Vendor Ledger Entry, GroupHeader (2) - OnPreSection()
CurrReport.SHOWOUTPUT(CurrReport.TOTALSCAUSEDBY=FIELDNO("Vendor Ledger Entry"."Vendor Posting Group"));
REPEAT
VLE.CALCFIELDS(VLE."Debit Amount (LCY)");
A:=A+VLE."Debit Amount (LCY)";
UNTIL VLE.NEXT = 0;

показывает непонятные значения, которые не понять как расчитаны. Подскажите исправить данную ситуацию.
Старый 17.04.2012, 10:23   #26  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Объясните зачем здесь использовать группировку?
Было бы проще просто использовать для каждого датайтема только боди и обычный хидер, раз все равно в начале суммы выводить придется. Уверен, что сейчас начнуться проблемы с тем куда вставлять вычисление и как получить фильтр из датайтема (Скорее всего в пресектион групфутера)
Старый 17.04.2012, 10:24   #27  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
UPD чуть-чуть не успел с ответом.
Старый 17.04.2012, 10:42   #28  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от InTacto Посмотреть сообщение
Объясните зачем здесь использовать группировку?
Было бы проще просто использовать для каждого датайтема только боди и обычный хидер, раз все равно в начале суммы выводить придется. Уверен, что сейчас начнуться проблемы с тем куда вставлять вычисление и как получить фильтр из датайтема (Скорее всего в пресектион групфутера)
Я только учюсь создавать отчеты, поэтому не знаю как будет лучше, делаю так нахожу в материалах.
Мне необходимо построить отчет по иерархии, вначале суммы по счету поставщика, потом из чего эта сумма складывается (по поставщикам), далее для каждого поставщика по договорам, а затем по документам.
у меня один датайтем - Vendor Ledger Entry.

Просто я начинала делать при помощи многий датайтемов и столкнулась с проблемами:
1.Vendor Posting Group
2.Vendor (тут я не знаю как связать с предыдущей таблицей, т.к. учетная группа поставщика постоянно меняется, а как для данной учетной группы отобразить суммы по дебету и кредиту в разрезе данного клиента???)
3.Vendor Agreement ( договор можно связать с поставщиком, но опять же проблема с учетной группой, точнее с счетом ГК для участвовал данный договор)
4.Vendor Ledger Entry (тут просто выводим все документы относящиеся к данной учетной группе, поставщику и договору).

Подскажите как быть в данной ситуации.
Старый 17.04.2012, 11:04   #29  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
У вас должно быть так:
Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет)
Поставщик1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику)
Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе)
Договор1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику, учетно)
Документ1
Документ2
Договор2
.......
Учетная группа2
Договор1
Документ1
.....
.....
Поставщик2
Учетная группа1
.....
Учетная группа2

Хотя разные учетные группы у одного поставщика меня смущают, ну да ладно.

Теперь по производительности.
Старый 17.04.2012, 11:18   #30  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от InTacto Посмотреть сообщение
У вас должно быть так:
Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет)
Поставщик1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику)
Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе)
Договор1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику, учетно)
Документ1
Документ2
Договор2
.......
Учетная группа2
Договор1
Документ1
.....
.....
Поставщик2
Учетная группа1
.....
Учетная группа2

Хотя разные учетные группы у одного поставщика меня смущают, ну да ладно.

Теперь по производительности.
А зачем нам Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе), когда она дублирует счет, и последовательность выдода должна быть:
Миниатюры
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 226
Размер:	13.2 Кб
ID:	10713  
Старый 17.04.2012, 11:38   #31  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Случайно запостил раньше сообщение, вот полный текст.

У вас должно быть так:
_Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет)
___Поставщик1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику)
______Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе)
__________Договор1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику, учетной группе, договору)
_____________Документ1 (выводим документы)
_____________Документ2
__________Договор2
__________.......
______Учетная группа2
__________Договор1
_____________Документ1
_____________.....
__________.....
___Поставщик2
______Учетная группа1
__________.....
______Учетная группа2

Хотя разные учетные группы у одного поставщика меня смущают, ну да ладно.

Теперь по производительности. Тут сложнее. Поля дебета и кредита вычесляемые, каждый раз их суммировать не айс. Лучше при подсчете суммы для счет загнать все операции во временную таблицу (например в GL Entry), не забыв указать номер постащика, группу, договор, документ в схожие по типу поля. Например, будем использовать ключик Source Type (оставляем пустым) ,Source No.( номер поставщика) ,G/L Account No. (пустой) ,Global Dimension 1 Code (группа) ,Global Dimension 2 Code (договор) ,Business Unit Code(пустой),Posting Date ( сюда на всякий случай запишем дату учета из операции) на временную табличку и указываем необходимые фильтры в зависимости от датайтема, в котором сейчас находимся. И делаем calcsums по дебету и кредиту.
Выводить придется записи из временной таблицы.
Возможно поля измерений не подойдут по длине и придется мутить другой ключ с подходящими полями, а может и другую табличку брать под временную
Старый 17.04.2012, 11:42   #32  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от zoya210489 Посмотреть сообщение

А зачем нам Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе), когда она дублирует счет, и последовательность выдода должна быть:
вы же сами сказали, что Учетная группа меняется. или они должны в другой счет перетечь?
Старый 18.04.2012, 03:22   #33  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от InTacto Посмотреть сообщение
Цитата:
Сообщение от zoya210489 Посмотреть сообщение

А зачем нам Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе), когда она дублирует счет, и последовательность выдода должна быть:
вы же сами сказали, что Учетная группа меняется. или они должны в другой счет перетечь?
Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц???
Старый 18.04.2012, 03:55   #34  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
Цитата:
Сообщение от InTacto Посмотреть сообщение
Цитата:
Сообщение от zoya210489 Посмотреть сообщение

А зачем нам Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе), когда она дублирует счет, и последовательность выдода должна быть:
вы же сами сказали, что Учетная группа меняется. или они должны в другой счет перетечь?
Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц???

Если поля дебет и кредит вычисляемые, то если попробовать наложить на них правильные фильтры то тогда может получится вывести правильные суммы;
Я вот попробовала вывести сумму по дебету для счета (например 66-2100), у меня получилось, использовала код:

IF GLA.GET("Vendor Ledger Entry"."Vendor Posting Group") THEN BEGIN
GLA.SETRANGE("Date Filter",StartDate,EndDate);
GLA.CALCFIELDS(GLA."Debit Amount");
AB:= GLA."Debit Amount";
END;

где GLA это Record - G/L Account;

Сумма выводится в HeaderGroup для каждого счета.

Но вот по поставщику так сумму не вывести просто, т.к. в его таблице Vendor сумма по дебету и кредиту отображается полная, как отфильтровать только ту, которая у нас получится при сложении сумм документов для данного поставщика и определенного счета из таблицы Vendor Ledger Entry. Можно ли будет как то наложить фильтры и вывести также просто сумму как у меня получилось для счета???
Старый 18.04.2012, 10:27   #35  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Попробовала написать фильтр, для поля группировки по поставщику:

IF Vendor.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN
Vendor.SETRANGE("Date Filter",StartDate,EndDate);
Vendor.CALCFIELDS(Vendor."Debit Amount (LCY)",Vendor."Credit Amount (LCY)");
LineAmount1[3] := Vendor."Debit Amount (LCY)";
LineAmount1[4] := Vendor."Credit Amount (LCY)";
END;

Проблема возникла в том, что он рассчитал сумму для поставщика по всем учетным группам, где он участвовал, т.е. все обобщил и получилось что по счету 66 у поставшика по дебету 300, когда на самом счете 100, т.к. он еще сложил суммы и с других счетов.

Затем попробывала рассчитать значение для клиента не через таблицу Vendor, а через Detailed Vendor Ledg. Entry (DVLE):

DVLE.SETCURRENTKEY(DVLE."Vendor Posting Group",DVLE."Vendor No.",DVLE."Agreement No.");
IF DVLE.GET(AA) and DVLE.GET(vdd) THEN BEGIN
DVLE.SETRANGE(DVLE."Posting Date",StartDate,EndDate);
DVLE.CALCSUMS(DVLE."Debit Amount (LCY)",DVLE."Credit Amount (LCY)");
LineAmount1[3] := DVLE."Debit Amount (LCY)";
LineAmount1[4] := DVLE."Credit Amount (LCY)";
END;

У меня выдает ошибку "Выражение Code нельзя преобразовать по типу значения Integer". Подскажите как можно решить данную проблему.
Старый 18.04.2012, 10:30   #36  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от zoya210489 Посмотреть сообщение

Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц???
Таблица будет одна. Фильтры перед суммированием будут разные.
Для того чтобы получить сумму по счету нужно наложить фильтр только на поле счета.
для поставщика по счету и поставщику
для договора по счету, постовщику и договору
использовать будем calcsums по ключу, о чем я писал в предыдущем посте.
Старый 18.04.2012, 10:44   #37  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
Попробовала написать фильтр, для поля группировки по поставщику:

IF Vendor.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN
Vendor.SETRANGE("Date Filter",StartDate,EndDate);
Vendor.CALCFIELDS(Vendor."Debit Amount (LCY)",Vendor."Credit Amount (LCY)");
LineAmount1[3] := Vendor."Debit Amount (LCY)";
LineAmount1[4] := Vendor."Credit Amount (LCY)";
END;

Проблема возникла в том, что он рассчитал сумму для поставщика по всем учетным группам, где он участвовал, т.е. все обобщил и получилось что по счету 66 у поставшика по дебету 300, когда на самом счете 100, т.к. он еще сложил суммы и с других счетов.

Затем попробывала рассчитать значение для клиента не через таблицу Vendor, а через Detailed Vendor Ledg. Entry (DVLE):

DVLE.SETCURRENTKEY(DVLE."Vendor Posting Group",DVLE."Vendor No.",DVLE."Agreement No.");
IF DVLE.GET(AA) and DVLE.GET(vdd) THEN BEGIN
DVLE.SETRANGE(DVLE."Posting Date",StartDate,EndDate);
DVLE.CALCSUMS(DVLE."Debit Amount (LCY)",DVLE."Credit Amount (LCY)");
LineAmount1[3] := DVLE."Debit Amount (LCY)";
LineAmount1[4] := DVLE."Credit Amount (LCY)";
END;

У меня выдает ошибку "Выражение Code нельзя преобразовать по типу значения Integer". Подскажите как можно решить данную проблему.

не знаю что в себе несут переменный АА и VDD, но вот это ад:
Код:
IF DVLE.GET(AA) and DVLE.GET(vdd) THEN BEGIN
какую смысловую нагрузку вы придаете этой строчке?

в подробностях нет полей договора и группы, если вы их туда не будете подставлять при учете, предварительно создав поля и поправив учетные процедуры.
именно по этому нам нужна временная табличка, в нее мы подставим вычисленные поля из операций поставщика(почему он у вас фигурирует как клиент, кстати?), а так же поля по которым будем фильтровать. Похожий ф-ционал реализован в аналитических отчетах.

ЗЫ Чисто ради интереса. Ваш процесс обучения кто-нибудь контролирует? Есть носители знаний поблизости?
Старый 18.04.2012, 11:19   #38  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от InTacto Посмотреть сообщение
Цитата:
Сообщение от zoya210489 Посмотреть сообщение
Попробовала написать фильтр, для поля группировки по поставщику:

IF Vendor.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN
Vendor.SETRANGE("Date Filter",StartDate,EndDate);
Vendor.CALCFIELDS(Vendor."Debit Amount (LCY)",Vendor."Credit Amount (LCY)");
LineAmount1[3] := Vendor."Debit Amount (LCY)";
LineAmount1[4] := Vendor."Credit Amount (LCY)";
END;

Проблема возникла в том, что он рассчитал сумму для поставщика по всем учетным группам, где он участвовал, т.е. все обобщил и получилось что по счету 66 у поставшика по дебету 300, когда на самом счете 100, т.к. он еще сложил суммы и с других счетов.

Затем попробывала рассчитать значение для клиента не через таблицу Vendor, а через Detailed Vendor Ledg. Entry (DVLE):

DVLE.SETCURRENTKEY(DVLE."Vendor Posting Group",DVLE."Vendor No.",DVLE."Agreement No.");
IF DVLE.GET(AA) and DVLE.GET(vdd) THEN BEGIN
DVLE.SETRANGE(DVLE."Posting Date",StartDate,EndDate);
DVLE.CALCSUMS(DVLE."Debit Amount (LCY)",DVLE."Credit Amount (LCY)");
LineAmount1[3] := DVLE."Debit Amount (LCY)";
LineAmount1[4] := DVLE."Credit Amount (LCY)";
END;

У меня выдает ошибку "Выражение Code нельзя преобразовать по типу значения Integer". Подскажите как можно решить данную проблему.

не знаю что в себе несут переменный АА и VDD, но вот это ад:
Код:
IF DVLE.GET(AA) and DVLE.GET(vdd) THEN BEGIN
какую смысловую нагрузку вы придаете этой строчке?

в подробностях нет полей договора и группы, если вы их туда не будете подставлять при учете, предварительно создав поля и поправив учетные процедуры.
именно по этому нам нужна временная табличка, в нее мы подставим вычисленные поля из операций поставщика(почему он у вас фигурирует как клиент, кстати?), а так же поля по которым будем фильтровать. Похожий ф-ционал реализован в аналитических отчетах.

ЗЫ Чисто ради интереса. Ваш процесс обучения кто-нибудь контролирует? Есть носители знаний поблизости?
В таблице Detailed Vendor Ledg. Entry, есть поля и поставщик, и учетная группа и договор может попробывать как нибудь на нее настроить фильтр??

Код:

DVLE.SETCURRENTKEY(DVLE."Vendor Posting Group",DVLE."Vendor No.",DVLE."Agreement No.");
IF DVLE.GET("Vendor Ledger Entry"."Vendor Posting Group") and DVLE.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN
DVLE.SETRANGE(DVLE."Posting Date",StartDate,EndDate);
DVLE.CALCSUMS(DVLE."Debit Amount (LCY)",DVLE."Credit Amount (LCY)");
LineAmount1[3] := DVLE."Debit Amount (LCY)";
LineAmount1[4] := DVLE."Credit Amount (LCY)";
END;
Старый 18.04.2012, 11:21   #39  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Я просто уже создала какую то часть отчета, и он у меня работает нормально, за исключением только того, что не выводит правильно суммы по поставщику и договорам, не хотелось бы полностью переписывать его.
Старый 18.04.2012, 11:27   #40  
ZoyaKom is offline
ZoyaKom
Участник
 
99 / 10 (1) +
Регистрация: 05.04.2012
Цитата:
Сообщение от InTacto Посмотреть сообщение
ЗЫ Чисто ради интереса. Ваш процесс обучения кто-нибудь контролирует? Есть носители знаний поблизости?
Нет, я разбираюсь сама, читаю книжки, ищю информацию в интернете.
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:52.