Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Прошу совета. Многоуровневая сумма в отчете / 25 сообщений из 26, страница 1 из 2
19.10.2006, 15:50
    #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
19.10.2006, 17:25
    #34067531
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
Вопрос
Обозначения валюты в другой колонке
Если да то сделай по ней группу, а внизу вставь compute-поле
с суммами
...
Рейтинг: 0 / 0
19.10.2006, 17:44
    #34067627
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
spas2001Вопрос
Обозначения валюты в другой колонке
Если да то сделай по ней группу, а внизу вставь compute-поле
с суммами
Да валюта в отдельном поле.
Тогда я так понимаю весь отчет будет разбит по валютам, а пользователи хотят чтобы все счета шли списком, а в низу финальные суммы по валютам.
...
Рейтинг: 0 / 0
19.10.2006, 18:10
    #34067743
кры
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
sum( if( valuta= 'RUB', sum, 0)) // итого в рублях
sum( if( valuta= 'USD', sum, 0)) // итого в долларах и т.д.
...
Рейтинг: 0 / 0
20.10.2006, 09:23
    #34068489
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
крыsum( if( valuta= 'RUB', sum, 0)) // итого в рублях
sum( if( valuta= 'USD', sum, 0)) // итого в долларах и т.д.
У меня таких валют :)) и в мире и море, мне что все ручками обиграть?
Нет это не лучший вариант программирования.
...
Рейтинг: 0 / 0
20.10.2006, 10:57
    #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
20.10.2006, 12:10
    #34069229
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
PavelBuilderВопрос поставлен не совсем корректно, все зависит немного от того как хранить в базе деньги. Вариантов несколько: все хранить в одной валюте, например USD иметь таблицу курсов

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



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

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

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

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

Может есть еще варианты? Буду признателен за советы. Еще как вариант: расшарить данные, в Datastore в котором сделать группировку по типу валюты и выражение для подсчета суммы по группе. При Retrieveend и EditChanged в цикле пробегать по всем группам и собирать значения сумм в строку. Не очень автоматически, т.к. итоговая строка все равно будет вставляться в DW вручную, но по крайней мере не надо писать кучу if.
...
Рейтинг: 0 / 0
23.10.2006, 08:55
    #34072948
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
Я имел ввиду, что внизу поставить, что-то вроде
string(sum1)+' RUB, '+ string(sum2)+' USD, '.....
...
Рейтинг: 0 / 0
23.10.2006, 10:13
    #34073087
Kr_Yury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
Еще вариант: добавить второй DW, для которого расшарить данные первого.
В первом - детальная инфа, во втором - а)упорядочение по валютам, б)итоги по валютам, в)но детальная инфа скрыта, отображаются только итоги.
Сам не экспериментировал, надо пробовать.
...
Рейтинг: 0 / 0
23.10.2006, 10:42
    #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
23.10.2006, 14:03
    #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
23.10.2006, 14:04
    #34073969
spas2001
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
Да ошибки там есть, извиняюсь, тороплюсь
...
Рейтинг: 0 / 0
23.10.2006, 14:24
    #34074062
Pasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу совета. Многоуровневая сумма в отчете
о спасибо помыслю
к радости или к сожалению скорость мне не протестировать, т.к. максимально бывает 20 счетов на запись и там это не актуально :))

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

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

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

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


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