‎2013 Feb 22 6:22 PM
Hello SAP Community, I'm trying to manually recalculate how a customized table in SAP is being generated based on the ABAP Source Code. Unfortunately, my knowledge of programming is very limited. Therefore, I would need some help trying to understand the source code for this customize table.
What I understand is this customize table obtains it's information from table MCHA, MCHB, MBEW, MARA, T001, T001W, TCURX. But I'm not exactly sure what are the criterias being used to create the customized table.
Thanks alot.
[quote]
REPORT ZUPDSTKU LINE-COUNT 60
LINE-SIZE 132
MESSAGE-ID 00
NO STANDARD PAGE HEADING.
*
* TABLES *
TABLES: ZMMSTOCK, MCHA, MCHB, MBEW, MARA, T001, T001W, TCURX.
*
SELECT-OPTIONS: S_WERKS FOR MCHB-WERKS.
* VARIABLES *
DATA: ZSTKIND LIKE MSKU-SOBKZ.
DATA: ZNOTCNT TYPE I.
DATA: ZCNTED TYPE I.
DATA: ZVMVER(013) TYPE P DECIMALS 08.
DATA: ZSTKTOT(013) TYPE P DECIMALS 02.
*
* INTERNAL TABLES *
DATA: BEGIN OF DATEREC,
YEAR(4) TYPE C,
MONTH(2) TYPE C,
DAY(2) TYPE C,
END OF DATEREC.
DATA: YEAR(4) TYPE C,
MONTH(2) TYPE C,
DAY(2) TYPE C.
*
* INITIALISATION OF VARIABLE *
ZNOTCNT = 0.
ZCNTED = 0.
ZSTKIND = ' '.
*
* SELECTION *
SELECT * FROM MCHB WHERE WERKS IN S_WERKS AND
( CLABS <> 0
OR CSPEM <> 0
OR CINSM <> 0 ).
SELECT SINGLE * FROM MARA
WHERE MATNR = MCHB-MATNR.
SELECT SINGLE * FROM MCHA
WHERE CHARG = MCHB-CHARG
AND MATNR = MCHB-MATNR
AND WERKS = MCHB-WERKS.
SELECT SINGLE * FROM MBEW
WHERE BWKEY = MCHB-WERKS
AND BWTAR = MCHA-BWTAR
AND MATNR = MCHB-MATNR.
*
* ASSIGN YEAR & MONTH TO INTERNAL TABLE DATEREC *
ZSTKIND = 'U'.
MOVE SY-DATUM TO DATEREC.
IF DATEREC-MONTH = 1.
DATEREC-MONTH = DATEREC-MONTH + 11.
DATEREC-YEAR = DATEREC-YEAR - 1.
ELSE.
DATEREC-MONTH = DATEREC-MONTH - 1.
ENDIF.
*
* SAVE MONTH-END STOCK BALANCE TO ZMMSTOCK TABLE *
IF SY-SUBRC NE 0.
WRITE: / MCHB-MATNR,
MCHB-WERKS,
MCHB-LGORT,
MCHB-CHARG,
'not found'.
ELSE.
*
* CALCULATE MOVING AVERAGE PRICE IN 8 DECIMAL *
* ZVMVER = MBEW-VMSAL / MBEW-VMKUM. * cky 28.07.2000 previous period
* valuated stock
SELECT SINGLE * FROM T001W WHERE WERKS = MCHB-WERKS.
SELECT SINGLE * FROM T001 WHERE BUKRS = T001W-EKORG.
SELECT SINGLE * FROM TCURX WHERE CURRKEY = T001-WAERS.
IF SY-SUBRC NE 0.
ZVMVER = MBEW-SALK3 / MBEW-LBKUM.
ELSE.
ZVMVER = MBEW-SALK3 * 100 / MBEW-LBKUM.
ENDIF.
*
SELECT SINGLE * FROM ZMMSTOCK WHERE MATNR = MCHB-MATNR
AND WERKS = MCHB-WERKS
AND LGORT = MCHB-LGORT
AND CHARG = MCHB-CHARG
AND LFGJA = DATEREC-YEAR
AND LFMON = DATEREC-MONTH.
IF SY-SUBRC = 0.
WRITE: / MCHB-MATNR,
MCHB-WERKS,
MCHB-LGORT,
MCHB-CHARG,
DATEREC-MONTH,
DATEREC-YEAR,
'exists in table ZMMSTOCK, record not updated'.
ZNOTCNT = ZNOTCNT + 1.
ELSE.
WRITE: / MCHB-MATNR,
MCHB-WERKS,
MCHB-LGORT,
MCHB-CHARG,
DATEREC-MONTH,
DATEREC-YEAR,
'updated to table ZMMSTOCK'.
ZCNTED = ZCNTED + 1.
ZMMSTOCK-MATNR = MCHB-MATNR.
ZMMSTOCK-WERKS = MCHB-WERKS.
ZMMSTOCK-LGORT = MCHB-LGORT.
ZMMSTOCK-CHARG = MCHB-CHARG.
ZMMSTOCK-VMVER = ZVMVER.
ZMMSTOCK-CVMLA = MCHB-CLABS.
ZMMSTOCK-CVMSP = MCHB-CSPEM.
ZMMSTOCK-CINSM = MCHB-CINSM.
ZMMSTOCK-LFGJA = DATEREC-YEAR.
ZMMSTOCK-LFMON = DATEREC-MONTH.
ZMMSTOCK-SOBKZ = ZSTKIND.
ZMMSTOCK-LWEDT = MCHA-LWEDT.
ZMMSTOCK-ERSDA = SY-DATUM.
INSERT ZMMSTOCK.
ENDIF.
ENDIF.
ENDSELECT.
*
* DISPLAY SUMMARY OF RECORD UPDATE *
SKIP 3.
WRITE: / 'Update Summary'.
WRITE: / '=============='.
WRITE: / 'Total Records Updated : ',
ZCNTED.
WRITE: / 'Total Records Not Updated : ',
ZNOTCNT.
* end of program
[/quote]
‎2013 Feb 22 6:52 PM
Hi,
I hope I understand your request. The first select statement (from MCHB) generates a looping structure, so for every record in MCHB that meets the criteria in the select (i.e. werks, clabs, cspem, cinsm) it will attempt to generate a record in your ZMMSTOCK table.
It is not a recommended practice to have so many selects (if any) inside the loop of an outer select.
For context, the loop starts at this:
SELECT * FROM MCHB WHERE WERKS IN S_WERKS AND
( CLABS <> 0
OR CSPEM <> 0
OR CINSM <> 0 ).
.
.
.
.
and ends at this:
ENDIF.
ENDIF.
ENDSELECT.
Regards,
Steve