Текущее время: Пт, мар 29 2024, 14:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Агрегирующий DSO
СообщениеДобавлено: Чт, фев 19 2015, 15:02 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Коллеги есть z-Транзакция по ведению планов дилеров. Сохраняет значения в z-Таблицу.
Есть z-Экстрактор (дельта по метке времени) -> z-DSO.

Для примера:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления записи
201501        1         A           10
201501        1         B           12
201501        2         A           23
201501        3         A           13        X


Хочу сделать агрегирующий DSO с учетом метки удаления записи.

Для примера:
Code:
Месяц/Год | Дилер | План
201501        1     22
201501        2     23



1) Создал DSO с инфо-объектами, указанными выше.
2) Сделал трансформацию.
3) В DTP поставил фильтр на "Метку удаления записи".
4) Грузится полным обновлением.

Но полное обновление не очень хочется ставить.
Хочу дельтой загружать.
Получается нужно ABAPом ставить отрицательное значение плана, если стоит метка удаления? (+ суммирование для показателя при обновлении)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Чт, фев 19 2015, 17:18 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Ср, фев 09 2011, 07:19
Сообщения: 752
Откуда: Сибирь
Пол: Мужской
Попробуйте "Метку удаления" в трансформации замэпить на признак 0RECORDMODE в ДСО (в трансформации этот признак в группе "Техническая группа") таким образом, чтобы при значении "Метка удаления" = Х, в 0RECORDMODE вставлялось значение 'D' .
Данные грузить дельтой и убрать в ППД фильтрацию по "Метку удаления" = Х.
Про дельту и признак 0RECORDMODE в ДСО можно нагулить, на форуме точно есть, например:
http://sapboard.ru/forum/viewtopic.php?f=12&t=86679

_________________
Ешьте рыбу, в ней фосфор.
__
Чат в Telegram по SAP BW: http://t.me/BW_SAP


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 13:53 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Итак, указал для признака 0RECORDMODE формулу:
Code:
IF( /BIC/ZDELFLAG = 'X', 'D', RECORDMODE )

Для показателя плана указал "Суммирование" вместо замещения.

ПРИМЕР_2 ИСХОДНОЕ СОСТОЯНИЕ
DSO
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления записи
201501        1         A           10
201501        1         B           12       
201501        2         A           23

DSO_SUMM
Code:
Месяц/Год | Дилер | План
201501        1      22
201501        2      23


ПРИМЕР_2 КАК СТАЛО ПОСЛЕ УДАЛЕНИЯ
DSO
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления записи
201501        1         A           10
201501        1         B           12        X
201501        2         A           23

DSO_SUMM
Code:
Месяц/Год | Дилер | План
201501        2         23



Т.е. запись целиком пропала. А должна была уменьшиться сумма только на 12.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 15:26 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Судя по всему у вас ключ: Месяц/год+Дилер. Комплектация не входит в ключ и стоит перезапись. Если так, то дельта так и должна отрабатывать.
Если Комплектацию добавить в ключ, то суммирование плана будет происходить не по двум признакам, как вы указываете в примерах, а уже по трём. Зато удаление будет происходить корректно.
P.S. Кстати, не совсем понятно - Комплектация включена в DSO или нет? А то у вас в примере DSO и DSO_SUM... Там есть, там нет...


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 15:35 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Поля DSO:
Месяц/Год (ключ)
Дилер (ключ)
Комплектация (ключ)
План (показатель)
Метка удаления записи

Поля DSO_SUMM:
Месяц/Год (ключ)
Дилер (ключ)
План (показатель)


Это тестовый пример. Смысл в том, чтобы во втором DSO хранились только результаты за период по дилерам (без разбивки по комплектациям).

Если делать полное обновление с фильтром по метке удаления и с замещением показателя (а не суммирование) - то все хорошо.

С дельтой пока так и не получилось сделать.

Под вопросом:
1) Если в чистый DSO идет запись с X-меткой удаления, то показатель должен быть 0, а не отрицательное число. Тоесть из общей суммы рассчитанной ничего не вычитается.
2) Если запись была загружена и идет дельта с меткой X - то в показатель должна идти отрицательная цифра (см. пример в посте выше).


Все это можно заABAPить конечно (проверять дельту в активной таблице DSO и анализировать показатель), просто хочу понять как это все стандартно можно сделать.
Наверняка многие создавали DSO, Кубы с готовыми результирующими данными, чтобы не затрачивать время на подсчет значений, если их очень много.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 16:07 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
В вашем случае мэпинг поля ROCANCEL и установка статуса в D не подойдет, т.к. он сносит запись из DSO по ключу, а вам необходимо отнимать. Поэтому умножайте значение на -1 в трансформации при статусе X, как и предполагали ранее.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 16:17 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Также странно, что вы писали, что данные попадают из Z-источника в DSO. Потом приводите пример, когда данные попадают из одного DSO в другой.
Т.е. цепочка выглядит так: Z-экстрактор->PSA->DSO1->DSO2. Дело в том, что данные в DSO2 попадать будут не из Active Table а из Change Log DSO1. И метки удаления X - никогда там не будет. Или R (Reverse) или D - в зависимости от типа дельты.
X - в терминологии дельты - это Before Image (сторно).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 16:55 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Спасибо за ответы.
В Z-экстракторе и DSO используется кастомная метка удаление (/BIC/ZDELFLAG). Ее можно увидеть в формуле в посте выше.
В нее записывается 'X' при удалении записи в Z-транзакции.
Если метку не ставить, то при удалении записи из прозрачной таблицы в дельту не попадет информация.
А так запись просто изменяется, соответственно по метке времени происходит подзагрузка дельты с меткой удаления.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 17:10 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Я так и подумал, сразу. Сбило с толку два DSO. Если в bw вам нужна информация только в разрезе Месяц/Год | Дилер | План, то прямо в Z-экстракторе умножайте на -1 показатели и все. На Плане ставите суммирование. Все признаки в ключе будут группироваться, показатель суммироваться. Равносильно select Месяц/Год, Дилер, SUM(План) from Z-экстрактор (дельта). Тип дельты: ADD.
Ну, и надо понимать, что в bw должна попадать только разница. Н-р, если у вас в системе A=100. А завтра стало A=150, то в BW должна уже попадать разница (150-100=50), иначе будет неправильный результат.
Вообщем, в вашем случае необходимо учитывать множество факторов.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Пт, фев 20 2015, 17:41 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Если у вас попадает в дельту не разница, а обновленные значения, то в DSO необходимо использовать те же ключи, что и в Z-таблице. Тогда тип дельты ABR. И "X" подмениваете на "D".


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Ср, фев 25 2015, 08:20 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
А как быть в случае, если данные вдруг решили перезагрузить из исходной системы, в которой уже есть записи с Z-меткой удаления X.

Они получается придут отрицательными, а не вычтут предыдущее значение.

Хороший вариант:
5
-5
1
-1

Плохой вариант:
-5
-1


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Ср, фев 25 2015, 10:55 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Z-таблица:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A          5
01.2015       1           A          5        X
01.2015       2           B          1
01.2015       2           B          1        X

При первичной загрузке данных:
Тип дельты ADD. На Плане стоит суммирование. В Z-экстракторе, на стороне ERP, все поля с меткой удаления умножаете на -1. Ключ в DSO: Месяц/Год | Дилер| Комплектация.
PSA:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A         5
01.2015       1           A         -5       
01.2015       2           B         1
01.2015       2           B         -1   

DSO:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A         0
01.2015       2           B         0

Такой же результат Плана будет, если Ключ в DSO: Месяц/Год | Дилер. комплектацию можно вообще выкинуть. Но показатели из экстрактора должны приходить аддитивные (т.е. если A=100 кг, потом 40 кг продали, остаток 60 кг, то в дельту должно приходить не 60 кг (как реальный остаток), а -40 кг (как разница)).

Если, по аналогии с примером выше, у вас приходит в дельту 60 кг, то:
Тип дельты ABR. На Плане стоит перезапись. В Z-экстракторе, на стороне ERP, все поля с меткой удаления устанавливаете в 0. Ключ в DSO: Месяц/Год | Дилер| Комплектация.
PSA:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A         5
01.2015       1           A         0       
01.2015       2           B         1
01.2015       2           B         0       

DSO:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A         0
01.2015       2           B         0

ВАЖНО, чтобы запись с меткой удаления приходила всегда ПОСЛЕ записи с начальным значением! Т.е. если записи придут в таком порядке:
PSA:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A         0
01.2015       1           A         5       
01.2015       2           B         0
01.2015       2           B         1   

То, DSO будет:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A        5
01.2015       2           B        1

Теперь, что будет если Ключ в DSO: Месяц/Год | Дилер:
Z-таблица:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A         5
01.2015       1           A         5        X
01.2015       1           B         1
01.2015       1           B         8

Дельта ADD:
DSO:
Code:
Месяц/Год | Дилер | План
01.2015       1      5-5+1+8=9 (сумма)

Дельта ABR:
DSO:
Code:
Месяц/Год | Дилер | План
01.2015       1     8 (последнее значение)

Теперь пришла дельта:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A          5
01.2015       1           A          15       
01.2015       1           B          10

Если дельта ADD:
DSO:
Code:
Месяц/Год | Дилер | План
01.2015       1      9+5+15+10

Если дельта ABR:
DSO:
Code:
Месяц/Год | Дилер | План
01.2015       1     10 (последнее значение)
А на самом деле должно быть 15+10=25.

Вот если бы ключ был Месяц/Год | Дилер | Комплектация:
DSO:
Code:
Месяц/Год | Дилер | Комплектация | План
01.2015       1           A        15 (последнее значение)
01.2015       1           B        10 (последнее значение)


Вот так можно организовать дельту. Для стандартных источников важен мэпинг поля ROCANCEL. Для Z - всё зависит от полёта вашей фантазии.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO  Тема решена
СообщениеДобавлено: Ср, фев 25 2015, 14:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Спасибо за столь подробный ответ.
Но в Z-таблице не могут храниться так данные:

Здесь дублируется запись по ключу (Месяц/Год | Дилер | Комплектация)
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A          5
01.2015       1           A          5        X

Пример хранения информации:
Таблица без удаленной записи:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A          5

Таблица с удаленной записью:
Code:
Месяц/Год | Дилер | Комплектация | План | Метка удаления
01.2015       1           A          5        X





Решил все-таки реализовать вариант, когда имеется такая схема:
Code:
Z_экстрактор (Дельта по метке времени без ABAP) -> Z_DSO (Месяц/Год | Дилер | Комплектация | План | Метка удаления) -> Z_DSO_2 (Месяц/Год | Дилер | План)

Покопавшись в отладчике и посмотрев как переходит дельта из одного DSO в другой, написал вот такой кусок кода, который полностью решил всю проблему.

Код вставляется в START_ROUTINE трансформации Z_DSO -> Z_DSO_2.

Code:
LOOP AT SOURCE_PACKAGE ASSIGNING <source_fields> WHERE /bic/zdelflag = 'X'.
  DELETE SOURCE_PACKAGE.
ENDLOOP.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Ср, фев 25 2015, 14:47 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, ноя 08 2013, 13:25
Сообщения: 78
Ну, вы же не описывали подробно структуру своей Z-таблицы и ключевые поля ,которые она использует. Поэтому я исходил из предположений. Вы всё правильно сделали. Первое DSO вам обеспечивает аддитивность данных. Т.е. на выходе вы всегда получаете разницу последующего значения с предыдущим (по ключу Месяц/Год | Дилер | Комплектация). Единственно, что можно обойтись вообще без кодинга - поставьте фильтр в DTP между DSO.
И вместо второго DSO можно сразу писать в куб.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Агрегирующий DSO
СообщениеДобавлено: Ср, фев 25 2015, 16:08 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, сен 03 2011, 08:51
Сообщения: 100
Пол: Мужской
Да, очень интересно получается с фильтром.
Раньше я думал, что фильтром ограничиваются целиком запись и она никак не попадает в DSO.
В отладчике очень хорошо наглядно все видно.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB