|
![]() |
#1 |
Участник
|
Написала код, который рассчитывает сумму строк, также как если бы я просто указала на них в groupfooter. Если я расчитанное значение подставляю в body то вижу все итерации, если в groupfooter то вижу правильное значение, если в groupheader то только сумму первой строки, а не всех строк, подскажите как мне отобразить полную рассчитанную сумма в groupheader. Или же какие то другие способы группировать и выводить итоги над записями.
|
|
![]() |
#2 |
Участник
|
Цитата:
P.S. попробуйте отчет в Excel вывести, как мне кажется, получается более гибко. |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от Constantine
![]() Цитата:
P.S. попробуйте отчет в Excel вывести, как мне кажется, получается более гибко. |
|
![]() |
#4 |
Участник
|
В Header, в который вы хотите вывести значения. Объявляете переменные, ставите на них нужные фильтры и потом
Код: REPEAT ... UNTIL ...NEXT = 0; |
|
![]() |
#5 |
Участник
|
Цитата:
Счет 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; показывает непонятные значения, которые не понять как расчитаны. Подскажите исправить данную ситуацию. |
|
![]() |
#6 |
Участник
|
Объясните зачем здесь использовать группировку?
Было бы проще просто использовать для каждого датайтема только боди и обычный хидер, раз все равно в начале суммы выводить придется. Уверен, что сейчас начнуться проблемы с тем куда вставлять вычисление и как получить фильтр из датайтема (Скорее всего в пресектион групфутера) |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от InTacto
![]() Объясните зачем здесь использовать группировку?
Было бы проще просто использовать для каждого датайтема только боди и обычный хидер, раз все равно в начале суммы выводить придется. Уверен, что сейчас начнуться проблемы с тем куда вставлять вычисление и как получить фильтр из датайтема (Скорее всего в пресектион групфутера) Мне необходимо построить отчет по иерархии, вначале суммы по счету поставщика, потом из чего эта сумма складывается (по поставщикам), далее для каждого поставщика по договорам, а затем по документам. у меня один датайтем - Vendor Ledger Entry. Просто я начинала делать при помощи многий датайтемов и столкнулась с проблемами: 1.Vendor Posting Group 2.Vendor (тут я не знаю как связать с предыдущей таблицей, т.к. учетная группа поставщика постоянно меняется, а как для данной учетной группы отобразить суммы по дебету и кредиту в разрезе данного клиента???) 3.Vendor Agreement ( договор можно связать с поставщиком, но опять же проблема с учетной группой, точнее с счетом ГК для участвовал данный договор) 4.Vendor Ledger Entry (тут просто выводим все документы относящиеся к данной учетной группе, поставщику и договору). Подскажите как быть в данной ситуации. |
|
![]() |
#8 |
Участник
|
UPD чуть-чуть не успел с ответом.
![]() |
|
![]() |
#9 |
Участник
|
У вас должно быть так:
Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет) Поставщик1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику) Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе) Договор1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику, учетно) Документ1 Документ2 Договор2 ....... Учетная группа2 Договор1 Документ1 ..... ..... Поставщик2 Учетная группа1 ..... Учетная группа2 Хотя разные учетные группы у одного поставщика меня смущают, ну да ладно. Теперь по производительности. |
|
![]() |
#10 |
Участник
|
Цитата:
Сообщение от InTacto
![]() У вас должно быть так:
Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет) Поставщик1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику) Учетная группа1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику и данной учетной группе) Договор1 ( в онпридайтайтем смотрим есть ли операции по данному поставщику, учетно) Документ1 Документ2 Договор2 ....... Учетная группа2 Договор1 Документ1 ..... ..... Поставщик2 Учетная группа1 ..... Учетная группа2 Хотя разные учетные группы у одного поставщика меня смущают, ну да ладно. Теперь по производительности. |
|
![]() |
#11 |
Участник
|
вы же сами сказали, что Учетная группа меняется. или они должны в другой счет перетечь?
|
|
![]() |
#12 |
Участник
|
Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц???
|
|
![]() |
#13 |
Участник
|
Цитата:
Сообщение от zoya210489
![]() Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц???
Если поля дебет и кредит вычисляемые, то если попробовать наложить на них правильные фильтры то тогда может получится вывести правильные суммы; Я вот попробовала вывести сумму по дебету для счета (например 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. Можно ли будет как то наложить фильтры и вывести также просто сумму как у меня получилось для счета??? |
|
![]() |
#14 |
Участник
|
Цитата:
Сообщение от zoya210489
![]() Просто документы относящиеся к одному поставщику или договору могут иметь разные учетные группы. А вот про временные таблицы то мы должны вычислять не только сумму дебета и кредита для счета, а также для поставщика и договора, получается у нас будет несколько временных таблиц??? Для того чтобы получить сумму по счету нужно наложить фильтр только на поле счета. для поставщика по счету и поставщику для договора по счету, постовщику и договору использовать будем calcsums по ключу, о чем я писал в предыдущем посте. |
|
![]() |
#15 |
Участник
|
Случайно запостил раньше сообщение, вот полный текст.
У вас должно быть так: _Счет ( в онпридайтайтем смотрим есть ли операции по учетным группым с которыми связан счет) ___Поставщик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 по дебету и кредиту. Выводить придется записи из временной таблицы. Возможно поля измерений не подойдут по длине и придется мутить другой ключ с подходящими полями, а может и другую табличку брать под временную |
|
![]() |
#16 |
Участник
|
Попробовала написать фильтр, для поля группировки по поставщику:
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". Подскажите как можно решить данную проблему. |
|
![]() |
#17 |
Участник
|
Цитата:
Сообщение от 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 |
Участник
|
Цитата:
Сообщение от 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 в подробностях нет полей договора и группы, если вы их туда не будете подставлять при учете, предварительно создав поля и поправив учетные процедуры. именно по этому нам нужна временная табличка, в нее мы подставим вычисленные поля из операций поставщика(почему он у вас фигурирует как клиент, кстати?), а так же поля по которым будем фильтровать. Похожий ф-ционал реализован в аналитических отчетах. ЗЫ Чисто ради интереса. Ваш процесс обучения кто-нибудь контролирует? Есть носители знаний поблизости? Код: 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; |
|
![]() |
#19 |
Участник
|
Цитата:
Сообщение от zoya210489
![]() В таблице 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; Можно почти забыть про временную табличку, правда отсутствие счета может подпортить картину. Вы так и не ответили что за смысл в этой строке Код: IF DVLE.GET("Vendor Ledger Entry"."Vendor Posting Group") and DVLE.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN Если вы хотите поставить фильтры, то используйте setrange или setfilter, что вы и делаете для даты, а вот для группы и договора делаете почему-то по другому. |
|
![]() |
#20 |
Участник
|
Цитата:
Сообщение от InTacto
![]() Цитата:
Сообщение от zoya210489
![]() В таблице 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; Можно почти забыть про временную табличку, правда отсутствие счета может подпортить картину. Вы так и не ответили что за смысл в этой строке Код: IF DVLE.GET("Vendor Ledger Entry"."Vendor Posting Group") and DVLE.GET("Vendor Ledger Entry"."Vendor No.") THEN BEGIN Если вы хотите поставить фильтры, то используйте setrange или setfilter, что вы и делаете для даты, а вот для группы и договора делаете почему-то по другому. Просто я написала код для счета поставщика (учетная группа): IF GLA.GET("Vendor Ledger Entry"."Vendor Posting Group") THEN GL:=GLA.Name; IF GLA.GET("Vendor Ledger Entry"."Vendor Posting Group") THEN BEGIN GLA.SETRANGE("Date Filter",StartDate,EndDate); GLA.CALCFIELDS(GLA."Debit Amount",GLA."Credit Amount"); LineAmount1[1] := GLA."Debit Amount"; LineAmount1[2] := GLA."Credit Amount"; END; Где GLA - это Record G/L Account. GL - это Text (100) LineAmount1 - это Decimal. У меня в отчете есть раздел groupheader в который я вывожу счета (по учетным группам поставщиков). В этом разделе я разместила 4 textbox: 1)"Vendor Ledger Entry"."Vendor Posting Group"; 2)GL (выводит наименования счета) 3)LineAmount1[1] (выводит сумму по дебету для конкретного счета) 4) LineAmount1[2] (выводит сумму по кредиту для конкретного счета). И у меня это получилось правильно вывести, вот я и подумала по аналогии сделать с поставщиками. Я думала что функция GET позволит вычислить значание дебета и кредита для нужной комбинации свое. |
|