SAP ALV报表开发实战案例(三)

SAP ALV报表开发实战案例

嗨!大家好~我是SAP小白,今天给大家分享一下我今天,不!是这几天开发的"实战级"的案例开发.如果有哪里感到疑惑或错误,欢迎大家评论区留言哦,让我们一起努力,拿高薪!!!冲冲冲!

对于学过openSQL的同学,上手起来可能会相对性的容易一些.我呢,主要说我的思路和部分代码,提供给大家参考学习.
如果大家对openSQL有遗忘的话请阅读这个博客哦

简单的来说就是做查询(增加,修改,删除),多表联查,单值查询,笛卡尔积,左连接,右连接,内连接,子查询,以及性能优化(目前水平没有涉及到事务).我今天主要讲的就是查询!查询!查询!重要的事情说三遍.本次主要使用的是内连接的方式.我把两种编写openSQL的方式分别写出来,给大家作比较.

//MySQL写法
SELECT * FROM  emp e  
INNER  JOIN  empext  t 
ON  e.empno=t.empnpo 
WHERE  e.ename='tony'

//SAP SQL写法
SELECT * FROM EMP AS E
INTO CORRESPONDING FIELDS OF TABLE GT_TABLE
INNER JOIN EMPEXT AS T
ON E~EMPNO = T~EMPNO
WHERE E~ENAME = 'NAME' .

大家看完之后会发现其实二者的区别并不是太大.
好了!接下来我开始进入今天的实战主题,不要走神哦.

首先!看需求!
选择屏幕
在这里插入图片描述
输出界面
在这里插入图片描述
从输出界面中我们可以看出来,需要查询的不止是三四张表那么容易,从理论上来讲数据在查询的时候关联的数据库越多性能就越差.今天咱不讲性能问题!
宣! SAP SQL进殿面上!

SELECT DISTINCT
     a~vkorg  "销售组织
     a~vtweg  "分销渠道
     a~vkgrp  "销售组
     a~auart  "订单类型
     a~erdat  "订单日期
     a~vbeln  "订单号
     a~kunnr  "客户编码
     a~waerk  "币种
     a~ERNAM  "制单人
     b~posnr  "行号
     c~name1  "客户全称
     d~kursk  "汇率
INTO CORRESPONDING FIELDS OF TABLE GT_VBAK
FROM VBAK AS A
INNER JOIN VBAP AS B ON a~vbeln = b~vbeln
INNER JOIN KNA1 AS C ON a~kunnr = c~kunnr
INNER JOIN VBKD AS D ON a~vbeln = d~vbeln
	WHERE a~vbeln = p_vbeln .

写到这里调用REUSE_ALV_GRID_DISPLAY然候ALV就可以直接输出到屏幕上了,这一张表关联了三张表.
接下来就是重点了.
当你在关联报表的时候应该会发现,输出界面上的这些字段,有的没有半毛钱关系,这个时候你就要采用分而治之的思想来做了.
说白了就是把其他表之间的关联性较大的放在一起再次查询.需要你从新定义内表和工作区.

 TYPES:BEGIN OF ty_vbep,
          vbeln TYPE vbep-vbeln,
          posnr TYPE vbep-posnr,
          wadat TYPE vbep-wadat,
        END OF ty_vbep.
  DATA: lt_vbep TYPE TABLE OF ty_vbep,
        ls_vbep TYPE ty_vbep.

 SELECT DISTINCT
      vbeln
      posnr
      wadat
        INTO CORRESPONDING FIELDS OF TABLE lt_vbep
      FROM vbep
      FOR ALL ENTRIES IN gt_vbak
      WHERE vbeln = gt_vbak-vbeln
       AND  posnr = gt_vbak-posnr.

SORT:lt_vbep BY vbeln posnr.

   LOOP AT gt_vbak INTO gs_vbak.
READ TABLE lt_vbep
    INTO ls_vbep
    WITH KEY vbeln = gs_vbak-vbeln posnr = gs_vbak-posnr
    BINARY SEARCH.
  MODIFY gt_vbak FROM gs_vbak.
ENDLOOP .

在这里定义内表和工作区都是局部的,只能在该函数中使用,所以我们还要到 include top 去添加相应的字段,换而言之就是把小表循环插入到大表当中去.
然后就把刚定义的工作区和内表正常使用即可,然后最好是做一个排序.
这里是比较重点的了,现在我们已经拿到数据,就需要loop循环到大表中,最终的显示.
READ TABLE 这个语法就是:读取内表it_vbep中的一行(按顺序从上到下读取)到is_vbep,在通过is_vbep中读取到数据输入到大表gs_vbak中的相应字段,用二分法的方法.
一句话:把小表is_vbep中的数据对应字段输入到大表gs_vbak中.

整个取数的代码块仅供参考也有其他逻辑.

FORM get_data . "取数
  TYPES:BEGIN OF ty_vbep,
          vbeln TYPE vbep-vbeln,
          posnr TYPE vbep-posnr,
          wadat TYPE vbep-wadat,
        END OF ty_vbep.
  DATA: lt_vbep TYPE TABLE OF ty_vbep,
        ls_vbep TYPE ty_vbep.

*  IF P_1 = 'X'.
  SELECT DISTINCT
     a~vkorg  "销售组织
     a~vtweg  "分销渠道
     a~vkgrp  "销售组
     a~auart  "订单类型
     a~erdat  "订单日期
     a~vbeln  "订单号
     a~kunnr  "客户编码
     a~waerk  "币种
     a~ERNAM  "制单人
     b~posnr  "行号
     c~name1  "客户全称
     d~kursk  "汇率
  INTO CORRESPONDING FIELDS OF TABLE gt_vbak
  FROM vbak AS a
  INNER JOIN vbap AS b ON a~vbeln = b~vbeln
    INNER JOIN kna1 AS c ON a~kunnr = c~kunnr
    INNER JOIN vbkd AS d ON a~vbeln = d~vbeln
        WHERE a~vbeln = p_vbeln .

  IF gt_vbak IS NOT INITIAL.
    SELECT DISTINCT
      vbeln
      posnr
      wadat
        INTO CORRESPONDING FIELDS OF TABLE lt_vbep
      FROM vbep
      FOR ALL ENTRIES IN gt_vbak
      WHERE vbeln = gt_vbak-vbeln
       AND  posnr = gt_vbak-posnr.

  ENDIF.

  SELECT *
    INTO TABLE @DATA(lt_tvakt)
    FROM tvakt
    WHERE spras = '1'.

  TYPES: BEGIN OF ty_vbkd,
           zlsch TYPE vbkd-zlsch , "付款方式
           ktext TYPE t151t-ktext, "客户级别
           kdgrp TYPE vbkd-kdgrp,
           bztxt TYPE t171t-bztxt,
           bzirk TYPE vbkd-bzirk,
         END OF ty_vbkd.
  DATA: lt_vbkd TYPE TABLE OF ty_vbkd,
        ls_vbkd TYPE ty_vbkd.

  SELECT vbkd~zlsch
         t151t~ktext
         t171t~bztxt
  INTO CORRESPONDING FIELDS OF TABLE lt_vbkd
  FROM vbkd
  INNER JOIN t151t ON vbkd~kdgrp = t151t~kdgrp
    INNER JOIN t171t ON vbkd~bzirk = t171t~bzirk
  WHERE vbkd~kdgrp = t151t~kdgrp
    AND vbkd~bzirk = t171t~bzirk.

  SORT:lt_vbep BY vbeln posnr,
       lt_tvakt BY auart .

  LOOP AT gt_vbak INTO gs_vbak.

    READ TABLE lt_vbep
    INTO ls_vbep
    WITH KEY vbeln = gs_vbak-vbeln posnr = gs_vbak-posnr
    BINARY SEARCH.

    READ TABLE lt_vbkd
    INTO ls_vbkd
    WITH KEY kdgrp = t151t-kdgrp bzirk = gs_vbak-bzirk
    BINARY SEARCH.

    IF sy-subrc = 0.
      gs_vbak-wadat = ls_vbep-wadat.
      gs_vbak-ktext = ls_vbkd-ktext.
      gs_vbak-bztxt = ls_vbkd-bztxt.
      gs_vbak-bezei2 = gs_vbak-bezei.
    ENDIF.
    READ TABLE lt_tvakt INTO DATA(ls_tvakt) WITH KEY auart = gs_vbak-auart BINARY SEARCH.
    
    IF sy-subrc = 0.
      gs_vbak-bezei = ls_tvakt-bezei.
    ENDIF.
    MODIFY gt_vbak FROM gs_vbak.
    "APPEND GS_VBAK TO GT_VBAK1.
    CLEAR:gs_vbak.
  ENDLOOP.
ENDFORM.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨天行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值