Текущее время: Пт, июл 18 2025, 20:14

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


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Пн, апр 14 2014, 21:26 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2012, 10:08
Сообщения: 128
Добрый день.
Не могу решить, на первый взгляд, не сложную задачу. Нужно соединить 3 таблицы, в которых есть поле ID, begda и endda, плюс дополнительные поля.
Если кто знаком с HR, то это HRP1005, T710 и z-таблица. В которых ID - это код штатной должности, ну и begda и endda. В таблице z есть поле, которое можно заполнять руками.
В каждой таблице на одну ID могут быть несколько неперекрывающихся записей, но периоды в отношении 3х таблиц могут перекрываться.
Т.е. в 1ой таблице может быть запись, на один период которой, может быть 2 записи второй таблицы, а в третей 3 периода будут входить в один период первой, и к примеру 10 дней 4го периода, endda у которого, больше endda периода первой таблицы. Самому тяжело понять, что написал, но как-то так.
Нужно проверять на появление новых должностей в HRP1005, повышение окладов в T710, и в Z могут появляться новые записи.
И я никак не могу сложить эту мозайку.
Я пошел по варианту анализа каждой записи HRP1005, далее в Z таблице, и потом каждой записи в t710. Но зашел в тупик.
Есть вариант сложить во внутреннюю таблицу все периоды из 3х таблиц, разбить их на все минимальные периоды и дальше тянуть по периодам, информацию из 3х таблиц. Но слабо пока представляю как это сделать.
Чувствую 5ой точкой, что есть проще вариант, но не могу его найти. И думаю не в том направлении.
Может кто подтолкнет к правильному решению? :)
Заранее спасибо.

P.S. Можно ли сделать это ракурсом 3х таблиц?

_________________
Бог умер (с) Ницше
Ницше умер (с) Бог
Хах.. (с) Смерть


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Пн, апр 14 2014, 22:28 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Фокус в том, что можно проверять записи во всех таблицах только на одну дату.
В разрезе каких дат нужно строить отчет?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Пн, апр 14 2014, 22:43 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2012, 10:08
Сообщения: 128
В разрезе дат, точней периодов всех таблиц, и во внутренюю таблицу складывать все "кусочки" и по этим кусочкам тянуть инфу из всех трех таблиц.
В итоге 3я таблица будет равна внутренней.

Путем рисования в тетрадке пришел к выводу, что во внутренней таблице будут наиболее мелкие периоды их всех 3х таблиц.
1 |-------------|--------------|-------------| (hrp1005)
2 |------|-------------|-------|-------------| (t710)
3 |----------|--|------|-------|-------------| (z)

4 |------|---|--|------|-------|-------------| внутренняя таблица

Как-то так.
И теперь для каждого кусочка внутренней таблицы нужно тянуть тип, группу, область их hrp1005.
Минимальный и максимальный оклад по типу-группе-области из Т710.
Установленный по штатке оклад из z.

_________________
Бог умер (с) Ницше
Ницше умер (с) Бог
Хах.. (с) Смерть


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 00:54 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
как вариант - считать по дням, тогда не нужно заморачиваться с нарезками периодов,
предварительно выбрать из бд данные с мин даты по макс возможную дату, раздельно без join,
по выбранным данным составить таблицы (или одну сводную) у которых ключом будет дата,
работать будет дольше, но если есть данные по дням, то можно собрать любой отчёт


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 08:52 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2012, 10:08
Сообщения: 128
К сожалению не вариант. И так в фоне полчаса отрабатывает.

_________________
Бог умер (с) Ницше
Ницше умер (с) Бог
Хах.. (с) Смерть


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 10:03 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, фев 15 2011, 15:02
Сообщения: 122
Если решите делать через внутренние таблицы, то есть замечательный ФМ RH_CUT_PERIODS, который разобьет начальные данные на нужные периоды.

_________________
Поздравляю тебя, Шарик, ты - балбес!


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 10:51 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2012, 10:08
Сообщения: 128
Ухты, походу то, что надо. Спасибо.
А то я сам велосипед начал придумывать.

_________________
Бог умер (с) Ницше
Ницше умер (с) Бог
Хах.. (с) Смерть


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 11:03 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
Добрый день!
Ракурсом 3 таблиц это не сделать.
Я решал подобную задачу (не такая уж она и простая)

Теоретически можно сделать через периоды, но это получится довольно сложный алгоритм (при N таблицах сложность растет геометрически)
Ключевая подсказка в этом направлении -
Условие пересечения двух периодов:
( T1.begda <= T2.endda ) AND
( T2.begda <= T1.endda )
выводится по закону де моргана, отрицанием условия непересечения:
(T1.begda > T2.endda ) OR
(T2.begda > T1.endda ).
можете построить на графиках.
Это теория.

Практичный вариант не приводящий к усложненному алгоритму:
Составить таблицу по дням (зафиксировать состояние параметров на каждый день).
После ее заполнения преобразовать обратно в таблицу периодов.


P.S. Для работы с периодами можно еще использовать логическую базу данных и оператор
PROVIDE f1 f2 ... FROM itab1 g1 g2 ... FROM itab2
...
FROM itabn
...
BETWEEN f AND g.
ENDPROVIDE.
в хелпе описано как работать, но еще раз предупреждаю работа с периодами это тупиковый (приводящий к разрастанию сложности) путь. И вообще ldb и provide это устаревшие эелементы языка (использовались еще до появления SQL)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 11:12 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Ср, июн 13 2012, 10:08
Сообщения: 128
Я немного не пойму про таблицу по дням. Как это должно выглядеть?

Ну пока я не понял с днями, на первом месте вариант использовать фм для обрезки дат, предварительно во внутреннюю таблицу кинуть все периоды из 3х таблиц, а потом уже всю инфу тянуть по этим периодам из трех таблиц.

_________________
Бог умер (с) Ницше
Ницше умер (с) Бог
Хах.. (с) Смерть


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 11:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
1) выборка из таблиц бд за заданный период в раздельные внутр таблицы
2) цикл с миним даты периода по максимальную:
для даты Di чтение из каждой внутр таблицы по условию begda <= Di <= endda,
прочитанные строки вносим как запись за дату Di в соотв дневные таблицы
(т.е. замена begda-endda на date)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 11:56 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
trop написал(а):
1) выборка из таблиц бд за заданный период в раздельные внутр таблицы
2) цикл с миним даты периода по максимальную:
для даты Di чтение из каждой внутр таблицы по условию begda <= Di <= endda,
прочитанные строки вносим как запись за дату Di в соотв дневные таблицы
(т.е. замена begda-endda на date)

да, именно так


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 12:00 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
marcustas написал(а):
Ну пока я не понял с днями, на первом месте вариант использовать фм для обрезки дат, предварительно во внутреннюю таблицу кинуть все периоды из 3х таблиц, а потом уже всю инфу тянуть по этим периодам из трех таблиц.

Я этот ФМ не использовал, тоже не очень пока понял ее интерфейс, внутри посмотрел - там не особо сложно
мне кажется что он как раз что то подобное алгоритму "по дням" и выполняет
В общем с чем будет проще разобраться то и используй


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 12:14 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
trop написал(а):
1) выборка из таблиц бд за заданный период в раздельные внутр таблицы
2) цикл с миним даты периода по максимальную:
для даты Di чтение из каждой внутр таблицы по условию begda <= Di <= endda,
прочитанные строки вносим как запись за дату Di в соотв дневные таблицы
(т.е. замена begda-endda на date)

Совет по оптимизации:
Алгоритм абсолютно верен, но выделенное место будет тормозить (даже сортированная таблица не поможет)
Поэтому можно так соптимизировать:
1) выборка из таблиц бд за заданный период в раздельные внутр таблицы
2) каждую запись в таблице преобразуем в набор записей (на каждый Di) от begda до endda.
так должно работать быстро


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 12:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
мысль понятна, однако, сомнительно что во внутр табл будет много периодов(записей),

ещё как вариант:
можно сортировать напр по begda (в endda как обычно м.б. 99991231),
затем использовать read .. binary search:
Code:
sort itab1  by ... begda.

read table itab1 
  binary search
  with key
  ..
  begda = idate
  transporting no fields
  .
case sy-subrc.
  when 0.  " запись найдена в строке sy-tabix -> используем sy-tabix
     tabix1 = sy-tabix.
  when others.  " записи нет, можно вставить в строку sy-tabix -> используем (sy-tabix-1)
     tabix1 = sy-tabix - 1.
endcase.  " sy-subrc

loop at itab1 
  from tabix1
  where ...
    and begda   le idate
    and endda   ge idate
  .
...

-либо-
удалять строки периодов из внутр таблиц по завершению обхода периода


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Соединить 3 таблицы с согласованием периодов
СообщениеДобавлено: Вт, апр 15 2014, 13:31 
Специалист
Специалист

Зарегистрирован:
Ср, дек 27 2006, 19:19
Сообщения: 230
trop написал(а):
мысль понятна, однако, сомнительно что во внутр табл будет много периодов(записей),

Помнится в некоторых инфотипах, вроде "дни отсутствия", записи были такие:
begda endda
19.01.2013 19.01.2013
24.01.2013 24.01.2013
25.01.2013 25.01.2013
и т д
Во всяком случае - "в фоне полчаса отрабатывает" я не могу по другому объяснить

Цитата:
ещё как вариант:
можно сортировать напр по begda (в endda как обычно м.б. 99991231),
затем использовать read .. binary search:

Выглядит несколько заумно, но идея отсортировать и просто брать по begda хорошая, периоды как правило не пересекаются
но < и > с binary search и sorted table не работают к сожалению.

Я бы примерно так сделал:
Code:
DATA itab1 TYPE TABLE OF hrp1005 WITH HEADER LINE.
DATA BEGIN OF days1 OCCURS 0.
  DATA date LIKE itab1-begda.
  INCLUDE STRUCTURE itab1.
DATA END OF days1.
DATA date LIKE days1-date.
REFRESH days1.
LOOP AT itab1.
  date =  itab1-begda.
  WHILE date <= itab1-endda.
     CLEAR days1.
     days1-date = date.
     MOVE-CORRESPONDING itab1 TO days1.
     APPEND days1.
     date = date + 1.
  ENDWHILE.
ENDLOOP.
SORT days1 BY date.

и дальше работать ужу с days1 - с подневной работать намного проще
а в году всего 365 дней - это копейки
остальные 2 таблицы - аналогично

Цитата:
удалять строки периодов из внутр таблиц по завершению обхода периода

Лучше не удалять записи из исходной таблицы, особенно когда по ней идешь в LOOPе, работает конечно, но некрасиво, все равно что сам себя за волосы поднимаешь


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

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


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

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


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

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