Текущее время: Чт, июл 10 2025, 05:13

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: контировка из оргменеджмента?
СообщениеДобавлено: Чт, ноя 04 2004, 16:09 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 14 2004, 18:02
Сообщения: 415
Откуда: из HR
Пол: Мужской
Добрый день!
Не подскажите ФМ который позволяет получить данные по контировке объекта из ОМ, интересуют поля раздел и подраздел персонала.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 05 2004, 14:04 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 14 2004, 18:02
Сообщения: 415
Откуда: из HR
Пол: Мужской
Не дождавшись ответа, решил сам эту проблему так:
Code:
FUNCTION z_ds_get_it1008.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(PLVAR) TYPE  OBJEC-PLVAR DEFAULT '01'
*"     REFERENCE(OBJID) TYPE  OBJEC-OBJID
*"     REFERENCE(SDATE) TYPE  SY-DATUM DEFAULT SY-DATUM
*"  EXPORTING
*"     REFERENCE(PARENT) TYPE  OBJEC-OBJID
*"     REFERENCE(IT_P1008) TYPE  P1008
*"  EXCEPTIONS
*"      1008_NOT_FOUND
*"      NO_UP_FOUND
*"      OBJID_NOT_FOUND
*"----------------------------------------------------------------------

  DATA : res(1)
       , upobj TYPE objec-objid
       , checkid TYPE objec-objid
       , it1008 TYPE hrp1008 OCCURS 10 WITH HEADER LINE
       .

  FIELD-SYMBOLS <objid> TYPE objec-objid.

  CLEAR : it1008, res, checkid.

  ASSIGN objid TO <objid>.

  SELECT SINGLE objid FROM hrp1000 INTO checkid WHERE objid = <objid>.
  IF sy-subrc NE 0.
    RAISE objid_not_found.
    EXIT.
  ENDIF.

  DO 40 TIMES.
    SELECT SINGLE * FROM hrp1008 INTO it1008 WHERE plvar = plvar AND
                                                   otype = 'O' AND
                                                   objid = <objid> AND
                                                   endda >= sdate.
    IF sy-subrc EQ 0.
      MOVE-CORRESPONDING it1008 TO it_p1008.
      parent = it_p1008-objid.
      res = 'X'.
      EXIT.
    ELSE.
      PERFORM get_up_level USING <objid> sdate CHANGING upobj.
      ASSIGN upobj TO <objid>.
    ENDIF.
  ENDDO.

  IF res IS INITIAL.
    RAISE 1008_not_found.
  ENDIF.

ENDFUNCTION.

*---------------------------------------------------------------------*
*       FORM get_up_level                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  OBJ                                                           *
*  -->  DAT                                                           *
*  -->  UPOBJ                                                         *
*---------------------------------------------------------------------*
FORM get_up_level USING obj dat CHANGING upobj.
  DATA : it1001 TYPE p1001 OCCURS 10 WITH HEADER LINE.
  CLEAR : it1001.

  SELECT SINGLE * FROM hrp1001 INTO it1001 WHERE otype = 'O' AND
                                                 objid = obj AND
                                                 endda >= dat AND
                                                 rsign = 'A' AND
                                                 relat = '002'.
  IF sy-subrc EQ 0.
    upobj = it1001-sobid.
  ELSE.
    RAISE no_up_found.
  ENDIF.
ENDFORM.



может кому полезно будет, а может кто меня и поправит :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 05 2004, 14:23 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
А что за магические
Code:
DO 40 TIMES.

И
Code:
  SELECT SINGLE * FROM hrp1008

в сочетании с только
Code:
  endda >= sdate.

Выглядит крайне ненадёжным
И вообще - для инфотипов оргменеджмента есть свой функциональный модуль
RH_READ_INFTY


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 05 2004, 14:30 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
И ещё, hrp1000 - такая же таблица инфотипа как и все остальные.
Поэтому простой select single без указания в фразе where ограничения по begda и endda - крайне сомнительное решение.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, ноя 05 2004, 15:23 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 14 2004, 18:02
Сообщения: 415
Откуда: из HR
Пол: Мужской
Отвечаю по пунктам обвинения :D :
1) DO 40 TIMES - сделано с целью не заморачиваться с глубиной вложености, можно было указать хоть 5 хоть 1005 просто мне так захотелось :wink:

2) SELECT SINGLE * FROM hrp1008 в сочетании endda >= sdate сделано потому, что интересует последняя актуальная запись, остальное не интересует, хотя может я и ошибся, тестирование покажет :)

3) чтение из таблицы hrp1000 сделно сцелью проверить наличие/отсутствие объекта поэтому даты просто не интересуют, можно было просто убрать этот код, это просто фича

4) RH_READ_INFTY мне ну просто не подходит, по одной простой причине, объекты оргменеджмента нижнего уровня наследуют контировку родительского объекта, и если я захочу считать данные 1008 ит у объекта нижнего уровня, то он будет ПУСТОЙ, вот потому и возникло данное решение, ну не нашел я альтернативы :D

спасибо Вам за комментарии


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, мар 25 2005, 21:20 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Если я правильно понял вопрос, то помочь может стандартный ФМ RH_CHECK_ACC_INPUT


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 30 2005, 08:50 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 14 2004, 18:02
Сообщения: 415
Откуда: из HR
Пол: Мужской
Спасибо, то, что нужно, но мой тоже работает, хотя, может критический взгляд со стороны укажет на недостатки :D

Несколько исправленный предыдущий вариант:
Code:
FUNCTION z_ds_get_it1008.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(PLVAR) TYPE  OBJEC-PLVAR DEFAULT '01'
*"     REFERENCE(OBJID) TYPE  OBJEC-OBJID
*"     REFERENCE(SDATE) TYPE  SY-DATUM DEFAULT SY-DATUM
*"  EXPORTING
*"     REFERENCE(PARENT) TYPE  OBJEC-OBJID
*"     REFERENCE(IT_P1008) TYPE  P1008
*"  EXCEPTIONS
*"      1008_NOT_FOUND
*"      NO_UP_FOUND
*"      OBJID_NOT_FOUND
*"----------------------------------------------------------------------

  DATA : res(1)
       , upobj TYPE objec-objid
       , checkid TYPE objec-objid
       , it1008 TYPE hrp1008 OCCURS 10 WITH HEADER LINE
       .

  FIELD-SYMBOLS <objid> TYPE objec-objid.

  CLEAR : it1008, it_p1008, res, checkid.

  ASSIGN objid TO <objid>.

  SELECT SINGLE objid FROM hrp1000 INTO checkid WHERE objid = <objid>.
  IF sy-subrc NE 0.
    RAISE objid_not_found.
    EXIT.
  ENDIF.

  DO 40 TIMES.
    SELECT SINGLE * FROM hrp1008 INTO it1008 WHERE
                                                   plvar = plvar AND
                                                   otype = 'O' AND
                                                   objid = <objid> AND
                                                   begda <= sdate AND
                                                   endda >= sdate.
    IF sy-subrc EQ 0.
      IF it_p1008-btrtl IS INITIAL AND NOT it1008-btrtl IS INITIAL.
        it_p1008-btrtl = it1008-btrtl.
        parent = it1008-objid.
      ENDIF.
      IF it_p1008-persa IS INITIAL AND NOT it1008-persa IS INITIAL.
        it_p1008-persa = it1008-persa.
        parent = it1008-objid.
      ENDIF.
      IF NOT it_p1008-btrtl IS INITIAL AND
         NOT it_p1008-persa IS INITIAL.
        res = 'X'.
        EXIT.
      ELSE.
        PERFORM get_up_level USING <objid> sdate CHANGING upobj.
        ASSIGN upobj TO <objid>.
      ENDIF.
    ELSE.
      PERFORM get_up_level USING <objid> sdate CHANGING upobj.
      ASSIGN upobj TO <objid>.
    ENDIF.
  ENDDO.

  IF res IS INITIAL.
    RAISE 1008_not_found.
  ENDIF.

ENDFUNCTION.

*---------------------------------------------------------------------*
*       FORM get_up_level                                             *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  OBJ                                                           *
*  -->  DAT                                                           *
*  -->  UPOBJ                                                         *
*---------------------------------------------------------------------*
FORM get_up_level USING obj dat CHANGING upobj.
  DATA : it1001 TYPE p1001 OCCURS 10 WITH HEADER LINE.
  CLEAR : it1001.

  SELECT SINGLE * FROM hrp1001 INTO it1001 WHERE otype = 'O' AND
                                                 objid = obj AND
                                                 begda <= dat AND
                                                 endda >= dat AND
                                                 rsign = 'A' AND
                                                 relat = '002'.
  IF sy-subrc EQ 0.
    upobj = it1001-sobid.
  ELSE.
    RAISE no_up_found.
  ENDIF.
ENDFORM.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 30 2005, 11:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Сб, сен 25 2004, 16:30
Сообщения: 1368
Откуда: Москва
Пол: Мужской
В подобных случаях стандартный модуль предпочтительнее по определению. Но вообще DO 40 TIMES это действительно сильно сказано. Чтобы получить вложенность по оргструктуре (для произвольного пути анализа) есть еще один ФМ - RH_STRUC_GET.

_________________
С уважением, Сергей Королев


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 31 2005, 14:26 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, окт 14 2004, 18:02
Сообщения: 415
Откуда: из HR
Пол: Мужской
Да, про RH_STRUC_GET я знаю, спасибо за комментарий, может быть логичнее, для проверки глубины вложенности было бы использовать его, но, на тот момент, когда задавался вопрос, не знал :D пришлось мудрить. В общем, как показывает мой пример, читаем матчасть :wink:


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

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


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

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