我做了一个程序,功能是根据物料BOM表来计算各产品的材料成本.(结果就象CK13N的结果,但是针
对多物料.采用分层列表的方式显示.
我条件选择了全部物料,结果运行了3个小时还没结束,我疯了,这样的程序怎么给用户用啊...
原程序如下,请问高手应该怎么改进速度?
************************************************************************
*Program : Computing the Cost By BOM
*Created By: chenys
*Date : 2004/09/21
************************************************************************
REPORT ZPP018 NO STANDARD PAGE HEADING
LINE-SIZE 255 LINE-COUNT 65.
TABLES:MAKT,MBEW,MARA.
DATA: P_I TYPE I .
DATA G_FIELDCATALOG TYPE LVC_T_FCAT.
DATA: BEGIN OF ITTITLES OCCURS 0,
TITLENAME TYPE STRING, "存贮标题
END OF ITTITLES.
DATA: BEGIN OF ITAB_MATNR OCCURS 0,
MATNR LIKE MARA-MATNR,
END OF ITAB_MATNR.
DATA: MATNR LIKE MARA-MATNR.
************************************************************************
*定义输出结构
************************************************************************
DATA:BEGIN OF BOM OCCURS 0 ,
LEVEL TYPE I, "层次
FMATNR LIKE STPO-IDNRK, "父BOM物料号
MATNR LIKE STPO-IDNRK, "物料编码
MAKTX LIKE MAKT-MAKTX, "物料描述
MTART LIKE MARA-MTART, "物料类型
MENGE LIKE STPO-MENGE, "数量
STPRS LIKE MBEW-STPRS, "系统中的标准价格
COST LIKE MBEW-STPRS, "按BOM结构累加的材料成本价
SMATNR LIKE STPO-IDNRK, "第一层所属物料号
XH TYPE I, "序号
END OF BOM.
PARAMETERS:PWERKS LIKE MAST-WERKS OBLIGATORY DEFAULT 2001. "工厂
SELECT-OPTIONS:PMATNR FOR MARA-MATNR OBLIGATORY. "产成品
SELECT-OPTIONS:PMATKL FOR MARA-MATKL .
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF LINE .
PARAMETERS: RB01 RADIOBUTTON GROUP RB .
SELECTION-SCREEN COMMENT (20) TEXT-001 FOR FIELD RB01.
PARAMETERS: RB02 RADIOBUTTON GROUP RB DEFAULT 'X'.
SELECTION-SCREEN COMMENT (20) TEXT-002 FOR FIELD RB02.
PARAMETERS: RB03 RADIOBUTTON GROUP RB .
SELECTION-SCREEN COMMENT (20) TEXT-003 FOR FIELD RB03.
SELECTION-SCREEN END OF LINE .
START-OF-SELECTION.
SELECT MATNR INTO TABLE ITAB_MATNR FROM MARA
WHERE MATNR IN PMATNR AND MATKL IN PMATKL
AND ( MATKL LIKE '%66' OR MATKL LIKE '%76' )
AND MATKL NOT LIKE 'EG%'
.
IF SY-SUBRC <> 0.
MESSAGE S011(ZMV03) WITH '物料不存在或您没有查看权限,请检查输入' .
STOP.
ENDIF.
LOOP AT ITAB_MATNR.
P_I = 0.
BOM-LEVEL = 0.
BOM-SMATNR = ITAB_MATNR-MATNR.
BOM-FMATNR = ITAB_MATNR-MATNR.
BOM-MATNR = ITAB_MATNR-MATNR.
BOM-MENGE = 1.
APPEND BOM.
MATNR = ITAB_MATNR-MATNR.
PERFORM GETSUBDATA.
ENDLOOP.
PERFORM GETPRICE.
PERFORM ZLSJ.
PERFORM DISP_GRID.
*---------------------------------------------------------------------*
* FORM DISP_GRID *
*---------------------------------------------------------------------*
* 打印 *
*---------------------------------------------------------------------*
FORM DISP_GRID.
ITTITLES-TITLENAME = '在BOM中的层次'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '父BOM物料号'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '物料编码'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '物料描述'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '物料类型'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '数量'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '物料标准价'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '材料成本'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '原始BOM所属物料'.
APPEND ITTITLES.
ITTITLES-TITLENAME = '序号'.
APPEND ITTITLES.
CALL FUNCTION 'Z_GRID_DISP'
EXPORTING
I_PROGRAM_NAME = SY-CPROG
I_INTERNAL_TABNAME = 'BOM'
I_UCOMM_FORM = ''
I_STATUS_FORM = ''
I_TEXT1 =
'您所选的条件中如有EC产品,则EC产品会被滤除!'
I_TEXT2 =
'按BOM计算的成品材料成本(按标准成本计算)'
TABLES
IT_TITLES = ITTITLES
CHANGING
IT_FIELDCATALOG = G_FIELDCATALOG
IT_OUTTAB = BOM[].
ENDFORM.
*---------------------------------------------------------------------*
* FORM GETSUBDATA *
*---------------------------------------------------------------------*
* 获取多层次BOM表物料, *
*---------------------------------------------------------------------*
FORM GETSUBDATA.
TABLES:MAST,STPO,STAS.
P_I = P_I + 1.
SELECT * FROM MAST
WHERE WERKS = PWERKS
AND MATNR = MATNR AND STLAL = '01'.
IF SY-SUBRC <> 0 . "如果找不到此物料子BOM,则无条件退出此FORM
P_I = P_I - 1.
EXIT.
ELSE.
ENDIF.
SELECT * FROM STAS
WHERE STLNR = MAST-STLNR
AND STLAL = MAST-STLAL.
SELECT * FROM STPO
WHERE STLNR = STAS-STLNR
AND STLKN = STAS-STLKN.
BOM-FMATNR = MAST-MATNR.
BOM-MATNR = STPO-IDNRK.
BOM-MENGE = STPO-MENGE.
BOM-LEVEL = P_I.
APPEND BOM.
*判断此物料是否有子BOM,如有则增加子BOM物料.
MATNR = STPO-IDNRK.
PERFORM GETSUBDATA.
ENDSELECT.
ENDSELECT.
ENDSELECT.
P_I = P_I - 1.
ENDFORM.
*---------------------------------------------------------------------*
* FORM GETPRICE *
*---------------------------------------------------------------------*
* 获取物料价格,物料描述等资料 *
*---------------------------------------------------------------------*
FORM GETPRICE.
LOOP AT BOM.
SELECT SINGLE MAKTX INTO BOM-MAKTX FROM MAKT
WHERE MATNR = BOM-MATNR AND SPRAS = 1.
SELECT SINGLE MTART INTO BOM-MTART FROM MARA
WHERE MATNR = BOM-MATNR.
SELECT SINGLE * FROM MBEW "获取系统中已有的标准价格
WHERE MATNR = BOM-MATNR AND BWKEY = PWERKS.
IF SY-SUBRC = 0.
IF MBEW-PEINH <> 0 .
BOM-STPRS = MBEW-STPRS / MBEW-PEINH.
ENDIF.
ELSE.
ENDIF.
BOM-COST = BOM-STPRS * BOM-MENGE."如果有子BOM,则待调整.
MODIFY BOM.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM ZLSJ *
*---------------------------------------------------------------------*
* 对分层BOM物料金额根据子BOM表进行逐层汇总 *
*---------------------------------------------------------------------*
FORM ZLSJ.
DATA : P_P TYPE P DECIMALS 4.
DATA BOM2 LIKE BOM OCCURS 0 WITH HEADER LINE .
DATA SMATNR LIKE MARA-MATNR.
LOOP AT BOM.
BOM-XH = SY-TABIX.
MODIFY BOM.
IF RB01 IS INITIAL.
IF BOM-COST = 0.
DELETE BOM.
ENDIF.
ENDIF.
ENDLOOP.
SORT BOM BY SMATNR LEVEL DESCENDING FMATNR.
P_P = 0.
LOOP AT BOM .
AT NEW SMATNR.
SMATNR = BOM-SMATNR.
ENDAT.
AT NEW FMATNR.
P_P = 0.
ENDAT.
P_P = P_P + BOM-COST.
AT END OF FMATNR.
READ TABLE BOM WITH KEY MATNR = BOM-FMATNR
SMATNR = SMATNR.
IF SY-SUBRC = 0 .
BOM-COST = BOM-MENGE * P_P.
MODIFY BOM INDEX SY-TABIX .
ENDIF.
ENDAT.
ENDLOOP.
SORT BOM BY XH.
IF NOT RB03 IS INITIAL."如果选择条件只需显示汇总层,则删除明细数据
LOOP AT BOM.
IF BOM-LEVEL <> 0.
DELETE BOM.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
====================================================================
楼上老兄,首先要看你的程序中所用到的几个表中,哪张表或哪几张表慢,主要是索引不正确,
才会这么慢,你先运行你的程序,然后用sto4去看你的sql 语句,里面有一个数据分析,系统可
以帮你分析出它运行时的评估成本是多少,选择哪一个索引表,还是全表scan,如果评估成本很
高就说明你的这张表运行起来很慢,你需要加索引来提高运行速度,还有就是你的程序中的嵌套
是不是可以改进等。
=====================================================================
通过st05去分析一下吧,