MB11 生鲜项目原料消耗发货功能

Posted Rainystuday

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MB11 生鲜项目原料消耗发货功能相关的知识,希望对你有一定的参考价值。

*&---------------------------------------------------------------------*
*& 程序名:  ZDQFI_925
*&
*&---------------------------------------------------------------------*
*& 抬头     : 生鲜项目原料消耗发货功能                                 *
*& 模块     : FI                                                        *
*& 作者     :                                                           *
*& 创建日期 : 20180301                                                 *
*& 程序类型 : 功能报表                                                 *
*& 消息类   : zmg_fi                                                   *
*& 描述     : 生鲜项目原料消耗发货功能                                 *
*&                                                                     *
*& 修改记录 :                                                          *
*& 日期        修改人           修改内容                               *
*& YYYY/MM/DD  修改人员名       说明                                   *
*&---------------------------------------------------------------------*
REPORT  zdqfi_925 MESSAGE-ID 00.

*&---------------------------------------------------------------------*
*& INCLUDE
*&---------------------------------------------------------------------*
INCLUDE zdqfi_925_top.     "Type/Data
*INCLUDE zxxxxxxxx_class.  "Class
INCLUDE zdqfi_925_selscr.  "Selection screen
INCLUDE zdqfi_925_form.    "Form
*INCLUDE zxxxxxxxx_module.  "Module


*&---------------------------------------------------------------------*
*& 初始化处理
*&---------------------------------------------------------------------*
INITIALIZATION.
*  PERFORM xxxxxxx.

*&---------------------------------------------------------------------*
*& 选择屏幕控制
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
*  PERFORM xxxxxxx.

*&---------------------------------------------------------------------*
*& 参数输入检查
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*  PERFORM xxxxxxx.

*&---------------------------------------------------------------------*
*& 程序开始处理
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM frm_check_run.
  PERFORM frm_get_data.   "取数,过滤数据 逻辑
  PERFORM frm_pro_doc.    "处理数据

*&---------------------------------------------------------------------*
*& 程序结束处理
*&---------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM frm_alv_data.   "alv显示数据
*&---------------------------------------------------------------------*
*&      Form  frm_check_run
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_run .
  DATA:ls_zfit1004 TYPE zfit1004. "加锁配置表.
  DATA:ls_zruning_lock TYPE zruning_lock. "加锁配置表.

  IF p_ccl = X.
    IF sy-batch = X.
      MESSAGE 重处理只能前台手工处理! TYPE S  DISPLAY LIKE E.
      LEAVE LIST-PROCESSING.
    ENDIF.
    SELECT SINGLE * FROM zfit1004 INTO ls_zfit1004 WHERE usnam = sy-uname.
    IF sy-subrc <> 0.
      MESSAGE 请联系产品维护权限! TYPE S  DISPLAY LIKE E.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

  SELECT SINGLE * FROM zruning_lock INTO ls_zruning_lock WHERE zprogram = sy-

repid AND flag = X.
  IF sy-subrc EQ 0.
    DO.
*加锁
      CALL FUNCTION ENQUEUE_EZ_ZRUNING_LOCK
        EXPORTING
          mode_zruning_lock = X
          mandt             = sy-mandt
          zprogram          = sy-repid
          _scope            = 1
        EXCEPTIONS
          foreign_lock      = 1
          system_failure    = 2
          OTHERS            = 3.
      IF sy-subrc = 0.
        EXIT.
      ELSE.
        IF sy-batch = X.
          WAIT UP TO 10 SECONDS.
        ELSE.
          MESSAGE 该程序已有其他用户在运行,请稍候再试! TYPE S  DISPLAY LIKE 

E.
          LEAVE LIST-PROCESSING.
        ENDIF.
      ENDIF.
    ENDDO.
  ELSE.
    MESSAGE 请维护加锁配置表ZRUNING_LOCK! TYPE S  DISPLAY LIKE E.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.                    " frm_check_run
*&---------------------------------------------------------------------*
*&      Form  frm_get_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_data .
  DATA:
    lr_status  TYPE RANGE OF zdestatus01,
    ls_status  LIKE LINE OF lr_status.
  DATA: lt_zfit1048 LIKE TABLE OF zfit1048,
        ls_zfit1048 LIKE zfit1048.
  FIELD-SYMBOLS:
               <lf_alv> LIKE LINE OF gt_alv.

  ls_status(3) = IEQ.
  IF p_ccl = X.
    ls_status-low = C.
    APPEND ls_status TO lr_status.
  ELSE.
    ls_status-low = E.
    APPEND ls_status TO lr_status.
    ls_status-low = ‘‘.
    APPEND ls_status TO lr_status.
  ENDIF.

**取主数据
  SELECT *
    INTO CORRESPONDING FIELDS OF TABLE gt_alv
    FROM zfit1048
    WHERE zdate_js   IN s_zdate
      AND ajust_date IN s_adate
      AND mblnr      IN s_mblnr
      AND iblnr      IN s_iblnr
      AND status     IN lr_status.

  SORT gt_alv BY iblnr mblnr.
  IF gt_alv[] IS INITIAL.
    MESSAGE 查询不到符合条件的数据 TYPE S DISPLAY LIKE E.
    LEAVE LIST-PROCESSING.
  ENDIF.

**不是重处理时,需先设置C状态,然后释放程序锁
  IF p_ccl <> X.
    LOOP AT gt_alv ASSIGNING <lf_alv>.
      MOVE-CORRESPONDING <lf_alv> TO ls_zfit1048.
      ls_zfit1048-status = C.
      APPEND ls_zfit1048 TO lt_zfit1048.
    ENDLOOP.
    MODIFY zfit1048 FROM TABLE lt_zfit1048.
    IF sy-subrc = 0.
      COMMIT WORK AND WAIT.
    ELSE.
      ROLLBACK WORK.
      MESSAGE 更新处理数据C状态到表ZFIT1048失败 TYPE S DISPLAY LIKE E.
      LEAVE LIST-PROCESSING.
    ENDIF.
  ENDIF.

  PERFORM frm_release_lock.

ENDFORM.                    " frm_get_data
*&---------------------------------------------------------------------*
*&      Form  frm_pro_doc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_pro_doc .
  FIELD-SYMBOLS: <lf_alv> LIKE LINE OF gt_alv.
**定义货物移动(MB11)收货过账的结构和变量
  DATA: ls_heade                 LIKE bapi2017_gm_head_01.
  DATA: ls_code                  LIKE bapi2017_gm_code.
*  DATA: ls_testrun               LIKE bapi2017_gm_gen-testrun.
  DATA: ls_goodsmvt_headret      LIKE bapi2017_gm_head_ret.
  DATA: ls_materialdocument      LIKE bapi2017_gm_head_ret-mat_doc.
  DATA: ls_matdocumentyear       LIKE bapi2017_gm_head_ret-doc_year.
  DATA: ls_goodsmvt_item         LIKE bapi2017_gm_item_create,
        lt_goodsmvt_item         LIKE TABLE OF bapi2017_gm_item_create,
        ls_goodsmvt_serialnumber LIKE bapi2017_gm_serialnumber,
        lt_goodsmvt_serialnumber LIKE TABLE OF bapi2017_gm_serialnumber,
        ls_return                LIKE bapiret2 ,
        lt_return                LIKE TABLE OF bapiret2 .
  DATA: lv_xblnr LIKE bkpf-xblnr,
        lv_zuonr LIKE bseg-zuonr.
  DATA: l_error TYPE c,
        l_msg   TYPE string.
  DATA: ls_bkpf LIKE bkpf,
        ls_bseg LIKE bseg,
        lv_awkey LIKE bkpf-awkey.


**处理数据
  LOOP AT gt_alv ASSIGNING <lf_alv>.

    CLEAR: ls_heade,
           ls_goodsmvt_headret,ls_materialdocument, ls_matdocumentyear,
           lt_goodsmvt_item,    lt_goodsmvt_serialnumber,lt_return.
**s1.抬头赋值:
*凭证日期:调整日期AJUST_DATE
*记账日期:当屏幕输入的BUDAT为空,则取调整日期AJUST_DATE,否则取屏幕输入BUDAT
    ls_code-gm_code        = 06.                              "MB11执行货物移

动收货,标准收货
    ls_heade-doc_date      = <lf_alv>-ajust_date.               "凭证日期
    IF p_budat IS INITIAL.
      ls_heade-pstng_date    = <lf_alv>-ajust_date.             "记账日期
    ELSE.
      ls_heade-pstng_date    = p_budat.
    ENDIF.
    ls_heade-pr_uname        = sy-uname.                        "用户名
**is_heade-header_txt    = ‘[ERP2.0]自营库存平台一期‘.        "抬头文本

**s2.项目赋值:
*商品:取数为存表中的MATNR;
*数量:取数为存表中的DIFMG;
*批次:取数为存表中的CHARG;
*移动类型:需根据DIFMG差异数量判断:
*当DIFMG差异数量不存在‘-’是,R3调用MB11增加库存,移动类型默认为Y52;
*当DIFMG差异数量存在‘-’是,R3调用MB11减少库存,移动类型默认为Y51;
*地点:WERKS    工厂
*库存地点:LGORT    库存地点
    ls_goodsmvt_item-material  = <lf_alv>-matnr.                       "商品号
    ls_goodsmvt_item-sales_ord = <lf_alv>-difmg.                       "数量
    ls_goodsmvt_item-plant     = <lf_alv>-werks.                       "工厂
    ls_goodsmvt_item-move_plant = <lf_alv>-werks.           "工厂11/18
    ls_goodsmvt_item-stge_loc   = <lf_alv>-lgort.                      "库存地点
    ls_goodsmvt_item-move_stloc = <lf_alv>-lgort.                      "库存地点

11/18
    ls_goodsmvt_item-batch      = <lf_alv>-charg.                      "批号
    IF <lf_alv>-difmg > 0.
      ls_goodsmvt_item-move_type = Y52.                              "移动类型
    ELSE.
      ls_goodsmvt_item-move_type = Y51.
    ENDIF.

**s3.细节赋值
*仓储类型:默认为999;
*仓位:默认为999;
*分配:输入MBLNR    SIMS MD 单号;
*文本:输入JUST_DATE    调整日期+ ‘确认销售发货成本(盘点)’
*参照:输入IBLNR   SIMS MD 单号
    ls_goodsmvt_item-entry_uom = <lf_alv>-meins.                      "单位
    ls_goodsmvt_item-stge_type   = 999.                             "仓储类型
    ls_goodsmvt_item-stge_bin    = 999.                             "仓位
    CONCATENATE <lf_alv>-ajust_date 确认销售发货成本(盘点) INTO  

ls_goodsmvt_item-item_text.
    APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
    CLEAR: ls_goodsmvt_item.

***Export分配和参照,在ZGGBS002替代程序里Import
***去替代商品凭证对应会计凭证分配和参照
    MOVE <lf_alv>-iblnr TO lv_xblnr.
    MOVE <lf_alv>-mblnr TO lv_zuonr.
    EXPORT lv_xblnr TO MEMORY ID  LV_XBLNR."抬头参照
    EXPORT lv_zuonr TO MEMORY ID  LV_ZUONR."行分配

    break 88392028.
**GR CREATE
    CALL FUNCTION BAPI_GOODSMVT_CREATE
      EXPORTING
        goodsmvt_header       = ls_heade
        goodsmvt_code         = ls_code
      IMPORTING
        goodsmvt_headret      = ls_goodsmvt_headret
        materialdocument      = ls_materialdocument
        matdocumentyear       = ls_matdocumentyear
      TABLES
        goodsmvt_item         = lt_goodsmvt_item
        goodsmvt_serialnumber = lt_goodsmvt_serialnumber
        return                = lt_return.

    LOOP AT lt_return INTO ls_return WHERE type = E OR type = A.
      CONCATENATE l_msg ls_return-message INTO l_msg.
      l_error = X.
    ENDLOOP.

    IF l_error = X.
      CALL FUNCTION BAPI_TRANSACTION_ROLLBACK.
      <lf_alv>-status_fh = E.
      CONCATENATE 生成商品凭证失败! l_msg INTO <lf_alv>-message_fh.
    ELSE.
* 返回商品凭证号,提交
      CALL FUNCTION BAPI_TRANSACTION_COMMIT
        EXPORTING
          wait = X.
      <lf_alv>-status_fh = S.
      <lf_alv>-mblnr_fh = ls_materialdocument.
      <lf_alv>-message_fh = 生成商品凭证成功!.
**商品凭证成功,通过MBLNR_FH+年度 取会计凭证
      CLEAR: ls_bkpf, ls_bseg, lv_awkey.
      CONCATENATE ls_materialdocument ls_matdocumentyear INTO lv_awkey.

      SELECT SINGLE *
        INTO ls_bkpf
        FROM bkpf
       WHERE awkey = lv_awkey
         AND awtyp = MKPF.

      IF sy-subrc EQ 0.
        SELECT SINGLE *
          INTO ls_bseg
          FROM bseg
         WHERE bukrs = ls_bkpf-bukrs
           AND belnr = ls_bkpf-belnr
           AND gjahr = ls_bkpf-gjahr
           AND hkont = 1243999994.
**会计凭证回写
        <lf_alv>-belnr_fh = ls_bkpf-belnr.
        <lf_alv>-mjahr    = ls_bkpf-gjahr.
        <lf_alv>-bukrs3   = ls_bkpf-bukrs.
        <lf_alv>-budat_fh = ls_bkpf-budat.
        <lf_alv>-cpudt_fh = ls_bkpf-cpudt.
        <lf_alv>-dmbtr3   = ls_bseg-dmbtr.
      ENDIF.

    ENDIF.

**数据回写zfit1048
    UPDATE zfit1048 SET status_fh  = <lf_alv>-status_fh
                        message_fh = <lf_alv>-message_fh
                        mblnr_fh   = <lf_alv>-mblnr_fh
                        belnr_fh   = <lf_alv>-belnr_fh
                        bukrs3     = <lf_alv>-bukrs3
                        dmbtr3     = <lf_alv>-dmbtr3
                        mjahr      = <lf_alv>-mjahr
                        budat_fh   = <lf_alv>-budat_fh
                        cpudt_fh   = <lf_alv>-cpudt_fh
* STATUS
                  WHERE iblnr    = <lf_alv>-iblnr
                    AND gjahr    = <lf_alv>-gjahr
                    AND serialno = <lf_alv>-serialno
                    AND mblnr    = <lf_alv>-mblnr
                    AND uuid     = <lf_alv>-uuid.
    IF sy-subrc EQ 0.
      COMMIT WORK AND WAIT.
    ELSE.
      ROLLBACK WORK.
      <lf_alv>-status_fh = E.
      <lf_alv>-message_fh = 商品凭证记账状态更新zfit1048表失败!.
    ENDIF.

  ENDLOOP.

ENDFORM.                    " frm_pro_doc
*&---------------------------------------------------------------------*
*&      Form  frm_alv_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_alv_data .

  IF sy-batch = X.
    RETURN.
  ENDIF.

  DEFINE lm_fieldcat.
    clear:gs_fcat.
    gs_fcat-tabname   = GT_ALV.
    gs_fcat-fieldname = &1.
    gs_fcat-scrtext_l = &2.
    gs_fcat-scrtext_m = &2.
    gs_fcat-scrtext_s = &2.
    gs_fcat-no_out    = &3.
    gs_fcat-outputlen = &4.
    gs_fcat-do_sum    = &5.
    gs_fcat-hotspot   = &6.
    gs_fcat-ref_table  = &7.
    gs_fcat-ref_field  = &8.
    append gs_fcat to gt_fcat.
  END-OF-DEFINITION.

  REFRESH: gt_fcat.
  lm_fieldcat:
IBLNR        库存盘点凭证    ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘ ,
MBLNR        SIMS MD单号     ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘,
WERKS        工厂            ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘ ,
LGORT        库存地点        ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘ ,
MATNR        商品编码        ‘‘ 18  ‘‘ ‘‘ ‘‘  ‘‘ ,
MEINS        单位            ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘ ,
CHARG        批次            ‘‘ ‘‘  ‘‘ ‘‘ ‘‘  ‘‘ ,
DIFMG        差异数量        ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ ,
AJUST_DATE   调整日期        ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ ,
STATUS_FH    商品凭证记账状态  ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ ,
MESSAGE_FH   消息              ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ ,
MBLNR_FH     商品凭证          ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ ,
MJAHR        凭证年度          ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘,
BELNR_FH     会计凭证          ‘‘ ‘‘ ‘‘ ‘‘ ‘‘  ‘‘ .

  gs_layout-zebra       = X.
  gs_layout-cwidth_opt  = X.
*  gs_layout-box_fname   = ‘SEL‘. "可放出最前的选择中方块"

  CALL FUNCTION REUSE_ALV_GRID_DISPLAY_LVC
    EXPORTING
      i_callback_program      = sy-repid
      i_callback_user_command = FRM_USER_COMMAND
      is_layout_lvc           = gs_layout
      it_fieldcat_lvc         = gt_fcat
      i_save                  = A
    TABLES
      t_outtab                = gt_alv
    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.                    " frm_alv_data
*&---------------------------------------------------------------------*
*&      Form  frm_release_lock
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_release_lock .
  CALL FUNCTION DEQUEUE_EZ_ZRUNING_LOCK
    EXPORTING
      mode_zruning_lock = X
      mandt             = sy-mandt
      zprogram          = sy-repid.
ENDFORM.                    " frm_release_lock

 

以上是关于MB11 生鲜项目原料消耗发货功能的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

基于springboot电商生鲜购物商城平台设计与实现(含源码+数据库文件)

(生鲜项目)19. ViewSet实现商品详情页接口

django天天生鲜项目--------celery功能

django天天生鲜项目--------celery功能

(生鲜项目)17. drf实现发送短信验证码功能