Создание партий партий при 309 ВД

Автор Паганель, Грудень 08, 2009, 08:19:24 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Паганель

Тут вопрос увидел  ;), а как раз недавно делал тоже самое, немного помучился, и не смог вспомнить как же делал, пришлось лезть в систему и смотреть как же я извращался, оказалось все просто.
В двух словах (весь код приводить не буду), есть табличка с заполнеными данными (материал, к-во, склад, завод), если необходимо новая партия, просто создаем ее и заполняем поле move_batch в табличке типа BAPI2017_GM_ITEM_CREATE

*&---------------------------------------------------------------------*
*&      Form  post_data
*&---------------------------------------------------------------------*
*       Проводка движений
*----------------------------------------------------------------------*
FORM post_data .
 DATA: npos, cntpos               TYPE i.
 DATA: ls_zgoodsmvt_item1 LIKE LINE OF zgoodsmvt_item1.

 cntpos = 300.

 CLEAR zgoodsmvt_header.
 CLEAR zgoodsmvt_item1.
 "REFRESH zgoodsmvt_item.
 CLEAR zgoodsmvt_headret.

 REFRESH bapiret.
 REFRESH bapiret2.

 zgoodsmvt_header-ref_doc_no = p_xblnr.
 zgoodsmvt_header-pstng_date = p_budat.
 zgoodsmvt_header-doc_date   = p_budat.
 zgoodsmvt_header-header_txt = 'Производство'.

 zgoodsmvt_code =  '04'.
 npos = 0.
 "mblnr = mblnr + 1.

 LOOP AT zgoodsmvt_item INTO ls_zgoodsmvt_item1 WHERE move_type = '311' OR move_type = '309'.
   npos = npos + 1.
   IF npos > cntpos.
     IF zgoodsmvt_item1[] IS NOT INITIAL.
       CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
       EXPORTING
         goodsmvt_header  = zgoodsmvt_header
         goodsmvt_code    = zgoodsmvt_code
       IMPORTING
         goodsmvt_headret = zgoodsmvt_headret
       TABLES
         goodsmvt_item    = zgoodsmvt_item1
         return           = bapiret2.

       CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
       EXPORTING
         wait = 'X'.

       IF zgoodsmvt_headret IS NOT INITIAL.
         APPEND zgoodsmvt_headret TO docheader.
       ENDIF.

       CLEAR zgoodsmvt_header.
       CLEAR zgoodsmvt_item1.
     ENDIF.
   ENDIF.

   IF cr_nbth EQ 'X'. " Создание новых партий для 309 ВД  " <<<<<< ТУТ

     PERFORM create_new_batch CHANGING ls_zgoodsmvt_item1.
   ENDIF.

   MOVE-CORRESPONDING ls_zgoodsmvt_item1 TO zgoodsmvt_item1.

   APPEND zgoodsmvt_item1.
 ENDLOOP.

 IF zgoodsmvt_item1[] IS NOT INITIAL.
   CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
   EXPORTING
     goodsmvt_header  = zgoodsmvt_header
     goodsmvt_code    = zgoodsmvt_code
   IMPORTING
     goodsmvt_headret = zgoodsmvt_headret
   TABLES
     goodsmvt_item    = zgoodsmvt_item1
     return           = bapiret2.

   CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
   EXPORTING
     wait = 'X'.

   IF zgoodsmvt_headret IS NOT INITIAL.
     APPEND zgoodsmvt_headret TO docheader.
   ENDIF.

   CLEAR zgoodsmvt_header.
   CLEAR zgoodsmvt_item1.
 ENDIF.

 IF bapiret2[] IS NOT INITIAL.
   LOOP AT bapiret2 .
     APPEND bapiret2 TO bapiret.
   ENDLOOP.
 ENDIF.

ENDFORM.                    " post_data



FORM create_new_batch
   CHANGING rs_zgoodsmvt_item LIKE LINE OF zgoodsmvt_item1.

   DATA: zclass TYPE klah-class.

   DATA: zlgort TYPE mchb-lgort.

   DATA: gt_mcha TYPE STANDARD TABLE OF  mcha.

   DATA: gt_mchb TYPE STANDARD TABLE OF  mchb.

   DATA: ls_mcha   LIKE mcha.
   DATA: xbncom TYPE bncom.

*    SELECT SINGLE * INTO ls_mcha FROM mcha WHERE charg = wa_xmseg-charg AND
*           matnr = wa_xmseg-matnr AND werks = wa_xmseg-werks.

   IF rs_zgoodsmvt_item-move_type EQ '309'.
     ls_mcha-matnr = rs_zgoodsmvt_item-move_mat.
     ls_mcha-werks = rs_zgoodsmvt_item-move_plant.
   ELSE.
     ls_mcha-matnr = rs_zgoodsmvt_item-material.
     ls_mcha-werks = rs_zgoodsmvt_item-plant.
   ENDIF.

   "ls_mcha-lgort = rs_zgoodsmvt_item-move_stloc.
   "ls_mcha-charg = batch_num.

   " ls_mcha-hsdat = p_budat.  см. Описание в начале

   " '*'. " Автоматичесская
   " '-'. " Без партий

    PERFORM check_use_batch
       USING    ls_mcha-matnr
       CHANGING rs_zgoodsmvt_item-move_batch.


   IF rs_zgoodsmvt_item-move_batch EQ '*'.

       PERFORM get_class CHANGING zclass.

       CALL FUNCTION 'VB_CREATE_BATCH'
       EXPORTING
         ymcha            = ls_mcha
         new_lgort        = rs_zgoodsmvt_item-move_stloc
         bypass_lock      = space
         x_bncom          = xbncom
         ref_matnr        = space
         ref_charg        = space
         kzcla            =  '1'  "ls_tco43-kzcla - возможность класификации, упростил см LCOKO1F81 там выбор по транзакции и профилю производству
         xkcfc            =  'X'  " ls_tco43-xkcfc
*          class            = 'BATCH'
*          class            =  'Z_BATCH'
         class            =  zclass
         no_change_of_bwtar = space "'X' "space "space " yx'X'
       IMPORTING
         ymcha            = ls_mcha
       TABLES
         new_batch        = gt_mcha
         new_batch_stoloc = gt_mchb
       EXCEPTIONS
           no_material                  = 1
           no_batch                     = 2
           no_plant                     = 3
           material_not_found           = 4
           plant_not_found              = 5
           stoloc_not_found             = 6
           lock_on_material             = 7
           lock_on_plant                = 8
           lock_on_batch                = 9
           lock_system_error            = 10
           no_authority                 = 11
           batch_exist                  = 12
           stoloc_exist                 = 13
           illegal_batch_number         = 14
           no_batch_handling            = 15
           no_valuation_area            = 16
           valuation_type_not_found     = 17
           no_valuation_found           = 18
           error_automatic_batch_number = 19
           cancelled                    = 20
           wrong_status                 = 21
           interval_not_found           = 22
           number_range_not_extern      = 23
           object_not_found             = 24
           error_check_batch_number     = 25
           no_external_number           = 26
           no_customer_number           = 27
           no_class                     = 28
           error_in_classification      = 29
           inconsistency_in_key         = 30
           OTHERS                       = 31.
         IF sy-subrc <> 0.
           MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
         ENDIF.

        rs_zgoodsmvt_item-move_batch = ls_mcha-charg.
        rs_zgoodsmvt_item-move_val_type = ls_mcha-bwtar.
   ELSE.
       CONCATENATE 'Материал' ls_mcha-matnr 'не ведется по партиям, партия не создавалась' INTO ls_alvmessage-name SEPARATED BY space.
       ls_alvmessage-type = 'S'.
       APPEND ls_alvmessage TO gt_alvmessage.
   ENDIF.

ENDFORM.                    " create_new_batch


Думаю все понятно, если чего не ясно - спрашивайте.