BitComet 旗下网站

转到日志
相关贴吧:
ABAP code

自动汇总

楼主 发表于:2008-08-30 17:10:47 [回复]

我要对库存中各库存数汇总,但是横排的,每个物料一排,用最后一个栏位对库存汇总。我用ALV做,数据等都已取出,但不知ALV能不能做到这个功能?
希望能自动汇总,而且根据我隐藏或显示哪些栏位自动加减汇总。


report ZSALESREPORT .
TYPE-POOLS: SLIS.
DATA:
FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
FIELDCAT_LN LIKE LINE OF FIELDCAT,
SORTCAT TYPE SLIS_T_SORTINFO_ALV,
SORTCAT_LN LIKE LINE OF SORTCAT,
EVENTCAT TYPE SLIS_T_EVENT,
EVENTCAT_LN LIKE LINE OF EVENTCAT.

DATA: COL_POS TYPE I ,
unitprice type p decimals 3,
totalamount type p decimals 3 .
tables: vbap, vbrk,vbrp .
* 宣告Internal Table
*宣告屏幕显示所需的Internal Table及包含的字段, 如报表要列出 VBAP数据,
*Internal Table 定义如下:
DATA: BEGIN OF isales OCCURS 10 ,
fkdat like vbrk-fkdat,
vbeln like vbrk-vbeln,
kunag like vbrk-kunag,
matnr like vbrp-matnr,
arktx like vbrp-arktx,
fklmg like vbrp-fklmg,
netwr like vbrp-netwr,
mwsbk like vbrk-mwsbk,
bstnk_vf like vbrk-bstnk_vf,
aubel like vbrp-aubel,
end of isales.

data: BEGIN OF isales2 occurs 0 , "isales2 used record isales record
fkdat like vbrk-fkdat,
vbeln like vbrk-vbeln,
kunag like vbrk-kunag,
matnr like vbrp-matnr,
arktx like vbrp-arktx,
fklmg like vbrp-fklmg,
unitprice like vbrp-netwr,
netwr like vbrp-netwr,
mwsbk like vbrk-mwsbk,
totalamount like vbrp-netwr,
bstnk_vf like vbrk-bstnk_vf,
aubel like vbrp-aubel,
end of isales2.

* 选取单号字段不为空白的所有数据记录插入至Internal Table IVBAP:
SELECTION-SCREEN BEGIN OF BLOCK AAAA WITH FRAME TITLE TTL1.
SELECT-OPTIONS: vbeln FOR vbrk-vbeln ."MEMORY ID BUK.
SELECT-OPTIONS: fkdat FOR vbrk-fkdat . "NO-DISPLAY.
SELECT-OPTIONS: kunag FOR vbrk-kunag .
SELECT-OPTIONS: bstnk_vf FOR vbrk-bstnk_vf. "NO-DISPLAY.
SELECT-OPTIONS: aubel FOR vbrp-aubel .
SELECT-OPTIONS: matnr FOR vbrp-matnr. "NO-DISPLAY.SELECTION-SCREEN END
SELECTION-SCREEN END OF BLOCK AAAA.
*&---------------------------------------------------------------
* INITIALIZATION.
*&---------------------------------------------------------------
INITIALIZATION.
TTL1 = '【Please Choose Search Condition:】'.
START-OF-SELECTION.

select a~fkdat
a~vbeln
a~kunag
b~matnr
b~arktx
b~fklmg
b~netwr
a~mwsbk
a~bstnk_vf
b~aubel
into TABLE isales
from vbrk as a inner join vbrp as b on a~vbeln = b~vbeln
where
a~vbeln in vbeln
and a~fkdat in fkdat
and a~kunag in kunag
and b~matnr in matnr
and a~bstnk_vf in bstnk_vf
and b~aubel in aubel .
*----Move data from isale to isale2 and add 2 additional column--- .
clear isales2 .
loop at isales .
move:
isales-fkdat to isales2-fkdat,
isales-vbeln to isales2-vbeln,
isales-kunag to isales2-kunag,
isales-matnr to isales2-matnr,
isales-arktx to isales2-arktx,
isales-fklmg to isales2-fklmg,
isales-netwr to isales2-netwr,
isales-mwsbk to isales2-mwsbk,
isales-bstnk_vf to isales2-bstnk_vf,
isales-aubel to isales2-aubel.
if isales-FKLMG > 0 . "isales-fklmg cannot divide if zero
unitprice = isales-NETWR / isales-FKLMG .
move unitprice to isales2-unitprice.
ELSE.
move unitprice to isales2-unitprice .
endif .
totalamount = isales-NETWR + isales-MWSBK .
move totalamount to isales2-totalamount.
append isales2 .
endloop .


ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'FKDAT' .
FIELDCAT_LN-KEY = 'X'.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Billing Date'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'VBELN'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Billing No'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'KUNAG'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Customer No.' .
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'MATNR'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Mat.No.'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'ARKTX'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Mat Desc'.
APPEND FIELDCAT_LN TO FIELDCAT.


ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'FKLMG'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Qty'.
APPEND FIELDCAT_LN TO FIELDCAT.

*********Additional column unitprice
ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'UNITPRICE'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'UNITPRICE'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'NETWR'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Amount' .
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'MWSBK'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Tax Amount'.
APPEND FIELDCAT_LN TO FIELDCAT.

*********Additional column totalamount
ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'TOTALAMOUNT'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'TOTALAMOUNT'.
APPEND FIELDCAT_LN TO FIELDCAT.


ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'BSTNK_VF'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Customer PO'.
APPEND FIELDCAT_LN TO FIELDCAT.

ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'AUBEL'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Sales Order'.
APPEND FIELDCAT_LN TO FIELDCAT.

SORTCAT_LN-SPOS = '1'.
SORTCAT_LN-FIELDNAME = 'VBELN'.
SORTCAT_LN-UP = 'X'.
SORTCAT_LN-DOWN = SPACE.
SORTCAT_LN-SUBTOT = 'X'.
APPEND SORTCAT_LN TO SORTCAT.

 

* Call ALV Function Module
DATA: PGM LIKE SY-REPID.
PGM = SY-REPID.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = PGM
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
IT_FIELDCAT = FIELDCAT
IT_SORT = SORTCAT
I_SAVE = 'A'
IT_EVENT = EVENTCAT
TABLES
T_OUTTAB = isales2
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
*** User Command Response ***
form USER_COMMAND USING UCOMM LIKE SY-UCOMM
SELFIELD TYPE SLIS_SELFIELD.
READ TABLE ISALES2 INDEX SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
CASE UCOMM.
WHEN '&IC1'.
CASE SELFIELD-SEL_TAB_FIELD.
WHEN 'ISALES2-AUBEL'. " Click sales document to show sales document
SET PARAMETER ID 'AUN' FIELD ISALES2-AUBEL.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
WHEN 'ISALES2-BSTNK_VF'. "Click Customer PO to show sales document
SET PARAMETER ID 'AUN' FIELD ISALES2-AUBEL.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
WHEN 'ISALES2-MATNR'.
SET PARAMETER ID 'MAT' FIELD ISALES2-MATNR.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
WHEN OTHERS . " When clicking all others columns to show the billing n
SET PARAMETER ID 'VF' FIELD ISALES2-VBELN.
CALL TRANSACTION 'VF03' AND SKIP FIRST SCREEN.
ENDCASE.
ENDCASE.
ENDform.


SET PARAMETER ID 'AUN' FIELD ISALES2-AUBEL.
CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
有一个问题,这里为什么用‘AUN',别的参数可以吗?


销售订单VBAK-VBELN的参数ID就是AUN,如果这里用其它的,在调用VA03的时候内表里的销售订单号就传不过来.
另 jxstone 兄,真是辛苦你了,贴了这么长一段代码,但我觉得有些地方可以简化,比如ADD 1 TO COL_POS.
FIELDCAT_LN-REF_TABNAME = ''.
FIELDCAT_LN-FIELDNAME = 'FKLMG'.
FIELDCAT_LN-KEY = ''.
FIELDCAT_LN-DO_SUM = SPACE.
FIELDCAT_LN-COL_POS = COL_POS.
FIELDCAT_LN-NO_OUT = SPACE.
FIELDCAT_LN-QFIELDNAME = SPACE.
FIELDCAT_LN-HOTSPOT = 'X'.
FIELDCAT_LN-SELTEXT_L = 'Qty'.
APPEND FIELDCAT_LN TO FIELDCAT.
其实我们最常用的就是FIELDCAT_LN-FIELDNAME 和 FIELDCAT_LN-SELTEXT_L 了,还有有些字段也许会有一些特殊的地方,何必把剩下的那么多多余的东西写出来?用默认值就行了,这样代码可以精简很多啊!


 

您现在还没有登录,请在登录后发贴