21.07.2010, 10:32 | #1 |
Участник
|
Как посчитать сальдо по клиенту на дату
Добрый день.
Подскажите, пожалуйста, как подсчитать сальдо по клиенту по определенному счету ГК на определенную дату в АХ 4.0. Проблема в следующем - простая сумма поля AmountMST таблицы CustTrans дает результат отличный от результата из оборотно-сальдовой по клиенту. В оборотно-сальдовой по клиенту каким-то образом учитывается таблица LedgerTrans. Но что-то мне неясно каким. Дело в том, что строгого соответствия между CustTrans и LedgerTrans нет. Я находил в нашей базе случаи, когда по CustTrans операция шла по одному профилю разноски, а в LedgerTrans эта операция шла на другие счета ГК. Кроме того, в LedgerTrans случаются операции с одинаковым номером журнала, в которых идет перенос средств с одного клиента на другого - в таких случаях вообще неясно какая операция из LedgerTrans соответствует операции из CustTrans. Последний раз редактировалось Silphidae; 21.07.2010 в 11:56. |
|
21.07.2010, 10:55 | #2 |
Участник
|
Не понятно, в чем конкретно отличие суммы проводок клиента от Оборотно-сальдовой ведомости? Кстати, вы про стандартную ОСВ без модификаций говорите?
Профиль разноски, насколько я помню, в ОСВ выводит текущий счет ГК, т.е. если он менялся в профиле в середине работы, то обороты по ГК и ОСВ не совпадут. На форуме обсуждалось уже не раз, правильнее заводить новые профили разноски. А проводка клиент-клиент одним ваучером, если не ошибаюсь, была запрещена в стандарте.
__________________
Ivanhoe as is.. |
|
21.07.2010, 11:12 | #3 |
Участник
|
Мне нужно было слепить отчет, который считает сальдо по контрагенту по модулю клиентов, затем сальдо по модулю поставщиков (если у этого клиента есть номер поставщика) и общее сальдо. Казалось бы, ерунда, считай себе сумму операций из CustTrans и VendTrans. Но когда я стал сравнивать данные со стандартой ОСВ - по некоторым клиентам обнаружил расхождения. Стал разбираться подробнее - в итоге нашел операции в custTrans, которым в ledgerTrans (по Voucher и Dimension) соответствуют операции на счета, не соответствующие профилю разноски из custTrans. Причем, расхождения как раз на суммы этих операций, так что ОСВ как-то учитывает это.
По поводу запрета проводок клиент-клиент одним ваучером - не знаю как, но у нас в базе есть такие операции. |
|
21.07.2010, 11:35 | #4 |
Участник
|
Повторю вопрос =): Чем отличается сумма проводок от ОСВ?? С какой группировкой и с какими фильтрами вы считаете первое и второе?
Я спрашиваю не про код (ведь если вы смотрите в код и понимаете его, то не понятно, почему вам не понятно расхождение и зачем вам нужна помощь), а про результат, который видит пользователь. Я вот не понял, какая разница какой профиль разноски в проводках модуля и счет ГК в проводках ГК, если вы просто считаете сумму? Или все-таки не просто сумма? Вариант ответа: Сумма всех проводок по клиенту за период = 5000, по ОСВ = 6000. Другой вариант: Сумма всех проводок по клиенту по профилю "ОСН" за период = 5000, по ОСВ = 6000.
__________________
Ivanhoe as is.. |
|
21.07.2010, 11:52 | #5 |
Участник
|
Извиняюсь, что не сразу указал про фильтр по счету ГК =)
Я считаю, например, по клиенту 2545 по 30.06.2010 по счету 76.20.00. Этому счету сейчас в системе соответствует профиль разноски "76.20". Так вот сумма X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "2545" && custTrans.PostingProfile == "76.20" && custTrans.TransDate <= str2date("30.06.2010", 123) А помощь мне нужна, скорее всего, с кодом =) |
|
21.07.2010, 12:13 | #6 |
Administrator
|
ОСВ по клиенту когда строится - то берется текущий профиль разноски клиента. Когда берется сумма по CustTrans - то берется профиль разноски который был по факту.
Т.е. если "в процессе жизненного пути" в профиле разноски меняли счет ГК или у клиента меняли профиль разноски - то все исторические проводки в ОСВ (до изменений) отобразятся как будто эти изменения были с самого начала. В то время как в CustTrans "все ходы записаны" и коверкания истории не будет
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Ivanhoe (-1), -xXx- (1). |
21.07.2010, 12:23 | #7 |
Программатор
|
custTrans.TransDate <= str2date("30.06.2010", 123)
замените на custTrans.TransDate <= 30\06\2010 и никогда так больше не делайте. Ничего личного. |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
21.07.2010, 12:25 | #8 |
Administrator
|
Небольшое уточнение. Смена профиля отследится Не отследится смена счета в профиле.
Просто в приведенном запросе по CustTrans проводки по профилю разноски с другим названием не попадут, в то время как в ОСВ данные попадут все в принципе.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
21.07.2010, 12:31 | #9 |
Участник
|
Да я понимаю, что всему виной баловство пользователей с настройками профилей разноски.
Подскажите, все же, пожалуйста, как считать сальдо так, чтобы оно сходилось с конечным сальдо по ОСВ? |
|
21.07.2010, 12:40 | #10 |
Administrator
|
Цитата:
Правильный: Не смотреть на ОСВ - т.к. там (если меняли настройки профилей разноски) заведомо неверные данные. Если по клиенту сделаны 5 проводок по 62 счету и 10 - по 76-му, то неверно считать что все 15 проводок сделаны действительно по 76-му счету (или по 62-му). Неправильный: Также как считает его ОСВ. Т.е. считать, что все проводки сделаны по профилям разноски с текущими настройками. Если при вызове ОСВ Вы ставите фильтр по счету ГК еще - то значит нужно отсекать записи в CustTrans, которым соответствуют записи в LedgerTrans с другим счетом ГК
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 21.07.2010 в 12:44. |
|
21.07.2010, 12:44 | #11 |
Участник
|
Добавьте в запрос таблицу LedgerTrans.
|
|
21.07.2010, 13:04 | #12 |
Участник
|
Цитата:
Неправильный: Также как считает его ОСВ. Т.е. считать, что все проводки сделаны по профилям разноски с текущими настройками. Если при вызове ОСВ Вы ставите фильтр по счету ГК еще - то значит нужно отсекать записи в CustTrans, которым соответствуют записи в LedgerTrans с другим счетом ГК
Получается какая-то ерунда типа: X++: while select custTrans where custTrans.AccountNum == "2545" && custTrans.PostingProfile == "76.20" && custTrans.TransDate <= 30\06\2010 { select firstonly ledgerTrans where ledgerTrans.AccountNum == "76.20.00" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.Dimension == custTrans.Dimension; if(ledgerTrans.recId) saldo += custTrans.AmountMST; } |
|
21.07.2010, 13:21 | #13 |
Administrator
|
Цитата:
X++: while select custTrans where custTrans.AccountNum == "2545" // && custTrans.PostingProfile == "76.20" && custTrans.TransDate <= 30\06\2010 { select firstonly ledgerTrans where ledgerTrans.AccountNum == "76.20.00" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate ; if(ledgerTrans.recId) // Это условие лишнее - запись есть всегда saldo += custTrans.AmountMST; } Например, так: X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "2545" && custTrans.TransDate <= 30\06\2010 exists join ledgerTrans where ledgerTrans.AccountNum == "76.20.00" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate;
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 21.07.2010 в 13:24. |
|
|
За это сообщение автора поблагодарили: Silphidae (1). |
21.07.2010, 13:39 | #14 |
Administrator
|
Подумал... забыл еще учесть корректирующие проводки (Поле Correct). Если Correct=Yes, то суммы нужно считать с обратным знаком.
__________________
Возможно сделать все. Вопрос времени |
|
21.07.2010, 13:57 | #15 |
Участник
|
Спасибо большое.
Вот так совпадает с данными ОСВ: X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "2545" && custTrans.TransDate <= 30\06\2010 && custTrans.PostingProfile == "76.20" exists join ledgerTrans where ledgerTrans.AccountNum == "76.20.00" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate; |
|
21.07.2010, 14:44 | #16 |
Administrator
|
А, ну да - точно
__________________
Возможно сделать все. Вопрос времени |
|
22.07.2010, 10:47 | #17 |
Axapta Retail User
|
Можно попросить проектик отчета, если не жалко Делал недавно пободное - хотелось сравнить.
|
|
22.07.2010, 11:21 | #18 |
Участник
|
Проектик во вложении. Там для вывода в эксель используется движок, написанный конторой, внедрявшей нам AX - его классы я не могу выложить без их согласия, извините.
|
|
|
За это сообщение автора поблагодарили: lev (1), novic (1). |
28.07.2010, 12:38 | #19 |
Axapta Retail User
|
А как бы договор сюда еще пришить?
X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "165057137" && custTrans.TransDate <= 01\01\2010 && custTrans.PostingProfile == "62.10.04" exists join ledgerTrans where ledgerTrans.AccountNum == "62.10.04" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate // так не получается join RContractTable where RContractTable.RContractPartnerCode == custTrans.AccountNum && RContractTable.RContractAccount == '12КР002008'; |
|
28.07.2010, 12:51 | #20 |
Administrator
|
А так?
X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "165057137" && custTrans.TransDate <= 01\01\2010 && custTrans.PostingProfile == "62.10.04" join RContractTable where RContractTable.RContractCode == custTrans.RContractCode && RContractTable.RContractAccount == custTrans.RContractAccount && RContractTable.RcontractPartnerType == RcontractPartnerType::Cust RContractTable.RContractAccount == '12КР002008' exists join ledgerTrans where ledgerTrans.AccountNum == "62.10.04" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate; X++: select sum(AmountMST) from custTrans where custTrans.AccountNum == "165057137" && custTrans.TransDate <= 01\01\2010 && custTrans.PostingProfile == "62.10.04" && custTrans.RContractCode == 'Группа' && custTrans.RContractAccount == '12КР002008' exists join ledgerTrans where ledgerTrans.AccountNum == "62.10.04" && ledgerTrans.Voucher == custTrans.Voucher && ledgerTrans.TransDate == custTrans.TransDate;
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 28.07.2010 в 12:55. |
|
Теги |
как правильно, клиент, оборотно-сальдовая ведомость, осв, полезное, расчеты с клиентами |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|