powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Прошу совета. Многоуровневая сумма в отчете
26 сообщений из 26, показаны все 2 страниц
Прошу совета. Многоуровневая сумма в отчете
    #34067182
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, хочу спросить совет, кто как решал задачу, если с такой сталкивался.

PB 9.0.2 (7661)
Oracle 9.2.0.7

Имеется форма (DW) по расходам, который всегда приводились к одной валюте USD:
Перелет USD 1000
Такси USD 100
Гостиница USD 400
Такси USD 200
Сумма 1700

Теперь хотят вести расходы в той валюте, в которой оплачивали и получать сумму затрат в каждой валюте:
Перелет RUB 27000
Такси RUB 800
Гостиница EUR 300
Такси USD 200
Сумма RUB 27800, USD 200, EUR 300

Вопрос как лучше реализовать.
Я вижу пока два варианта и не могу выбрать оптимальный:
1) текстовое поле в Summary которое я ручками заполняю из кода, обрабатывая событие Retrieveend и EditChanged
2) в Summary вставить отчет типа N_Up - которое будет считать только суммы по валютам. Один минус, данный отчет будет выдавать сумму только после выборки/сохранения, но в процессе редактирования данные будут на последнее сохранение.

Может есть еще варианты? Буду признателен за советы.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34067531
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос
Обозначения валюты в другой колонке
Если да то сделай по ней группу, а внизу вставь compute-поле
с суммами
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34067627
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Вопрос
Обозначения валюты в другой колонке
Если да то сделай по ней группу, а внизу вставь compute-поле
с суммами
Да валюта в отдельном поле.
Тогда я так понимаю весь отчет будет разбит по валютам, а пользователи хотят чтобы все счета шли списком, а в низу финальные суммы по валютам.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34067743
кры
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sum( if( valuta= 'RUB', sum, 0)) // итого в рублях
sum( if( valuta= 'USD', sum, 0)) // итого в долларах и т.д.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34068489
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
крыsum( if( valuta= 'RUB', sum, 0)) // итого в рублях
sum( if( valuta= 'USD', sum, 0)) // итого в долларах и т.д.
У меня таких валют :)) и в мире и море, мне что все ручками обиграть?
Нет это не лучший вариант программирования.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34068815
PavelBuilder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос поставлен не совсем корректно, все зависит немного от того как хранить в базе деньги. Вариантов несколько: все хранить в одной валюте, например USD иметь таблицу курсов (девочка регулярно их ведет) написать процедуру/функцию которая будет возвращать курс на дату (учитывать то что девочка могла не ввести все курсы и брать ближайший курс по требуемой дате. А девочку чморить - что б вводила... в банках это нормально - вводят как надо) В отчетах можно выводить в любой валюте, так как для этого все есть: в базе USD курс в требуемой валюте известен. И учитывая что все расчеты в ye на день предшествовавшей оплате, все с этим учетом в норме (можете ввести свои бизнес правила)

Если хранить в базе и сумму и валюту, все немного иначе, немного, но разница существенна в самом подходе.

Потому с учетом всего весьма полезно иметь процедурное апи на сервере, реализовывающее процедуры/функции например возврата суммы в требуемой валюте с учетом кросс-курсов (сколько стоит к примеру USD в евро и т.п)

У нас на ms sql 2000
есть например такое удобное чудо(по параметрам сами догадаетесь):

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PROCEDURE tools_GetCurrRate
  @date_to       Datetime,           -- курс на эту дату
  @orig_curr_c   Smallint    =  116 ,  -- оригинальная валюте
  @target_curr_c Smallint    =  1 ,    -- требуемая валюта
  @rate          Numeric( 18 , 11 ) OUT, -- курс в требуемой валюте 
  @err_msg       varchar( 255 ) = NULL OUT

Не буду дальше отписывать все что у нас есть по этому поводу. но могу сказать, что если завтра отчеты нужно будет считать в другой валюте, меня это не сильно расстроит.

Реализовывать подобную логику на клиенте - верх ненормальности. Это пререготива базы данных в первую очередь, клиент это все навсего инструмент для ввода запросов и отчетности, а никак не логики. Не согласны? Тогда скажу что в нашей функции к примеру в свое время была учтена деноминация рублей и процедура возвращала на дату реальные в то время деньги (миллионы рублей) и вся эта логика до сих пор работает на сервере и полностью отражает всю жизнь, а значит мы можем выполнить любые отчеты на любую дату с учетом тех требований которые были в то время что запросили в отчете, на клиенте на этот счет есть спец. реализация истории изменения форм отчетности и все.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34069229
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelBuilderВопрос поставлен не совсем корректно, все зависит немного от того как хранить в базе деньги. Вариантов несколько: все хранить в одной валюте, например USD иметь таблицу курсов

Если хранить в базе и сумму и валюту, все немного иначе, немного, но разница существенна в самом подходе.



Мне не нужно пересчитывать!!!!!!
Мне нужно выдать в конце сумму по каждой валюте, которые участвовали в отчете.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34069480
PavelBuilder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так и выдай ту сумму и ту валюту.
Resultset продедуры вернет сумму sum_a и валюту currency_nm или ее код currency_iso или внутрений код из справочника (классификатора) если надо currency_c. Честно говоря не понимаю в чем сложность
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34069789
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavelBuilderНу так и выдай ту сумму и ту валюту.
Resultset продедуры вернет сумму sum_a и валюту currency_nm или ее код currency_iso или внутрений код из справочника (классификатора) если надо currency_c. Честно говоря не понимаю в чем сложность

а понял к чему клонишь
На MSSQL это попроще решить посравнению с Oracle
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34070447
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha2) в Summary вставить отчет типа N_Up - которое будет считать только суммы по валютам. Один минус, данный отчет будет выдавать сумму только после выборки/сохранения, но в процессе редактирования данные будут на последнее сохранение.

Не очень понял последнюю фразу, что значит в процессе редактирования... отчета?

Если сталкивался с такими проблемами "Итого в разрезе чего - либо" то делал вложенный отчет с расчетом агрегированной информации. Единственный минус это двойной расчет данных при выдаче отчета, но ктож машинное время считает.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34070507
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли сталкивался с такими проблемами "Итого в разрезе чего - либо" то делал вложенный отчет с расчетом агрегированной информации. Единственный минус это двойной расчет данных при выдаче отчета, но ктож машинное время считает.
И если в момент между select'ами удачно вставить/удалить документ, то сумма совпадать не будет. Очень хорошее решение :)
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34072864
Andyn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PashaЯ вижу пока два варианта и не могу выбрать оптимальный:
1) текстовое поле в Summary которое я ручками заполняю из кода, обрабатывая событие Retrieveend и EditChanged
2) в Summary вставить отчет типа N_Up - которое будет считать только суммы по валютам. Один минус, данный отчет будет выдавать сумму только после выборки/сохранения, но в процессе редактирования данные будут на последнее сохранение.

Может есть еще варианты? Буду признателен за советы. Еще как вариант: расшарить данные, в Datastore в котором сделать группировку по типу валюты и выражение для подсчета суммы по группе. При Retrieveend и EditChanged в цикле пробегать по всем группам и собирать значения сумм в строку. Не очень автоматически, т.к. итоговая строка все равно будет вставляться в DW вручную, но по крайней мере не надо писать кучу if.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34072948
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел ввиду, что внизу поставить, что-то вроде
string(sum1)+' RUB, '+ string(sum2)+' USD, '.....
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34073087
Kr_Yury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант: добавить второй DW, для которого расшарить данные первого.
В первом - детальная инфа, во втором - а)упорядочение по валютам, б)итоги по валютам, в)но детальная инфа скрыта, отображаются только итоги.
Сам не экспериментировал, надо пробовать.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34073158
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Промежуточный итог (можете попинать если криво что-то сделал)
В окне редактирования/просмотра на события: retrieveend, Editchanged, itemchanged и pfc_deleterow написал обработчик:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
This.AcceptText( )
ll_count = This.RowCount( )	

If ll_count >  0  Then
  ls_summa = ''
  ll_j =  1 
  ls_cur[ll_j] = dw_bottom.Describe( "Evaluate('LookUpDisplay(exp_currency) ', " + string( 1 ) + ")")
  ls_cur_last = ls_cur[ll_j]
  ll_j ++
  For ll_i =  2  To ll_count
    ls_cur_cur = dw_bottom.Describe( "Evaluate('LookUpDisplay(exp_currency) ', " + string(ll_i) + ")")
    If ls_cur_cur <> ls_cur_last Then
        ll_g =  1 
        ll_max = UpperBound(ls_cur)
        lb_find = False
        Do
           If ls_cur[ll_g] = ls_cur_cur Then lb_find = True
           If ll_max = ll_g Then
                 If ls_cur[ll_g] = ls_cur_cur Then
                     lb_find = True
                 Else
                     ls_cur[ll_j] = ls_cur_cur
                     ll_j ++
                 End If
           End If
           ll_g ++				
       Loop While lb_find = False			
       ls_cur_last = ls_cur_cur
    End If		
  Next
  ll_max = UpperBound(ls_cur)
  For ll_j =  1  To ll_max
     ld_cur_sum =  0 
     For ll_i =  1  To ll_count
        If ls_cur[ll_j] = dw_bottom.Describe( "Evaluate('LookUpDisplay(exp_currency) ', " + string(ll_i) + ")") Then
            ld_cost = dw_bottom.GetItemDecimal(ll_i, 'exp_total')
            If IsNull(ld_cost) Then ld_cost =  0 
            ld_cur_sum = ld_cur_sum + ld_cost
        End If
      Next
      ls_summa = ls_summa + ' ' + ls_cur[ll_j] + ' = ' + string(ld_cur_sum)
   Next
	
   ls_mod_string = "t_summa.Text = 'Sum: " + ls_summa + "'"
   dw_bottom.Modify(ls_mod_string)
End If

Теперь жду в каком виде захотят отчет получать. :))
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34073962
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я думаю быстрее будет в цикле - поставить фильтр, убрать фильтр
Пример
setredraw(false)
for k =1 to ....(перебор значения справочника
ll_sum=0
ls_fil=" exp_cur ='RUB'"
dw_bottom.setfilter(ls_fil)
dw_bottom.filter(ls_fil)
if dw_bottom.rowcount() >0 then
for i=1 to dw_bottom.rowcount()
ll_sum+=dw_bottom.object.sum1[row]
next
dw_total.object.text = dw_total.object.text +string(ll_sum)
end if
ls_fil=''
dw_bottom.setfilter(ls_fil)
dw_bottom.filter(ls_fil)
next
setredraw(true)

Примерно так. Значения валют наверняка в dw child, так что быстрее однако
ЗЫ: Не претендую на 100% красоту данного кода и полное решение
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34073969
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ошибки там есть, извиняюсь, тороплюсь
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34074062
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о спасибо помыслю
к радости или к сожалению скорость мне не протестировать, т.к. максимально бывает 20 счетов на запись и там это не актуально :))

а вот возможно в финальном годовом отчетет будет вариант для эксперимента
спасибо
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34076117
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pashaа вот возможно в финальном годовом отчетет будет вариант для эксперимента
спасибо
Это наверное будет работать, но на мой взгляд это неправильный подход к испльзованию PB, работать с данными должен сервер БД, для этого он и предназначен.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34077768
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Estets Pashaа вот возможно в финальном годовом отчетет будет вариант для эксперимента
спасибо
Это наверное будет работать, но на мой взгляд это неправильный подход к испльзованию PB, работать с данными должен сервер БД, для этого он и предназначен.

я с вами полностью согласен.
Но нормально связать процедуру, которая выбирает данные, из БД Oracle и DW у меня не получается. Может знаний не хватает.
Для примера связка процедура Ms SQL и DW работает на отлично. Соотвтсвенно такой отчет, как я выше описал при связке с Ms SQL выполняется все на серваке, а клиент получает только данные.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34079025
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PashaНо нормально связать процедуру, которая выбирает данные, из БД Oracle и DW у меня не получается. Может знаний не хватает.
Ну тогда стоит поискать на форуме, где-то было описание как делать процедуры для DW на ORACLE, вообщем достаточно просто только в DW передается не SELECT а курсор, ну и в старом PB6 были на сколько я помню какие-то проблемы в именем пакеджа, который необходимо было толи стирать, толи заносить руками, давно это было но работало ;)
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34079601
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Estets PashaНо нормально связать процедуру, которая выбирает данные, из БД Oracle и DW у меня не получается. Может знаний не хватает.
Ну тогда стоит поискать на форуме, где-то было описание как делать процедуры для DW на ORACLE, вообщем достаточно просто только в DW передается не SELECT а курсор, ну и в старом PB6 были на сколько я помню какие-то проблемы в именем пакеджа, который необходимо было толи стирать, толи заносить руками, давно это было но работало ;)

я про этот вариант и говорию :))
не очень он мне нравится пару раз натыкался на траблы
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34081400
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pasha Estets PashaНо нормально связать процедуру, которая выбирает данные, из БД Oracle и DW у меня не получается. Может знаний не хватает.
Ну тогда стоит поискать на форуме, где-то было описание как делать процедуры для DW на ORACLE, вообщем достаточно просто только в DW передается не SELECT а курсор, ну и в старом PB6 были на сколько я помню какие-то проблемы в именем пакеджа, который необходимо было толи стирать, толи заносить руками, давно это было но работало ;)

я про этот вариант и говорию :))
не очень он мне нравится пару раз натыкался на траблы
Ага, только работает как часы в течении нескольких лет на 100+- datawindows у 30+- клиентов...
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34082234
Pasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппАга, только работает как часы в течении нескольких лет на 100+- datawindows у 30+- клиентов...
мною было замечено, при внесении корректировки в таблицу, которая была связана с процедурой и соотвесвенно с пакаджем, необходимо было перекомпилить пакадж. После перекомпилирования пакаджа, сыпалось dw. Делалось попыток раз 3 использовать данный механизм, и когда парур раз натыкались на вилы, было принято решение отказаться до лучших времен.
вот только не могу вспомнить такой глюк выскакивал на восьмерке или на девятке PB
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34083128
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PashaПосле перекомпилирования пакаджа, сыпалось dw.
Очень странно, если процедура работает т.е. вызывается из plus-а то DW должна работать "полубому", она операется только на совпадение ResultSet да и то не всегда выдает ошибку, например при отсутствии последней колонки. Что то вы наверное не все перекомпиляли, или пересоздавали процедуры без прав, но есть подозрение что PB тут не при чем.
...
Рейтинг: 0 / 0
Прошу совета. Многоуровневая сумма в отчете
    #34084215
ytrewq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pasha ФилиппАга, только работает как часы в течении нескольких лет на 100+- datawindows у 30+- клиентов...
мною было замечено, при внесении корректировки в таблицу, которая была связана с процедурой и соотвесвенно с пакаджем, необходимо было перекомпилить пакадж
Это замечено не только Вами - это стандартное поведение ORACLE. На PB это никоим образом не влияет.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Прошу совета. Многоуровневая сумма в отчете
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]