Loading



+ Sapforum.Biz » Инструменты » ABAP - Инструментальные средства » SE37 - Построитель функций (Модератор: Dmitriy)Тема:
|- Работа с классификацией в системе



Автор Тема: Работа с классификацией в системе  (Прочитано 3609 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
В общем для работы с классификацией в системе написано довольно много всяких функций, полезных и местами не очень, но как мне кажется самым кошерным в данном случае является группа функций:

CLBPA - BAPIs Klassifizierung

Который содержит в себе следующие функции:
                    "BAPI_OBJCL_CREATE
                    "BAPI_OBJCL_CHANGE
                    "BAPI_OBJCL_CONCATENATEKEY
                    "BAPI_OBJCL_DELETE
                    "BAPI_OBJCL_EXISTENCECHECK
                    "BAPI_OBJCL_GETDETAIL
                    "BAPI_OBJCL_GETOBJECTS
                    "BAPI_OBJCL_GETSTATUS
                    "BAPI_OBJCL_SPLITKEY
                    "BAPI_OBJCL_GETCLASSES
                    "BAPI_OBJCL_GET_KEY_OF_OBJECT
                    "BAPI_OBJCL_GET_OBJECT_OF_KEY
                    "BAPI_OBJCL_CHANGE_KEY
                    "BAPI_OBJCL_CREATE_KEY
                    "BAPI_OBJCL_EXISTENCECHECK_KEY
                    "BAPI_OBJCL_GETCLASSES_KEY
                    "BAPI_OBJCL_GETDETAIL_KEY
                    "BAPI_OBJCL_GETOBJECTS_KEY
                    "BAPI_OBJCL_GETSTATUS_KEY
                    "BAPI_OBJCL_DELETE_KEY
                    "BAPI_OBJCL_SPLITKEY_KEY
                    "BAPI_OBJCL_CONCATENATEKEY_KEY
                    "CLBPA_DISPLAY_ALLOWED_VALUES
                    "ALE_OBJCL_CREATE_KEY
                    "IDOC_INPUT_CLASSIFICATION_CREA

Мне пока всем этим хозяйством, пользоваться не доводилось, так сказать нужды не было  ::) пока. Но по мере востребования, примеры постараюсь выкладывать. Ну или если кто сам чего нароет, то может выкладывать.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Так сказать из последнего и наиболее часто используемого модуля BAPI_OBJCL_GETCLASSES. Полезного в нем не только то, что он читает класс, но так же может прочитать и значения признаков классификации объекта. В примере представлен вызов для чтения классификации CO-заказа.

DATA: l_aufk LIKE aufk,
      l_count LIKE sy-tabix,
      l_lvalues TYPE tabelle,
      l_classtype_imp LIKE bapi1003_key-classtype,
      l_objectkey_imp LIKE bapi1003_key-object,
      lt_alloclist LIKE bapi1003_alloc_list OCCURS 1 WITH HEADER LINE,
      lt_allocvalueschar LIKE bapi1003_alloc_values_char
                              OCCURS 1 WITH HEADER LINE,
      lt_return LIKE bapiret2 OCCURS 1 WITH HEADER LINE.

cls_table: pt_anka.

SELECT SINGLE * INTO l_aufk
FROM aufk WHERE aufnr = 'Номер CO-заказа'.
IF sy-subrc <> 0. <заказ CO-не существует> ENDIF.

l_classtype_imp = '013'.
l_objectkey_imp = l_aufk-objnr.
l_lvalues = 'AUFK'.
CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
     EXPORTING
          objectkey_imp   = l_objectkey_imp
          objecttable_imp = l_lvalues
          classtype_imp   = l_classtype_imp
          read_valuations = 'X'
     TABLES
          alloclist       = lt_alloclist
          allocvalueschar = lt_allocvalueschar
          return          = lt_return.

READ TABLE lt_return WITH KEY type   = 'S'
                              id     = 'CL'
                              number = '741'.
IF sy-subrc = 0. <Классификация к заказу прочитана> ENDIF.

Оффлайн NachDenken

  • Newbie
  • *
  • Сообщений: 143
  • Reputation Power: 0
  • NachDenken has no influence.
Так сказать из последнего и наиболее часто используемого модуля BAPI_OBJCL_GETCLASSES. Полезного в нем не только то, что он читает класс, но так же может прочитать и значения признаков классификации объекта. В примере представлен вызов для чтения классификации CO-заказа.
а вот названия классов партий тоже можно или не к этой классификации?
« Последнее редактирование: Май 21, 2008, 12:41:21 pm от Uukrul »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
а вот названия классов партий тоже можно или не к этой классификации?
Думаю можно... судя по всему группа функций общего назначения. Поиграюсь пример выложу.

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Типа пришла зима, надо было этими ФМ-ками почитать классификацию партий. Ну что можно сказать, что таки работают
TABLES: mcha.

PARAMETERS: p_matnr LIKE mcha-matnr,
            p_werks LIKE mcha-werks,
            p_charg LIKE mcha-charg.

DATA: l_objectkey LIKE bapi1003_key-object,
      l_classnum LIKE bapi1003_key-classnum,
      l_status LIKE bapi1003_key-status,
      l_standardclass LIKE bapi1003_key-stdclass.
DATA: lt_allocvaluesnum LIKE bapi1003_alloc_values_num
                             OCCURS 1 WITH HEADER LINE,
      lt_allocvalueschar LIKE bapi1003_alloc_values_char
                             OCCURS 1 WITH HEADER LINE,
      lt_allocvaluescurr LIKE bapi1003_alloc_values_curr
                             OCCURS 1 WITH HEADER LINE,
      lt_return LIKE bapiret2
                             OCCURS 1 WITH HEADER LINE.

****
DEFINE ext_to_int.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
       exporting
            input  = &1
       importing
            output = &2.
END-OF-DEFINITION.
****

* Имя класса партии значения которого хотим получить
l_classnum = 'BATCH_CLASS'.
* Сформировать ключ объекта партии
ext_to_int: p_matnr l_objectkey(18),
            p_werks l_objectkey+18(4),
            p_charg l_objectkey+22(10).
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
     EXPORTING
          objectkey        = l_objectkey
          objecttable      = 'MCHA'
          classnum         = l_classnum
          classtype        = '022'
          keydate          = sy-datum
          unvaluated_chars = ' '
          language         = sy-langu
     IMPORTING
          status           = l_status
          standardclass    = l_standardclass
     TABLES
          allocvaluesnum   = lt_allocvaluesnum
          allocvalueschar  = lt_allocvalueschar
          allocvaluescurr  = lt_allocvaluescurr
          return           = lt_return.

READ TABLE lt_return WITH KEY type = 'S'
                              id = 'CL'
                              number = '731'.
IF sy-subrc = 0. WRITE: / 'Класс считан!'. ENDIF.
Собственно говоря в таблицах признаки и значения для объекта...

Оффлайн Удав

  • Newbie
  • *
  • Сообщений: 38
  • Reputation Power: 0
  • Удав has no influence.
Re: Работа с классификацией в системе
« Ответ #5 : Февраль 08, 2009, 11:27:59 pm »
Работать то эти BAPI(особенно по чтению данных) работают, но на практике они применимы для небольшого количества вызовов в рамках одной программы.
Как часто это бывает у индусов, внутренние таблицы в функциях для внутреннего применения не очищаются.
Более того, внутренние таблицы не являются сортированными.
Как будет время побаловаться с SE30 - выложу примеры как для чтения данных классификации, так и для записи.
У меня получилась следующая оптимальная схема работы:
Чтение: напрямую из INOB + AUSP, если нужны текстовые значения из признаков - с помощью связки CAWN+CAWNT
Запись: через BAPI, для ускорения работы при большом объеме вводимых данных используется запуск ФМ в режиме STARTING NEW TASK ...PERFORMING ..

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Работа с классификацией в системе
« Ответ #6 : Февраль 08, 2009, 11:54:30 pm »
Работать то эти BAPI(особенно по чтению данных) работают, но на практике они применимы для небольшого количества вызовов в рамках одной программы.
Ну никто не спорит, практически любая BAPI по чтению данных будет медленнее, чем чтение данных из таблицы внутри своей программы, так же это относится и к BAPI по записи данных, хотя конечно запись на несколько порядков сложнее, но в принципе тоже реализуема, хотя конечно вероятность повредить данные при прямой записи очень большая и можно легко отгрести от гнезда, за такие вещи  ::), что касается вообще BAPI то конечно все зависит от требований, если нет массовой обработки данных, т.е. это диалоговая транзакция, то тут все равно основное время занимает ожидание ввода от пользователя, а BAPI это удобно, но если вам надо пройтись по всем  классам, то... SELECT это ваш инструмент.

PS: Результаты сравнений производительности, хотелось бы конечно на посмотреть... думаю информация к размышлению будет полезная, да и тема уже есть подходящая http://sapforum.biz/index.php/topic,174.0.html (Оптимизация ABAP), так что будет время, ждем-с примеров.

Оффлайн Удав

  • Newbie
  • *
  • Сообщений: 38
  • Reputation Power: 0
  • Удав has no influence.
Re: Работа с классификацией в системе
« Ответ #7 : Февраль 10, 2009, 05:24:49 pm »
Ну вот и результаты:
Чтение 1500 классификаций:
1. через BAPI ~ 20 с.
2. через SELECT из INOB + AUSP + CAWN + CAWNT ~6 c.
Изменение 190 классификаций партий через BAPI_OBJCL_CHANGE:
1. В цикле - 730 с.
2. В цикле с использованием STARTING NEW TASK в синхронном режиме с PERFORMING NEW TASK(количество процессов для классификации - 1) - 760 с.
3. В цикле с использованием STARTING NEW TASK в синхронном режиме с PERFORMING NEW TASK(количество процессов для классификации - 5) - 260 с.

ЗЫ: Как файлы измерений выкладывать - через файлообменники?
« Последнее редактирование: Февраль 10, 2009, 05:31:55 pm от Удав »

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Работа с классификацией в системе
« Ответ #8 : Февраль 10, 2009, 05:43:47 pm »
ЗЫ: Как файлы измерений выкладывать - через файлообменники?
Не понял вопрос... имеется в виду как прицепить файл к сообщению?

Оффлайн Удав

  • Newbie
  • *
  • Сообщений: 38
  • Reputation Power: 0
  • Удав has no influence.
Re: Работа с классификацией в системе
« Ответ #9 : Февраль 10, 2009, 05:55:11 pm »
Ну да :)

Оффлайн Uukrul

  • SAP R/3 4.6C
  • Administrator
  • Hero Member
  • *****
  • Сообщений: 2.311
  • Reputation Power: 2
  • Uukrul barely matters.Uukrul barely matters.
  • Пол: Мужской
    • Sapforum.BIZ
Re: Работа с классификацией в системе
« Ответ #10 : Февраль 10, 2009, 06:05:06 pm »
Ну да :)
Ну тут все просто... мышаком клик в поле, дополнительный опции (выделено красным), дальше или руками или кнопка обзор для выбора пути к вложению. Если вложений несколько тогда мышкой по ссылке "Вложения", выделено черным, будут добавляться поля ввода. Пока можно 20 вложений, размером кажется не более 2 мб на один файл.

Оффлайн Удав

  • Newbie
  • *
  • Сообщений: 38
  • Reputation Power: 0
  • Удав has no influence.
Re: Работа с классификацией в системе
« Ответ #11 : Февраль 10, 2009, 07:33:22 pm »
Результат SE30 по чтению классификации:
а) через BAPI (READ_BAPI...),
б) через SELECT (READ_AUSP)
в)по изменению классификации через BAPI(SAVE_BAPI...). Нужно заметить, что для очистки внутренних таблиц перед BAPI_OBJCL_CHANGE вызывается ФМ VB_INIT. Без него время выполнения было бы значительно хуже на большом количестве изменяемых классификаций.
« Последнее редактирование: Февраль 10, 2009, 07:38:13 pm от Удав »

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #12 : Август 31, 2010, 12:21:02 am »
Результат SE30 по чтению классификации:
а) через BAPI (READ_BAPI...),
б) через SELECT (READ_AUSP)
в)по изменению классификации через BAPI(SAVE_BAPI...). Нужно заметить, что для очистки внутренних таблиц перед BAPI_OBJCL_CHANGE вызывается ФМ VB_INIT. Без него время выполнения было бы значительно хуже на большом количестве изменяемых классификаций.


Если не сложно, можно примеры выложить
 save_bapi_head-44 партии.htm (10.96 Кб - загружено 40 раз.)
 SAVE_BAPI-44 партии.htm (413.75 Кб - загружено 99 раз.)

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #13 : Сентябрь 06, 2010, 02:01:31 pm »
Цитата: Uukrul  link=topic=170.msg2411#msg2411 date=1231757741
Типа пришла зима, надо было этими ФМ-ками почитать классификацию партий. Ну что можно сказать, что таки работают
TABLES: mcha.

PARAMETERS: p_matnr LIKE mcha-matnr,
            p_werks LIKE mcha-werks,
            p_charg LIKE mcha-charg.

DATA: l_objectkey LIKE bapi1003_key-object,
      l_classnum LIKE bapi1003_key-classnum,
      l_status LIKE bapi1003_key-status,
      l_standardclass LIKE bapi1003_key-stdclass.
DATA: lt_allocvaluesnum LIKE bapi1003_alloc_values_num
                             OCCURS 1 WITH HEADER LINE,
      lt_allocvalueschar LIKE bapi1003_alloc_values_char
                             OCCURS 1 WITH HEADER LINE,
      lt_allocvaluescurr LIKE bapi1003_alloc_values_curr
                             OCCURS 1 WITH HEADER LINE,
      lt_return LIKE bapiret2
                             OCCURS 1 WITH HEADER LINE.

****
DEFINE ext_to_int.
  call function 'CONVERSION_EXIT_ALPHA_INPUT'
       exporting
            input  = &1
       importing
            output = &2.
END-OF-DEFINITION.
****

* Имя класса партии значения которого хотим получить
l_classnum = 'BATCH_CLASS'.
* Сформировать ключ объекта партии
ext_to_int: p_matnr l_objectkey(18),
            p_werks l_objectkey+18(4),
            p_charg l_objectkey+22(10).
CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
     EXPORTING
          objectkey        = l_objectkey
          objecttable      = 'MCHA'
          classnum         = l_classnum
          classtype        = '022'
          keydate          = sy-datum
          unvaluated_chars = ' '
          language         = sy-langu
     IMPORTING
          status           = l_status
          standardclass    = l_standardclass
     TABLES
          allocvaluesnum   = lt_allocvaluesnum
          allocvalueschar  = lt_allocvalueschar
          allocvaluescurr  = lt_allocvaluescurr
          return           = lt_return.

READ TABLE lt_return WITH KEY type = 'S'
                              id = 'CL'
                              number = '731'.
IF sy-subrc = 0. WRITE: / 'Класс считан!'. ENDIF.
Собственно говоря в таблицах признаки и значения для объекта...

Небольшое уточнение, следует учитывать уровень партии, таблица TCUCH
" Определяем уровень партии (OMCT) spro- Общая логистика - Управление партиями - Уровень партии"

У меня например уровень партии "1 - Партия однозначно ведется на уровне материала", а в коде привязывается к уровню партии, как то не кошерно  ;) (сказал же настроить на уровне завода, а мои настройщики настроили, по крайней мере в тестовом манданте.... ) .....
и так, код выглядит следующим образом (ссори, переделывать не стал, выдернул с BADi, думаю кому надо ls_ximseg-matnr  поменяют на p_matnr)

DATA: l_objectkey TYPE bapi1003_key-object,
        l_classnum TYPE bapi1003_key-classnum,
        l_status TYPE bapi1003_key-status,
        l_standardclass TYPE bapi1003_key-stdclass.
  DATA: lt_allocvaluesnum TYPE STANDARD TABLE OF bapi1003_alloc_values_num,
        lt_allocvalueschar TYPE STANDARD TABLE OF bapi1003_alloc_values_char,
        ls_allocvalueschar TYPE bapi1003_alloc_values_char,
        lt_allocvaluescurr TYPE STANDARD TABLE OF bapi1003_alloc_values_curr,
        lt_return TYPE STANDARD TABLE OF bapiret2.
  DATA: ls_ximseg TYPE LINE OF shp_imsegvb_t.
  DATA: ls_ausp TYPE ausp.

************************************************
  DEFINE ext_to_int.
    call function 'CONVERSION_EXIT_ALPHA_INPUT'
      exporting
        input  = &1
      importing
        output = &2.
  END-OF-DEFINITION.
************************************************

  l_classnum = 'ZMM_BATCH_SEARCH'.

  " Определяем уровень партии (OMCT) spro- Общая логистика - Управление партиями - Уровень партии
  " 0 - Партии однозначно ведутся на уровне завода
  " 1 - Партия однозначно ведется на уровне материала
  " 2 - Партия однозначно ведется на уровне манданта

  DATA: l_kzdch TYPE kzdch.
  SELECT SINGLE kzdch INTO l_kzdch from TCUCH.

  LOOP AT ct_ximseg INTO ls_ximseg.

    " Сформировать ключ объекта материала
    " !!! Внимание, зависит от уровня партии !!!*
    CASE l_kzdch .
      WHEN 0. " 0 - Партии однозначно ведутся на уровне завода
        ext_to_int: ls_ximseg-matnr l_objectkey(18),
                    ls_ximseg-werks l_objectkey+18(4),
                    ls_ximseg-charg l_objectkey+18(10).
      WHEN 1. " 1 - Партия однозначно ведется на уровне материала
           ext_to_int: ls_ximseg-matnr l_objectkey(18),
*                ls_ximseg-werks l_objectkey+18(4),
                 ls_ximseg-charg l_objectkey+18(10).
      WHEN 2. " 2 - Партия однозначно ведется на уровне манданта
           ext_to_int: ls_ximseg-charg l_objectkey+18.
    ENDCASE.

    CALL FUNCTION 'BAPI_OBJCL_GETDETAIL'
      EXPORTING
        objectkey        = l_objectkey
        " objecttable      = 'MCHA' " При уровне партии на уровне мандата
        objecttable      = 'MCH1'  " Партии (при межзаводском управлении партиями)
        classnum         = l_classnum
        classtype        = '023'
        keydate          = sy-datum
        unvaluated_chars = ' '
        language         = sy-langu
      IMPORTING
        status           = l_status
        standardclass    = l_standardclass
      TABLES
        allocvaluesnum   = lt_allocvaluesnum
        allocvalueschar  = lt_allocvalueschar
        allocvaluescurr  = lt_allocvaluescurr
        return           = lt_return."lt_return.
" ..................
« Последнее редактирование: Сентябрь 06, 2010, 02:08:31 pm от Паганель »

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #14 : Сентябрь 06, 2010, 03:08:09 pm »
Дополнительно, как я понимаю, при межзаводском уровне партий  вместо MCHA надо использовать табличку MCH1, т.е.
   0 -   Партии однозначно ведутся на уровне завода - таблица MCH1
   1 -   Партия однозначно ведется на уровне материала - таблица MCHA
   2 -   Партия однозначно ведется на уровне манданта - вот тут не ясно, скорее всего  MCHA?

что то не вьяжется ....  при "1 -   Партия однозначно ведется на уровне материала" выборку надо делать с MCH1.
« Последнее редактирование: Сентябрь 06, 2010, 03:21:47 pm от Паганель »

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #15 : Сентябрь 14, 2010, 11:35:40 am »
Дополнительно, как я понимаю, при межзаводском уровне партий  вместо MCHA надо использовать табличку MCH1, т.е.
   0 -   Партии однозначно ведутся на уровне завода - таблица MCH1
   1 -   Партия однозначно ведется на уровне материала - таблица MCHA
   2 -   Партия однозначно ведется на уровне манданта - вот тут не ясно, скорее всего  MCHA?

что то не вьяжется ....  при "1 -   Партия однозначно ведется на уровне материала" выборку надо делать с MCH1.

Немного не правильно, разберусь - отпишусь.

А для програм лучше использовать ФМ "VB_BATCH_DEFINITION"
DATA: gv_batch_level        LIKE tcuch-kzdch.         "Batch-Level

CALL FUNCTION 'VB_BATCH_DEFINITION'
        IMPORTING
          kzdch = gv_batch_level.

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #16 : Сентябрь 14, 2010, 12:46:54 pm »
Дополнительно, как я понимаю, при межзаводском уровне партий  вместо MCHA надо использовать табличку MCH1, т.е.
   0 -   Партии однозначно ведутся на уровне завода - таблица MCH1
   1 -   Партия однозначно ведется на уровне материала - таблица MCHA
   2 -   Партия однозначно ведется на уровне манданта - вот тут не ясно, скорее всего  MCHA?

что то не вьяжется ....  при "1 -   Партия однозначно ведется на уровне материала" выборку надо делать с MCH1.

Разобрался
   0 -   Партии однозначно ведутся на уровне завода - таблица MCHA
   1 -   Партия однозначно ведется на уровне материала - таблица MCHA
   2 -   Партия однозначно ведется на уровне манданта - вот тут не ясно, скорее всего  MCH1

P.S. Меня ввело в заблуждение название таблички MCH1 - "Партии (при межзаводском управлении партиями)", т.е. подразумевался уровень материала или манданта, не данные партии для завода

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #17 : Сентябрь 14, 2010, 01:00:12 pm »
Как пример выборки и использования функции http://sapforum.biz/index.php/topic,1293.msg7719.html#msg7719
Цитировать
REPORT  zmm_test.


SELECTION-SCREEN BEGIN OF BLOCK 01.
PARAMETERS: p_matnr TYPE matnr.
PARAMETERS: p_charg TYPE charg_d.
PARAMETERS: p_werks TYPE werks_d.
SELECTION-SCREEN END OF BLOCK 01.


* 0 -   Партии однозначно ведутся на уровне завода
* 1 -   Партия однозначно ведется на уровне материала
* 2 -   Партия однозначно ведется на уровне манданта

CONSTANTS: client                 LIKE tcuch-kzdch VALUE '2',
           material               LIKE tcuch-kzdch VALUE '1',
           plant                  LIKE tcuch-kzdch VALUE '0'.

DATA: gv_batch_level        LIKE tcuch-kzdch.         "Batch-Level

DATA: gt_mch1 TYPE STANDARD TABLE OF mch1 WITH HEADER LINE.
DATA: gt_mcha TYPE STANDARD TABLE OF mcha WITH HEADER LINE.

START-OF-SELECTION.

  CALL FUNCTION 'VB_BATCH_DEFINITION'
    IMPORTING
      kzdch = gv_batch_level.


  CASE gv_batch_level.
    WHEN client.
      SELECT  * FROM mch1
        INTO CORRESPONDING FIELDS OF TABLE gt_mch1
        WHERE
         charg EQ p_charg.
    WHEN material.
      SELECT  * FROM mch1
          INTO CORRESPONDING FIELDS OF TABLE gt_mch1
          WHERE
                matnr EQ p_matnr
                AND charg EQ p_charg.
    WHEN plant.
      SELECT  * FROM mcha
        INTO CORRESPONDING FIELDS OF TABLE gt_mcha
        WHERE
            matnr EQ p_matnr AND
            charg EQ p_charg AND
            werks EQ p_werks.
  ENDCASE.

Оффлайн Паганель

  • blogger
  • Full Member
  • *
  • Сообщений: 1.331
  • Reputation Power: 0
  • Паганель has no influence.
  • Пол: Мужской
Re: Работа с классификацией в системе
« Ответ #18 : Сентябрь 27, 2010, 12:03:16 pm »
Небольшой примерчик использования BAPI_OBJCL_CHANGE
и ФМ для получения уровня партии и таблиц VB_BATCH_DEFINITION.

Оформлен как FORM fill_classifications, на вход передаются 2 структуры (данные позиции материала, в т.ч. партия и материал, и данные значений признаков).


" Значения признаков
DATA: BEGIN OF items.
  DATA: dhsdat  TYPE string.
  DATA: lifnr type lifnr.
DATA: END OF items.

DATA: gt_mseg TYPE STANDARD TABLE OF mseg WITH HEADER LINE.

DATA: l_mseg type mseg.


START-OF-SELECTION.

items-dhsdat = '01.10.2010'.

SELECT * FROM mseg
INTO CORRESPONDING FIELDS OF TABLE gt_mseg
WHERE mblnr = '4900000591'


LOOP AT gt_mseg INTO ls_mseg.
    PERFORM fill_classifications USING ls_mseg  items.
ENDLOOP.


FORM do_fill_classifications
  USING rs_mseg LIKE mseg
        rs_items type items.

DATA: git_bapi1003 TYPE TABLE OF bapi1003_alloc_values_num,
      git_values_char TYPE TABLE OF bapi1003_alloc_values_char,
      git_values_curr TYPE TABLE OF bapi1003_alloc_values_curr,
      git_bapiret2    TYPE TABLE OF bapiret2,
      ls_bapiret2           TYPE bapiret2.

DATA: gs_bapi1003     TYPE bapi1003_alloc_values_num,
      gs_values_char  TYPE bapi1003_alloc_values_char,
      gs_values_curr  TYPE bapi1003_alloc_values_char,
      gc_flag_x(1)       TYPE c VALUE 'X'.

DATA: l_objectkey TYPE bapi1003_key-object.

* CHARACT  Имя признака
* VALUE_CHAR  Значение признака
* VALUE_NEUTRAL  Значение признака
* CHARACT_DESCR  Название признака

" Определяем уровень партии (тр. OMCT) spro- Общая логистика - Управление партиями - Уровень партии
" 0 - Партии однозначно ведутся на уровне завода - MCHA
" 1 - Партия однозначно ведется на уровне материала - MCH1
" 2 - Партия однозначно ведется на уровне манданта - MCH1

" KZDCH Уровень TCUCH-KZDCH
" KLART Класс TCLA-KLART
" OBTAB Таблица TCLT-OBTAB

DATA: l_objecttable  TYPE bapi1003_key-objecttable. " OBTAB  Таблица TCLT-OBTAB
DATA: gv_batch_level LIKE tcuch-kzdch.         "Batch-Level
DATA: classtype TYPE tcla-klart.

CALL FUNCTION 'VB_BATCH_DEFINITION'
        IMPORTING
          kzdch = gv_batch_level
          klart = classtype
          obtab = l_objecttable.

 CASE gv_batch_level.
  WHEN 0.
    "l_objecttable = 'MCHA'.
    ext_to_int:     rs_mseg-matnr l_objectkey(18),
                    rs_mseg-werks l_objectkey+18(4),
                    rs_mseg-charg l_objectkey+18(10).

  WHEN 1.
      "l_objecttable = 'MCH1'.
      ext_to_int:      rs_mseg-matnr l_objectkey(18),
                       rs_mseg-charg l_objectkey+18(10).

  WHEN 2.
      "l_objecttable = 'MCH1'.
      ext_to_int: rs_mseg-charg l_objectkey+18.
 ENDCASE.


 REFRESH git_values_char.

  gs_values_char-charact = 'ZMM_BATH_DHSDAT'.
  gs_values_char-value_neutral = rs_items-dhsdat.
  APPEND gs_values_char TO git_values_char.

  gs_values_char-charact = 'ZMM_LIFNR'.
  gs_values_char-value_neutral = rs_items-lifnr.
  APPEND gs_values_char TO git_values_char.


 APPEND gs_values_char TO git_values_char.

CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
    objectkey                = l_objectkey
    objecttable              = l_objecttable  " MCHA или  MCH1
    classnum                 = 'ZMM_BATCH_SEARCH'  "Class Number
    classtype                =  classtype         " 022, 023
*   STATUS                   = '1'
*   STANDARDCLASS         =
*   CHANGENUMBER           =
*   KEYDATE                    = SY-DATUM
*   NO_DEFAULT_VALUES   = ' '
* IMPORTING
*   CLASSIF_STATUS       =
  TABLES
    allocvaluesnumnew       = git_bapi1003
    allocvaluescharnew      = git_values_char
    allocvaluescurrnew      = git_values_curr
    return                  = git_bapiret2.

IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
 EXPORTING
   wait          = 'X'
 IMPORTING
   return        = ls_bapiret2.


ENDFORM.                    " DO_CHANGE_CHARACTERISIC
« Последнее редактирование: Сентябрь 27, 2010, 12:08:21 pm от Паганель »


 


Facebook Comments