ABAP程序的性能优化啊.

这篇博客介绍了ABAP程序的性能优化,包括历史修改记录、数据表定义、宏定义和BDC数据处理等,旨在提升系统运行效率。
摘要由CSDN通过智能技术生成

*===============================基本信息===============================*
* 标题:销售订单评审一览表
* 创建日期:2006-03-15       
* 基本描述:XXX        
*===============================更改日志===============================*
* 申请号       日期         修改人           更改描述
* 2008-04修改新老产品,“新/老产品”--BOM和CQS使用取于物料主数据,CQS评
* 审完后修改物料主数据由新产品更改为老产品。视图更改:CQS评审更改物料定
* 价组,只开通修改销售视图,所以BDC所选的位置是2
* 2008-04-07增加ZAR的订单类型,为益周物流(物控,生管,采购)在"生管评审备注"
* 填写生产异常信息
** 2008-06-24  同一订单下的相同新产品把第二项改成老产品。(取消)
* 2008-09-27   优化
* 2008-11-25 从20081202后的免费订单由GCM评审
* 2008-12-11 放开ZAR订单查看的权限
* 2009-01-19 CQS评审时不仅带出评审帐号且带上电脑名
* 2009-01-21 增加ZMJ收费无料号样品订单评审,只要GCM评审
* 2009-03-05 取消ZMJ样品订单的评审
* 2009-03-18 销售人员姓名改为取自订单版本号 YLT
*CQS权限说明  WTCQS帐号只能评审不为A,B,C,Y的料号;YJCQS不能评审80R的料号
* 2009-07-10 增加送达方
*===============================定    义===============================*

************************************************************************
* 基本代码
************************************************************************
REPORT ZR_SD_043
NO STANDARD PAGE HEADING
LINE-COUNT 65
LINE-SIZE  150
MESSAGE-ID ZSD1.

************************************************************************
* INCLUDE:包含文件
************************************************************************
INCLUDE OLE2INCL.

************************************************************************
* TABLE: 定义内表和TABLE
************************************************************************
TABLES: MARC,MARA, T001W, MAKT, VBAK,VBEP,VBAP,JEST,JCDS,ONRVB,MAST,STKO,MVKE,ZJCDS.
************************************************************************
* TYPE : 定义数据类型
************************************************************************
TYPE-POOLS: SLIS.
*报表最后输出时使用的数据
DATA:  T_VBAK1 LIKE VBAK OCCURS 0 WITH HEADER LINE.         "销售订单
DATA:  T_TEMP  LIKE VBAP OCCURS 0 WITH HEADER LINE.        "YILT 销售订单项目数据
DATA: FLAG.
DATA: BEGIN OF T_VBAK OCCURS 0.
        INCLUDE STRUCTURE T_VBAK1.
DATA NAME1 LIKE KNA1-NAME1.
DATA BZ(80).
DATA FLAG.
DATA: END OF T_VBAK.
DATA: BEGIN OF T_VBAP1 OCCURS 0,
         POSNR LIKE VBAP-POSNR,
         MATNR LIKE VBAP-MATNR,
         MAKTX LIKE MAKT-MAKTX,
         ZMENG LIKE VBAP-ZMENG,
         MEINS LIKE VBAP-MEINS,
         NETWR_D LIKE VBAP-NETWR,
         KWMENG LIKE VBAP-KWMENG,
         KDMAT LIKE VBAP-KDMAT,
         KONDM LIKE VBAP-KONDM,
         MMKON LIKE MVKE-KONDM,
         ABGRU LIKE VBAP-ABGRU,
         SERNR LIKE VBAP-SERNR,
         VTEXT LIKE T178T-VTEXT,
         SOVTE LIKE T178T-VTEXT,
         VTEXT1 LIKE TSPAT-VTEXT,
         NAME1 LIKE KNA1-NAME1,
         DISPO LIKE MARC-DISPO,
         BISMT LIKE MARA-BISMT,

      END OF T_VBAP1.


DATA: BEGIN  OF  IT_PRINT_001  OCCURS  0.
DATA FLAG.
DATA: COLOR1 TYPE SLIS_T_SPECIALCOL_ALV.

        INCLUDE STRUCTURE T_VBAK1.
        INCLUDE STRUCTURE T_VBAP1.
DATA BSTKD_E LIKE VBKD-BSTKD_E.
DATA XL(130).
DATA E1.
DATA ET1(130).
DATA E2.
DATA ET2(40).
DATA E3.
DATA ET3(40).
DATA E4.
DATA ET4(132).
DATA E5.  "免费订单GCM评审状态
DATA ET5(132).
DATA COLOR(4) TYPE C .  "显示颜色-- PPAP订单为黄色 ELIN 09-06-30

*DATA BSTKD_E LIKE VBKD-BSTKD_E.               "谢明志 05-08-18
DATA STRGR LIKE MARC-STRGR.
DATA ZKUNNR LIKE VBAK-KUNNR.     "送达方客户号
DATA NAME2 LIKE KNA1-NAME1.      "送达方名称
DATA SNAME LIKE PA0001-SNAME.    "销售人员姓名
DATA USNAM0 LIKE JCDS-USNAM.
DATA UDATE0 LIKE JCDS-UDATE.
DATA UTIME0 LIKE JCDS-UTIME.
DATA USNAM01(12).

DATA USNAM1 LIKE JCDS-USNAM.
DATA UDATE1 LIKE JCDS-UDATE.
DATA UTIME1 LIKE JCDS-UTIME.
DATA USNAM11(12).

DATA USNAM2 LIKE JCDS-USNAM.
DATA IPDEC2(16) TYPE C.  "取CQS评审人的IP
DATA HOST2(25) TYPE C.  "取CQS评审人的电脑名
DATA ZNAME LIKE ZDT02-ZNAME. "CQS评审人姓名
DATA UDATE2 LIKE JCDS-UDATE.
DATA UTIME2 LIKE JCDS-UTIME.
DATA USNAM21(12).

DATA USNAM3 LIKE JCDS-USNAM.
DATA UDATE3 LIKE JCDS-UDATE.
DATA UTIME3 LIKE JCDS-UTIME.
DATA USNAM31(12).
*免费订单由GCM评审
DATA USNAM4 LIKE JCDS-USNAM.
DATA UDATE4 LIKE JCDS-UDATE.
DATA UTIME4 LIKE JCDS-UTIME.
DATA USNAM41(12).

DATA :OBJNR1 LIKE ONRVB-OBJNR,
      OBJNR2 LIKE ONRVB-OBJNR,
      EDATU LIKE VBEP-EDATU,

      WERKS LIKE VBAP-WERKS,
      STLST LIKE STKO-STLST    "BOM状态
      .

DATA: END  OF  IT_PRINT_001.
DATA Z_AREA LIKE IT_PRINT_001.
DATA L_TEMP LIKE LINE OF IT_PRINT_001.
DATA: IP_UNAME TYPE USR41-TERMINAL.
DATA: P_REPORT,
      P_ALV.
*长文本信息
DATA: IT_LTEXT TYPE STANDARD TABLE OF TLINE
      INITIAL SIZE 1 WITH HEADER LINE.

*BDC使用的参数
DATA:  IT_BDCDATA_001 LIKE STANDARD TABLE OF BDCDATA INITIAL SIZE 6
WITH HEADER LINE,SESSION LIKE APQI-GROUPID.


*读取EXCEL表格后,存放数据
*NEED MODIFY: 根据EXCEL表格字段量的不同做修改。这里只适用不多于5个字
*段的情况,如有更多的字段,则必须进行相应的扩展。扩展后子程序
*F_FILE_READ_DATA的也要做相应的扩展。
DATA: BEGIN OF IT_EXCEL_001 OCCURS 0,
        COLUMN_001(20) ,
        COLUMN_002(20) ,
        COLUMN_003(20) ,
        COLUMN_004(20) ,
        COLUMN_005(20) ,
END OF IT_EXCEL_001.

DATA: BEGIN OF IT_SELECT_CONDITION OCCURS 0,
        SIGN(1) ,
        OPTION(2) ,
        LOW(8) ,
        HIGH(8) ,
END OF IT_SELECT_CONDITION.

************************************************************************
* CONSTANTS : 定义常量
************************************************************************


************************************************************************
* TYPE : 定义数据类型
************************************************************************
TYPE-POOLS: SLIS.

************************************************************************
* DATA : 定义变量
************************************************************************

*用于绘制普通REPORT
DATA G_WRITE_COUNT TYPE I VALUE 0.
DATA G_INIT_COUNT TYPE I VALUE 0.
DATA G_LAST_FILED_WIDTH TYPE I VALUE 0.
TYPES  TYPE_IT_WRITE_POSITION  TYPE  I  OCCURS  0 .
DATA IT_WRITE_POSITION TYPE TYPE_IT_WRITE_POSITION.

*用于ALV控件双击事件
DATA: G_SELECTED_FIELD_VALUE(80).
DATA: G_TABINDEX TYPE I.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.  "用于显示不同颜色
*ALV控件构造时需要的参数
DATA: G_ALV_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
      G_ALV_FIELDCAT_LINE LIKE LINE OF G_ALV_FIELDCAT,
      G_ALV_EVENT         TYPE SLIS_T_EVENT.

*读取EXCEL文件时需要的对象
DATA EXCEL TYPE OLE2_OBJECT.
DATA WORKBOOK TYPE OLE2_OBJECT.
DATA CELL TYPE OLE2_OBJECT.

*ALV控件输出的表头
DATA: G_ALV_LISTHEADER TYPE SLIS_T_LISTHEADER.

*指定ALV控件触发TOP_OF_PAGE事件时调用的子程序
DATA: G_ALV_FORMNAME_TOP_OF_PAGE TYPE SLIS_FORMNAME
                             VALUE 'F_ALV_EVENT_TOP_OF_PAGE'.
*指定ALV控件触发END_OF_LIST事件时调用的子程序
DATA: G_ALV_FORMNAME_END_OF_LIST TYPE SLIS_FORMNAME
                             VALUE 'F_ALV_EVENT_END_OF_LIST'.

*指定ALV控件的显示特征
DATA : G_ALV_LAYOUT                 TYPE SLIS_LAYOUT_ALV.
*BDC
DATA:  MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER
LINE.
************************************************************************
* DEFINE: 定义宏
************************************************************************
*普通报表格式的输出宏
DEFINE MACRO001.
  WRITE: "NEED MODIFY
    /1 &1,
    21 &2,
    41 &3,
    61 &4,
    81 &5,
    100 &6.
END-OF-DEFINITION.

************************************************************************
*  SELECTION SCREEN : 定义报表筛选条件
************************************************************************
*确定过滤参数
SELECTION-SCREEN BEGIN OF BLOCK FLAG WITH FRAME TITLE BLK_001 .
SELECT-OPTIONS : S_VBELN FOR VBAK-VBELN,
                 S_POSNR FOR VBAP-POSNR,
                 S_VKORG FOR VBAK-VKORG OBLIGATORY MEMORY ID VOK ,
                 S_VTWEG FOR VBAK-VTWEG,
                 S_SPART FOR VBAK-SPART,
                 S_VKBUR FOR VBAK-VKBUR,
                 S_VKGRP FOR VBAK-VKGRP,
                 S_KUNNR FOR VBAK-KUNNR,
                 S_ERDAT FOR VBAK-ERDAT,
                 S_VDATU FOR VBAK-VDATU,
                 S_EDATU FOR VBEP-EDATU,   "YLT 增加行项目交期
                 S_MATNR FOR MARC-MATNR,
                 S_DISPO FOR MARC-DISPO,
                 S_AUGRU FOR VBAK-AUGRU,
                 S_ABGRU FOR VBAP-ABGRU,
                 S_KONDM FOR VBAP-KONDM.
*                 S_MMKON FOR MVKE-KONDM.
PARAMETERS: SGD AS CHECKBOX DEFAULT ''."启用生管过滤评审时间
SELECT-OPTIONS :S_UDATE FOR JCDS-UDATE.
SELECT-OPTIONS S_STLST FOR STKO-STLST.
SELECTION-SCREEN END OF BLOCK FLAG.

SELECTION-SCREEN BEGIN OF BLOCK BLK_002 WITH FRAME TITLE BLK_002 .
PARAMETERS:
            S_ALL RADIOBUTTON GROUP R1 ,
            S_PS RADIOBUTTON GROUP R1 DEFAULT 'X',
            EPLAS RADIOBUTTON GROUP R1 ,
            S_AZFD  RADIOBUTTON GROUP R1 ,  "所有免费订单
            S_ZFD RADIOBUTTON GROUP R1 .      "所有未评审的免费订单

SELECTION-SCREEN END OF BLOCK BLK_002.
*选择文件
*NEED MODIFY:当要使用文件功能时,只要将代码“NO-DISPLAY”去掉即可
*代码“NO-DISPLAY”的作用:隐藏参数
SELECTION-SCREEN BEGIN OF BLOCK BLK_003 WITH FRAME TITLE BLK_003 .
PARAMETERS: P_FILE LIKE CFFILE-FILENAME NO-DISPLAY  .
SELECTION-SCREEN END OF BLOCK BLK_003.

*===============================事    件===============================*
************************************************************************
* INITIALIZATION.启动程序开始执行
************************************************************************


************************************************************************
* AT SELECTION SCREEN:
************************************************************************
AT SELECTION-SCREEN.
  PERFORM F_CHECK_INPUT.          "检查用户输入


INITIALIZATION.
  BLK_001 = '检索参数---PPAP订单为黄色背景色!'.
  BLK_002 = '报表类型'.
  BLK_003 = '文件参数'.

 

**用于弹出文件对话框
*NEED MODIFY:当要使用文件功能时,只要将以下代码的注释去掉即可
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
*  PERFORM F_FILE_GET.

************************************************************************
* START OF SELECTION:
************************************************************************
START-OF-SELECTION.
*往数据库增加运行日志
  DATA: BEGIN  OF  IT_ZREPORTLOG OCCURS  0.
  INCLUDE TYPE ZREPORTLOG.
  DATA: END  OF IT_ZREPORTLOG .

  IT_ZREPORTLOG-MANDT = SY-MANDT.
  IT_ZREPORTLOG-TCODE = SY-TCODE.
  IT_ZREPORTLOG-DATUM = SY-DATUM.
  IT_ZREPORTLOG-UZEIT = SY-UZEIT.
  IT_ZREPORTLOG-UNAME = SY-UNAME.
  IT_ZREPORTLOG-TITLE = SY-TITLE.
  APPEND IT_ZREPORTLOG.
  INSERT INTO ZREPORTLOG VALUES IT_ZREPORTLOG .
*如果P_FILE有赋值,则进行EXCEL文件读取
  IF P_FILE <> ''.
    PERFORM F_FILE_OPEN.           "文件2.打开文件
    PERFORM F_FILE_READ_DATA.      "文件3.取文件中的数据
    PERFORM F_FILE_CLOSE.          "文件3.关闭文件
  ENDIF.

  PERFORM F_READ_DATA.


************************************************************************
* END OF SELECTION
************************************************************************
END-OF-SELECTION.
*  IF P_REPORT = 'X'.
*    PERFORM F_PRINT_REPORT.
*  ELSEIF P_ALV = 'X'.
  PERFORM F_PRINT_ALV.
*  ELSEIF P_FORM = 'X'.
*    PERFORM F_PRINT_FORM.
*ENDIF.

************************************************************************
* TOP OF PAGE
************************************************************************
TOP-OF-PAGE.

************************************************************************
* END OF PAGE
************************************************************************
END-OF-PAGE.

************************************************************************
* LINE SELECTION
************************************************************************
AT LINE-SELECTION .

************************************************************************
* AT PFXX:
************************************************************************
  AT PFXX.

************************************************************************
* AT USER-COMMAND
************************************************************************
AT USER-COMMAND.


*===============================子 例 程===============================*
************************************************************************
*过滤条件有效性检查
FORM F_CHECK_INPUT.
*增加销售机构权限检查BY PXY AT 08-06-02
  TABLES:T001.
  SELECT T001~BUKRS
  FROM T001
    INTO T001-BUKRS
    WHERE T001~BUKRS IN S_VKORG.
    AUTHORITY-CHECK OBJECT 'ZREPORT' ID 'BEGRU' FIELD 'CO.'
                                     ID 'BUKRS' FIELD T001-BUKRS.
    IF SY-SUBRC <> 0 .
      MESSAGE E026 WITH S_VKORG.
    ENDIF.
  ENDSELECT.

  IF EPLAS = 'X'.
* 权限控制,S43D权限组能修改“生产评审意见”的相关字段
*    AUTHORITY-CHECK OBJECT 'ZREPORT' ID 'BEGRU' FIELD 'S43D' ID 'BUKRS' FIELD T001-BUKRS..
*    IF SY-SUBRC <> 0 .
*      MESSAGE E015.
*    ENDIF.
  ENDIF.
ENDFORM.                    " F_CHECK_INPUT
************************************************************************
*从数据库中读取数据,填充报表输出时所用的内表
FORM F_READ_DATA .
  DATA: CELLCOLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
  IF EPLAS = 'X'.
    SELECT *
   FROM  VBAP
   INNER JOIN VBAK
       ON VBAK~VBELN = VBAP~VBELN
*   INNER JOIN ONRVB
*       ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
   INNER JOIN VBEP
       ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
*   INNER JOIN JEST
*       ON JEST~OBJNR = ONRVB~OBJNR
*      AND JEST~INACT = ''
*      AND JEST~CHGNR = '001'
   INNER JOIN MARC
       ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
   INNER JOIN MARA
       ON VBAP~MATNR = MARA~MATNR
   INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
   WHERE VBAK~VBELN IN S_VBELN
     AND VBAP~POSNR IN S_POSNR
     AND VBAK~VKORG IN S_VKORG
     AND VBAK~VTWEG IN S_VTWEG
     AND VBAK~SPART IN S_SPART
     AND VBAK~VKBUR IN S_VKBUR
     AND VBAK~VKGRP IN S_VKGRP
     AND VBAK~KUNNR IN S_KUNNR
     AND VBAK~ERDAT IN S_ERDAT
     AND VBAK~VDATU IN S_VDATU
     AND VBEP~EDATU IN S_EDATU  "行项目交期
     AND VBAK~AUGRU IN S_AUGRU
     AND VBAP~ABGRU IN S_ABGRU
     AND VBAK~AUART = 'ZAR'  "EPLAS不需要订单评审的生管备注
     AND MARC~DISPO IN S_DISPO
     AND MARC~MATNR IN S_MATNR
     AND VBAP~KONDM IN S_KONDM.
*  ELSEIF S_ALL = ''.
  ELSEIF S_PS = 'X'.
    SELECT *
   FROM  VBAP
   INNER JOIN VBAK
       ON VBAK~VBELN = VBAP~VBELN
   INNER JOIN ONRVB
       ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
   INNER JOIN VBEP
       ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
   INNER JOIN JEST
       ON JEST~OBJNR = ONRVB~OBJNR
      AND JEST~INACT = ''
      AND JEST~CHGNR = '001'
   INNER JOIN MARC
       ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
   INNER JOIN MARA
       ON VBAP~MATNR = MARA~MATNR
   INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
   WHERE VBAK~VBELN IN S_VBELN
     AND VBAP~POSNR IN S_POSNR
     AND VBAK~VKORG IN S_VKORG
     AND VBAK~VTWEG IN S_VTWEG
     AND VBAK~SPART IN S_SPART
     AND VBAK~VKBUR IN S_VKBUR
     AND VBAK~VKGRP IN S_VKGRP
     AND VBAK~KUNNR IN S_KUNNR
     AND VBAK~ERDAT IN S_ERDAT
     AND VBAK~VDATU IN S_VDATU
     AND VBEP~EDATU IN S_EDATU  "行项目交期
     AND VBAK~AUGRU IN S_AUGRU
     AND VBAP~ABGRU IN S_ABGRU
     AND ( VBAK~AUART = 'ZOR' OR VBAK~AUART = 'ZSD'
        OR VBAK~AUART = 'ZKB' OR VBAK~AUART = 'ZTJ'  )
*        OR VBAK~AUART = 'ZFD' OR VBAK~AUART = 'ZKB' )  "免费订单用另外的处理方式
     AND MARC~DISPO IN S_DISPO
     AND MARC~MATNR IN S_MATNR
     AND VBAP~KONDM IN S_KONDM
     AND ( JEST~STAT = 'E0001' OR JEST~STAT = 'E0002' OR JEST~STAT = 'E0003' ).

    SELECT *
FROM  VBAP
INNER JOIN VBAK
ON VBAK~VBELN = VBAP~VBELN
INNER JOIN ONRVB
ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
INNER JOIN VBEP
ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
INNER JOIN JEST
ON JEST~OBJNR = ONRVB~OBJNR
AND JEST~INACT = ''
AND JEST~CHGNR = '001'
INNER JOIN MARC
ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
INNER JOIN MARA
ON VBAP~MATNR = MARA~MATNR
APPENDING CORRESPONDING FIELDS OF TABLE IT_PRINT_001
WHERE VBAK~VBELN IN S_VBELN
AND VBAP~POSNR IN S_POSNR
AND VBAK~VKORG IN S_VKORG
AND VBAK~VTWEG IN S_VTWEG
AND VBAK~SPART IN S_SPART
AND VBAK~VKBUR IN S_VKBUR
AND VBAK~VKGRP IN S_VKGRP
AND VBAK~KUNNR IN S_KUNNR
AND VBAK~ERDAT IN S_ERDAT
AND VBAK~VDATU IN S_VDATU
AND VBEP~EDATU IN S_EDATU  "行项目交期
AND VBAK~AUGRU IN S_AUGRU
AND VBAP~ABGRU IN S_ABGRU
AND VBAK~AUART = 'ZFD'     "免费订单用另外的处理方式
AND MARC~DISPO IN S_DISPO
AND MARC~MATNR IN S_MATNR
AND VBAP~KONDM IN S_KONDM
*     AND VBAK~ERDAT <= '20081202' "在此日期前的免费订单为三个状态
AND VBAK~ERDAT <= '20081201' "在此日期前的免费订单为三个状态
AND ( JEST~STAT = 'E0001' OR JEST~STAT = 'E0002' OR JEST~STAT = 'E0003').

    SELECT *
FROM  VBAP
INNER JOIN VBAK
  ON VBAK~VBELN = VBAP~VBELN
INNER JOIN ONRVB
  ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
INNER JOIN VBEP
  ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
INNER JOIN JEST
  ON JEST~OBJNR = ONRVB~OBJNR
 AND JEST~INACT = ''
 AND JEST~CHGNR = '001'
INNER JOIN MARC
  ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
INNER JOIN MARA
  ON VBAP~MATNR = MARA~MATNR
APPENDING CORRESPONDING FIELDS OF TABLE IT_PRINT_001
WHERE VBAK~VBELN IN S_VBELN
AND VBAP~POSNR IN S_POSNR
AND VBAK~VKORG IN S_VKORG
AND VBAK~VTWEG IN S_VTWEG
AND VBAK~SPART IN S_SPART
AND VBAK~VKBUR IN S_VKBUR
AND VBAK~VKGRP IN S_VKGRP
AND VBAK~KUNNR IN S_KUNNR
AND VBAK~ERDAT IN S_ERDAT
AND VBAK~VDATU IN S_VDATU
AND VBEP~EDATU IN S_EDATU  "行项目交期
AND VBAK~AUGRU IN S_AUGRU
AND VBAP~ABGRU IN S_ABGRU
AND VBAK~AUART = 'ZFD'     "免费订单用另外的处理方式
AND MARC~DISPO IN S_DISPO
AND MARC~MATNR IN S_MATNR
AND VBAP~KONDM IN S_KONDM
*     AND VBAK~ERDAT > '20081202'
AND VBAK~ERDAT > '20081201'
AND ( JEST~STAT = 'E0001' OR JEST~STAT = 'E0002' OR JEST~STAT = 'E0003'  OR JEST~STAT = 'E0004').

*    SELECT *
*FROM  VBAP
*INNER JOIN VBAK
*  ON VBAK~VBELN = VBAP~VBELN
*INNER JOIN ONRVB
*  ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
*INNER JOIN VBEP
*  ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
*INNER JOIN JEST
*  ON JEST~OBJNR = ONRVB~OBJNR
* AND JEST~INACT = ''
* AND JEST~CHGNR = '001'
*INNER JOIN MARC
*  ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
*INNER JOIN MARA
*  ON VBAP~MATNR = MARA~MATNR
*APPENDING CORRESPONDING FIELDS OF TABLE IT_PRINT_001
*WHERE VBAK~VBELN IN S_VBELN
*AND VBAP~POSNR IN S_POSNR
*AND VBAK~VKORG IN S_VKORG
*AND VBAK~VTWEG IN S_VTWEG
*AND VBAK~SPART IN S_SPART
*AND VBAK~VKBUR IN S_VKBUR
*AND VBAK~VKGRP IN S_VKGRP
*AND VBAK~KUNNR IN S_KUNNR
*AND VBAK~ERDAT IN S_ERDAT
*AND VBAK~VDATU IN S_VDATU
*AND VBEP~EDATU IN S_EDATU  "行项目交期
*AND VBAK~AUGRU IN S_AUGRU
*AND VBAP~ABGRU IN S_ABGRU
*AND VBAK~AUART = 'ZMJ'
*AND MARC~DISPO IN S_DISPO
*AND MARC~MATNR IN S_MATNR
*AND VBAP~KONDM IN S_KONDM
*AND ( JEST~STAT = 'E0001' ).

  ELSEIF S_ZFD = 'X'.

    SELECT *
FROM  VBAP
INNER JOIN VBAK
ON VBAK~VBELN = VBAP~VBELN
INNER JOIN ONRVB
ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
INNER JOIN VBEP
ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
INNER JOIN JEST
ON JEST~OBJNR = ONRVB~OBJNR
AND JEST~INACT = ''
AND JEST~CHGNR = '001'
INNER JOIN MARC
ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
INNER JOIN MARA
ON VBAP~MATNR = MARA~MATNR
INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
WHERE VBAK~VBELN IN S_VBELN
AND VBAP~POSNR IN S_POSNR
AND VBAK~VKORG IN S_VKORG
AND VBAK~VTWEG IN S_VTWEG
AND VBAK~SPART IN S_SPART
AND VBAK~VKBUR IN S_VKBUR
AND VBAK~VKGRP IN S_VKGRP
AND VBAK~KUNNR IN S_KUNNR
AND VBAK~ERDAT IN S_ERDAT
AND VBAK~VDATU IN S_VDATU
AND VBEP~EDATU IN S_EDATU  "行项目交期
AND VBAK~AUGRU IN S_AUGRU
AND VBAP~ABGRU IN S_ABGRU
AND VBAK~AUART = 'ZFD'     "免费订单用另外的处理方式
AND MARC~DISPO IN S_DISPO
AND MARC~MATNR IN S_MATNR
AND VBAP~KONDM IN S_KONDM
*     AND VBAK~ERDAT <= '20081202'  "在此日期前的免费订单为三个状态
AND VBAK~ERDAT <= '20081201'  "在此日期前的免费订单为三个状态
AND ( JEST~STAT = 'E0001' OR JEST~STAT = 'E0002' OR JEST~STAT = 'E0003').

    SELECT *
FROM  VBAP
INNER JOIN VBAK
  ON VBAK~VBELN = VBAP~VBELN
INNER JOIN ONRVB
  ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
INNER JOIN VBEP
  ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
INNER JOIN JEST
  ON JEST~OBJNR = ONRVB~OBJNR
 AND JEST~INACT = ''
 AND JEST~CHGNR = '001'
INNER JOIN MARC
  ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
INNER JOIN MARA
  ON VBAP~MATNR = MARA~MATNR
APPENDING CORRESPONDING FIELDS OF TABLE IT_PRINT_001
WHERE VBAK~VBELN IN S_VBELN
AND VBAP~POSNR IN S_POSNR
AND VBAK~VKORG IN S_VKORG
AND VBAK~VTWEG IN S_VTWEG
AND VBAK~SPART IN S_SPART
AND VBAK~VKBUR IN S_VKBUR
AND VBAK~VKGRP IN S_VKGRP
AND VBAK~KUNNR IN S_KUNNR
AND VBAK~ERDAT IN S_ERDAT
AND VBAK~VDATU IN S_VDATU
AND VBEP~EDATU IN S_EDATU  "行项目交期
AND VBAK~AUGRU IN S_AUGRU
AND VBAP~ABGRU IN S_ABGRU
AND VBAK~AUART = 'ZFD'     "免费订单用另外的处理方式
AND MARC~DISPO IN S_DISPO
AND MARC~MATNR IN S_MATNR
AND VBAP~KONDM IN S_KONDM
*     AND VBAK~ERDAT > '20081202'
AND VBAK~ERDAT > '20081201'
AND ( JEST~STAT = 'E0001' OR JEST~STAT = 'E0002' OR JEST~STAT = 'E0003'  OR JEST~STAT = 'E0004').

*    SELECT *
*FROM  VBAP
*INNER JOIN VBAK
*  ON VBAK~VBELN = VBAP~VBELN
*INNER JOIN ONRVB
*  ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
*INNER JOIN VBEP
*  ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
*INNER JOIN JEST
*  ON JEST~OBJNR = ONRVB~OBJNR
* AND JEST~INACT = ''
* AND JEST~CHGNR = '001'
*INNER JOIN MARC
*  ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
*INNER JOIN MARA
*  ON VBAP~MATNR = MARA~MATNR
*APPENDING CORRESPONDING FIELDS OF TABLE IT_PRINT_001
*WHERE VBAK~VBELN IN S_VBELN
*AND VBAP~POSNR IN S_POSNR
*AND VBAK~VKORG IN S_VKORG
*AND VBAK~VTWEG IN S_VTWEG
*AND VBAK~SPART IN S_SPART
*AND VBAK~VKBUR IN S_VKBUR
*AND VBAK~VKGRP IN S_VKGRP
*AND VBAK~KUNNR IN S_KUNNR
*AND VBAK~ERDAT IN S_ERDAT
*AND VBAK~VDATU IN S_VDATU
*AND VBEP~EDATU IN S_EDATU  "行项目交期
*AND VBAK~AUGRU IN S_AUGRU
*AND VBAP~ABGRU IN S_ABGRU
*AND VBAK~AUART = 'ZMJ'
*AND MARC~DISPO IN S_DISPO
*AND MARC~MATNR IN S_MATNR
*AND VBAP~KONDM IN S_KONDM
*AND ( JEST~STAT = 'E0001').

  ELSE.
    IF SGD = 'X'.
      SELECT *
      FROM  VBAP
      INNER JOIN VBAK
          ON VBAK~VBELN = VBAP~VBELN
      INNER JOIN ONRVB
          ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
      INNER JOIN JCDS
         ON JCDS~OBJNR = ONRVB~OBJNR
        AND JCDS~STAT  = 'E0004'
        AND JCDS~CHIND = 'I'
      INNER JOIN VBEP
          ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
     INNER JOIN MARC
         ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
     INNER JOIN MARA
         ON VBAP~MATNR = MARA~MATNR
      INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
      WHERE VBAK~VBELN IN S_VBELN
        AND VBAP~POSNR IN S_POSNR
        AND VBAK~VKORG IN S_VKORG
        AND VBAK~VTWEG IN S_VTWEG
        AND VBAK~SPART IN S_SPART
        AND VBAK~VKBUR IN S_VKBUR
        AND VBAK~VKGRP IN S_VKGRP
        AND VBAK~KUNNR IN S_KUNNR
        AND VBAK~ERDAT IN S_ERDAT
        AND VBAK~VDATU IN S_VDATU
        AND VBEP~EDATU IN S_EDATU  "行项目交期
        AND VBAK~AUGRU IN S_AUGRU
        AND VBAP~ABGRU IN S_ABGRU
        AND MARC~DISPO IN S_DISPO
        AND MARC~MATNR IN S_MATNR
*      AND JCDS~USNAM IN S_
        AND JCDS~UDATE IN S_UDATE
*      AND JCDS~UTIME IN S_
       AND VBAP~KONDM IN S_KONDM
        AND ( VBAK~AUART = 'ZOR' OR VBAK~AUART = 'ZSD'
           OR VBAK~AUART = 'ZFD' OR VBAK~AUART = 'ZKB'
           OR VBAK~AUART = 'ZTJ' )  .

    ELSEIF S_ALL = 'X'.
      SELECT *
      FROM  VBAP
      INNER JOIN VBAK
          ON VBAK~VBELN = VBAP~VBELN
      INNER JOIN ONRVB
          ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
      INNER JOIN VBEP
          ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
     INNER JOIN MARC
         ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
     INNER JOIN MARA
         ON VBAP~MATNR = MARA~MATNR
      INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
      WHERE VBAK~VBELN IN S_VBELN
        AND VBAP~POSNR IN S_POSNR
        AND VBAK~VKORG IN S_VKORG
        AND VBAK~VTWEG IN S_VTWEG
        AND VBAK~SPART IN S_SPART
        AND VBAK~VKBUR IN S_VKBUR
        AND VBAK~VKGRP IN S_VKGRP
        AND VBAK~KUNNR IN S_KUNNR
        AND VBAK~ERDAT IN S_ERDAT
        AND VBAK~VDATU IN S_VDATU
        AND VBEP~EDATU IN S_EDATU  "行项目交期
        AND VBAK~AUGRU IN S_AUGRU
        AND VBAP~ABGRU IN S_ABGRU
        AND MARC~DISPO IN S_DISPO
        AND MARC~MATNR IN S_MATNR
        AND ( VBAK~AUART = 'ZOR' OR VBAK~AUART = 'ZSD'
        OR VBAK~AUART = 'ZFD'   OR VBAK~AUART = 'ZKB' OR VBAK~AUART = 'ZTJ'
        OR VBAK~AUART = 'ZMJ' )
           .
    ELSEIF S_AZFD = 'X'.
      SELECT *
       FROM  VBAP
       INNER JOIN VBAK
           ON VBAK~VBELN = VBAP~VBELN
       INNER JOIN ONRVB
           ON ONRVB~VBELN = VBAP~VBELN AND ONRVB~POSNR = VBAP~POSNR
       INNER JOIN VBEP
           ON VBEP~VBELN = VBAP~VBELN AND VBEP~POSNR = VBAP~POSNR AND VBEP~ETENR = '0001'
      INNER JOIN MARC
          ON VBAP~MATNR = MARC~MATNR AND VBAP~WERKS = MARC~WERKS
      INNER JOIN MARA
          ON VBAP~MATNR = MARA~MATNR
       INTO CORRESPONDING FIELDS OF TABLE IT_PRINT_001
       WHERE VBAK~VBELN IN S_VBELN
         AND VBAP~POSNR IN S_POSNR
         AND VBAK~VKORG IN S_VKORG
         AND VBAK~VTWEG IN S_VTWEG
         AND VBAK~SPART IN S_SPART
         AND VBAK~VKBUR IN S_VKBUR
         AND VBAK~VKGRP IN S_VKGRP
         AND VBAK~KUNNR IN S_KUNNR
         AND VBAK~ERDAT IN S_ERDAT
         AND VBAK~VDATU IN S_VDATU
         AND VBEP~EDATU IN S_EDATU  "行项目交期
         AND VBAK~AUGRU IN S_AUGRU
         AND VBAP~ABGRU IN S_ABGRU
         AND MARC~DISPO IN S_DISPO
         AND MARC~MATNR IN S_MATNR
         AND ( VBAK~AUART = 'ZFD'  OR VBAK~AUART = 'ZMJ' ) .

    ENDIF.
  ENDIF.

  DATA: ZSTLTY LIKE STKO-STLTY,
        ZSTLNR LIKE STKO-STLNR,
        ZSTLAL LIKE STKO-STLAL,
        ZSTKOZ LIKE STKO-STKOZ.
  LOOP AT IT_PRINT_001.
    SELECT
      STKO~STLTY STKO~STLNR STKO~STLAL MAX( STKO~STKOZ )
    FROM MAST
    INNER JOIN STKO
       ON MAST~STLNR = STKO~STLNR
      AND MAST~STLAL = STKO~STLAL
     INTO (ZSTLTY,ZSTLNR,ZSTLAL,ZSTKOZ)
    WHERE MAST~MATNR = IT_PRINT_001-MATNR
      AND MAST~WERKS = IT_PRINT_001-WERKS
      AND STKO~STLTY = 'M'
      AND MAST~STLAN = '1'
    GROUP BY
      STKO~STLTY STKO~STLNR STKO~STLAL.

    ENDSELECT.

    SELECT
     SINGLE STKO~STLST
      FROM STKO
      INTO IT_PRINT_001-STLST
      WHERE STKO~STLTY = ZSTLTY
      AND STKO~STLNR = ZSTLNR
      AND STKO~STLAL = ZSTLAL
      AND STKO~STKOZ = ZSTKOZ
      AND STKO~STLST IN S_STLST.

    SELECT SINGLE * FROM JEST INTO JEST
WHERE OBJNR = IT_PRINT_001-OBJNR2
 AND STAT = 'E0004'.

    IF SY-SUBRC = 0 .
      DELETE IT_PRINT_001.
    ELSE.
      IF EPLAS = ''."ZAR订单类型不进入判断
        SELECT SINGLE * FROM JEST INTO JEST
         WHERE OBJNR = IT_PRINT_001-OBJNR
           AND STAT = 'E0001'.
        IF SY-SUBRC = 0.
          IT_PRINT_001-E1 = 'X'.
          IF IT_PRINT_001-STLST IN S_STLST.
            IF IT_PRINT_001-OBJNR <> ''.
              IT_PRINT_001-OBJNR1 = IT_PRINT_001-OBJNR.
              REPLACE 'VB0' WITH '0' INTO IT_PRINT_001-OBJNR1.

              CONCATENATE IT_PRINT_001-OBJNR+0(12) '000000' INTO IT_PRINT_001-OBJNR2.
            ELSE.
              CONCATENATE IT_PRINT_001-VBELN IT_PRINT_001-POSNR INTO IT_PRINT_001-OBJNR1.
            ENDIF.
            MODIFY IT_PRINT_001.
            CLEAR IT_PRINT_001.
          ELSE.
            DELETE IT_PRINT_001.
          ENDIF.
        ELSE.
          DELETE IT_PRINT_001.
        ENDIF.
      ENDIF.
    ENDIF.
    CLEAR IT_PRINT_001.
    CLEAR:ZSTLTY,ZSTLNR,ZSTLAL,ZSTKOZ.
  ENDLOOP.
*  LOOP AT IT_PRINT_001.  "YLT 20090718优化程序将下面的LOOP与上面合并
**YILT 080707 益周ZAR的单出不来的调整
**  IF IT_PRINT_001-AUART = 'ZAR' AND IT_PRINT_001-WERKS = '2000'.
**  ELSE.
*    SELECT SINGLE * FROM JEST INTO JEST
*     WHERE OBJNR = IT_PRINT_001-OBJNR2
*       AND STAT = 'E0004'.
*    IF SY-SUBRC = 0.
*      DELETE IT_PRINT_001.
*    ENDIF.
**  ENDIF.
*  ENDLOOP.
*  IF EPLAS = ''."ZAR订单类型不进入判断
*    LOOP AT IT_PRINT_001 .
*      SELECT SINGLE * FROM JEST INTO JEST
*       WHERE OBJNR = IT_PRINT_001-OBJNR
*         AND STAT = 'E0001'.
*      IF SY-SUBRC = 0.
*        IT_PRINT_001-E1 = 'X'.
*        MODIFY IT_PRINT_001.
*        CLEAR IT_PRINT_001.
*      ELSE.
*        DELETE IT_PRINT_001.
*      ENDIF.
*    ENDLOOP.
*  ENDIF.
  LOOP AT IT_PRINT_001.
*送达方编号
    SELECT SINGLE KUNNR FROM VBPA INTO IT_PRINT_001-ZKUNNR
    WHERE VBELN = IT_PRINT_001-VBELN
         AND PARVW = 'WE'.
*计算单价
    IF IT_PRINT_001-KWMENG > 0.
      IT_PRINT_001-NETWR_D = IT_PRINT_001-NETWR / IT_PRINT_001-KWMENG.
    ENDIF.
*取评审文本
*IF IT_PRINT_001-AUART = 'ZFD' AND IT_PRINT_001-ERDAT > '20081202'.
    IF IT_PRINT_001-AUART = 'ZFD' AND IT_PRINT_001-ERDAT > '20081201' AND IT_PRINT_001-VBELN <> '0000043345'.
      PERFORM F_SUB_GET_TEXT
               USING IT_PRINT_001-OBJNR1 '0006'
               CHANGING IT_PRINT_001-ET1.                       "取文本数据

      SELECT SINGLE * FROM JEST INTO JEST
       WHERE OBJNR = IT_PRINT_001-OBJNR
         AND STAT = 'E0002'.
      IF SY-SUBRC = 0.
        IT_PRINT_001-E5 = 'X'.
      ENDIF.
      PERFORM F_SUB_GET_TEXT
               USING IT_PRINT_001-OBJNR1 '0001'
               CHANGING IT_PRINT_001-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值