计划订单转采购申请

程序包含INCLUDE  使用------------------------------------------隔开

*&---------------------------------------------------------------------*
*& Report ZMMR012
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr105.
TABLES: rm61h, ekko, marc, plaf, ioitem, mara.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_werks TYPE rm61h-werks OBLIGATORY DEFAULT '3100'.
SELECT-OPTIONS: s_dispo FOR rm61h-dispo,
                s_matnr FOR rm61h-matnr,
                s_ekgrp FOR marc-ekgrp,
                s_fevor FOR marc-fevor,
                s_mtart FOR mara-mtart,
                s_matkl FOR mara-matkl,
                s_kdauf FOR ioitem-kdauf MATCHCODE OBJECT vmva,
                s_kdpos FOR ioitem-kdpos.

PARAMETERS: p_sdatv TYPE rm61p-sdatv,
            p_pertr TYPE rm61p-pertr,

            p_beskz TYPE rm61p-beskz DEFAULT 'F' OBLIGATORY,
            p_fixkz TYPE rm61p-fixkz DEFAULT 'X' AS CHECKBOX,
            p_kzzuo TYPE rm61p-kzzuo DEFAULT 'X' AS CHECKBOX.

SELECT-OPTIONS: s_mbeskz FOR marc-beskz NO-EXTENSION NO INTERVALS DEFAULT 'F' " OBLIGATORY,
                s_msobsl FOR marc-sobsl NO-EXTENSION NO INTERVALS.

SELECTION-SCREEN END OF BLOCK blk1.

INCLUDE zppr105top.
INCLUDE zppr105f01.

INITIALIZATION.
  PERFORM frm_init_fcat.

AT SELECTION-SCREEN.
   PERFORM FRM_JURISD.     " 权限检查

START-OF-SELECTION.
  PERFORM frm_get_data.

END-OF-SELECTION.
  PERFORM frm_show_data.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

*&---------------------------------------------------------------------*
*&  包含                ZPPR105TOP
*&---------------------------------------------------------------------*

CONSTANTS: cv_vpauft(4TYPE VALUE 'VP  '.   "Vorplanungsauftrag

TYPESBEGIN OF tp_output.
    INCLUDE STRUCTURE plaf.
TYPES: box        TYPE xfeld,
       lock       TYPE xfeld,
       lockusr    TYPE sy-msgv1,
       fixkz      TYPE mdba-fixkz,
*       zzbednr    TYPE mdba-zzbednr,
       ekgrp      TYPE marc-ekgrp,
       fevor      TYPE marc-fevor,
       mtart      TYPE mara-mtart,
       matkl      TYPE mara-matkl,
       maktx      TYPE makt-maktx,
       mbeskz     TYPE marc-beskz,
       msobsl     TYPE marc-sobsl,
       wrkst     TYPE mara-wrkst,
       zcpgg     TYPE mara-zcpgg,
       aufnr_t    TYPE string,
       cy_seqnr_t TYPE string,
       zhhbz      TYPE eban-zhhbz,
       rcol       TYPE char4,     " 颜色
       fstyle     TYPE lvc_t_styl,
       msg        TYPE char100.
TYPESEND OF tp_output.

TYPESBEGIN OF tp_material,
         matnr TYPE marc-matnr,
         fevor TYPE marc-fevor,
         ekgrp TYPE marc-ekgrp,
         mtart TYPE mara-mtart,
         matkl TYPE mara-matkl,
         maktx TYPE makt-maktx,
         beskz TYPE marc-beskz,
         sobsl TYPE marc-sobsl,
         wrkst TYPE mara-wrkst,
         zcpgg TYPE mara-zcpgg,
       END OF tp_material.

DATA: gt_fcat TYPE lvc_t_fcat,
      gs_layo TYPE lvc_s_layo.

DATA: gt_output TYPE STANDARD TABLE OF tp_output.

DATA: gcl_alv_grid  TYPE REF TO cl_gui_alv_grid.
DATA: gs_stbl       TYPE lvc_s_stbl.                "ALV 控制:刷新稳定性

DATA: rs_selfield TYPE slis_selfield.

DATA: i_grid_settings TYPE lvc_s_glay .
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

*&---------------------------------------------------------------------*
*&  包含                ZPPR105F01
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*& Form FRM_INIT_FCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_init_fcat .
  DATA: ls_fcat TYPE lvc_s_fcat.
  gs_layo-zebra 'X'.
*  gs_layo-cwidth_opt = 'X'.
  gs_layo-no_merging 'X'.
  gs_layo-box_fname 'BOX'.
  gs_layo-info_fname 'RCOL'.
  gs_layo-stylefname 'FSTYLE'.

  DEFINE mro_fcat.
    CLEAR: ls_fcat.
    ls_fcat-fieldname = &1.
    ls_fcat-coltext = &2.
    ls_fcat-scrtext_l = &2.
    ls_fcat-scrtext_m = &2.
    ls_fcat-scrtext_s = &2.
    ls_fcat-DD_OUTLEN = &4.
    ls_fcat-no_zero 'X'.
    TRANSLATE ls_fcat-fieldname TO UPPER CASE.
    IF &3 NE space.
      ls_fcat-ref_table = &3.
      TRANSLATE ls_fcat-ref_table TO UPPER CASE.
      IF &1 EQ 'mbeskz'.
        ls_fcat-ref_field 'BESKZ'.
      ELSEIF &1 EQ 'msobsl'.
        ls_fcat-ref_field 'SOBSL'.
      ELSE.
        ls_fcat-ref_field = ls_fcat-fieldname.
      ENDIF.
    ENDIF.
    IF &1 EQ 'fixkz' OR &1 EQ 'pertr' OR &1 EQ 'psttr' OR &1 EQ 'pedtr' OR  &1 EQ 'gsmng' OR &1 EQ 'zhhbz'.
      ls_fcat-edit 'X'.
    ENDIF.
    IF &1 EQ 'fixkz'.
      ls_fcat-checkbox 'X'.
    ENDIF.
    IF &1 EQ 'aufnr_t' OR &1 EQ 'cy_seqnr_t'.
      ls_fcat-outputlen 20 .
    ENDIF .
    IF  &1 NE 'aufnr_t' AND &1 NE 'cy_seqnr_t'.
      ls_fcat-col_opt 'X' .
    ENDIF .
    APPEND ls_fcat TO gt_fcat.
  END-OF-DEFINITION.

  mro_fcat 'matnr' '物料编码' 'plaf' ''.
  mro_fcat 'maktx' '物料描述' space ''.

  mro_fcat 'wrkst' '基本物料' space ''.
  mro_fcat 'zcpgg' '产品规格' space ''.

  mro_fcat 'dispo' 'MRP控制者' 'plaf' ''.
  mro_fcat 'pertr' '期初日期' 'plaf' ''.
  mro_fcat 'psttr' '订单开始' 'plaf' ''.
  mro_fcat 'pedtr' '订单完成' 'plaf' ''.
  mro_fcat 'gsmng' '订货数量' 'plaf' ''.
  mro_fcat 'meins' '单位' 'plaf' ''.

  mro_fcat 'beskz' '采购类型' 'plaf' ''.

  mro_fcat 'fixkz' '采购申请固定' 'mdba' ''.
*  mro_fcat 'zzbednr' '需求跟踪号' 'mdba'.
  mro_fcat 'flief' '固定供应商' 'plaf' ''.

  mro_fcat 'ekgrp' '采购组' 'marc' ''.
  mro_fcat 'fevor' '生产管理员' 'marc' ''.
  mro_fcat 'mtart' '物料类型' 'mara' ''.
  mro_fcat 'matkl' '物料组' 'mara' ''.

  mro_fcat 'plnum' '计划订单' 'plaf' ''.
  mro_fcat 'aufnr_t' '来源工单' '' ''.
  mro_fcat 'cy_seqnr_t' '优先级' '' ''.
  mro_fcat 'paart' '订单类型' 'plaf' ''.
  mro_fcat 'knttp' '科目分配类' 'plaf' ''.
  mro_fcat 'kdauf' '销售订单' 'plaf' ''.
  mro_fcat 'kdpos' '项目' 'plaf' ''.
  mro_fcat 'kdein' '计划行' 'plaf' ''.

  mro_fcat 'mbeskz' '物料主数据采购类型' 'marc' ''.
  mro_fcat 'msobsl' '物料主数据特殊采购类' 'marc' ''.
  mro_fcat 'zhhbz' '回货备注' '' '100'.
*         mbeskz  TYPE marc-beskz,
*       msobsl  TYPE marc-sobsl,

  mro_fcat 'msg'  '消息' space ''.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  CLEAR: gt_output, gt_output[].
  DATA: ls_output LIKE LINE OF gt_output.
  DATA: lt_plaf TYPE STANDARD TABLE OF plaf,
        ls_plaf LIKE LINE OF lt_plaf.

  DATA: lt_material TYPE STANDARD TABLE OF tp_material,
        ls_material LIKE LINE OF lt_material.

  DATABEGIN OF ls_ekko,
          matnr TYPE ekpo-matnr,
          ebeln TYPE ekpo-ebeln,
          ebelp TYPE ekpo-ebelp,
          lifnr TYPE ekko-lifnr,
        END OF ls_ekko,
        lt_ekko LIKE TABLE OF ls_ekko.

  RANGES: rg_matnr FOR plaf-matnr.
  IF p_pertr IS INITIAL.
    p_pertr '99991231'.
  ENDIF.


  SELECT * FROM plaf INTO CORRESPONDING FIELDS OF TABLE lt_plaf
           WHERE plwrk = p_werks "rm61h-werks
             AND dispo IN s_dispo "= rm61h-dispo
             AND plscn '000'
             AND pertr <= p_pertr "Pruefen Eroeffnungstermin Ende
             AND pertr >= p_sdatv "Pruefen Eroeffnungstermin Anfang
             AND paart NE cv_vpauft
             AND kdauf IN s_kdauf
             AND kdpos IN s_kdpos
             AND matnr IN s_matnr
             AND umskz EQ 'X'.
*             AND beskz EQ p_beskz.


  LOOP AT lt_plaf INTO ls_plaf.
    CHECK rg_matnr IS INITIAL OR ls_plaf-matnr NOT IN rg_matnr.
    rg_matnr-sign 'I'.
    rg_matnr-option 'EQ'.
    rg_matnr-low = ls_plaf-matnr.
    APPEND rg_matnr.
  ENDLOOP.

  DATABEGIN OF ls_resb,
          rsnum    LIKE resb-rsnum,
          rspos    LIKE resb-rspos,
          rsart    LIKE resb-rsart,
          matnr    LIKE resb-matnr,
          werks    LIKE resb-werks,
          bdter    LIKE resb-bdter,
          aufnr    LIKE resb-aufnr,
          cy_seqnr LIKE afko-cy_seqnr,
        END OF ls_resb,
        lt_resb LIKE TABLE OF ls_resb.

  CLEAR: lt_resb[], lt_resb .
  SELECT resb~rsnum
         resb~rspos
         resb~rsart
         resb~matnr
         resb~werks
         resb~bdter
         resb~aufnr         afko
~cy_seqnr    
INTO CORRESPONDING FIELDS OF TABLE lt_resb    
FROM resb    INNER 
JOIN afko ON resb~aufnr = afko~aufnr    
WHERE resb~matnr IN rg_matnr      
AND resb~xloek ''      
AND resb~kzear ''.  

IF rg_matnr[] IS NOT INITIAL.    
SELECT mara~matnr mara~mtart mara~matkl           marc
~fevor marc~ekgrp makt~maktx marc~werks           marc
~beskz marc~sobsl mara~wrkst mara~zcpgg      
INTO CORRESPONDING FIELDS OF TABLE lt_material      
FROM mara INNER JOIN marc        
ON mara~matnr EQ marc~matnr      
LEFT OUTER JOIN makt        
ON mara~matnr EQ makt~matnr       
AND makt~spras EQ sy-langu     
WHERE mara~matnr IN rg_matnr       
AND marc~werks EQ p_werks       
AND marc~ekgrp IN s_ekgrp       
AND marc~fevor IN s_fevor       
AND mara~mtart IN s_mtart       
AND mara~matkl IN s_matkl       
AND marc~beskz IN s_mbeskz       
AND marc~sobsl IN s_msobsl     
ORDER BY mara~matnr ASCENDING.    

SELECT ekpo~matnr ekpo~ebeln ekpo~ebelp ekko~lifnr      
INTO CORRESPONDING FIELDS OF TABLE lt_ekko      
FROM ekpo      INNER 
JOIN ekko ON ekpo~ebeln = ekko~ebeln      
WHERE ekpo~matnr IN rg_matnr .  

ENDIF.  

SORT lt_ekko BY matnr ASCENDING ebeln DESCENDING .  
DELETE ADJACENT DUPLICATES FROM lt_ekko COMPARING matnr ebeln .  




LOOP AT lt_plaf INTO ls_plaf.    
READ TABLE lt_material INTO ls_material WITH KEY matnr = ls_plaf-matnr BINARY SEARCH.    
CHECK sy-subrc 0.    
IF p_beskz EQ 'E' AND ls_plaf-beskz NE 'E' OR p_beskz EQ 'F' AND ls_plaf-beskz NE 'F'.      
CONTINUE.    
ENDIF.    
CLEAR: ls_output.    
MOVE-CORRESPONDING ls_plaf TO ls_output.    ls_output
-ekgrp = ls_material-ekgrp.    ls_output
-fevor = ls_material-fevor.    ls_output
-mtart = ls_material-mtart.    ls_output
-matkl = ls_material-matkl.    ls_output
-maktx = ls_material-maktx.    ls_output
-fixkz = p_fixkz.    ls_output
-mbeskz = ls_material-beskz.    ls_output
-msobsl = ls_material-sobsl.    ls_output
-wrkst = ls_material-wrkst.    ls_output
-zcpgg = ls_material-zcpgg.    

READ TABLE lt_ekko INTO ls_ekko WITH KEY matnr = ls_plaf-matnr .    
IF sy-subrc .      ls_output
-flief = ls_ekko-lifnr .    
ENDIF .    

LOOP AT lt_resb INTO ls_resb WHERE matnr = ls_plaf-matnr                                    
AND bdter <= ls_plaf-pertr .      
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'        
EXPORTING          
input  = ls_resb-aufnr        
IMPORTING          
output = ls_resb-aufnr.      

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'        
EXPORTING          
input  = ls_resb-cy_seqnr        
IMPORTING          
output = ls_resb-cy_seqnr.      ls_output

-aufnr_t    = ls_output-aufnr_t     && '/' && ls_resb-aufnr .      ls_output
-cy_seqnr_t = ls_output-cy_seqnr_t  && '/' && ls_resb-cy_seqnr .      
CLEAR: ls_resb .    
ENDLOOP .    

APPEND ls_output TO gt_output.    
CLEAR: ls_output .  
ENDLOOP.

ENDFORM.


*&---------------------------------------------------------------------*
*& Form FRM_SHOW_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_show_data .  i_grid_settings
-edt_cll_cb 'X' .  
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'    
EXPORTING      i_callback_program       
= sy-repid      i_callback_pf_status_set 
'FRM_SET_STATUS'      i_callback_user_command  
'FRM_USER_COMMAND'      is_layout_lvc            
= gs_layo      it_fieldcat_lvc          
= gt_fcat      i_grid_settings          
= i_grid_settings      i_save                   
'A'    
TABLES      t_outtab                 
= gt_output    
EXCEPTIONS      program_error            
1      
OTHERS                   2.  
IF sy-subrc <> 0.
* Implement suitable error handling here  
ENDIF.
ENDFORM.


FORM frm_set_status USING rt_extab TYPE slis_t_extab.  
SET PF-STATUS 'ZPF_001'.  

DATA: lo_grid TYPE REF TO cl_gui_alv_grid.  
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      e_grid 
= lo_grid.  

CALL METHOD lo_grid->register_edit_event    
EXPORTING      i_event_id 
= cl_gui_alv_grid=>mc_evt_modified.  
IF sy-subrc <> 0.  
ENDIF.

ENDFORM.

FORM frm_user_command USING r_ucomm LIKE sy-ucomm                            rs_selfield 
TYPE slis_selfield.  
IF r_ucomm EQ 'CPL1'.    
PERFORM frm_planord_to_pr.    rs_selfield
-refresh 'X'.  
ENDIF.
ENDFORM.


FORM frm_planord_to_pr.  
DATA: ls_output LIKE LINE OF gt_output,        lv_index  
LIKE sy-tabix.  
DATA: ls_plaf  LIKE plaf,        ls_cm61o 
LIKE cm61o,        ls_mdba  
LIKE mdba.  
DATA: lv_gsmng LIKE plaf-gsmng,        lv_flief 
LIKE plaf-flief,        lv_error 
TYPE xfeld.  
DATA: ls_temp  LIKE ls_output,        ls_style 
TYPE lvc_s_styl.  
DATA:lv_banfn TYPE eban-banfn,       lv_bnfpo 
TYPE eban-bnfpo.  

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'    
IMPORTING      e_grid 
= lr_grid.  
CALL METHOD lr_grid->check_changed_data .  

LOOP AT gt_output INTO ls_output WHERE box EQ 'X' AND rcol NE 'C510'.    lv_index 
= sy-tabix.    
MOVE-CORRESPONDING ls_output TO ls_plaf.    
MOVE-CORRESPONDING ls_output TO ls_temp.    
"------ Steuerparamenter setzen --------------------------    
CLEAR: ls_cm61o, lv_error.
*    ls_cm61o-trtyp = 'V'.             "Change    ls_cm61o
-lockx 'X'.             "Lock planned order
*    ls_cm61o-autho = 'X'.             "Authority check durchfuehren
*    ls_cm61o-stpre = 'VC'.            "Change but no Save
*    ls_cm61o-wtpst = 'X'.             "Wait for time stamp TL: P4DK111222    ls_cm61o
-bapco 'X'.    ls_cm61o
-darkx 'X'.    ls_cm61o
-bapix 'X'.    
CLEAR ls_mdba.
*    ls_mdba-lfdat = ls_output-lfdat.
*    ls_mdba-frgdt = ls_output-frgdt.    ls_mdba
-werks = p_werks"ls_output-werks.    ls_mdba
-dispo = ls_output-dispo.    ls_mdba
-ekgrp = ls_output-ekgrp.    ls_mdba
-lgort = ls_output-lgort.                              "TL 46A
*    ls_mdba-reswk = ls_output-reswk.    ls_mdba
-fixkz = ls_output-fixkz.    ls_mdba
-flief = ls_output-flief.
*    ls_mdba-zzbednr = ls_output-zzbednr.    lv_gsmng 

= ls_plaf-gsmng.
*    lv_flief = ls_plaf-flief.    

CALL FUNCTION 'MD_PLANNED_ORDER_2_REQUISITION'      
EXPORTING        plaf1      
= ls_plaf        mdba1      
= ls_mdba        cm61o      
= ls_cm61o        manyorders 
= space        findsource 
= p_kzzuo      
IMPORTING        plaf2      
= ls_plaf
*       no_next_order = gv_no_next_order      
EXCEPTIONS        error      
1.    
IF sy-subrc NE 0.      
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.      lv_error 
'X'.    
ELSE.      
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'        
EXPORTING          
wait 'X'.    
ENDIF.    

MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno      
INTO ls_output-msg      
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.    

IF ( sy-msgty 'S' AND sy-msgv2 IS NOT INITIAL AND sy-msgv3 IS NOT INITIAL )        
AND ( ls_output-pwwrk '3100' OR  ls_output-pwwrk '3200' ).        
CLEAR:lv_banfn,lv_bnfpo.        lv_banfn 
= sy-msgv2.        lv_bnfpo 
= sy-msgv3.        
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'          
EXPORTING            
input         = lv_banfn         
IMPORTING            
OUTPUT        =  lv_banfn .        

UPDATE eban SET zhhbz = ls_output-zhhbz WHERE banfn = lv_banfn                                                  
AND BNFPO = lv_bnfpo.        
IF sy-subrc 0.            
COMMIT WORK.            
ELSE.              
ROLLBACK WORK.        
ENDIF.    
ENDIF.    

IF ls_plaf-gsmng > OR lv_error 'X'.      ls_output
-rcol 'C610'.      
MOVE-CORRESPONDING ls_plaf TO ls_output.      ls_output
-ekgrp = ls_temp-ekgrp.      ls_output
-fevor = ls_temp-fevor.      ls_output
-mtart = ls_temp-mtart.      ls_output
-matkl = ls_temp-matkl.      ls_output
-maktx = ls_temp-maktx.      ls_output
-fixkz = ls_temp-fixkz.
*      ls_output-zzbednr = ls_temp-zzbednr.    
ELSE.      
" 删除该行      ls_output
-rcol 'C510'.      
CLEAR: ls_output-fstyle, ls_output-fstyle[], ls_style.      ls_style
-style = cl_gui_alv_grid=>mc_style_disabled.      
INSERT ls_style INTO TABLE ls_output-fstyle.    
ENDIF.    
MODIFY gt_output FROM ls_output INDEX lv_index.  
ENDLOOP.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form FRM_JURISD
*&---------------------------------------------------------------------*
*& text 权限检查
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM FRM_JURISD .    "权限检查   
AUTHORITY-CHECK OBJECT 'M_BANF_WRK'     
ID 'WERKS' FIELD P_WERKS     
ID 'ACTVT' DUMMY."FIELD '03'.    
IF SY-SUBRC <> 0.    
MESSAGE E002(ZMM01WITH P_WERKS.    
ENDIF.


ENDFORM.

社会很单纯,复杂的是人
原文地址:https://www.cnblogs.com/coderfarmer/p/14641479.html