Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема начата: Uukrul от Октябрь 03, 2010, 01:33:24 am
-
CLVF_VB_INSERT_CLASSIFICATION - Присвоение классов и значений признаков объектам или как гласит описание к данному ФМ - Система классов: обновление присвоений. Внутренняя функция, ошибок на верх не выдает, максимум может упасть в дамп, если что-то не так ей передадите в параметрах, но зато позволяет залить кучу присвоений классов и значений признаков для кучи объектов, так как в качестве параметров используются таблицы объектов и признаков.
Пример использования для классификации ОЗМ, вид класса 001, если будет какие-то особенности для других классов, так сказать велкам пишите дополнения.
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'.
Вроде как все!
-
Пока не работает, вставляет в табличку KSSK. Потом дамп.
Кстати, а какие ты таблички потом чистил?
-
Пока не работает, вставляет в табличку KSSK. Потом дамп.
Это значит что ты уже один раз вызвал это ФМ с ошибочными параметрами, теперь все.. вызываай для другой записи или как минимум руками чисть таблицу KSSK. Вообще-то так как этот ФМ вставляет данные наиболее быстрым способом и делает минимум проверок, то при его не правильном использовании получите не консистентные данные в базе и как следствие дампы.
PS: А что не работает то? Мой пример работает... это я проверил ::) Так что давай код, а то так долго будешь работает/не работает.
-
Это значит что ты уже один раз вызвал это ФМ с ошибочными параметрами, теперь все.. вызываай для другой записи или как минимум руками чисть таблицу KSSK. Вообще-то так как этот ФМ вставляет данные наиболее быстрым способом и делает минимум проверок, то при его не правильном использовании получите не консистентные данные в базе и как следствие дампы.
PS: А что не работает то? Мой пример работает... это я проверил ::) Так что давай код, а то так долго будешь работает/не работает.
Да вот это и не работает:
"*&---------------------------------------------------------------------*
"*& 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.
-
Ну так классы 022 и 023 они особенные даже в транзакции CL24N для них написана специальная обработка. Так что для 023 класса вызов должен быть оформлен по другому.
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, ну а дальше вроде все работает... в общем с вас Паганель ящик приличного пива.
-
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.
Сейчас у себя потестирую, отпишусь.
Пиво с меня.
-
Ну сейчас обошлись lsmw на batchInpute (надо бы выложить), пиво по любому с меня (давно уже предлагал).
ФМ конечно быстрее, но стремновато, надо будет хорошо потестить.
Сейчас у себя потестирую, отпишусь.
Пиво с меня.
P.S. Господину Уукрулу респект, это эдинственный пример на весь интернет этой ФМ.