ABAP 成本中心发料报表

一、业务情况

成本中心发料,涉及的移动类型为MATDOC-BWART = 201 and 202,因此,在取数时,需要限制移动类型的数据

输入的屏幕

涉及的字段

二、程序

1、声明部分

TABLES:matdoc,makt,mara,marc,csks,cskt.
TYPE-POOLS:slis.

TYPES:BEGIN OF ty_output,
        werks     TYPE matdoc-werks,     "工厂
        matbf     TYPE matdoc-matbf,     "物料
        maktx     TYPE makt-maktx,       "物料描述
        zpm       TYPE mara-zpm,         "品名
        zggxh     TYPE mara-zggxh,       "规格
        maabc     TYPE marc-maabc,       "ABC分类
        lgort_sid TYPE matdoc-lgort_sid, "发出仓库
        kostl     TYPE matdoc-kostl,     "成本中心
        Ktext     TYPE cskt-Ktext,       "成本中心描述
        bldat     TYPE matdoc-bldat,     "凭证日期
        menge     TYPE matdoc-menge,     "数量
        meins     TYPE matdoc-meins,     "单位
        cprice    TYPE dmbtr_cs,         "成本价
        dmbtr     TYPE matdoc-dmbtr,     "总价
        usnam     TYPE matdoc-usnam,     "用户名
        box       TYPE c LENGTH 1,
      END OF ty_output.

DATA gt_output TYPE TABLE OF ty_output.
DATA gs_output TYPE ty_output.

DATA gt_result TYPE TABLE OF  ty_output.
DATA gs_result TYPE ty_output.

DATA gt_fieldcat TYPE slis_t_fieldcat_alv."列属性
DATA gs_fieldcat TYPE slis_fieldcat_alv.

DATA gs_layout TYPE slis_layout_alv. "全局参数

DATA gt_events TYPE slis_t_event.  "CALLBACK事件
DATA gs_events TYPE slis_alv_event.

*定义宏
DEFINE %%append_fieldcat.
  CLEAR gs_fieldcat.
  gs_fieldcat-col_pos = &1.
  gs_fieldcat-fieldname = &2."字段名是什么
  gs_fieldcat-seltext_m = &3."描述文本
  gs_fieldcat-outputlen = &4."输出长度
  APPEND gs_fieldcat TO gt_fieldcat.
END-OF-DEFINITION.

2、选择界面部分

*选择屏幕
SELECTION-SCREEN BEGIN OF BLOCK bk01 WITH FRAME TITLE TEXT-001.
  PARAMETERS p_werks TYPE matdoc-werks OBLIGATORY."工厂

  SELECT-OPTIONS s_matbf FOR matdoc-matbf.        "物料
  SELECT-OPTIONS s_kostl FOR matdoc-kostl.         "成本中心
SELECTION-SCREEN END OF BLOCK bk01.

3、取数部分

取数部分注意:

1)不同的数据库表中的限制条件,比如MARC表中的同一个物料可能存在不同的工厂,使用LEFT JOIN会导致有两条数据存在,因此就要限制工厂的字段

2)成本中心描述也可能存在两个,因为一个成本中心的编号可能具有两个有效期,为了区分这两个有效期,就会有两个描述,在这里取出了有效期限最长的那个

FORM get_data .

  SELECT
    matdoc~werks,
    matdoc~matbf,
    makt~maktx,
    mara~zpm,
    mara~zggxh,
    marc~maabc,
    matdoc~lgort_sid,
    matdoc~kostl,
    cskt~ktext,
    matdoc~bldat,
    matdoc~menge,
    matdoc~meins,
    matdoc~dmbtr,
    matdoc~usnam
    FROM matdoc
    INNER JOIN makt ON matdoc~matbf = makt~matnr
    LEFT JOIN mara ON matdoc~matbf = mara~matnr
    LEFT JOIN marc ON matdoc~matbf = marc~matnr AND matdoc~werks = marc~werks "同一个物料可能存在多个工厂中
    INNER JOIN cskt ON matdoc~kostl = cskt~kostl AND cskt~datbi =  '99991231'"部门可能拥有两个有效期的成本中心,取最新数据
    WHERE  matdoc~bwart BETWEEN '201' AND  '202'
      AND matdoc~werks = @p_werks
      AND matdoc~matbf IN @s_matbf
      AND matdoc~kostl IN @s_kostl
    INTO CORRESPONDING FIELDS OF TABLE @gt_result.

**计算物料的单价
  CLEAR gs_output.
  LOOP AT gt_result INTO gs_output.
    SHIFT gs_output-kostl LEFT DELETING LEADING '0'.
    IF gs_output-menge <> 0."确保除数不为零
      gs_output-cprice = gs_output-dmbtr / gs_output-menge.
      APPEND gs_output TO gt_output.
    ELSE.
      gs_output-cprice = '0'.
      APPEND  gs_output TO gt_output.
    ENDIF.
  ENDLOOP.
ENDFORM.

4、布局部分

FORM display_data .
  PERFORM build_fieldcat.
  PERFORM build_layout.
  PERFORM build_events.
  PERFORM build_alv.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form build_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_alv .
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-cprog
      i_callback_pf_status_set = 'SET_STATUS'
*     I_CALLBACK_USER_COMMAND  = ' '
      is_layout                = gs_layout
      it_fieldcat              = gt_fieldcat
      it_events                = gt_events
    TABLES
      t_outtab                 = gt_output
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
  IF sy-subrc <> 0.
  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form build_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_fieldcat .
  %%append_fieldcat: '1' 'WERKS' '工厂' '4',
                     '2' 'MATBF' '物料' '40',
                     '3' 'MAKTX' '描述' '40',
                     '4' 'ZPM'   '品名' '40',
                     '5' 'ZGGXH' '规格' '128',
                     '6' 'MAABC' 'ABC分类' '1',
                     '7' 'LGORT_SID' '发出仓库' '4',
                     '8' 'KOSTL' '成本中心' '10',
                     '9' 'KTEXT'   '成本中心描述' '20',
                     '10' 'BLDAT' '凭证日期' '8',
                     '11' 'MENGE' '数量' '13',
                     '12' 'MEINS' '单位'  '3',
                     '13' 'CPRICE' '成本价' '13',
                     '14' 'DMBTR' '总价' '13',
                     '15' 'USNAM' '用户名' '12'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_layout .
  gs_layout-colwidth_optimize = 'X'."优化列宽
  gs_layout-zebra = 'X'. "斑马纹输出
  gs_layout-box_fieldname = 'BOX'.
  gs_layout-window_titlebar = '成本中心发料清单' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_events
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM build_events .
  CLEAR gs_events.
  gs_events-name = 'PF_STATUS_SET'.
  gs_events-form = 'SET_STATUS'."子程序
  APPEND gs_events TO gt_events.
ENDFORM.

FORM set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD'."参照标准按钮
ENDFORM.

5、权限设置

  AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
   ID 'ACTVT'  FIELD '03'
   ID 'WERKS' FIELD p_werks.
  IF sy-subrc <> 0.
*不报E类型的message,因为如果是E类型,程序终止,用户没有办法修改
    MESSAGE s001 WITH  '无工厂权限!' DISPLAY LIKE 'E'.
    else.
       PERFORM get_data.
  ENDIF.

世界地图矢量数据可以通过多种网站进行下载。以下是一些提供免费下载世界地图矢量数据的网站: 1. Open Street Map (https://www.openstreetmap.org/): 这个网站可以根据输入的经纬度或手动选定范围来导出目标区域的矢量图。导出的数据格式为osm格式,但只支持矩形范围的地图下载。 2. Geofabrik (http://download.geofabrik.de/): Geofabrik提供按洲际和国家快速下载全国范围的地图数据数据格式支持shape文件格式,包含多个独立图层,如道路、建筑、水域、交通、土地利用分类、自然景观等。数据每天更新一次。 3. bbbike (https://download.bbbike.org/osm/): bbbike提供全球主要的200多个城市的地图数据下载,也可以按照bbox进行下载。该网站还提供全球数据数据格式种类齐全,包括geojson、shp等。 4. GADM (https://gadm.org/index.html): GADM提供按国家或全球下载地图数据的服务。该网站提供多种格式的数据下载。 5. L7 AntV (https://l7.antv.antgroup.com/custom/tools/worldmap): L7 AntV是一个提供标准世界地图矢量数据免费下载的网站。支持多种数据格式下载,包括GeoJSON、KML、JSON、TopJSON、CSV和高清SVG格式等。可以下载中国省、市、县的矢量边界和世界各个国家的矢量边界数据。 以上这些网站都提供了世界地图矢量数据免费下载服务,你可以根据自己的需求选择合适的网站进行下载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值