Доп. аналитика в давальческой схеме.
Тема обсуждалась тут:
viewtopic.php?t=304701.Неоднократно возникает вопрос как в давальческую схему добавить свои аналитические признаки. Например, нужно вести давальческий запас на отдельном счете, по партиям с раздельной оценкой, чтобы не было усреднения цены. Или, например, запас для капитального строительства лежит в запасе проекта, в разрезе других объектов учета, и нужно протянуть эти признаки в запас подрядчика, но стандарт не позволяет.
Мы использовали для этих целей партийный учет. В партии много стандартных полей. Например, поле Вид Оценки сразу решает проблему с раздельной оценкой на отдельном балансовом счете. Можно создать пользовательские поля и указать свой объект учета, например, объект строительства. Можно завести классификацию партии и там указать нужные признаки.
Таким образом, нам необходимо создать новую партию у давальца. В поставке SD это принимающая партия. Принимающую партию можно создавать и указывать автоматически при создании поставки.
Итак, транзакция ME2O, программа RM06ELLB. Найдем вот такой код в подпрограмме «CREATE_DELIVERY»:
Code:
FORM CREATE_DELIVERY.
CALL FUNCTION 'GN_DELIVERY_CREATE'
EXPORTING
vbsk_i = vbsk
vbls_pos_rueck = 'X'
no_commit = 'X'
if_no_deque = 'X' "641451
TABLES
xkomdlgn = xkomdlgn
xvbfs = xvbfs
xvbls = xvbls
EXCEPTIONS
OTHERS = 1.
Видим внутреннюю таблицу с позициями поставки «XKOMDLGN». Внутри есть отпускающий материал, завод, склад, партия и т.д. Есть поля принимающего материала, завода, склада, партии. Перед вызовом этого ФМ заполним поле принимающая партия своими данными, и задача решена:
Code:
FORM CREATE_DELIVERY.
LOOP AT xkomdlgn.
CALL METHOD zcl_batch->bapi_bwtar_create. “схематично для примера
CALL METHOD zcl_batch->bapi_batch_create. “схематично для примера
xkomdlgn-ummat = xkomdlgn-matnr.
xkomdlgn-umwrk = xkomdlgn-werks.
xkomdlgn-umlgo = xkomdlgn-lgort.
xkomdlgn-umbar = z_bwtar.
xkomdlgn-umcha = z_charg.
xkomdlgn-umsok = 'O'.
MODIFY xkomdlgn.
ENDLOOP. “ xkomdlgn
CALL FUNCTION 'GN_DELIVERY_CREATE'…
2. Мы пошли дальше – указываем в поставке отпускающую партию проекта, СПП, так как нам нужно отпустить запас с проекта PS, заказ мм (там номер контракта), позицию заказа (там контировка). То есть, и в документах и в запасе – везде есть аналитика.
Некоторые подробности типа создания партии на складе опустим. Делаем следующим образом. СПП и экран выбора партии проекта:
найти код:
Code:
FORM CREATE_DELIVERY.
LOOP AT xkomdlgn.
h_tabix = sy-tabix.
Добавить код:
Code:
FORM CREATE_DELIVERY.
LOOP AT xkomdlgn.
h_tabix = sy-tabix.
…
*“CALL SCREEN 0100 STARTING AT 30 05
*“ ENDING AT 70 17.
CALL SCREEN 0101 STARTING AT 30 05
ENDING AT 70 17.
xkomdlgn-ps_psp_pnr = z_ps_psp_pnr.
xkomdlgn-lgort = z_lgort.
…
MODIFY xkomdlgn.
ENDLOOP. “ xkomdlgn
DELETE xkomdlgn WHERE lfimg EQ 0.
Заказ ММ и позицию заказа прописываем вместе с партией в поставку:
найти код -
Code:
FORM CREATE_DELIVERY.
CALL FUNCTION 'GN_DELIVERY_CREATE'…
вставить перед ним код:
Code:
FORM CREATE_DELIVERY.
LOOP AT xkomdlgn.
CALL METHOD zcl_batch->bapi_bwtar_create. “схематично
CALL METHOD zcl_batch->bapi_batch_create. “схематично
xkomdlgn-ummat = xkomdlgn-matnr.
xkomdlgn-umwrk = xkomdlgn-werks.
xkomdlgn-umlgo = xkomdlgn-lgort.
xkomdlgn-umbar = z_bwtar.
xkomdlgn-umcha = z_charg.
xkomdlgn-umsok = 'O'.
xkomdlgn-vbelv = z_ebeln.
xkomdlgn-posnv = z_ebelp.
*”xkomdlgn-ps_psp_pnr = z_ps_psp_pnr. “ так не получается
MODIFY xkomdlgn.
ENDLOOP. “ xkomdlgn
CALL FUNCTION 'GN_DELIVERY_CREATE'…
Проводка отпуска. Перенос запаса проекта на обычный тут:
находим код:
Code:
FORM FV50WF0W.
…
********* Localization Brazil ***********************
* Transfer with transfer order
* IF LIKP-VBTYP EQ VBTYP_LINO AND NOT LIKP-WERKS IS INITIAL
* AND TVLK-AUFER EQ CHARB.
* perform j_1b_im_tf_assign_txcd tables imseg
* xlips
* using likp-vkorg
* tvko.
* ENDIF.
**********End of Localization Brazil*****************
вставляем код:
**********End of Localization Brazil*****************
Code:
PERFORM z_bapi_mb1b_411q USING likp
xlips
imkpf.
LOOP AT imseg.
IF imseg-called_by CS 'VL02N'
AND ( imseg-bwart = '541' OR imseg-bwart = '941' )
AND imseg-kzbew = 'L'.
*” чтобы проводка прошла - иначе ERROR!
imseg-ps_psp_pnr = ''.
MODIFY imseg.
ENDIF. "imseg.
ENDLOOP.
После переноса уже обычный запас отпускается подрядчику стандартным образом.
Сторно отпуска:
находим код:
Code:
CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
EXPORTING
i_vbeln = xlikpukwa-vbeln
i_budat = xlikpukwa-stdat
i_count = count
i_mblnr = xlikpukwa-mblnr
i_tcode = 'VL09'
i_vbtyp = xlikpukwa-vbtyp
TABLES
t_mesg = xmesg
EXCEPTIONS
error_reverse_goods_issue = 1
OTHERS = 2.
вставляем код:
Code:
CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE'
EXPORTING
i_vbeln = xlikpukwa-vbeln
i_budat = xlikpukwa-stdat
i_count = count
i_mblnr = xlikpukwa-mblnr
i_tcode = 'VL09'
i_vbtyp = xlikpukwa-vbtyp
TABLES
t_mesg = xmesg
EXCEPTIONS
error_reverse_goods_issue = 1
OTHERS = 2.
*END-ENHANCEMENT-SECTION.
*... Fehlermeldungen? - Dann Fehlertabelle (TMESG) aufbauen
IF NOT sy-subrc IS INITIAL.
MOVE charx TO storno_not_ok.
ENDIF.
*... Alles gut gelaufen? - Dann sichern!
IF sy-subrc IS INITIAL.
COMMIT WORK AND WAIT. "*--lфuft hier extern
*ENHANCEMENT-POINT rvv50l09_02 SPOTS es_rvv50l09.
*** start of usercode
*** ЗЮ NPZ 2006-11-08
*** перенос запаса (СвИсп) -> (Q ЗпсПроекта)
*** при сторно ДвлПоставки 542 вдв
PERFORM z_cancel_411 USING xlikpukwa-stdat likp.
*** end of usercode
3. Дальше еще интереснее – нужно переписать интерфейс так, как удобно пользователю. Нашел вот такой BAPI – «BAPI_OUTB_DELIVERY_CREATENOREF» - он не подходит для создания двл. поставки.
Здесь учитываем, что главная изюминка транзакции ME2O – это опять же наш ФМ «GN_DELIVERY_CREATE» , все остальное это, грубо говоря, интерфейс. ФМ оставляем, интерфейс меняем. Теперь у нас выводится список запасов по критериям с селекционного экрана, количество выданного и требуемого запаса с нужной аналитикой, ставятся галочки напротив и создается поставка. Кода много, весь не показать, извините.