创建PO详解编程语言

FORM FRM_CREATE_PO  USING    P_POSNR 
                    CHANGING P_EBELN. 
 
  DATA: LV_VENDOR      TYPE LIFNR, 
        LV_ITEM        TYPE EBELP, 
        LV_CONDTYPE(4). 
 
  DATA:          LV_AMOUNT TYPE P DECIMALS 2, 
                 LV_TAX    TYPE P DECIMALS 2 VALUE '1.17', 
                 LV_RATIO  TYPE P DECIMALS 2."公司间加价系数 
 
  CHECK P_EBELN IS INITIAL. 
 
  CLEAR: GS_POHEADER, 
         GS_POHEADERX. 
 
  PERFORM FRM_GET_COMPANY_RATIO(ZSDS0002) USING IT_ZSDT0018-BUKRS CHANGING LV_RATIO. 
 
  PERFORM FRM_CONVERT_VENDOR USING '1001' CHANGING LV_VENDOR. 
 
  GS_POHEADER-VENDOR      = LV_VENDOR. 
  GS_POHEADER-SUPPL_PLNT  = '1001'. 
  GS_POHEADER-DOC_TYPE    = 'ZRTO'. 
  GS_POHEADER-DOC_DATE    = IT_ZSDT0018-DATUM. 
  GS_POHEADER-CREAT_DATE  = SY-DATUM. 
  GS_POHEADER-CREATED_BY  = SY-UNAME. 
  GS_POHEADER-PURCH_ORG   = '8000'. 
  GS_POHEADER-PUR_GROUP   = 'A15'. 
  GS_POHEADER-COMP_CODE   = IT_ZSDT0018-BUKRS. 
  GS_POHEADER-SALES_PERS  = P_POSNR. 
 
  GS_POHEADERX-DOC_TYPE   = 'X'. 
  GS_POHEADERX-DOC_DATE   = 'X'. 
  GS_POHEADERX-CREAT_DATE = 'X'. 
  GS_POHEADERX-CREATED_BY = 'X'. 
  GS_POHEADERX-VENDOR     = 'X'. 
  GS_POHEADERX-PURCH_ORG  = 'X'. 
  GS_POHEADERX-PUR_GROUP  = 'X'. 
  GS_POHEADERX-COMP_CODE  = 'X'. 
  GS_POHEADERX-SALES_PERS = 'X'. 
  GS_POHEADERX-OUR_REF    = 'X'. 
  GS_POHEADERX-SUPPL_PLNT = 'X'. 
 
  CLEAR LV_ITEM. 
 
  REFRESH: GT_POITEM,GT_POITEMX, 
           GT_POCOND,GT_POCONDX. 
 
  REFRESH: GT_POSCHEDULE, 
           GT_POSCHEDULEX. 
 
  LOOP AT ITAB WHERE POSNR = P_POSNR. 
    ADD 10 TO LV_ITEM. 
 
    CLEAR GS_POITEM. 
    GS_POITEM-PO_ITEM     = LV_ITEM. 
    GS_POITEM-MATERIAL    = ITAB-MATNR."Article (商品款号) 
    GS_POITEM-PLANT       = ITAB-WERKS. 
    GS_POITEM-BATCH       = ITAB-CHARG. 
    GS_POITEM-QUANTITY    = ITAB-MENGE. 
    GS_POITEM-STGE_LOC    = '0001'. 
    GS_POITEM-RET_ITEM    = 'X'. 
    GS_POITEM-VAL_TYPE    = ITAB-CHARG. 
    GS_POITEM-TAX_CODE    = 'J1'. 
    APPEND GS_POITEM TO GT_POITEM. 
 
    CLEAR GS_POITEMX. 
    GS_POITEMX-PO_ITEM    = LV_ITEM. 
    GS_POITEMX-MATERIAL   = 'X'. 
    GS_POITEMX-BATCH      = 'X'. 
    GS_POITEMX-STGE_LOC   = 'X'. 
    GS_POITEMX-PLANT      = 'X'. 
    GS_POITEMX-QUANTITY   = 'X'. 
    GS_POITEMX-STGE_LOC   = 'X'. 
    GS_POITEMX-RET_ITEM   = 'X'. 
    GS_POITEMX-VAL_TYPE   = 'X'. 
    GS_POITEMX-TAX_CODE   = 'X'. 
    APPEND GS_POITEMX TO GT_POITEMX. 
 
    CLEAR GS_POSCHEDULE. 
    GS_POSCHEDULE-PO_ITEM = LV_ITEM. 
    GS_POSCHEDULE-SCHED_LINE = 1. 
    GS_POSCHEDULE-DELIVERY_DATE = IT_ZSDT0018-DATUM. 
    APPEND GS_POSCHEDULE TO GT_POSCHEDULE. 
 
    CLEAR GS_POSCHEDULEX. 
    GS_POSCHEDULEX-PO_ITEM = LV_ITEM. 
    GS_POSCHEDULEX-SCHED_LINE = 1. 
    GS_POSCHEDULEX-DELIVERY_DATE = 'X'. 
    APPEND GS_POSCHEDULEX TO GT_POSCHEDULEX. 
 
*   获取物料的成本价 * 加价系数 * 1.17 
    PERFORM FRM_GET_MAT_VALUE(ZSDS0002) USING ITAB-MATNR ITAB-CHARG '1001' LV_RATIO CHANGING LV_AMOUNT. 
**   根据是否有采购信息记录 判断净价的条件类型 
*    PERFORM FRM_CHECK_CONDITION_TYPE(ZSDS0002) USING LV_VENDOR '8000'  ITAB-WERKS ITAB-MATNR CHANGING LV_CONDTYPE. 
    IF ITAB-CHARG+0(1) = 'W' AND LV_AMOUNT IS INITIAL. 
      SELECT SINGLE ZJE FROM ZMMT0121 
        INTO LV_AMOUNT 
        WHERE MATNR = ITAB-MATNR 
          AND CHARG = ITAB-CHARG 
          AND WERKS = ITAB-WERKS. 
 
      IF SY-SUBRC EQ 0. 
*    ---> 定价过程取消税率 1.17 20150426 start 
*        LV_AMOUNT = LV_AMOUNT * LV_TAX. 
*    <--- 定价过程取消税率 1.17 20150426 end 
      ENDIF. 
    ENDIF. 
 
    CLEAR GS_POCOND. 
    GS_POCOND-ITM_NUMBER = LV_ITEM. 
    GS_POCOND-COND_TYPE = 'PB00'. 
    GS_POCOND-COND_VALUE = LV_AMOUNT. 
    GS_POCOND-CURRENCY = 'CNY'. 
    GS_POCOND-CHANGE_ID = 'U'. 
    GS_POCOND-COND_UPDAT = 'X'. 
    APPEND GS_POCOND TO GT_POCOND. 
 
    CLEAR GS_POCONDX. 
    GS_POCONDX-ITM_NUMBER = LV_ITEM. 
    GS_POCONDX-COND_TYPE = 'X'. 
    GS_POCONDX-COND_VALUE = 'X'. 
    GS_POCONDX-CURRENCY = 'X'. 
    GS_POCONDX-CHANGE_ID = 'X'. 
    GS_POCONDX-COND_UPDAT = 'X'. 
    APPEND GS_POCONDX TO GT_POCONDX. 
 
    CLEAR GS_POCOND. 
    GS_POCOND-ITM_NUMBER = LV_ITEM. 
    GS_POCOND-COND_TYPE = 'PBXX'. 
    GS_POCOND-COND_VALUE = LV_AMOUNT. 
    GS_POCOND-CURRENCY = 'CNY'. 
    GS_POCOND-CHANGE_ID = 'U'. 
    GS_POCOND-COND_UPDAT = 'X'. 
    APPEND GS_POCOND TO GT_POCOND. 
 
    CLEAR GS_POCONDX. 
    GS_POCONDX-ITM_NUMBER = LV_ITEM. 
    GS_POCONDX-COND_TYPE = 'X'. 
    GS_POCONDX-COND_VALUE = 'X'. 
    GS_POCONDX-CURRENCY = 'X'. 
    GS_POCONDX-CHANGE_ID = 'X'. 
    GS_POCONDX-COND_UPDAT = 'X'. 
    APPEND GS_POCONDX TO GT_POCONDX. 
  ENDLOOP. 
 
  CALL FUNCTION 'BAPI_PO_CREATE1' 
    EXPORTING 
      POHEADER         = GS_POHEADER 
      POHEADERX        = GS_POHEADERX 
    IMPORTING 
      EXPPURCHASEORDER = GV_EXPPURCHASEORDER 
    TABLES 
      RETURN           = IT_RETURN 
      POITEM           = GT_POITEM 
      POITEMX          = GT_POITEMX 
      POCOND           = GT_POCOND 
      POCONDX          = GT_POCONDX 
      POSCHEDULE       = GT_POSCHEDULE 
      POSCHEDULEX      = GT_POSCHEDULEX. 
 
  LOOP AT IT_RETURN  WHERE TYPE = 'E' OR TYPE = 'A' OR TYPE = 'X'. 
 
  ENDLOOP. 
 
  IF SY-SUBRC EQ 0. 
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 
 
    CLEAR P_EBELN. 
 
    APPEND_MSG_LIST 'E' 'ZSD002' '048' P_POSNR IT_RETURN-MESSAGE  '' ''. 
  ELSE. 
 
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 
      EXPORTING 
        WAIT = 'X'. 
 
    P_EBELN = GV_EXPPURCHASEORDER. 
 
    APPEND_MSG_LIST 'S' 'ZSD002' '047' P_POSNR P_EBELN  '' ''. 
  ENDIF. 
ENDFORM.                    " FRM_CREATE_PO
FORM frm_get_mat_value  USING    p_matnr 
                                 p_charg 
                                 p_werks 
                                 p_ratio 
                        CHANGING p_value. 
 
  DATA : lv_ratio  TYPE p DECIMALS 2,"公司间加价系数 
         lv_value  TYPE p DECIMALS 2,"物料成品价 
         lv_amount TYPE p DECIMALS 5, 
         lv_matnr  TYPE matnr, 
         lv_mtart  TYPE mtart, 
         lv_tax    TYPE p DECIMALS 2 VALUE '1.17'. 
 
  SELECT SINGLE * 
    FROM mbew 
    WHERE matnr = p_matnr 
      AND bwkey = p_werks 
      AND bwtar = p_charg. 
 
  IF mbew-vprsv EQ 'S'. 
    lv_value = mbew-stprs / mbew-peinh. 
  ELSE. 
    lv_value = mbew-verpr / mbew-peinh. 
  ENDIF. 
 
  SELECT SINGLE mtart INTO lv_mtart FROM mara WHERE matnr = p_matnr. 
 
*  IF LV_MTART EQ 'Z006'."辅料. 
*    P_VALUE = LV_VALUE * LV_TAX. 
*  ELSE. 
*    P_VALUE = LV_VALUE * P_RATIO * LV_TAX. 
*  ENDIF. 
 
*    ---> 定价过程取消税率 1.17 20150426 start 
  IF lv_mtart EQ 'Z006'."辅料. 
    p_value = lv_value. 
  ELSE. 
    p_value = lv_value * p_ratio. 
  ENDIF. 
*    <--- 定价过程取消税率 1.17 20150426 end 
ENDFORM.                    " FRM_GET_MAT_VALUE

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/18704.html

(0)
上一篇 2021年7月19日 21:22
下一篇 2021年7月19日 21:22

相关推荐

发表回复

登录后才能评论