SAP BAPI_PRODORD_CREATE创建生产订单

*&---------------------------------------------------------------------*
*& Report ZPPD009
*&---------------------------------------------------------------------*
*& 销售订单批量创建生产订单
*&---------------------------------------------------------------------*
REPORT zppd009.

TABLES: vbak,vbap.

TYPES: BEGIN OF ty_out,
         sel     TYPE char1,
         icon    TYPE icon_d,
         message TYPE bapiret2-message,
         type    TYPE bapiret2-type,
         aufnr   TYPE aufk-aufnr,  "生产订单
         vkorg   TYPE vbak-vkorg,  "销售组织
         vtweg   TYPE vbak-vtweg,  "分销渠道
         spart   TYPE vbak-spart,  "产品组
         auart   TYPE vbak-auart,  "订单类型
         audat   TYPE vbak-audat,  "凭证日期
         vbeln   TYPE vbak-vbeln,  "销售订单
         posnr   TYPE vbap-posnr,  "订单行
         werks   TYPE vbap-werks,  "工厂
         matnr   TYPE vbap-matnr,  "物料编码
         maktx   TYPE maktx,       "物料描述
         kwmeng  TYPE vbap-kwmeng, "总数量
         lfimg   TYPE lips-lfimg, "已交货数量
         psmng1  TYPE afpo-psmng, "在制工单数量
         kalab   TYPE mska-kalab, "可用库存数量
         psmng2  TYPE afpo-psmng, "可制工单数量
         auart2  TYPE aufk-auart, "生产订单类型
         gstrp   TYPE afko-gstrp, "可制工单开始日期
         gltrp   TYPE afko-gltrp, "可制工单结束日期
         verid   TYPE afpo-verid, "生产版本
       END OF ty_out.

DATA: gt_out TYPE TABLE OF ty_out.


* ALV相关的变量
DATA: go_grid     TYPE REF TO cl_gui_alv_grid,
      gs_layout   TYPE lvc_s_layo,
      gt_fieldcat TYPE lvc_t_fcat,
      gs_variant  TYPE disvariant,
      gs_fieldcat LIKE LINE OF gt_fieldcat,
      gt_exclude  TYPE slis_t_extab,
      gv_repid    TYPE syrepid.


SELECT-OPTIONS: s_vkorg FOR vbak-vkorg OBLIGATORY DEFAULT '1100',
                s_vtweg FOR vbak-vtweg,
                s_spart FOR vbak-spart,
                s_auart FOR vbak-auart,
                s_vbeln FOR vbak-vbeln,
                s_matnr FOR vbap-matnr,
                s_audat FOR vbak-audat.


CLASS lcl_event_handle DEFINITION.
  PUBLIC SECTION.
    METHODS:
      handle_f4 FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname es_row_no er_event_data,

      handle_data_changed_finished  FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING e_modified et_good_cells.
ENDCLASS.



CLASS lcl_event_handle IMPLEMENTATION.

  METHOD handle_f4.

    PERFORM frm_onf4_help USING e_fieldname es_row_no er_event_data.

  ENDMETHOD.

  METHOD handle_data_changed_finished.


  ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.
  PERFORM frm_auth_check.
  PERFORM frm_get_data.
  PERFORM frm_display_alv.


*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .

  SELECT a~vkorg,a~vtweg,a~spart,a~audat,a~vbeln,a~auart,
         b~posnr,b~werks,b~matnr,c~maktx,b~kwmeng
    INTO CORRESPONDING FIELDS OF TABLE @gt_out
    FROM vbak AS a
    INNER JOIN vbap AS b
    ON a~vbeln = b~vbeln
    LEFT JOIN makt AS c
    ON b~matnr = c~matnr
   WHERE a~vkorg IN @s_vkorg
    AND a~vtweg IN @s_vtweg
    AND a~spart IN @s_spart
    AND a~auart IN @s_auart
    AND a~vbeln IN @s_vbeln
    AND a~audat IN @s_audat
    AND b~matnr IN @s_matnr
    AND b~absta = 'A'.

  IF gt_out IS NOT INITIAL.
    SELECT vbeln AS vbeln_vl,
           posnr AS posnr_vl,
           lfimg,
           vgbel AS vbeln,
           vgpos AS posnr
      INTO TABLE @DATA(lt_lips)
      FROM lips
      FOR ALL ENTRIES IN @gt_out
    WHERE vgbel = @gt_out-vbeln
      AND posnr = @gt_out-posnr
      AND wbsta = 'C'.

    SORT lt_lips BY vbeln posnr.

    SELECT a~aufnr,a~posnr,psmng,wemng,
           a~kdauf,
           a~kdpos
      INTO TABLE @DATA(lt_afpo)
      FROM afpo AS a
      INNER JOIN aufk AS b
      ON a~aufnr = b~aufnr
      INNER JOIN jest AS c
      ON b~objnr = c~objnr
      FOR ALL ENTRIES IN @gt_out
    WHERE a~kdauf = @gt_out-vbeln
      AND a~kdpos = @gt_out-posnr
      AND c~stat IN ('I0001','I0002','E0002')
      AND c~inact = ''.

    SORT lt_afpo BY kdauf kdpos.

    SELECT matnr,werks,lgort,charg,sobkz,
           vbeln,posnr,kalab
      INTO TABLE @DATA(lt_mska)
      FROM mska
      FOR ALL ENTRIES IN @gt_out
     WHERE vbeln = @gt_out-vbeln
      AND  posnr = @gt_out-posnr.

    SORT lt_mska BY vbeln posnr.


    SELECT matnr,verid,werks,adatu,bdatu,bstmi,bstma,matko
      INTO TABLE @DATA(local_mkal)
      FROM mkal
      FOR ALL ENTRIES IN @gt_out
      WHERE werks = @gt_out-werks
      AND  matnr = @gt_out-matnr
      AND  bdatu GE @sy-datum
      AND  adatu LE @sy-datum
      AND  mksp NE '1'.

    SORT local_mkal BY werks matnr verid.

  ENDIF.

  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).
    READ TABLE lt_lips TRANSPORTING NO FIELDS WITH KEY vbeln = <fs_out>-vbeln
                                                       posnr = <fs_out>-posnr
                                       BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT lt_lips INTO DATA(ls_lips) FROM sy-tabix.
        IF ls_lips-vbeln NE <fs_out>-vbeln
          OR ls_lips-posnr NE <fs_out>-posnr.

          EXIT.
        ENDIF.

        <fs_out>-lfimg = <fs_out>-lfimg + ls_lips-lfimg.  "已交货数量
        CLEAR: ls_lips.
      ENDLOOP.
    ENDIF.
    READ TABLE lt_afpo TRANSPORTING NO FIELDS WITH KEY kdauf = <fs_out>-vbeln
                                                       kdpos = <fs_out>-posnr
                                        BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT lt_afpo INTO DATA(ls_afpo) FROM sy-tabix.
        IF ls_afpo-kdauf NE <fs_out>-vbeln
          OR ls_afpo-kdpos NE <fs_out>-posnr.

          EXIT.
        ENDIF.

        <fs_out>-psmng1 = <fs_out>-psmng1 + ( ls_afpo-psmng - ls_afpo-wemng ). "在制工单数量
        CLEAR: ls_afpo.
      ENDLOOP.
    ENDIF.

    READ TABLE lt_mska TRANSPORTING NO FIELDS WITH KEY vbeln = <fs_out>-vbeln
                                                       posnr = <fs_out>-posnr
                                        BINARY SEARCH.
    IF sy-subrc = 0.
      LOOP AT lt_mska INTO DATA(ls_mska) FROM sy-tabix.
        IF ls_mska-vbeln NE <fs_out>-vbeln
          OR ls_mska-posnr NE <fs_out>-posnr.

          EXIT.
        ENDIF.

        <fs_out>-kalab = <fs_out>-kalab + ls_mska-kalab.                    "可用库存数量
        CLEAR: ls_mska.
      ENDLOOP.
    ENDIF.

* 可制工单数量 = 总数量 - 已交货数量 - 在制工单数量 - 可用库存数量
    <fs_out>-psmng2 = <fs_out>-kwmeng - <fs_out>-lfimg - <fs_out>-psmng1 - <fs_out>-kalab.

    <fs_out>-auart2 = 'ZP40'.
    <fs_out>-gstrp = sy-datum.
    <fs_out>-gltrp = sy-datum.

    READ TABLE local_mkal INTO DATA(ls_mkal) WITH KEY werks = <fs_out>-werks
                                                      matnr = <fs_out>-matnr
                                           BINARY SEARCH.
    IF sy-subrc = 0.
      <fs_out>-verid = ls_mkal-verid.
    ENDIF.
  ENDLOOP.

  DELETE gt_out WHERE psmng2 LE 0.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_display_alv .

  DATA:ls_layout TYPE lvc_s_layo,
       ls_event  TYPE slis_alv_event,
       lt_event  TYPE slis_t_event.

  ls_layout-zebra      = abap_true.
  ls_layout-sel_mode   = 'A'.
* ls_layout-box_fname = 'SEL'.
  ls_layout-cwidth_opt = abap_true.

  PERFORM frm_build_fieldcat.

  ls_event-form = 'FRM_CALLER_EXIT'.
  ls_event-name = 'CALLER_EXIT'.
  APPEND ls_event TO lt_event.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program       = sy-cprog
      i_bypassing_buffer       = abap_true
      i_callback_pf_status_set = 'FRM_PF_STATUS'
      i_callback_user_command  = 'FRM_USER_COMMAND'
      it_events                = lt_event
      is_layout_lvc            = ls_layout
      it_fieldcat_lvc          = gt_fieldcat
    TABLES
      t_outtab                 = gt_out
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_build_fieldcat .

  DEFINE mcr_fieldcat.

    CLEAR gs_fieldcat.

    gs_fieldcat-fieldname  = &1.
    gs_fieldcat-coltext = &2.
    gs_fieldcat-scrtext_s = &2.
    gs_fieldcat-scrtext_l  = &2.
    gs_fieldcat-scrtext_m  = &2.
    gs_fieldcat-key        = &3.
    gs_fieldcat-checkbox   = &4.
    gs_fieldcat-edit       = &5.
    gs_fieldcat-hotspot    = &6.
    gs_fieldcat-ref_table  = &7.
    gs_fieldcat-ref_field  = &8.
    gs_fieldcat-icon       = &9.

    IF gs_fieldcat-fieldname = 'VERID'.
      gs_fieldcat-f4availabl = abap_true.
    ENDIF.

    APPEND gs_fieldcat TO gt_fieldcat.

  END-OF-DEFINITION.

  CLEAR gt_fieldcat.

  mcr_fieldcat 'SEL'         '选择' '' 'X' 'X' '' '' '' ''.
  mcr_fieldcat 'ICON'         '提示灯' '' '' '' '' '' '' ''.
  mcr_fieldcat 'MESSAGE'      '消息' '' '' '' '' 'BAPIRET2' 'MESSAGE' ''.
  mcr_fieldcat 'AUFNR'        '生产订单' '' '' '' '' 'AUFK' 'AUFNR' ''.
  mcr_fieldcat 'VKORG'        '销售组织' '' '' '' '' 'VBAK' 'VKORG' ''.
  mcr_fieldcat 'VTWEG'        '分销渠道' '' '' '' '' 'VBAK' 'VTWEG' ''.
  mcr_fieldcat 'SPART'        '产品组' '' '' '' '' 'VBAK' 'SPART' ''.
  mcr_fieldcat 'AUART'        '订单类型' '' '' '' '' 'VBAK' 'AUART' ''.
  mcr_fieldcat 'AUDAT'        '凭证日期' '' '' '' '' '' '' ''.
  mcr_fieldcat 'VBELN'        '销售订单' '' '' '' '' 'VBAK' 'VBELN' ''.
  mcr_fieldcat 'POSNR'        '订单行' '' '' '' '' 'VBAP' 'POSNR' ''.
  mcr_fieldcat 'WERKS'        '工厂' '' '' '' '' 'VBAP' 'WERKS' ''.
  mcr_fieldcat 'MATNR'        '物料编码' '' '' '' '' 'VBAP' 'MATNR' ''.
  mcr_fieldcat 'MAKTX'        '物料描述' '' '' '' '' 'MAKT' 'MAKTX' ''.
  mcr_fieldcat 'KWMENG'       '总数量' '' '' '' '' '' '' ''.
  mcr_fieldcat 'LFIMG'        '已交货数量' '' '' '' '' '' '' ''.
  mcr_fieldcat 'PSMNG1'       '在制工单数量' '' '' '' '' '' '' ''.

  mcr_fieldcat 'KALAB'        '可用库存数量' '' '' '' '' '' '' ''.
  mcr_fieldcat 'PSMNG2'       '可制工单数量' '' '' 'X' '' 'AFPO' 'PSMNG' ''.
  mcr_fieldcat 'AUART2'       '生产订单类型' '' '' 'X' '' 'AUFK' 'AUART' ''.
  mcr_fieldcat 'GSTRP'        '可制工单开始日期' '' '' 'X' '' 'AFKO' 'GSTRP' ''.
  mcr_fieldcat 'GLTRP'        '可制工单结束日期' '' '' 'X' '' 'AFKO' 'GLTRP' ''.
  mcr_fieldcat 'VERID'        '生产版本' '' '' 'X' '' 'AFPO' 'VERID' ''.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_AUTH_CHECK
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_auth_check .
  SELECT vkorg
    INTO TABLE @DATA(lt_tvko)
    FROM tvko
   WHERE vkorg IN @s_vkorg.

  LOOP AT lt_tvko INTO DATA(ls_tvko).
    AUTHORITY-CHECK OBJECT 'V_VBAK_VKO'
     ID 'VKORG' FIELD ls_tvko-vkorg
     ID 'VTWEG' DUMMY
     ID 'SPART' DUMMY
     ID 'ACTVT' DUMMY.
    IF sy-subrc <> 0.
      MESSAGE s001(00) WITH '缺少销售组织:'ls_tvko-vkorg '的权限' DISPLAY LIKE 'E'.
      LEAVE LIST-PROCESSING.
    ENDIF.
    CLEAR: ls_tvko.
  ENDLOOP.

ENDFORM.


FORM frm_pf_status USING is_extab TYPE slis_t_extab.

  DATA lt_fcode TYPE slis_t_extab.

  SET PF-STATUS 'STANDARD' EXCLUDING lt_fcode.

ENDFORM.

FORM frm_user_command USING iv_ucomm LIKE sy-ucomm
                            is_selfield TYPE slis_selfield. "#EC
  "Grid
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = go_grid.

  go_grid->check_changed_data( ).

  CASE iv_ucomm.
    WHEN 'ZCREATE'.
      PERFORM frm_create.

    WHEN 'ZALL' OR 'ZSAL'.
      PERFORM frm_sel_proc USING iv_ucomm.

  ENDCASE.

  PERFORM frm_alv_refresh USING go_grid.

ENDFORM.

FORM frm_alv_refresh USING lo_alvgrid TYPE REF TO cl_gui_alv_grid.
  DATA:
    ls_stable     TYPE lvc_s_stbl,
    ls_layout     TYPE lvc_s_layo,
    lt_columns    TYPE lvc_t_col,
    lt_index_rows TYPE  lvc_t_row,
    lt_row_no     TYPE  lvc_t_roid.

  ls_stable-row = 'X'.
  ls_stable-col = 'X'.

  CLEAR: lt_columns,ls_layout.

  CALL METHOD lo_alvgrid->get_frontend_layout
    IMPORTING
      es_layout = ls_layout.

  ls_layout-cwidth_opt = 'X'.

  CALL METHOD lo_alvgrid->set_frontend_layout
    EXPORTING
      is_layout = ls_layout.

  CALL METHOD lo_alvgrid->get_selected_columns "获取选择列
    IMPORTING
      et_index_columns = lt_columns.

  CALL METHOD lo_alvgrid->get_selected_rows "获取选择行
    IMPORTING
      et_index_rows = lt_index_rows
      et_row_no     = lt_row_no.

  CALL METHOD lo_alvgrid->refresh_table_display
    EXPORTING
      is_stable      = ls_stable
      i_soft_refresh = 'X'
    EXCEPTIONS
      finished       = 1
      OTHERS         = 2.
*
  CALL METHOD lo_alvgrid->set_selected_columns "设置回刷新前的列
    EXPORTING
      it_col_table = lt_columns.

  CALL METHOD lo_alvgrid->set_selected_rows "设置回刷新前的列
    EXPORTING
      it_index_rows = lt_index_rows
      it_row_no     = lt_row_no.
ENDFORM. " frm_alv_refresh
*&---------------------------------------------------------------------*
*& Form FRM_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_create .
  DATA: ls_orderdata TYPE bapi_pp_order_create,
        ls_return    TYPE bapiret2,
        lv_aufnr     TYPE aufk-aufnr,
        lv_error     TYPE char1,
        ls_log       TYPE zppt0009_log.

  IF line_exists( gt_out[ sel = 'X'] ).

    LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>) WHERE sel = 'X'
                                                     AND aufnr = ''.
      CLEAR:
      ls_orderdata,
      lv_aufnr,
      lv_error,
      ls_return,
      ls_log.

      MOVE-CORRESPONDING <fs_out> TO ls_log.
      ls_log-create_user = sy-uname.
      ls_log-create_date = sy-datum.
      ls_log-create_time = sy-uzeit.


      PERFORM frm_check_data
        CHANGING <fs_out>
                 lv_error.
      IF lv_error = 'X'.

*        ls_log-message = <fs_out>-message.
*        ls_log-type = <fs_out>-type.
*        MODIFY zppt0009_log FROM ls_log.
*        COMMIT WORK.
        CONTINUE.
      ENDIF.


      ls_orderdata-plant = <fs_out>-werks.
      ls_orderdata-material = <fs_out>-matnr.
      ls_orderdata-planning_plant = <fs_out>-werks.
      ls_orderdata-order_type = <fs_out>-auart2.
      ls_orderdata-basic_start_date = <fs_out>-gstrp.
      ls_orderdata-basic_end_date = <fs_out>-gltrp.
      ls_orderdata-quantity = <fs_out>-psmng2.
      ls_orderdata-prod_version = <fs_out>-verid.
      ls_orderdata-sales_order = <fs_out>-vbeln.
      ls_orderdata-sales_order_item = <fs_out>-posnr.

      SET UPDATE TASK LOCAL.

      CALL FUNCTION 'BAPI_PRODORD_CREATE'
        EXPORTING
          orderdata    = ls_orderdata
        IMPORTING
          return       = ls_return
          order_number = lv_aufnr.

      IF ls_return-type CA 'AEX'.
        <fs_out>-icon = icon_red_light.
        <fs_out>-type = 'E'.
        <fs_out>-message = ls_return-message.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      ELSE.
        <fs_out>-icon = icon_green_light.
        <fs_out>-type = 'S'.
        <fs_out>-message = '生产订单创建成功'.
        <fs_out>-aufnr = lv_aufnr.
        ls_log-aufnr = lv_aufnr.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
      ENDIF.

      ls_log-message = <fs_out>-message.
      ls_log-type = <fs_out>-type.
      MODIFY zppt0009_log FROM ls_log.
      COMMIT WORK.
      CONTINUE.

    ENDLOOP.
  ELSE.
    MESSAGE e001(00) WITH '请至少选择一行数据创建'.
  ENDIF.

ENDFORM.


FORM frm_caller_exit USING ls_exit TYPE slis_data_caller_exit.


  DATA:
    lt_f4 TYPE lvc_t_f4,
    ls_f4 TYPE lvc_s_f4.

  IF go_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = go_grid.
  ENDIF.


  go_grid->register_edit_event(
    EXPORTING
      i_event_id =  cl_gui_alv_grid=>mc_evt_enter   " Event ID
    EXCEPTIONS
      error      = 1
      OTHERS     = 2
  ).

  go_grid->register_edit_event(
    EXPORTING
      i_event_id =  cl_gui_alv_grid=>mc_evt_modified   " Event ID
    EXCEPTIONS
      error      = 1
      OTHERS     = 2
  ).


  DATA(lo_event_handle) = NEW lcl_event_handle( ).


  SET HANDLER lo_event_handle->handle_f4 FOR go_grid.
  SET HANDLER lo_event_handle->handle_data_changed_finished FOR go_grid.


  ls_f4-fieldname = 'VERID'.
  ls_f4-register = 'X'.
  ls_f4-getbefore = 'X'.
  ls_f4-chngeafter = 'X'.
  INSERT ls_f4 INTO TABLE lt_f4.

  CALL METHOD go_grid->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.   " F4 Fields

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ONF4_HELP
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_E_FIELDNAME  text
*      -->P_ES_ROW_NO  text
*      -->P_ER_EVENT_DATA  text
*&---------------------------------------------------------------------*
FORM frm_onf4_help USING  e_fieldname
                          es_row_no TYPE lvc_s_roid
                          er_event_data TYPE REF TO cl_alv_event_data.


  DATA: lt_ddshretval TYPE TABLE OF ddshretval.


  CASE e_fieldname.
    WHEN 'VERID'.
      READ TABLE gt_out INTO DATA(ls_out) INDEX es_row_no-row_id.
      IF sy-subrc = 0.
        SELECT verid,text1,matnr,werks,adatu,bdatu,bstmi,bstma
          INTO TABLE @DATA(local_mkal)
           FROM mkal
           WHERE werks = @ls_out-werks
           AND  matnr = @ls_out-matnr
           AND  bdatu GE @ls_out-gstrp
           AND  adatu LE @ls_out-gstrp
           AND  mksp NE '1'
           ORDER BY verid.

        CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
          EXPORTING
            retfield        = 'VERID'
            dynpprog        = sy-repid
            dynpnr          = sy-dynnr
            dynprofield     = 'VERID'
            window_title    = '选择生产版本'
            value_org       = 'S'
          TABLES
            value_tab       = local_mkal
            return_tab      = lt_ddshretval
          EXCEPTIONS
            parameter_error = 1
            no_values_found = 2
            OTHERS          = 3.
        IF sy-subrc = 0.
          LOOP AT  lt_ddshretval INTO DATA(ls_retval).
            CASE ls_retval-retfield.
              WHEN 'VERID'.
                ls_out-verid = ls_retval-fieldval.
            ENDCASE.
          ENDLOOP.
          MODIFY gt_out FROM ls_out INDEX es_row_no-row_id TRANSPORTING verid.
          er_event_data->m_event_handled = 'X'.
        ENDIF.
      ENDIF.
      PERFORM frm_alv_refresh USING go_grid.
  ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      <--P_<FS_OUT>  text
*      <--P_LV_ERROR  text
*&---------------------------------------------------------------------*
FORM frm_check_data  CHANGING ls_out TYPE ty_out
                              lv_error.


  DATA: lv_psmng2 TYPE afpo-psmng.
*  SELECT SINGLE kwmeng
*    INTO ls_out-kwmeng
*    FROM vbap
*  WHERE  vbeln = ls_out-vbeln
*    AND posnr = ls_out-posnr.
*
*  SELECT SUM( lfimg ) INTO ls_out-lfimg
*    FROM lips
*   WHERE vgbel = ls_out-vbeln
*    AND vgpos = ls_out-posnr
*    AND wbsta = 'C'.

* 取在制工单数量实时计算可制工单数量
  SELECT SUM( psmng - wemng ) INTO @ls_out-psmng1
    FROM afpo AS a
    INNER JOIN aufk AS b
    ON a~aufnr = b~aufnr
    INNER JOIN jest AS c
    ON b~objnr = c~objnr
  WHERE a~kdauf = @ls_out-vbeln
    AND a~kdpos = @ls_out-posnr
    AND c~stat IN ('I0001','I0002')
    AND c~inact = ''.

* 可制工单数量 = 总数量 - 已交货数量 - 在制工单数量 - 可用库存数量
  lv_psmng2 = ls_out-kwmeng - ls_out-lfimg - ls_out-psmng1 - ls_out-kalab.

  IF lv_psmng2 LE 0 OR lv_psmng2 < ls_out-psmng2.
    lv_error = 'X'.
    ls_out-type = 'E'.
    ls_out-icon = icon_red_light.
    ls_out-message = |可制工单数量{ lv_psmng2 }不足|.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SEL_PROC
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*      -->P_UCOMM  text
*&---------------------------------------------------------------------*
FORM frm_sel_proc  USING   p_ucomm.


  DATA: lt_fidx TYPE lvc_t_fidx,
        lv_fg   TYPE char1.

  CASE p_ucomm.
    WHEN 'ZALL'.
      lv_fg = abap_true.
    WHEN 'ZSAL'.
      lv_fg = abap_false.
  ENDCASE.

  CALL METHOD go_grid->get_filtered_entries
    IMPORTING
      et_filtered_entries = lt_fidx.

  LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_out>).

    READ TABLE lt_fidx WITH KEY table_line = sy-tabix
        TRANSPORTING NO FIELDS.
    CHECK sy-subrc NE 0.
    <fs_out>-sel = lv_fg.
  ENDLOOP.


ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值