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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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