SAP ABAP程序 之 交货单查询统计


交货单统计,主要查询 LIKP,LIPS,单价取自VBAP 订单明细表;

*&---------------------------------------------------------------------*
*& Report ZSDR0030
*&---------------------------------------------------------------------*
*&zhangshaohua
*&---------------------------------------------------------------------*
REPORT zSDR0030.
TABLES :likp,lips,zsact0003,kna1,vbap,vbak,vbrp,marm,mvke,vbfa,zmmt0037,but000.

**定义结构
DATA:
  gt_data TYPE TABLE OF zsact0003.

TYPES: BEGIN OF gty_out,
         wadat_ist     LIKE likp-wadat_ist,                            "发货日期
         vkorg         LIKE likp-vkorg,                                "销售组织代码
         vtweg         LIKE lips-vtweg,                                "渠道编码
         vtweg_mc(10)  TYPE c,                              "渠道名称
         vkbur         LIKE lips-vkbur,                                "销售办公室编码
         vkbur_mc(20)  TYPE c,                                     "销售办公室名称
         vkgrp         LIKE vbak-vkgrp,                              "销售组编码
         vkgrp_mc(20)  TYPE c,                                     "销售组名称
         bzirk         LIKE vbkd-bzirk,                                "销售地区
         bzirk_mc(20)  TYPE c,                                "销售地区名称
         kdgrp         LIKE vbkd-kdgrp,                                "客户组
         kdgrp_mc(20)  TYPE c ,                                      "客户组名称
         kunnr         LIKE likp-kunag,                                "客户代码
         name1         LIKE kna1-name1,                                 "客户名称
         matnr         LIKE lips-matnr,                                "物料号
         maKtx         LIKE zmmt0037-maktx,                            "物料描述
         charg         LIKE lips-charg,                                 "批号
         lfart         LIKE likp-lfart,                                "交货单类型
         lfimg         LIKE lips-lfimg,                                "交货数量
         hsdj          LIKE vbap-kwmeng,                               "含税价
         hsje          LIKE vbap-kwmeng,                               "含税价
         vrkme         LIKE lips-vrkme,                                "销售单位
         netwr         LIKE vbap-kzwi1,                                "销售订单行金额
         kwmeng        LIKE vbap-kwmeng,                               "销售订单数量
         vrkme_so      LIKE vbap-vrkme,                      "销售单位
         vbeln         LIKE likp-vbeln,                     "交货单号
         posnr         LIKE lips-posnr,                       "行项目号
         vbtyp_v       LIKE vbfa-vbtyp_v,                     "
         ddbh          LIKE vbak-vbeln ,                         "订单编号
         rybh          LIKE vbpa-kunnr,                           "业务员号
         ryxm          LIKE but000-name_last ,                    "业务员姓名
         zzbusin       LIKE zmmt0037-zzbusin,                  "事业部
         zzproducst    LIKE zmmt0037-zzproducst,                "生产企业
         zzabccat      LIKE zmmt0037-zzabccat,                 "ABC类别
         umVKz         LIKE lips-UMVKZ,                  "每件数量
         umrez      like zmmt0037-umrez,               "标准件数量
         wgbez         LIKE zmmt0037-wgbez,                  "物料组
         zzdosage_desc LIKE zmmt0037-zzdosage_desc,       "剂型描述
         ewbez         LIKE zmmt0037-ewbez,                  "治疗领域
         vtext         LIKE zmmt0037-vtext,                 "产品类别
         zsl           LIKE lips-lfimg,                    "主数量
         fzsl          LIKE lips-lfimg,                    "辅助数量
         vsart         LIKE vbkd-vsart,                          "运输方式
         vsart_mc(20)  TYPE c,                          "运输方式名称
       END OF gty_out.

DATA:
  lv_kwmeng_su TYPE vbap-kwmeng,     "销售单位数量
  lv_kwmeng_bu TYPE vbap-kwmeng,     "基本单位数量
  lv_netwr     TYPE vbap-netwr,      "金额
  lwa_data     TYPE zsact0003,
  lt_marm      TYPE TABLE OF marm,   "单位转化系数
  lwa_marm     TYPE marm,
  lt_mvke      TYPE TABLE OF mvke,   "销售单位
  lwa_mvke     TYPE mvke,
  lv_price     TYPE p LENGTH 11 DECIMALS 5,      "销售单价
  lv_lfimg     TYPE lips-lfimg,      "发货数量
  lv_lfimg_ba  TYPE lips-lfimg,      "发货数量(基本单位)
  lv_fkimg     TYPE vbrp-fkimg,      "开票数量
  lv_fkimg_ba  TYPE vbrp-fkimg.      "开票数量(基本单位)

*标准的ALV输出
* slis 类型池 全局变量 定义,多数没用,
DATA: g_repid             TYPE sy-repid,
      g_line              TYPE slis_fieldcat_alv,
      gt_fieldcat         TYPE slis_t_fieldcat_alv,
      gt_layout           TYPE slis_layout_alv,
      gt_sortinfo         TYPE slis_sortinfo_alv,
      gt_lvc_title        TYPE lvc_title,
      gt_list_top_of_page TYPE slis_t_listheader,
      gt_events           TYPE slis_t_event,
      gt_fcat             TYPE lvc_t_fcat,
      gt_table            TYPE REF TO data,
      gs_settings         TYPE lvc_s_glay,
      f2code              LIKE sy-ucomm VALUE '&TEA'.


* 定义用于输出的内表
DATA: gt_tab TYPE STANDARD TABLE OF gty_out  WITH HEADER LINE.
DATA: gt_tab2 TYPE STANDARD TABLE OF gty_out.

**定义双击执行事务代码 用,  猜的
DATA ok_code LIKE sy-ucomm.

DATA: g_ucomm LIKE sy-ucomm.

DATA:   bdcdata LIKE bdcdata    OCCURS 0 WITH HEADER LINE."用来存储屏幕字段参数值,传递录屏参数
*       messages of call transaction
DATA:   messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE."记录执行BDC过程中产生的消息
DATA: ls_mss LIKE bdcmsgcoll.

*选择屏幕
SELECT-OPTIONS:
  s_kunnr FOR likp-kunag,"客户号
  s_vkorg FOR likp-vkorg,"销售组织
  s_Vtweg FOR LIps-vtweg,"渠道
  s_matnr FOR LIps-matnr,"物料号
  s_FHRQ FOR likp-wadat_ist OBLIGATORY. "实际发货日期


***************************************************************
**2 功能 程序
**************************************************************
** 1 统计发货情况,含正向发货和退货
START-OF-SELECTION.

  "发货
  SELECT
    a~wadat_ist,                            "发货日期
    a~vkorg,                                "销售组织代码
    b~vtweg,                                "渠道编码
    b~vtweg AS vtweg_mc,                              "渠道名称
    b~vkbur,                                "销售办公室编码
    b~vkbur AS vkbur_mc,                                "销售办公室编码
    g~vkgrp,                              "销售组编码
    g~vkgrp AS vkgrp_mc,                              "销售组名称
    e~bzirk,                                "销售地区
    e~bzirk AS bzirk_mc,                                "销售地区名称
    e~kdgrp,                                "客户组
    e~kdgrp AS kdgrp_mc,
    a~kunag AS kunnr,                                "客户代码
    h~name1 ,                               "客户名称
    b~matnr,                                "物料号
    i~maktx,                                "物料描述
    b~charg,                                "批号
    a~lfart,                                "交货单类型
    b~lfimg,                                "交货数量
    f~kzwi1  AS hsdj,              "含税价
    f~kzwi1  AS hsje,              "含税价
    b~vrkme,                                "销售单位
    f~kzwi1 AS netwr,                                "销售订单行金额
    f~kwmeng,                               "销售订单数量
    f~vrkme AS vrkme_so,                     "销售单位
    a~vbeln,
    b~posnr,
    d~vbtyp_v,
    g~vbeln ,                                "订单号
    j~kunnr AS ywy,                          "业务员号
    k~name_last,                       "姓名
    i~zzbusin,        "事业部
    i~zzproducst,                       " 生产企业
    i~zzabccat,                           "ABC分类
    b~umvkz,                  "每件数量
    i~umrez,                    "标准件数量
    i~wgbez,                  "物料组
    i~zzdosage_desc,       "剂型描述
    i~ewbez,                  "治疗领域
    i~vtext,                 "产品类别
    b~lfimg as zsl,                    "主数量
    b~lfimg as fzsl,                    "辅助主数量
    e~vsart,
    ' ' AS vsart_mc

     INTO TABLE @gt_tab
  FROM likp AS a
  INNER JOIN lips AS b
    ON a~vbeln = b~vbeln
  LEFT JOIN vbfa AS d
    ON b~vbeln = d~vbeln
   AND b~posnr = d~posnn
   AND d~vbtyp_v = 'C'                   "只获取销售订单和交货单的关联数据
  LEFT JOIN vbkd AS e
    ON d~vbelv = e~vbeln
  LEFT JOIN vbap AS f
    ON d~vbelv = f~vbeln
   AND d~posnv = f~posnr
  LEFT JOIN vbak AS g
    ON d~vbelv = g~vbeln
   LEFT JOIN kna1 AS h
    ON a~kunag = h~kunnr
   LEFT JOIN zmmt0037 AS i
    ON b~matnr = i~matnr
   LEFT JOIN vbpa AS j
    ON a~vbeln = j~vbeln AND j~parvw = 'Z1'
   LEFT JOIN but000 AS k
    ON j~kunnr = k~partner


  WHERE a~wadat_ist  IN @s_FHRQ
    AND a~kunag IN @s_kunnr
    AND b~matnr IN @s_matnr
    AND a~vkorg IN @s_vkorg
    AND b~vtweg IN @s_vtweg
    AND a~wbstk = 'C'
    AND a~lfart = 'LF'.

  "退货
  SELECT
    a~wadat_ist,                            "发货日期
    a~vkorg,                                "销售组织代码
    b~vtweg,                                "渠道编码
    b~vtweg AS vtweg_mc,                              "渠道名称
    b~vkbur,                                "销售办公室编码
    b~vkbur AS vkbur_mc,                                "销售办公室编码
    g~vkgrp,                              "销售组编码
    g~vkgrp AS vkgrp_mc,                              "销售组名称
    e~bzirk,                                "销售地区
    e~bzirk AS bzirk_mc,                                "销售地区名称
    e~kdgrp,                                "客户组
    e~kdgrp AS kdgrp_mc,
    a~kunag AS kunnr,                                "客户代码
    h~name1 ,                               "客户名称
    b~matnr,                                "物料号
    i~maktx,                                "物料描述
    b~charg,                                "批号
    a~lfart,                                "交货单类型
    b~lfimg,                                "交货数量
    f~kzwi1  AS hsdj,              "含税价
    f~kzwi1  AS hsje,              "含税金额
    b~vrkme,                                "销售单位
    f~kzwi1 AS netwr,                                "销售订单行金额
    f~kwmeng,                               "销售订单数量
    f~vrkme AS vrkme_so,                     "销售单位
    a~vbeln,
    b~posnr,
    d~vbtyp_v,
    g~vbeln  ,                               "订单号
    j~kunnr AS ywy,                          "业务员号
    k~name_last ,                      "姓名
    zzbusin,                          "事业部
    zzproducst,                       " 生产企业
    zzabccat,                          "ABC分类
    b~umvkz,                  "每件数量
    i~umrez,                    "标准件数量
    i~wgbez,                  "物料组
    i~zzdosage_desc,       "剂型描述
    i~ewbez,                  "治疗领域
    i~vtext,                 "产品类别
    b~lfimg as zsl,                    "主数量
    b~lfimg as fzsl,                    "辅助主数量
    e~vsart,                          "运输方式
    ' ' AS vsart_mc

    APPENDING TABLE @gt_tab
  FROM likp AS a
  INNER JOIN lips AS b
    ON a~vbeln = b~vbeln
  LEFT JOIN vbfa AS d
    ON b~vbeln = d~vbeln
   AND b~posnr = d~posnn
   AND d~vbtyp_v = 'H'                  "只获取销售订单和交货单的关联数据
  LEFT JOIN vbkd AS e
    ON d~vbelv = e~vbeln
  LEFT JOIN vbap AS f
    ON d~vbelv = f~vbeln
   AND d~posnv = f~posnr
  LEFT JOIN vbak AS g
    ON d~vbelv = g~vbeln
   LEFT JOIN kna1 AS h
    ON a~kunag = h~kunnr
   LEFT JOIN zmmt0037 AS i
      ON b~matnr = i~matnr
   LEFT JOIN vbpa AS j
    ON a~vbeln = j~vbeln AND j~parvw = 'Z1'
   LEFT JOIN but000 AS k
    ON j~kunnr = k~partner

  WHERE a~wadat_ist  IN  @s_FHRQ
  AND a~kunag IN @s_kunnr
    AND b~matnr IN @s_matnr
    AND a~vkorg IN @s_vkorg
    AND b~vtweg IN @s_vtweg
    AND a~lfart = 'LR'.


**2 将相关列取值由代码变为中文描述

**取订单类型字典
  SELECT auart,bezei AS ddlx  INTO TABLE @DATA(ddlx) FROM tvakt WHERE auart LIKE 'Z%' AND spras = '1'  .

**取运输方式字典
  SELECT bezei, vsart INTO TABLE @DATA(ysfs) FROM t173t  WHERE  spras = '1'  .
  LOOP AT ysfs  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-vsart_mc = -bezei.
    "MODIFI 内表名 FROM 结构(如果同名,可以不要 FROM GT_TAB) TRANSPORTING 要修改的字段名 WHERE 字段名= 新值。
    MODIFY gt_tab FROM gt_tab  TRANSPORTING vsart_mc WHERE vsart = -vsart.
  ENDLOOP.
**取销售渠道字典
**SELECT  vtweg,  vtext INTO TABLE @DATA(xsqd)  FROM tvtwt   WHERE  spras = '1'.
*  查询渠道
  SELECT  vtweg,  vtext  INTO TABLE @DATA(vtweg1)  FROM tvtwt  WHERE  spras = '1'  .
  LOOP AT vtweg1  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-vtweg_mc = -vtext.
    "MODIFI 内表名 FROM 结构(如果同名,可以不要 FROM GT_TAB) TRANSPORTING 要修改的字段名 WHERE 字段名= 新值。
    MODIFY gt_tab FROM gt_tab  TRANSPORTING vtweg_mc WHERE vtweg = -vtweg.
  ENDLOOP.


**取销售组织
  SELECT  vkorg, vtext INTO TABLE @DATA(xszz)  FROM tvkot WHERE  spras = '1'    .
  LOOP AT xszz  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-vkorg = -vtext.
    MODIFY gt_tab FROM gt_tab  TRANSPORTING vkorg WHERE vkorg = -vkorg.
  ENDLOOP.

*  查询销售办公室
  SELECT  vkbur,  bezei  INTO TABLE @DATA(vkbur)   FROM tvkbt  WHERE  spras = '1'  .
  LOOP AT vkbur  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-vkbur_mc = -bezei.
    MODIFY gt_tab FROM gt_tab  TRANSPORTING vkbur_mc WHERE vkbur = -vkbur.
  ENDLOOP.

**  查询销售组
  SELECT  vkgrp,  bezei  INTO TABLE @DATA(vkgrp)  FROM tvgrt   WHERE  spras = '1'  .
  LOOP AT vkgrp  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-vkgrp_mc = -bezei.
    MODIFY gt_tab FROM gt_tab  TRANSPORTING vkgrp_mc WHERE vkgrp = -vkgrp.
  ENDLOOP.

**  查询销售地区
  SELECT   bzirk,  bztxt  INTO TABLE @DATA(bzirk)  FROM t171t  WHERE  spras = '1'  .
  LOOP AT bzirk  ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-bzirk_mc = -bztxt.
    MODIFY gt_tab FROM gt_tab  TRANSPORTING bzirk_mc WHERE bzirk = -bzirk.
  ENDLOOP.
** 查询客户组(客?类型描述)
  SELECT kdgrp,ktext INTO TABLE @DATA(khlx) FROM t151t WHERE spras = '1'.
  LOOP AT khlx ASSIGNING FIELD-SYMBOL().
    CLEAR gt_tab.
    gt_tab-kdgrp_mc = -ktext.
    MODIFY gt_tab FROM gt_tab  TRANSPORTING kdgrp_mc WHERE kdgrp = -kdgrp.
  ENDLOOP.

**2 处理单价、主数量等其它辅助信息
**FIELD-SYMBOL 指针 可直接更改内表字段的值 .
  LOOP AT gt_tab ASSIGNING FIELD-SYMBOL().

    -hsdj = -netwr / -kwmeng.   "用销售金额 除以 订单数量,得到 含税单价
    IF -lfart = 'LR'.
      -lfimg =  -lfimg * -1.
      -netwr =  -netwr * -1.
    ENDIF.

    -hsje = -lfimg * -hsdj.  "用交货数量* 订单的含税单价
    if -umvkz > 1.
      -zsl = -lfimg * -umrez."转换为最小包装数
    endif.
    if -umrez <> 0 .
      -fzsl = -zsl / -umrez."转换为标准件包装数
    endif .
    "去掉前导000
    SHIFT -kunnr LEFT DELETING LEADING '0'.
    SHIFT -vbeln LEFT DELETING LEADING '0'.
    SHIFT -matnr LEFT DELETING LEADING '0'.
    SHIFT -ddbh LEFT DELETING LEADING '0'.
    SHIFT -rybh LEFT DELETING LEADING '0'.
  ENDLOOP.


**删除重复行项目
  SORT gt_tab ASCENDING BY vbeln posnr.
  DELETE  gt_tab  WHERE lfimg = 0 .




END-OF-SELECTION.

**执行函数
  PERFORM frm_show_alv.


* 输出 alv 报表
FORM frm_show_alv .

  DEFINE append_alv_field.
    CLEAR g_line.
    g_line-fieldname    = &1.
    g_line-tabname      = 'GT_ALV'.
    g_line-reptext_ddic = &2.
    g_line-seltext_l    = &2.
    g_line-seltext_m    = &2.
    g_line-seltext_s    = &2.
    g_line-cfieldname   = &3.
    g_line-ctabname     = &4.
    g_line-no_out       = &5.
    g_line-no_zero      = &6.
    g_line-outputlen    = &7.
    g_line-qfieldname   = &8.
    g_line-just         = &9.
    g_line-ddictxt      = 'L'.
    g_line-do_sum       = 'X'.
    IF  g_line-fieldname = 'LFIMG'. "如果字段名为LFIMG,则将小数位设置为0,其它的设置为2位
      g_line-decimals_out       = '0'. "去掉小数点后的0
     ELSE.
       g_line-decimals_out       = '2'. "去掉小数点后的0
    ENDIF.

    APPEND g_line TO gt_fieldcat.
  END-OF-DEFINITION.


**ALV 显示字段
  REFRESH:gt_fieldcat.
  gt_layout-colwidth_optimize = 'X'. " 自适应宽度

  append_alv_field 'VKORG' '销售组织' '' '' '' '' '' '' ''.
  append_alv_field 'vtweg' '渠道' '' '' '' '' '' '' ''.
  append_alv_field 'vtweg_mc' '渠道名称' '' '' '' '' '' '' ''.
  append_alv_field 'WADAT_IST' '票据日期' '' '' '' '' '' '' ''.
  append_alv_field 'VBELN' '交货单号' '' '' '' '' '' '' ''.
  append_alv_field 'RYBH' '业务员号' '' '' '' '' '' '' ''.
  append_alv_field 'RYXM' '业务员姓名' '' '' '' '' '' '' ''.
  append_alv_field 'kunnr' '客户号' '' '' '' '' '' '' ''.
  append_alv_field 'name1' '客户名称' '' '' '' '' '' '' ''.
  append_alv_field 'matnr' '物料号' '' '' '' '' '' '' ''.
  append_alv_field 'maktx' '物料描述' '' '' '' '' '' '' ''.
  append_alv_field 'charg' '批号' '' '' '' '' '' '' ''.
  append_alv_field 'lfart' '类型' '' '' '' '' '' '' ''.
  append_alv_field 'LFIMG' '交货数量' '' '' '' '' '' '' ''.
  append_alv_field 'zsl' '主数量' '' '' '' '' '' '' ''.
  append_alv_field 'fzsl' '辅助数量' '' '' '' '' '' '' ''.

  append_alv_field 'hsdj' '单价' '' '' '' '' '' '' ''.
  append_alv_field 'hsje' '金额' '' '' '' '' '' '' ''.
  append_alv_field 'NETWR' '订单金额' '' '' '' '' '' '' ''.
  append_alv_field 'KWMENG' '订单数量' '' '' '' '' '' '' ''.
  append_alv_field 'VTWEG' '行项目' '' '' '' '' '' '' ''.
  append_alv_field 'DDBH' '订单号' '' '' '' '' '' '' ''.
  append_alv_field 'kdgrp' '客户类型' '' '' '' '' '' '' ''.
  append_alv_field 'kdgrp_mc' '客户类型名称' '' '' '' '' '' '' ''.
  append_alv_field 'vkbur' '销售办公室' '' '' '' '' '' '' ''.
  append_alv_field 'vkbur_mc' '销售办名称' '' '' '' '' '' '' ''.
  append_alv_field 'vkgrp' '销售组' '' '' '' '' '' '' ''.
  append_alv_field 'vkgrp_mc' '销售组名称' '' '' '' '' '' '' ''.
  append_alv_field 'bzirk' '销售地区号' '' '' '' '' '' '' ''.
  append_alv_field 'bzirk_mc' '销售地区' '' '' '' '' '' '' ''.
  append_alv_field 'zzbusin' '事业部' '' '' '' '' '' '' ''.
  append_alv_field 'zzproducst' '生产企业' '' '' '' '' '' '' ''.
  append_alv_field 'zzabccat' 'ABC分类' '' '' '' '' '' '' ''.
  append_alv_field 'vsart' '运输方式1' '' '' '' '' '' '' ''.
  append_alv_field 'vsart_mc' '运输方式' '' '' '' '' '' '' ''.
  append_alv_field 'umrez' '件数量' '' '' '' '' '' '' ''.
  append_alv_field 'wgbez' '物料组' '' '' '' '' '' '' ''.
  append_alv_field 'zzdosage_desc' '剂型' '' '' '' '' '' '' ''.
  append_alv_field 'ewbez' '治疗领域' '' '' '' '' '' '' ''.
  append_alv_field 'vtext' '产品类别' '' '' '' '' '' '' ''.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
*     i_callback_pf_status_set = 'FRM_STATUS'   "GUI指定子程序
*     i_callback_user_command  = 'FRM_USER_COMM' "客户命令指定子程序
      is_layout          = gt_layout
      it_fieldcat        = gt_fieldcat[]
*     it_events          = events[]
    TABLES
      t_outtab           = gt_tab[] "指定要显示的内表名称
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.


ENDFORM.
SAP