Автор Тема: CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам  (Прочитано 13854 раз)

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 780
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
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'.

Вроде как все!

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

  • Я НЕ ЗАНИМАЮСЬ SAP
  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • https://noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
Пока не работает, вставляет в табличку KSSK. Потом дамп.

Кстати, а какие ты таблички потом чистил?
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 780
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Пока не работает, вставляет в табличку KSSK. Потом дамп.
Это значит что ты уже один раз вызвал это ФМ с ошибочными параметрами, теперь все.. вызываай для другой записи или как минимум руками чисть таблицу KSSK. Вообще-то так как этот ФМ вставляет данные наиболее быстрым способом и делает минимум проверок, то при его не правильном использовании получите не консистентные данные в базе и как следствие дампы.

PS: А что не работает то? Мой пример работает... это я проверил  ::) Так что давай код, а то так долго будешь работает/не работает.
« Последнее редактирование: Октябрь 03, 2010, 01:39:25 pm от Uukrul »

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

  • Я НЕ ЗАНИМАЮСЬ SAP
  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • https://noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
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.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 780
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Ну так классы 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, ну а дальше вроде все работает... в общем с вас Паганель ящик приличного пива.

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

  • Я НЕ ЗАНИМАЮСЬ SAP
  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • https://noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.

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

Пиво с меня.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

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

  • Я НЕ ЗАНИМАЮСЬ SAP
  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • https://noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
You are not allowed to view links. Register or Login
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.

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

Пиво с меня.
P.S. Господину Уукрулу респект, это эдинственный пример на весь интернет этой ФМ.
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login