Текущее время: Чт, апр 18 2024, 10:51

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


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

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


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

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