Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Октябрь 03, 2010, 01:33:24 am

Название: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Uukrul от Октябрь 03, 2010, 01:33:24 am
CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам или как гласит описание к данному ФМ - Система классов: обновление присвоений. Внутренняя функция, ошибок на верх не выдает, максимум может упасть в дамп, если что-то не так ей передадите в параметрах, но зато позволяет залить кучу присвоений классов и значений признаков для кучи объектов, так как в качестве параметров используются таблицы объектов и признаков.

Пример использования для классификации ОЗМ, вид класса 001, если будет какие-то особенности для других классов, так сказать велкам пишите дополнения.
Код: You are not allowed to view links. Register or Login
DATA: BEGIN OF allkssk OCCURS 0.
        INCLUDE STRUCTURE rmclkssk.
DATA: END OF allkssk.
*
DATA: BEGIN OF allausp OCCURS 0.
        INCLUDE STRUCTURE rmclausp.
DATA: END OF allausp.

CLEAR: allkssk[], allausp[].

allkssk-objek = 'E-1100'.
allkssk-klart = '001'.
allkssk-class = 'CL1112'.
* Внутренний номер класса...
SELECT SINGLE clint INTO (allkssk-clint)
FROM klah WHERE klart = '001' AND class = 'CL1112'.
allkssk-mafid = 'O'.
allkssk-zaehl = '1'.
allkssk-adzhl = '0000'.
* Имя таблицы БД объекта к виду класса
SELECT SINGLE obtab INTO (allkssk-obtab)
FROM tcla WHERE klart = '001'.
allkssk-statu = '1'.
allkssk-vbkz  = 'I'.

APPEND allkssk.


allausp-objek = 'E-1100'.
* Внутренний номер признак
SELECT SINGLE atinn INTO (allausp-atinn)
FROM cabn WHERE atnam = 'CH0004'.

allausp-atzhl = '1'.
allausp-klart = '001'.
allausp-mafid = 'O'.
allausp-atwrt = '01'.
allausp-atcod = '1'.
allausp-statu = 'H'.
* Имя таблицы БД объекта к виду класса
SELECT SINGLE obtab INTO (allausp-obtab)
FROM tcla WHERE klart = '001'.

APPEND allausp.

BREAK-POINT.

CALL FUNCTION 'CLVF_VB_INSERT_CLASSIFICATION'
  "IN UPDATE TASK
  EXPORTING
    called_from_cl = 'X'
    table          = 'MARA'
    date_of_change = sy-datum
  TABLES
    kssktab        = allkssk
    ausptab        = allausp.

COMMIT WORK.

И так нас интересуют две таблицы это ALLKSSK - описание присвоения класса к объекту и ALLAUSP - признаки и значения, если признаки не присваиваем то данную таблицу передаем пустой. Все поля таблицы я не описываю, будет только тот минимум который требуется для выполнения операции. И так для присвоение классов:

allkssk-objek = 'E-1100' - В данном случае код материала, а вообще код объекта который классифицируется.
allkssk-klart = '001' - Вид класса
allkssk-class = 'CL1112' - Имя класса
* Внутренний номер класса по его виду и имени
SELECT SINGLE clint INTO (allkssk-clint)
FROM klah WHERE klart = '001' AND class = 'CL1112'.
allkssk-mafid = 'O' - Индикатор что присвоение идет к объекту, тут буква "О", а не ноль.
allkssk-zaehl = '1' - Позиция сортировки, ну если там будет несколько классов к одному объекту.
allkssk-adzhl = '0000' - Внутренний счетчик для архивации. кажется его можно пропустить.
* Имя таблицы БД объекта к виду класса, берется из таблицы описания по виду класса
SELECT SINGLE obtab INTO (allkssk-obtab)
FROM tcla WHERE klart = '001'.
allkssk-statu = '1' - Статус класса 1- активный, 2 - блокирован, 3 - класс не полный
allkssk-vbkz  = 'I' - Индикатор обновления I - Вставка новго класса, U - Обновление присвоения и т.д.


Для присвоение признаков:

allausp-objek = 'E-1100'  - В данном случае код материала, а вообще код объекта который классифицируется.
* Внутренний номер признака по имени из таблицы CABN
SELECT SINGLE atinn INTO (allausp-atinn)
FROM cabn WHERE atnam = 'CH0004'.
allausp-atzhl = '1' - Счетчик характеристик признака, вроде как передаем 1 и фиг с ним.
allausp-klart = '001' - Вид класса
allausp-mafid = 'O' - Индикатор что присвоение идет к объекту, тут буква "О", а не ноль.
allausp-atwrt = '01' - Значение которое присвоим признаку, тут именно код значения, а не текст
allausp-atcod = '1' - Код отношения значений, вроде как при простых признаках 1.
allausp-statu = 'H' - Статус классификации, похоже надо H - при присвоении нового класса и нового значения.
* Имя таблицы БД объекта к виду класса
SELECT SINGLE obtab INTO (allausp-obtab)
FROM tcla WHERE klart = '001'.

Вроде как все!
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Паганель от Октябрь 03, 2010, 12:19:36 pm
Пока не работает, вставляет в табличку KSSK. Потом дамп.

Кстати, а какие ты таблички потом чистил?
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Uukrul от Октябрь 03, 2010, 01:35:00 pm
You are not allowed to view links. Register or Login
Пока не работает, вставляет в табличку KSSK. Потом дамп.
Это значит что ты уже один раз вызвал это ФМ с ошибочными параметрами, теперь все.. вызываай для другой записи или как минимум руками чисть таблицу KSSK. Вообще-то так как этот ФМ вставляет данные наиболее быстрым способом и делает минимум проверок, то при его не правильном использовании получите не консистентные данные в базе и как следствие дампы.

PS: А что не работает то? Мой пример работает... это я проверил  ::) Так что давай код, а то так долго будешь работает/не работает.
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Паганель от Октябрь 03, 2010, 03:50:26 pm
You are not allowed to view links. Register or Login
Это значит что ты уже один раз вызвал это ФМ с ошибочными параметрами, теперь все.. вызываай для другой записи или как минимум руками чисть таблицу KSSK. Вообще-то так как этот ФМ вставляет данные наиболее быстрым способом и делает минимум проверок, то при его не правильном использовании получите не консистентные данные в базе и как следствие дампы.

PS: А что не работает то? Мой пример работает... это я проверил  ::) Так что давай код, а то так долго будешь работает/не работает.

Да вот это и не работает:
Код: You are not allowed to view links. Register or Login
"*&---------------------------------------------------------------------*
"*& Report  ZMM_RPT_ADD_MATNR_CLASSIF
"*&
"*&---------------------------------------------------------------------*
"*&
"*&
"*&---------------------------------------------------------------------*

REPORT  ZMM_RPT_ADD_MATNR_CLASSIF.

DATA: BEGIN OF allkssk OCCURS 0.
        INCLUDE STRUCTURE rmclkssk.
DATA: END OF allkssk.
*
DATA: BEGIN OF allausp OCCURS 0.
        INCLUDE STRUCTURE rmclausp.
DATA: END OF allausp.

PARAMETERS: pa_matnr type mara-matnr.
PARAMETERS: pa_klart type rmclkssk-klart DEFAULT '023'.
PARAMETERS: pa_class type rmclkssk-class DEFAULT 'ZMM_BATCH_SEARCH'.


START-OF-SELECTION.

CLEAR: allkssk[], allausp[].

allkssk-objek = pa_matnr. "'E-1100'.
allkssk-klart = pa_klart. " '023'.
allkssk-class = pa_class. " 'ZMM_BATCH_SEARCH'.

* Внутренний номер класса...
SELECT SINGLE clint INTO (allkssk-clint)
  FROM klah
  WHERE klart = pa_klart  AND class = pa_class.

 allkssk-mafid = 'O'.
 allkssk-zaehl = '10'.
 allkssk-adzhl = '0000'.

* Имя таблицы БД объекта к виду класса
SELECT SINGLE obtab INTO (allkssk-obtab)
    FROM tcla WHERE klart = pa_klart.

allkssk-statu = '1'.
allkssk-vbkz  = 'I'.
allkssk-stdcl = 'X'.

APPEND allkssk.

*allausp-objek = pa_matnr. "'E-1100'.
*
** Внутренний номер признак
*SELECT SINGLE atinn INTO (allausp-atinn)
*  FROM cabn
*  WHERE atnam = 'CH0004'.
*
*allausp-atzhl = '1'.
*allausp-klart = '001'.
*allausp-mafid = 'O'.
*allausp-atwrt = '01'.
*allausp-atcod = '1'.
*allausp-statu = 'H'.
** Имя таблицы БД объекта к виду класса
*SELECT SINGLE obtab INTO (allausp-obtab)
*FROM tcla WHERE klart = '001'.
*
*APPEND allausp.

BREAK-POINT.

CALL FUNCTION 'CLVF_VB_INSERT_CLASSIFICATION'
  "IN UPDATE TASK
  EXPORTING
    called_from_cl = 'X'
    table          = 'MARA'
    date_of_change = sy-datum
    "INSERT_MOD = ''
  TABLES
    kssktab        = allkssk
    ausptab        = allausp.

COMMIT WORK.
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Uukrul от Октябрь 03, 2010, 08:09:16 pm
Ну так классы 022 и 023 они особенные даже в транзакции CL24N для них написана специальная обработка. Так что для 023 класса вызов должен быть оформлен по другому.
Код: You are not allowed to view links. Register or Login
DATA: BEGIN OF allkssk OCCURS 0.
        INCLUDE STRUCTURE rmclkssk.
DATA: END OF allkssk.
*
DATA: BEGIN OF allausp OCCURS 0.
        INCLUDE STRUCTURE rmclausp.
DATA: END OF allausp.

PARAMETERS: pa_matnr TYPE mara-matnr DEFAULT 'E-1100'.
PARAMETERS: pa_klart TYPE rmclkssk-klart DEFAULT '023'.
PARAMETERS: pa_class TYPE rmclkssk-class DEFAULT '023_01'.


START-OF-SELECTION.

  CLEAR: allkssk[], allausp[].

  allkssk-objek = pa_matnr.                                 "'E-1100'.
  allkssk-klart = pa_klart.                                 " '023'.
  allkssk-class = pa_class. " 'ZMM_BATCH_SEARCH'.

* Внутренний номер класса...
  SELECT SINGLE clint INTO (allkssk-clint)
    FROM klah
    WHERE klart = pa_klart  AND class = pa_class.

  allkssk-mafid = 'O'.
  allkssk-zaehl = '1'.
  allkssk-adzhl = '0000'.

* Имя таблицы БД объекта к виду класса
  allkssk-obtab = 'MARA'.

  allkssk-statu = '1'.
  allkssk-vbkz  = 'I'.


  DATA: l_object_id LIKE kssk-objek.
  l_object_id = pa_matnr.
  CALL FUNCTION 'CUOB_GET_NEW_NUMBER'
    EXPORTING
      class_type    = pa_klart
      object_id     = l_object_id
      table         = 'MARA'
    IMPORTING
      object_number = allkssk-cuobj
    EXCEPTIONS
      lock_problem  = 1
      OTHERS        = 2.
  IF sy-subrc <> 0. EXIT. ENDIF.

  APPEND allkssk.

  CALL FUNCTION 'CUOB_COMMIT_WORK'
    EXPORTING
      on_commit = space.

  CALL FUNCTION 'CLVF_VB_INSERT_CLASSIFICATION'
    "IN UPDATE TASK
    EXPORTING
      called_from_cl = 'X'
      table          = 'MARA'
      date_of_change = sy-datum
    TABLES
      kssktab        = allkssk
      ausptab        = allausp.

  COMMIT WORK.
Как видим основная проблема заключается в том, что описание класса то конечно вставляется в привязке к материалу, но на самом деле классифицировать будем то партии?! Вот поэтому надо получить внутренний номер объекта для конфигурации, поле  allkssk-cuobj, причем как видим для класса 023 указываем таблицу не MCHA из описания класса, а таблицу MARA. Далее перед вызовом классификации нужно этот внутренний номер конфигурации тоже сохранить и для этого есть функция CUOB_COMMIT_WORK, ну а дальше вроде все работает... в общем с вас Паганель ящик приличного пива.
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Паганель от Октябрь 03, 2010, 08:33:49 pm
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.

Сейчас у себя потестирую, отпишусь.

Пиво с меня.
Название: Re: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам
Отправлено: Паганель от Октябрь 03, 2010, 08:35:42 pm
You are not allowed to view links. Register or Login
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.

Сейчас у себя потестирую, отпишусь.

Пиво с меня.
P.S. Господину Уукрулу респект, это эдинственный пример на весь интернет этой ФМ.