Search on this Website

Showing posts with label Some ABAP/4 Sample Code. Show all posts
Showing posts with label Some ABAP/4 Sample Code. Show all posts

Saturday, July 10, 2010

Working with database tables and internal tables

* Declaration of a work area for a Dictionary table
TABLES CUSTOMERS.
* Internal table used as snapshot of the database table
DATA ALL_CUSTOMERS LIKE CUSTOMERS OCCURS 100
WITH HEADER LINE.
* Reading the entries of the database table into an internal table
SELECT * FROM CUSTOMERS INTO TABLE ALL_CUSTOMERS.
* Displaying each line of an internal table
LOOP AT ALL_CUSTOMERS.
WRITE: / ALL_CUSTOMERS-NAME.
ENDLOOP.
*&---------------------------------------------------------------------*
* 1. Elementary types

Other Approach to define data type
DATA: CUSTOMER_NAME_1(25) TYPE C,
VENDOR_NAME_1(25) TYPE C.
* 2. Reference to an existing field
DATA: CUSTOMER_NAME_2(25) TYPE C,
VENDOR_NAME_2 LIKE CUSTOMER_NAME_2.
* 3. Reference to a non-elementary type
TYPES T_NAME(25) TYPE C.
DATA: CUSTOMER_NAME_3 TYPE T_NAME,
VENDOR_NAME_3 TYPE T_NAME.

Click Here to Read More !!!!

Sunday, June 13, 2010

A real life example for using a temporary program

REPORT CHAP2503.
* Variables for later use
PARAMETERS TABNAME(10) DEFAULT 'CUSTOMERS'.
DATA: SOURCE_TABLE(72) OCCURS 100 WITH HEADER LINE,
PROGRAM_NAME LIKE SY-CPROG,
SYNTAX_CHECK_MESSAGE(128),
LINE_NO TYPE I.
* Building the source code


PERFORM BUILD_THE_SOURCE_CODE USING TABNAME.
* Generating the temporary program, checking syntax errors
GENERATE SUBROUTINE POOL SOURCE_TABLE
NAME PROGRAM_NAME
MESSAGE SYNTAX_CHECK_MESSAGE
LINE LINE_NO.
IF SY-SUBRC NE 0.
WRITE: / 'Syntax error, message', SYNTAX_CHECK_MESSAGE,
/ 'in line', LINE_NO.
EXIT.
ENDIF.
* Calling a form externally
PERFORM DISPLAY_TABLE IN PROGRAM (PROGRAM_NAME).
* Form to build the source code of the temporary program
FORM BUILD_THE_SOURCE_CODE USING F_NAME.
APPEND:
'report ztmpprog. ' TO SOURCE_TABLE,
'tables ' TO SOURCE_TABLE,
F_NAME TO SOURCE_TABLE,
'. ' TO SOURCE_TABLE,
'field-symbols . ' TO SOURCE_TABLE,
'form display_table. ' TO SOURCE_TABLE,
'select * from ' TO SOURCE_TABLE,
F_NAME TO SOURCE_TABLE,
'. ' TO SOURCE_TABLE,
' new-line. ' TO SOURCE_TABLE,
' do. ' TO SOURCE_TABLE,
' assign component sy-index ' TO SOURCE_TABLE,
' of structure ' TO SOURCE_TABLE,
F_NAME TO SOURCE_TABLE,
' to . ' TO SOURCE_TABLE,
' if sy-subrc ne 0. exit. endif.' TO SOURCE_TABLE,
' write . ' TO SOURCE_TABLE,
' enddo. ' TO SOURCE_TABLE,
'endselect. ' TO SOURCE_TABLE,
'endform. ' TO SOURCE_TABLE.
ENDFORM.

Click Here to Read More !!!!

Sample program for generating a persistent program

*&---------------------------------------------------------------------*
REPORT CHAP2504.
* Internal table for source code, field for name of temporary program
DATA: SOURCE_TABLE(72) OCCURS 10 WITH HEADER LINE,
PROGRAM_NAME LIKE SY-CPROG.

* Building the source code
APPEND 'report zgenprog.' TO SOURCE_TABLE.
APPEND 'write ''I am a generated program''.' TO SOURCE_TABLE.
* Insert the report, if necessary
READ REPORT 'zgenprog' INTO SOURCE_TABLE.
IF SY-SUBRC NE 0.
APPEND 'report zgenprog.' TO SOURCE_TABLE.
APPEND 'write ''Here is zgenprog''.' TO SOURCE_TABLE.
INSERT REPORT 'zgenprog' FROM SOURCE_TABLE.
ENDIF.
* Execute the report
SUBMIT ZGENPROG AND RETURN.
Click Here to Read More !!!!

Sunday, June 6, 2010

Sample ABAP program for Transferring data to a file

REPORT CHAP2601.
* Data declarations for later use
PARAMETERS FILENAME(128) DEFAULT '/usr/tmp/testfile.dat'
LOWER CASE.
TABLES CUSTOMERS.
DATA MSG_TEXT(50).
* Get data for file transfer

DATA ALL_CUSTOMERS LIKE CUSTOMERS OCCURS 100
WITH HEADER LINE.
SELECT * FROM CUSTOMERS INTO TABLE ALL_CUSTOMERS.
SORT ALL_CUSTOMERS BY CITY.
LOOP AT ALL_CUSTOMERS.
WRITE: / ALL_CUSTOMERS-CITY,
ALL_CUSTOMERS-NAME.
ENDLOOP.
* Opening the File
OPEN DATASET FILENAME FOR OUTPUT IN TEXT MODE
MESSAGE MSG_TEXT.
IF SY-SUBRC NE 0.
WRITE: 'File cannot be opened. Reason:', MSG_TEXT.
EXIT.
ENDIF.
* Transferring Data
LOOP AT ALL_CUSTOMERS.
TRANSFER ALL_CUSTOMERS-NAME TO FILENAME.
ENDLOOP.
* Closing the File
CLOSE DATASET FILENAME.

Click Here to Read More !!!!

Sample ABAP program for Reading data from a file

REPORT CHAP2602.
* Data declarations for later use
TABLES CUSTOMERS.
PARAMETERS FILENAME(128) DEFAULT '/usr/tmp/testfile.dat'
LOWER CASE.
DATA: MSG_TEXT(50),
ALL_CUSTOMER_NAMES LIKE CUSTOMERS-NAME OCCURS 100
WITH HEADER LINE.


* Opening the File
OPEN DATASET FILENAME FOR INPUT IN TEXT MODE
MESSAGE MSG_TEXT.
IF SY-SUBRC NE 0.
WRITE: 'File cannot be opened. Reason:', MSG_TEXT.
EXIT.
ENDIF.
* Reading Data
DO.
READ DATASET FILENAME INTO ALL_CUSTOMER_NAMES.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
APPEND ALL_CUSTOMER_NAMES.
ENDDO.
* Closing the file
CLOSE DATASET FILENAME.
* Display the result
LOOP AT ALL_CUSTOMER_NAMES.
WRITE / ALL_CUSTOMER_NAMES.
ENDLOOP.

Click Here to Read More !!!!

Abap code for Transferring data to a file (presentation server)

REPORT CHAP2603.
* Data declarations for later use
PARAMETERS FILENAME(128) DEFAULT 'c:\users\default\testfile.dat'
LOWER CASE.
TABLES CUSTOMERS.
DATA ALL_CUSTOMERS LIKE CUSTOMERS OCCURS 100
WITH HEADER LINE.
* Get data for file transfer

SELECT * FROM CUSTOMERS INTO TABLE ALL_CUSTOMERS.
SORT ALL_CUSTOMERS BY CITY.
LOOP AT ALL_CUSTOMERS.
WRITE: / ALL_CUSTOMERS-CITY,
ALL_CUSTOMERS-NAME.
ENDLOOP.
* Transferring Data
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = FILENAME
TABLES
DATA_TAB = ALL_CUSTOMERS
EXCEPTIONS
FILE_OPEN_ERROR = 1
OTHERS = 2.
CASE SY-SUBRC.
WHEN 1.
WRITE 'Error when file opened'.
EXIT.
WHEN 2.
WRITE 'Error during data transfer'.
EXIT.
ENDCASE.

Click Here to Read More !!!!

Thursday, May 6, 2010

Reading data from a file (presentation server),ABAP Code

REPORT CHAP2604.
* Data declarations for later use
PARAMETERS FILENAME(128) DEFAULT 'c:\users\default\testfile.dat'
LOWER CASE.
TABLES CUSTOMERS.
DATA ALL_CUSTOMERS LIKE CUSTOMERS OCCURS 100
WITH HEADER LINE.


CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = FILENAME
TABLES
DATA_TAB = ALL_CUSTOMERS
EXCEPTIONS
FILE_OPEN_ERROR = 1
OTHERS = 2.
CASE SY-SUBRC.
WHEN 1.
WRITE 'Error when file opened'.
EXIT.
WHEN 2.
WRITE 'Error during data transfer'.
EXIT.
ENDCASE.
* Display the result
LOOP AT ALL_CUSTOMERS.
WRITE: / ALL_CUSTOMERS-NAME,
ALL_CUSTOMERS-CITY.
ENDLOOP.

Click Here to Read More !!!!

Sample program for OLE Automation

*&---------------------------------------------------------------------*
*& Chapter 28: Sample program for OLE Automation
*&---------------------------------------------------------------------*
REPORT CHAP2801.
* Including OLE types
INCLUDE OLE2INCL.
* Tables and variables for later use
TABLES: CUSTOMERS.
DATA: APPLICATION TYPE OLE2_OBJECT,
WORKBOOK TYPE OLE2_OBJECT,
SHEET TYPE OLE2_OBJECT,
CELLS TYPE OLE2_OBJECT.
* Creating an object
CREATE OBJECT APPLICATION 'excel.application'.
IF SY-SUBRC NE 0.
WRITE: / 'Error when opening excel.application', SY-MSGLI.
ENDIF.



* Setting properties
SET PROPERTY OF APPLICATION 'Visible' = 1.
* Calling methods
CALL METHOD OF APPLICATION 'Workbooks' = WORKBOOK.
PERFORM ERRORS.
CALL METHOD OF WORKBOOK 'Add'.
PERFORM ERRORS.
CALL METHOD OF APPLICATION 'Worksheets' = SHEET EXPORTING #1 = 1.
PERFORM ERRORS.
CALL METHOD OF SHEET 'Activate'.
PERFORM ERRORS.
PERFORM FILL_SHEET.
* Subroutine for filling the spread sheet
FORM FILL_SHEET.
DATA: ROW_MAX TYPE I VALUE 256,
INDEX TYPE I.
FIELD-SYMBOLS: .
SELECT * FROM CUSTOMERS.
INDEX = ROW_MAX * ( SY-DBCNT - 1 ) + 1.
DO 4 TIMES.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE CUSTOMERS TO .
CALL METHOD OF SHEET 'Cells' = CELLS
EXPORTING #1 = INDEX.
SET PROPERTY OF CELLS 'Value' = .
ADD 1 TO INDEX.
ENDDO.
ENDSELECT.
ENDFORM.
* Subroutine for error handling
FORM ERRORS.
IF SY-SUBRC NE 0.
WRITE: / 'Error in OLE call', SY-MSGLI.
EXIT.
ENDIF.
ENDFORM.

Click Here to Read More !!!!

Wednesday, May 23, 2007

Sample Code for Using Field-Groups

A Note on the Use of Field Groups...Because field-groups write their data to paging space (rather than storing it in memory), they are appropriate only for processing lists with lots (like 50,000 or more) of records. If you expect your programs to be handling tens of thousands of records, you should:
analyze the expected size of your lists. For instance, if your system has 512M of main memory, you may decide that you don't want any report to use more than 15M of memory for its lists. In that program, you may have a list:


begin of mylist occurs XXX,
dat1(100) type c,
dat2(50) type c,
dat3(10) type c,
end of list. Then each record takes up approximately 160 bytes; so every 6 records take up approximately 1K. For this list structure, it would take about 90,000 records to use up 15M RAM.
decide the maximum amount of memory you want your program to use
decide whether to use field-groups or something else (like internal tables). If you expect the size of your list to be greater than the amount of memory you want your program to use, then use field-groups (actually, if you use internal tables, and the number of records exceeds the number of records in your OCCURS statement, the system just writes those extra records to the paging space. So is there really any difference between just using an internal table with an OCCURS 0 statement-- which would write the entire table to paging space-- and using field-groups? According to Gareth M. de Bruyn and Robert Lyfareff in Introduction to ABAP/4 Programming for SAP, field-groups are stored more efficiently, and have better performance. They recommend field-groups for lists of 100,000 or more records).
document.write (RepName);

Field-Groups Sample Code
*&---------------------------------------------------------------------*
*& Report ZSPFLI *
*& *
*&---------------------------------------------------------------------*
REPORT ZSPFLI LINE-SIZE 132 LINE-COUNT 65(3)
NO STANDARD PAGE HEADING.
TABLES:SPFLI,SCARR, SFLIGHT, SBOOK.
SELECT-OPTIONS: MYCARRID FOR SPFLI-CARRID.
FIELD-GROUPS: HEADER, SPFLI_FG, SFLIGHT_FG, SBOOK_FG.
INSERT:
SPFLI-CARRID
SPFLI-CONNID
SFLIGHT-FLDATE
SBOOK-BOOKID
INTO HEADER,
SPFLI-CARRID
SPFLI-CONNID
SPFLI-CITYFROM
SPFLI-AIRPFROM
SPFLI-CITYTO
SPFLI-AIRPTO
SPFLI-DEPTIME
SCARR-CARRNAME
INTO SPFLI_FG,
SFLIGHT-FLDATE
SFLIGHT-SEATSMAX
SFLIGHT-SEATSOCC
SFLIGHT-PRICE
INTO SFLIGHT_FG,
SBOOK-BOOKID
SBOOK-CUSTOMID
SBOOK-CUSTTYPE
SBOOK-SMOKER
INTO SBOOK_FG.
SELECT * FROM SPFLI WHERE CARRID IN MYCARRID.
SELECT SINGLE * FROM SCARR WHERE CARRID = SPFLI-CARRID.
EXTRACT SPFLI_FG.
SELECT * FROM SFLIGHT
WHERE CARRID = SPFLI-CARRID AND CONNID = SPFLI-CONNID.
EXTRACT SFLIGHT_FG.
SELECT * FROM SBOOK
WHERE CARRID = SFLIGHT-CARRID AND
CONNID = SFLIGHT-CONNID AND FLDATE = SFLIGHT-FLDATE.
EXTRACT SBOOK_FG.
CLEAR SBOOK.
ENDSELECT.
CLEAR SFLIGHT.
ENDSELECT.
CLEAR SPFLI.
ENDSELECT.
SORT.
LOOP.
AT SPFLI_FG.
FORMAT COLOR COL_HEADING.
WRITE: / SCARR-CARRNAME,
SPFLI-CONNID, SPFLI-CITYFROM,
SPFLI-AIRPFROM, SPFLI-CITYTO, SPFLI-AIRPTO, SPFLI-DEPTIME.
FORMAT COLOR OFF.
ENDAT.
AT SFLIGHT_FG.
WRITE: /15 SFLIGHT-FLDATE, SFLIGHT-PRICE, SFLIGHT-SEATSMAX,
SFLIGHT-SEATSOCC.
ENDAT.
AT SBOOK_FG.
WRITE: /30 SBOOK-BOOKID, SBOOK-CUSTOMID,
SBOOK-CUSTTYPE, SBOOK-SMOKER.
ENDAT.
ENDLOOP.
*&---------------------------------------------------------------------*
*& END OF REPORT *
*&---------------------------------------------------------------------*

Click Here to Read More !!!!

Finance Docs and Related MM Docs

Some poor souls in your finance department might use this report for auditing...
This program lists accounting documents that were automatically created from MM, and also lists the MM source documents. It can take several minutes to run, depending on the amount of data in the database, because it has to access (slow) cluster tables.
Accounting Docs Automatically Created from MM


*&---------------------------------------------------------------------*
*& Report ZFIMMDOC *
*& Listing of accounting docs and the material docs from which they *
*& were automatically created. *
*&---------------------------------------------------------------------*
REPORT ZFIMMDOC MESSAGE-ID Z1 LINE-COUNT 65 NO STANDARD PAGE HEADING.
TABLES: BKPF, MSEG, MKPF, T001, BSIM, T001K, MARA, BSEG, SKAT,
MAKT, T156T.
INCLUDE: ZFIMMTOP. "types mymseg_type
PARAMETERS: COMPANYC LIKE BKPF-BUKRS OBLIGATORY, " default '1101',
YEAR LIKE BKPF-GJAHR OBLIGATORY, " default '1998'.
POSTDATE LIKE BKPF-BUDAT OBLIGATORY.
SELECT-OPTIONS: VAL_AREA FOR BSIM-BWKEY NO-DISPLAY,
S_MBLNR FOR MSEG-MBLNR NO-DISPLAY,
S_BELNR FOR BSEG-BELNR NO-DISPLAY.
DATA: MYBUTXT LIKE T001-BUTXT,
LINES TYPE I,
PREVIOUS_BELNR LIKE BKPF-BELNR,
PREVIOUS_AWKEY LIKE BKPF-AWKEY,
MYTXT50 LIKE SKAT-TXT50,
BEGIN OF X001K OCCURS 20.
INCLUDE STRUCTURE T001K.
DATA: END OF X001K.
DATA: BEGIN OF MYBKPF OCCURS 100,
BLART LIKE BKPF-BLART, "doc type
BELNR LIKE BKPF-BELNR, "doc no
WAERS LIKE BKPF-WAERS, "currency key
AWKEY LIKE BKPF-AWKEY,
END OF MYBKPF.
DATA: BEGIN OF MYBSIM OCCURS 500.
INCLUDE TYPE MYBSIM_TYPE.
DATA: END OF MYBSIM.
DATA: BEGIN OF MYBSEG OCCURS 1200,
BELNR LIKE BSEG-BELNR,
BUZEI LIKE BSEG-BUZEI,
BSCHL LIKE BSEG-BSCHL,
HKONT LIKE BSEG-HKONT,
WRBTR LIKE BSEG-WRBTR,
SHKZG LIKE BSEG-SHKZG, "debit/credit
END OF MYBSEG.
DATA: BEGIN OF MYMSEG OCCURS 500.
INCLUDE TYPE MYMSEG_TYPE.
DATA: END OF MYMSEG.
PERFORM GET_BKPF.
PERFORM GET_BSIM.
PERFORM COLLECT_BELNR.
PERFORM GET_BSEG.
PERFORM COLLECT_MBLNR.
PERFORM GET_MSEG.
SORT MYBSIM BY BELNR.
SORT MYMSEG BY MBLNR ZEILE.
SORT MYBSEG BY BELNR BUZEI.
LOOP AT MYBSIM.
IF MYBSIM-SHKZG = 'H'. "negative value
MYBSIM-DMBTR = ( -1 ) * MYBSIM-DMBTR.
ENDIF.
PERFORM WRITE_BSIM_DATA USING MYBSIM.
AT END OF BELNR. "new belnr record: get bseg recs
PERFORM WRITE_BSEG_DATA USING MYBSIM-BELNR.
ENDAT.
AT END OF AWKEY.
PERFORM WRITE_MSEG_DATA USING MYBSIM-AWKEY(10).
ENDAT.
WRITE: SY-ULINE.
ENDLOOP.
WRITE: / 'number of records accessed'.
DESCRIBE TABLE MYBKPF LINES LINES.
WRITE: / 'bkpf:', LINES.
DESCRIBE TABLE MYBSIM LINES LINES.
WRITE: / 'bsim:', LINES.
DESCRIBE TABLE MYMSEG LINES LINES.
WRITE: / 'mseg:', LINES.
DESCRIBE TABLE MYBSEG LINES LINES.
WRITE: / 'bseg:', LINES.
AT SELECTION-SCREEN.
* get company text
SELECT SINGLE BUTXT FROM T001 INTO MYBUTXT
WHERE BUKRS = COMPANYC.
* get valuation areas from company code
REFRESH VAL_AREA. CLEAR VAL_AREA.
SELECT * FROM T001K INTO TABLE X001K
WHERE BUKRS = COMPANYC.
LOOP AT X001K.
VAL_AREA-SIGN = 'I'. VAL_AREA-OPTION = 'EQ'.
VAL_AREA-LOW = X001K-BWKEY.
APPEND VAL_AREA.
ENDLOOP.
READ TABLE VAL_AREA INDEX 1.
TOP-OF-PAGE.
PERFORM WRITE_HEADER.
*&---------------------------------------------------------------------*
*& Form GET_BKPF
*&---------------------------------------------------------------------*
FORM GET_BKPF.
* get bkpf records
* should perform authority check here **
SELECT BLART BELNR WAERS AWKEY
INTO CORRESPONDING FIELDS OF TABLE MYBKPF
FROM BKPF
WHERE BUKRS = COMPANYC AND GJAHR = YEAR AND BUDAT = POSTDATE
ORDER BY BELNR.
ENDFORM. " GET_BKPF
*&---------------------------------------------------------------------*
*& Form GET_BSIM
*----------------------------------------------------------------------*
FORM GET_BSIM.
LOOP AT MYBKPF.
MYBSIM-BLART = MYBKPF-BLART.
MYBSIM-BELNR = MYBKPF-BELNR.
MYBSIM-WAERS = MYBKPF-WAERS.
MYBSIM-AWKEY = MYBKPF-AWKEY.
* should perform authority check here **
* select bsim records using conditions gjahr, bwkey, belnr
SELECT BELNR BUZEI DMBTR MATNR BUDAT MENGE MEINS
INTO CORRESPONDING FIELDS OF MYBSIM
FROM BSIM
WHERE GJAHR = YEAR AND
BELNR = MYBKPF-BELNR AND
BWKEY IN VAL_AREA.
APPEND MYBSIM.
ENDSELECT.
ENDLOOP.
ENDFORM. " GET_BSIM
*&---------------------------------------------------------------------*
*& Form get_bseg
*&---------------------------------------------------------------------*
FORM GET_BSEG.
* should perform authority check here **
* select bseg records using conditions bukrs, belnr, gjahr
SELECT BELNR BUZEI BSCHL HKONT WRBTR SHKZG
INTO CORRESPONDING FIELDS OF TABLE MYBSEG
FROM BSEG
WHERE GJAHR = YEAR AND
BUKRS = COMPANYC AND
BELNR IN S_BELNR.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_MSEG
*&---------------------------------------------------------------------*
FORM GET_MSEG.
* should perform authority check here **
SELECT MBLNR
ZEILE BWART MATNR LGORT MENGE MEINS WAERS SHKZG DMBTR WERKS
KOSTL SOBKZ KZBEW KZZUG KZVBR
INTO CORRESPONDING FIELDS OF TABLE MYMSEG
FROM MSEG
WHERE MJAHR = YEAR AND MBLNR IN S_MBLNR.
WRITE: SY-ULINE.
ENDFORM. " GET_AND_WRITE_MATDOC
*&---------------------------------------------------------------------*
*& Form WRITE_HEADER
*----------------------------------------------------------------------*
FORM WRITE_HEADER.
DATA: MYOPTION(11) TYPE C, MYSIGN(7) TYPE C, "explain select criteria
SELECT_TEXT(60) TYPE C, SELECT_POSITION TYPE I.
WRITE: TEXT-000,
TEXT-001. "company and report header
IF SY-PAGNO = 1. "**** first page
WRITE: / 'Company Code', COMPANYC, MYBUTXT,
'Accounting Year', YEAR, 'Posting Date:', POSTDATE.
ENDIF. "**** first page
WRITE: / 'Generated', SY-DATUM, SY-UZEIT,
'Page', SY-PAGNO, SY-ULINE.
* format for accounting docs
FORMAT COLOR COL_GROUP.
WRITE: / 'DT',
4 'acct doc',
15 'material',
25 'item',
31 'Posted',
42(12) 'Quantity',
'Unit',
61 ' balance'.
FORMAT COLOR OFF.
WRITE: / 'item' UNDER 'item', 30 'Code', 35 'Account',
45 'Description',
61 ' balance'.
* format for material docs
FORMAT COLOR COL_TOTAL.
WRITE: / 'MatrialDoc' UNDER 'acct doc',
'Posted' UNDER 'Posted', 'Entered' UNDER 'Description',
76 ' '.
FORMAT COLOR OFF.
WRITE: /10 'item',
'Material' UNDER 'Material',
25 'Plant',
'Stor' UNDER 'Code',
'Mvmt' UNDER 'Account',
42(12) 'Quantity',
'Unit',
61 ' balance',
/11 'MaterialDesc',
'MovementType' UNDER 'Quantity',
60 'CostCtr'.
WRITE: SY-ULINE.
ENDFORM. " WRITE_HEADER
*&---------------------------------------------------------------------*
*& Form WRITE_MKPF_DATA
*&---------------------------------------------------------------------*
FORM WRITE_MKPF_DATA USING F_MSEG TYPE MYMSEG_TYPE
F_MAKTX LIKE MAKT-MAKTX
F_BTEXT LIKE T156T-BTEXT.
WRITE: / F_MSEG-ZEILE UNDER 'item',
F_MSEG-MATNR UNDER 'material',
F_MSEG-WERKS UNDER 'Plant',
F_MSEG-LGORT UNDER 'Stor',
F_MSEG-BWART UNDER 'Mvmt',
(12)F_MSEG-MENGE UNDER 'Quantity' DECIMALS 2,
F_MSEG-MEINS UNDER 'Unit',
F_MSEG-DMBTR UNDER ' balance'.
WRITE: / F_MAKTX UNDER 'MaterialDesc',
F_BTEXT UNDER 'MovementType',
F_MSEG-KOSTL UNDER 'CostCtr'.
ENDFORM. " WRITE_MKPF_DATA
*&---------------------------------------------------------------------*
*& Form WRITE_MKPF_HEADER
*&---------------------------------------------------------------------*
FORM WRITE_MKPF_HEADER USING P_MBLNR LIKE MKPF-MBLNR.
DATA: MYBUDAT LIKE MKPF-BUDAT, MYCPUDT LIKE MKPF-CPUDT.
SELECT SINGLE BUDAT CPUDT FROM MKPF
INTO (MYBUDAT, MYCPUDT)
WHERE MBLNR = P_MBLNR AND MJAHR = YEAR.
IF SY-SUBRC = 0. "got record
FORMAT COLOR COL_TOTAL.
WRITE: / P_MBLNR UNDER 'acct doc',
MYBUDAT UNDER 'Posted',
MYCPUDT UNDER 'Entered',
76 ' '.
FORMAT COLOR OFF.
ENDIF.
ENDFORM. " WRITE_MKPF_HEADER
*&---------------------------------------------------------------------*
*& Form WRITE_BSIM_DATA
*&---------------------------------------------------------------------*
FORM WRITE_BSIM_DATA USING F_BSIM TYPE MYBSIM_TYPE.
FORMAT COLOR COL_GROUP.
WRITE: / F_BSIM-BLART UNDER 'DT',
F_BSIM-BELNR UNDER 'acct doc',
F_BSIM-MATNR UNDER 'material',
F_BSIM-BUZEI UNDER 'Plant', "item
F_BSIM-BUDAT UNDER 'Posted',
(12)F_BSIM-MENGE UNDER 'Quantity' DECIMALS 2,
F_BSIM-MEINS UNDER 'Unit',
F_BSIM-DMBTR UNDER ' balance' RIGHT-JUSTIFIED.
FORMAT COLOR OFF.
ENDFORM. " WRITE_BSIM_DATA
*&---------------------------------------------------------------------*
*& Form WRITE_BSEG_DATA
*&---------------------------------------------------------------------*
FORM WRITE_BSEG_DATA USING P_BELNR.
LOOP AT MYBSEG WHERE BELNR = P_BELNR.
SELECT SINGLE TXT50 INTO MYTXT50 FROM SKAT
WHERE SPRAS = '1' AND KTOPL = 'HFCA' AND
SAKNR = MYBSEG-HKONT.
IF MYBSEG-SHKZG = 'H'. "negative value
MYBSEG-WRBTR = ( -1 ) * MYBSEG-WRBTR.
ENDIF.
WRITE: / MYBSEG-BUZEI UNDER 'Plant', "item
MYBSEG-BSCHL UNDER 'Code',
MYBSEG-HKONT UNDER 'Account',
MYTXT50 UNDER 'Description',
MYBSEG-WRBTR UNDER ' balance'.
ENDLOOP.
ENDFORM. " WRITE_BSEG_DATA
*&---------------------------------------------------------------------*
*& Form COLLECT_MBLNR
*&---------------------------------------------------------------------*
FORM COLLECT_MBLNR.
SORT MYBSIM BY AWKEY.
S_MBLNR-SIGN = 'I'.
S_MBLNR-OPTION = 'EQ'.
LOOP AT MYBSIM.
AT NEW AWKEY.
S_MBLNR-LOW = MYBSIM-AWKEY(10).
APPEND S_MBLNR.
ENDAT.
ENDLOOP.
READ TABLE S_MBLNR INDEX 1.
ENDFORM. " COLLECT_MBLNR
*&---------------------------------------------------------------------*
*& Form COLLECT_BELNR
*&---------------------------------------------------------------------*
FORM COLLECT_BELNR.
S_BELNR-SIGN = 'I'.
S_BELNR-OPTION = 'EQ'.
SORT MYBSIM BY BELNR.
LOOP AT MYBSIM.
AT NEW BELNR.
S_BELNR-LOW = MYBSIM-BELNR.
APPEND S_BELNR.
ENDAT.
ENDLOOP.
READ TABLE S_BELNR INDEX 1.
ENDFORM. " COLLECT_BELNR
*&---------------------------------------------------------------------*
*& Form WRITE_MSEG_DATA
*&---------------------------------------------------------------------*
FORM WRITE_MSEG_DATA USING P_MBLNR LIKE MSEG-MBLNR.
DATA: MYBTEXT LIKE T156T-BTEXT,
MYMAKTX LIKE MAKT-MAKTX.
PERFORM WRITE_MKPF_HEADER USING P_MBLNR.
LOOP AT MYMSEG WHERE MBLNR = P_MBLNR.
SELECT SINGLE BTEXT INTO MYBTEXT FROM T156T
WHERE SPRAS = '1' AND
BWART = MYMSEG-BWART AND
SOBKZ = MYMSEG-SOBKZ AND
KZBEW = MYMSEG-KZBEW AND
KZZUG = MYMSEG-KZZUG AND
KZVBR = MYMSEG-KZVBR.
SELECT SINGLE MAKTX INTO MYMAKTX FROM MAKT
WHERE SPRAS = '1' AND MATNR = MYMSEG-MATNR.
IF MYMSEG-SHKZG = 'H'.
MYMSEG-DMBTR = ( -1 ) * MYMSEG-DMBTR.
ENDIF.
PERFORM WRITE_MKPF_DATA USING MYMSEG MYMAKTX MYBTEXT.
ENDLOOP.
ENDFORM. " WRITE_MSEG_DATA
* end of ZFIMMDOC program *
* begin of ZFIMMTOP include program *
*----------------------------------------------------------------------*
* INCLUDE ZFIMMTOP *
*----------------------------------------------------------------------*
TYPES: BEGIN OF MYMSEG_TYPE,
MBLNR LIKE MSEG-MBLNR,
ZEILE LIKE MSEG-ZEILE,
BWART LIKE MSEG-BWART,
MATNR LIKE MSEG-MATNR,
WERKS LIKE MSEG-WERKS,
LGORT LIKE MSEG-LGORT,
MENGE LIKE MSEG-MENGE,
MEINS LIKE MSEG-MEINS,
WAERS LIKE MSEG-WAERS,
SHKZG LIKE MSEG-SHKZG,
DMBTR LIKE MSEG-DMBTR,
KOSTL LIKE MSEG-KOSTL,
SOBKZ LIKE MSEG-SOBKZ, " for goods movement text
KZBEW LIKE MSEG-KZBEW, " for goods movement text
KZZUG LIKE MSEG-KZZUG, " for goods movement text
KZVBR LIKE MSEG-KZVBR, " for goods movement text
END OF MYMSEG_TYPE.
TYPES: BEGIN OF MYBSIM_TYPE,
BLART LIKE BKPF-BLART, "doc type
BELNR LIKE BKPF-BELNR, "doc no
WAERS LIKE BKPF-WAERS,
AWKEY LIKE BKPF-AWKEY,
BUZEI LIKE BSIM-BUZEI, "doc item
MATNR LIKE BSIM-MATNR,
BUDAT LIKE BSIM-BUDAT,
MENGE LIKE BSIM-MENGE, "quantity
MEINS LIKE BSIM-MEINS, "unit of measure
SHKZG LIKE BSIM-SHKZG, "debit/credit
DMBTR LIKE BSIM-DMBTR, "balance amount
END OF MYBSIM_TYPE.
* end of ZFIMMDOC include *

Click Here to Read More !!!!

ABAP/4 Program: Project Expense Report

The report displays information about internal orders. It has two parts: one for reporting data based on document information in BSIS and BSEG, and one for reporting data based on purchasing order information. The user selects which report to run with the appropriate radio button. For PO data, this report simply prepares and submits a set of parameters to the Outstanding Purchase Order report. For document information, this report prepares and lists the appropriate information from BSIS and BSEG.


Report By Document Data: The report looks up data in BSIS and BSEG that meets the user's selection criteria, and lists the data (one line per BSIS entry). Purchase order and cost object data resides in BSEG; the rest of the data resides in BSIS.
Report By PO Data: The report looks up purchase order information by referencing BSIS, and then referencing BSEG. It then keeps a list of purchase orders po_doc, which is passed on to the Outstanding Order report to limit its selection, and a list of (Purchase Order, Item Number) pairs (fields ebeln and ebelp in BSEG). In addition, it keeps a list of (Purchase Order, Internal Order) pairs (fields BSEG-ebeln and BSIS-aufnr), so that the Outstanding PO report can quickly look up the internal order numbers without another database call. These two lists are kept in the select-options po_itemp and po_aufnr. It was convenient to do it this way, because select-options are easy to pass on using submit...with. The limitation is that, in pur_itemp, ebelp must always be less than ebeln, and in po_order, aufnr must always be less than ebeln, otherwise an error will occur when passing the parameters. If this happens, and the program needs to be modified, then the info will have to be passed using an internal table exported to memory in this report (using export) and then imported in the Outstanding PO report (using import). The Outstanding PO report report behaves slightly different when called from this report. Namely:
the compare parameter is set to 'A' (an arbitrary value), which is a flag indicating that the report was called by this report, and to process as described here
After looking up records for PO documents, limited by the PO numbers in the po_doc selection criteria passed to it, the report makes a further check on each line item, listing only those items found in the PO/Item pairs list po_itemp
the report lists items with IR < gr =" IR"> GR)
the report's output list contains an additional field Internal Order, which is looked up in the PO/Internal Order pairs list po_order that is passed to it For further details, see documentation in the Outstanding PO report.
document.write (RepName);

Project Expense Report
*&---------------------------------------------------------------------*
*& Report ZPRJEXP2 *
*& Author: Matt Wong, SNI Taiwan, Aug 1998 *
*& *
*& Report for displaying expense data for internal orders/projects. *
*& PO_ITEMP contains PO/item pairs to be passed onto the Outstanding PO*
*& report, since we may only want to access certain items of a PO (not *
*& all items). *
*& Using a select-option to do this makes it easier to pass the info to*
*& the report *
*& *
*& PO_AUFNR is also for passing data between programs. It passes *
*& PO/Internal Order number pairs *
*&---------------------------------------------------------------------*
REPORT ZPRJEXP2 LINE-SIZE 250 LINE-COUNT 65 NO STANDARD PAGE HEADING.
TABLES: BSIS, BSEG.
PARAMETERS: COMPANY LIKE BSIS-BUKRS OBLIGATORY,
BYDOC RADIOBUTTON GROUP REPT,
BYPO RADIOBUTTON GROUP REPT.
SELECT-OPTIONS: ORDER FOR BSIS-AUFNR OBLIGATORY NO-EXTENSION,
POSTDATE FOR SY-DATUM NO-EXTENSION,
YEAR FOR BSIS-GJAHR NO-DISPLAY,
PO_DOC FOR BSEG-EBELN NO-DISPLAY,
PO_ITEMP FOR BSEG-EBELN NO-DISPLAY, "PO/item pair
PO_AUFNR FOR BSIS-AUFNR NO-DISPLAY.
DATA:
BSEG_FIELDS LIKE RSFS_STRUC OCCURS 10 WITH HEADER LINE,
BEGIN OF MYBSEG,
EBELN LIKE BSEG-EBELN,
EBELP LIKE BSEG-EBELP,
KSTRG LIKE BSEG-KSTRG,
END OF MYBSEG,
LASTAUFNR LIKE BSIS-AUFNR,
AUFNRSUBTOTAL LIKE BSIS-DMBTR,
TOTAL LIKE BSIS-DMBTR.
AT SELECTION-SCREEN ON POSTDATE.
CLEAR YEAR. REFRESH YEAR.
IF NOT POSTDATE-LOW IS INITIAL.
YEAR-SIGN = 'I'.
YEAR-OPTION = 'EQ'.
YEAR-LOW = POSTDATE-LOW(4).
IF NOT POSTDATE-HIGH IS INITIAL AND
( POSTDATE-LOW(4) <> POSTDATE-HIGH(4) ) .
MESSAGE E003(ZS).
ENDIF.
APPEND YEAR.
ENDIF.
INITIALIZATION.
BSEG_FIELDS = 'ebeln'. APPEND BSEG_FIELDS.
BSEG_FIELDS = 'ebelp'. APPEND BSEG_FIELDS.
BSEG_FIELDS = 'kstrg'. APPEND BSEG_FIELDS.
REFRESH PO_DOC.
PO_DOC-SIGN = 'I'.
PO_DOC-OPTION = 'EQ'.
REFRESH PO_ITEMP.
TOP-OF-PAGE.
WRITE: SY-DATUM.
WRITE: 85 'Project Expenditure Tracing Report (by Document),'.
WRITE: 'Posting date'.
IF POSTDATE-HIGH IS INITIAL.
WRITE: POSTDATE-LOW.
ELSE.
WRITE: 'Between', POSTDATE-LOW, 'and', POSTDATE-HIGH.
ENDIF.
WRITE: 240 'Page:', 248(2) SY-PAGNO, / SY-ULINE.
START-OF-SELECTION.
* should do authorization checking here **
SELECT * FROM BSIS WHERE
BUKRS = COMPANY AND
GJAHR IN YEAR AND
AUFNR IN ORDER AND
BUDAT IN POSTDATE
ORDER BY AUFNR BELNR.
IF BYPO = ' ' AND LASTAUFNR <> BSIS-AUFNR.
PERFORM WRITE_ORDER_HEADER.
ENDIF.
LASTAUFNR = BSIS-AUFNR.
* should do authorization checking here **
SELECT SINGLE (BSEG_FIELDS) FROM BSEG INTO MYBSEG WHERE
BUKRS = COMPANY AND
BELNR = BSIS-BELNR AND
GJAHR = BSIS-GJAHR AND
BUZEI = BSIS-BUZEI.
IF BYPO = 'X'. "output by PO doc: report zgmpo-05
LOOP AT PO_AUFNR WHERE HIGH = MYBSEG-EBELN AND LOW = BSIS-AUFNR.
ENDLOOP.
IF SY-SUBRC = 4. "no entry already exists
PO_AUFNR-HIGH = MYBSEG-EBELN.
PO_AUFNR-LOW = BSIS-AUFNR.
APPEND PO_AUFNR.
ENDIF.
IF MYBSEG-EBELN <> SPACE.
PERFORM ADD_PO_ITEM.
ENDIF.
ELSE. "output by document
IF BSIS-SHKZG = 'H'.
ELSE.
BSIS-DMBTR = - BSIS-DMBTR.
ENDIF.
PERFORM WRITE_OUTPUT.
TOTAL = TOTAL + BSIS-DMBTR.
AUFNRSUBTOTAL = AUFNRSUBTOTAL + BSIS-DMBTR.
ENDIF.
ENDSELECT.
IF BYPO = 'X'.
SUBMIT ZGMPO-05 WITH COMPARE = 'A'
WITH PO_ITEMP IN PO_ITEMP
WITH PO_DOC IN PO_DOC
WITH POSTDAT IN POSTDATE
WITH PO_AUFNR IN PO_AUFNR AND RETURN.
ELSE.
PERFORM WRITE_AUFNRSUBTOTAL.
PERFORM WRITE_TOTAL.
ENDIF.
*&---------------------------------------------------------------------*
*& Form WRITE_OUTPUT
*&---------------------------------------------------------------------*
FORM WRITE_OUTPUT.
WRITE: / BSIS-BELNR UNDER TEXT-001, "Document
BSIS-BUDAT UNDER TEXT-002, "Posting Date
BSIS-KOSTL UNDER TEXT-003, "Cost Center
BSIS-SGTXT UNDER TEXT-004, "Description
BSIS-DMBTR UNDER TEXT-005, "Amount
MYBSEG-KSTRG UNDER TEXT-006, "Cost Object
MYBSEG-EBELN UNDER TEXT-007. "PO Number
ENDFORM. " WRITE_OUTPUT
*&---------------------------------------------------------------------*
*& Form WRITE_COL_HEADERS
*&---------------------------------------------------------------------*
FORM WRITE_COL_HEADERS.
WRITE: / TEXT-001, "Document
16 TEXT-002, "Posting Date
28 TEXT-003, "Cost Center
36 TEXT-004, "Description
87 TEXT-005, "Amount
107 TEXT-006, "Cost Object
123 TEXT-007. "PO Number
ENDFORM.
*&---------------------------------------------------------------------*
*& Form WRITE_TOTAL
*&---------------------------------------------------------------------*
FORM WRITE_TOTAL.
WRITE: / SY-ULINE.
WRITE: / 'Total:' UNDER TEXT-004, TOTAL UNDER TEXT-005.
ENDFORM. " WRITE_TOTAL
*&---------------------------------------------------------------------*
*& Form ADD_PO_ITEM
*&---------------------------------------------------------------------*
FORM ADD_PO_ITEM.
LOOP AT PO_DOC WHERE LOW = MYBSEG-EBELN.
ENDLOOP.
IF SY-SUBRC = 4. "entry does not already exist
PO_DOC-LOW = MYBSEG-EBELN.
APPEND PO_DOC.
ENDIF.
* add po/item pair to list. PO goes into high, item into low
LOOP AT PO_ITEMP WHERE HIGH = MYBSEG-EBELN AND LOW = MYBSEG-EBELP.
ENDLOOP.
IF SY-SUBRC = 4. "entry does not already exist
PO_ITEMP-HIGH = MYBSEG-EBELN.
PO_ITEMP-LOW = MYBSEG-EBELP.
APPEND PO_ITEMP.
ENDIF.
ENDFORM. " ADD_PO_ITEM
*&---------------------------------------------------------------------*
*& Form WRITE_ORDER_HEADER
*&---------------------------------------------------------------------*
FORM WRITE_ORDER_HEADER.
IF NOT AUFNRSUBTOTAL IS INITIAL.
PERFORM WRITE_AUFNRSUBTOTAL.
ENDIF.
SKIP 1.
WRITE: / 'Project No:', BSIS-AUFNR.
WRITE: / SY-ULINE.
PERFORM WRITE_COL_HEADERS.
ENDFORM. " WRITE_ORDER_HEADER
*&---------------------------------------------------------------------*
*& Form WRITE_AUFNRSUBTOTAL
*&---------------------------------------------------------------------*
FORM WRITE_AUFNRSUBTOTAL.
WRITE: / SY-ULINE.
WRITE: / 'Project Total:' UNDER TEXT-004, AUFNRSUBTOTAL UNDER TEXT-005.
AUFNRSUBTOTAL = 0.
ENDFORM. " WRITE_AUFNRSUBTOTAL

Click Here to Read More !!!!

ABAP/4 Program: Outstanding PO Report

This report displays information for outstanding purchase orders. The report has two parts: one is the standard report, and the other is called from the Project Expense report. Note that both reports output GL Account, cost center, and cost object information (from table EKKN) as a single value on the output line. Actually, each line may have several cost centers and cost object to which the invoices were allocated; however, the user only wanted one (any one) to be listed.


Standard Report: The standard report lists info (limited by selection criteria) for purchase order items whose GR and IR are not equal. The report first accesses the header table EKKO, limited by purchasing group and purchase order. It then accesses EKPO, limited by PO item and material selection criteria. An internal table sums keeps subtotals of the related GR/IR quantities and values, read from EKBE, for the given PO and item. In the fill_sums routine, the subtotals are grouped by Credit/Debit indicator (EKBE-SHKZG), account assignment (EKBE-ZEKKN), and PO Doc Category (EKBE-BEWTP). These subtotals are then processed by the fill_outtab routine, which makes the GR/IR totals and compares them. If they are unequal, data is looked up further from EKKN, and the item is output.
Report Called from Project Expense Report: The report called from the Project Expense Report is the same as the standard report except that:
the compare variable is set to value 'A'.
records are outputted if GR < loekz =" '" loekz =" '" ebeln =" EKKOEBELN" compare =" 'A'." high =" MYEKPO-EBELN" low =" MYEKPO-EBELP." subrc =" 0." ebeln =" MYEKPO-EBELN" ebelp =" MYEKPO-EBELP."> ' '.
IF SUMS-SHKZG = 'H'. "negative value
SUMS-MENGE = - SUMS-MENGE.
SUMS-DMBTR = - SUMS-DMBTR.
ENDIF.
SUMS-SHKZG = ' '.
COLLECT SUMS.
ENDSELECT.
ENDFORM.
*---------------------------------------------------------------------*
* FORM FILL_OUTTAB *
*---------------------------------------------------------------------*
FORM FILL_OUTTAB.
* preconditions: myekpo is set at current PO and item
* sums has gr/ir totals, by zekkn sub-index
CLEAR OUTTAB.
LOOP AT SUMS.
IF SUMS-BEWTP = 'E'. "goods receipt
OUTTAB-GR = OUTTAB-GR + SUMS-MENGE.
OUTTAB-GRVAL = OUTTAB-GRVAL + SUMS-DMBTR.
ELSEIF SUMS-BEWTP = 'R'. "invoice receipt
OUTTAB-IR = OUTTAB-IR + SUMS-MENGE.
OUTTAB-IRVAL = OUTTAB-IRVAL + SUMS-DMBTR.
ELSE.
* perform write_bewtp_unhandled.
ENDIF.
ENDLOOP.
IF COMPARE = SPACE.
CHECK OUTTAB-GR <> OUTTAB-IR. "if gr/ir is equal, stop processing
ELSE. "COMPARE = 'A'.
CHECK ( OUTTAB-IR < gr =" 0" ir =" 0" ebeln =" MYEKPO-EBELN." ebelp =" MYEKPO-EBELP." menge =" MYEKPO-MENGE." txz01 =" MYEKPO-TXZ01." out =" OUTTAB-GR" outval =" OUTTAB-GRVAL" estgrval =" OUTTAB-GR" estoutval =" OUTTAB-ESTGRVAL"> ' '. "account assignment: need to use ekkn
IF EKPO-VRTKZ = '2'. "multiple account distributed by percentage
WRITE: / 'This program does not handle accounts distributed',
'by percentage. Pls check manually (PO number',
EKPO-EBELN, ')'.
EXIT.
ENDIF.
* Fill in random info from ekkn.
SELECT SINGLE MENGE VPROZ SAKTO KOSTL KSTRG FROM EKKN
INTO MYEKKN WHERE
EBELN = MYEKPO-EBELN AND EBELP = MYEKPO-EBELP.
OUTTAB-SAKTO = MYEKKN-SAKTO.
OUTTAB-KOSTL = MYEKKN-KOSTL.
OUTTAB-KSTRG = MYEKKN-KSTRG.
APPEND OUTTAB. CLEAR OUTTAB.
ENDIF. "account assignment
ENDFORM.
*---------------------------------------------------------------------*
* FORM WRITE_OUTTAB *
*---------------------------------------------------------------------*
FORM WRITE_OUTTAB.
DESCRIBE TABLE OUTTAB LINES LN.
IF LN = 0.
WRITE: / 'No records found.'.
EXIT.
ENDIF.
SORT OUTTAB BY SAKTO KOSTL KSTRG.
LOOP AT OUTTAB.
IF ( NOT OLDSAKTO IS INITIAL ) AND OUTTAB-SAKTO <> OLDSAKTO AND
WROTE_SUBT = SPACE.
DO_SUBTOTAL = 'X'.
ENDIF.
OLDSAKTO = OUTTAB-SAKTO.
IF ( NOT OLDKOSTL IS INITIAL ) AND OUTTAB-KOSTL <> OLDKOSTL AND
WROTE_SUBT = SPACE.
DO_SUBTOTAL = 'X'.
ENDIF.
IF ( NOT OLDKSTRG IS INITIAL ) AND OLDKSTRG <> OUTTAB-KSTRG.
DO_SUBTOTAL = 'X'.
ENDIF.
OLDKSTRG = OUTTAB-KSTRG.
WROTE_SUBT = SPACE.
IF DO_SUBTOTAL = 'X'.
PERFORM WRITE_COBJ_SUBTOTAL.
CLEAR COBJ_SUBTOTAL.
DO_SUBTOTAL = SPACE.
ENDIF.
ADD-CORRESPONDING OUTTAB TO COBJ_SUBTOTAL.
ADD-CORRESPONDING OUTTAB TO TOTALS.
IF OUTTAB-OUT < 0.
FORMAT COLOR COL_NEGATIVE.
ENDIF.
WRITE: /
OUTTAB-EBELN UNDER TEXT-004, "PO doc
OUTTAB-EBELP UNDER TEXT-005, "PO item
OUTTAB-SAKTO UNDER TEXT-006, "G/L Acct
OUTTAB-KOSTL UNDER TEXT-007, "Cost Center
OUTTAB-KSTRG UNDER TEXT-008, "Cost Object
(13) OUTTAB-MENGE UNDER TEXT-009, "Quantity
(13) OUTTAB-GR UNDER TEXT-010, "GR quantity
(13) OUTTAB-IR UNDER TEXT-011, "IR quantity
(13) OUTTAB-ESTGRVAL UNDER TEXT-017, "Estimated GR Value
* (13) outtab-grval under text-012, "GR Val
(13) OUTTAB-IRVAL UNDER TEXT-013, "IR Value
(13) OUTTAB-OUT UNDER TEXT-014, "Outstandng IR qty
(13) OUTTAB-ESTOUTVAL UNDER TEXT-018, "Estimated Out IR Value
* (13) outtab-outval under text-015. "Outstandng IRval
OUTTAB-TXZ01 UNDER TEXT-019.
IF COMPARE = 'A'.
LOOP AT PO_AUFNR WHERE HIGH = OUTTAB-EBELN.
WRITE: PO_AUFNR-LOW UNDER TEXT-020.
ENDLOOP.
ENDIF.
FORMAT COLOR OFF.
ENDLOOP.
PERFORM WRITE_COBJ_SUBTOTAL.
PERFORM WRITE_TOTALS.
ENDFORM.
*---------------------------------------------------------------------*
* FORM WRITE_HEADERS *
*---------------------------------------------------------------------*
FORM WRITE_HEADERS.
FORMAT COLOR COL_HEADING.
WRITE: / TEXT-004, "PO
12 TEXT-005, "Item
18 TEXT-006, "G/L
29 TEXT-007, "Cost Center
40 TEXT-008, "Cost Object
49 TEXT-009, "Tot Qty
57 TEXT-010, "GR Qty
71 TEXT-011, "IR Qty
85 TEXT-017, "Est GR Value
* 85 text-012, "GR Val
99 TEXT-013, "IR Val
113 TEXT-014, "Outstanding IR Qty
* 127 text-015. "Outstanding IR Val
127 TEXT-018, "Est Out IR Val
141 TEXT-019. "short text
IF COMPARE = 'A'.
WRITE: 183 TEXT-020. "project
ENDIF.
WRITE: / SY-ULINE.
FORMAT COLOR OFF.
ENDFORM.
TOP-OF-PAGE.
WRITE: SY-DATUM, SY-REPID, '/', SY-UNAME.
IF COMPARE = 'A'. "called from proj exp. report
READ TABLE POSTDAT INDEX 1.
WRITE: 85 'Project Expenditure Tracking Report (By PO Number)'.
WRITE: 'Posting date'.
IF POSTDAT-HIGH IS INITIAL.
WRITE: ':', POSTDAT-LOW.
ELSE.
WRITE: 'Between', POSTDAT-LOW, 'and', POSTDAT-HIGH.
ENDIF.
ELSE.
WRITE: 110 'Outstanding Purchase Order'.
ENDIF.
WRITE: 240 'Page:', 248(2) SY-PAGNO, / SY-ULINE.
PERFORM WRITE_HEADERS.
*&---------------------------------------------------------------------*
*& Form WRITE_COBJ_SUBTOTAL
*&---------------------------------------------------------------------*
FORM WRITE_COBJ_SUBTOTAL.
IF COMPARE = ' '.
WRITE: / SY-ULINE.
WRITE: / 'Subtotal' UNDER TEXT-008,
(13) COBJ_SUBTOTAL-MENGE UNDER TEXT-009, "Quantity
(13) COBJ_SUBTOTAL-GR UNDER TEXT-010, "GR quantity
(13) COBJ_SUBTOTAL-IR UNDER TEXT-011, "IR quantity
(13) COBJ_SUBTOTAL-ESTGRVAL UNDER TEXT-017, "Estimated GR Value
(13) COBJ_SUBTOTAL-IRVAL UNDER TEXT-013, "IR Value
(13) COBJ_SUBTOTAL-OUT UNDER TEXT-014, "Outstandng IR qty
(13) COBJ_SUBTOTAL-ESTOUTVAL UNDER TEXT-018. "Estimated Out IRva
SKIP 1.
WROTE_SUBT = 'X'.
ENDIF.
ENDFORM. " WRITE_COBJ_SUBTOTAL
*&---------------------------------------------------------------------*
*& Form WRITE_TOTALS
*&---------------------------------------------------------------------*
FORM WRITE_TOTALS.
WRITE: / SY-ULINE.
WRITE: / 'Total:' UNDER TEXT-008,
(13) TOTALS-MENGE UNDER TEXT-009, "Quantity
(13) TOTALS-GR UNDER TEXT-010, "GR quantity
(13) TOTALS-IR UNDER TEXT-011, "IR quantity
(13) TOTALS-ESTGRVAL UNDER TEXT-017, "Estimated GR Value
(13) TOTALS-IRVAL UNDER TEXT-013, "IR Value
(13) TOTALS-OUT UNDER TEXT-014, "Outstandng IR qty
(13) TOTALS-ESTOUTVAL UNDER TEXT-018. "Estimated Out IRva
ENDFORM. " WRITE_TOTALS

Click Here to Read More !!!!

ABAP/4 Program: Describe Select-Options

When printing a report, you can print the search conditions or report parameters that the user entered. For instance, if a report output was restricted to plants between 1011 and 1501, you may want to print "Plants Between 1011 and 1501" on the report. This procedure describes the selected parameters.
Describe Select-Options


select-options: sel_opt for sy-datum.
.
.
.
loop at sel_opt.
perform describe_select_options using 'Date'
sel_opt-sign
sel_opt-option
sel_opt-low
sel_opt-high
changing datedesc.
write: / datedesc.
endloop.
.
.
.
*&---------------------------------------------------------------------*
*& Form DESCRIBE_SELECT_OPTIONS
*&---------------------------------------------------------------------*
form describe_select_options using
field_name type c "name to describe field (e.g. "Date")
sel_opt_sign like sel_opt-sign
sel_opt_option like sel_opt-option
sel_opt_low like sel_opt-low
sel_opt_high like sel_opt_high
changing descline type c. "line that will hold the one-line description
if sel_opt_sign = 'i'.
concatenate 'Include' field_name into descline separated by space.
else.
concatenate 'Exclude' field_name into descline separated by space.
endif.
case sel_opt_option.
when 'EQ'.
concatenate descline '=' sel_opt_low into descline
separated by space.
when 'BT'.
concatenate descline 'between' sel_opt_low 'and' sel_opt_high
into descline separated by space.
when 'NB'.
concatenate descline 'not between' sel_opt_low 'and' sel_opt_high
into descline separated by space.
when 'NE'.
concatenate descline '!=' sel_opt_low into descline
separated by space.
when 'GE'.
concatenate descline '>=' sel_opt_low into descline
separated by space.
when 'LE'.
concatenate descline '<=' sel_opt_low into descline
separated by space.
when 'GT'.
concatenate descline '>' sel_opt_low into descline
separated by space.
when 'LT'.
concatenate descline '<' sel_opt_low into descline
separated by space.
endcase.
endform. " describe_select_options

Click Here to Read More !!!!

ABAP/4 Program: Output Table Fields to a List

When you're looking at the structure of a table, SAP will let you print the structure, but it won't let you save the structure. This can be annoying. This report outputs the table structure to a list. At this point the user can use the System->List->Save->Local file command to save the list to a file.
Output Table Fields to a List


*&---------------------------------------------------------------------*
*& Report YTABFLDS *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT YTABFLDS .
TABLES: DD02L, DD03L, DD04T.
PARAMETERS THETABLE LIKE DD02L-TABNAME OBLIGATORY.
DATA: BEGIN OF MYTABLE,
TABNAME LIKE DD02L-TABNAME,
AS4LOCAL LIKE DD02L-AS4LOCAL,
AS4VERS LIKE DD02L-AS4VERS,
END OF MYTABLE.
SELECT SINGLE TABNAME AS4LOCAL AS4VERS INTO MYTABLE FROM DD03L
WHERE TABNAME = THETABLE.
WRITE: / MYTABLE-TABNAME, 11 MYTABLE-AS4LOCAL, 13 MYTABLE-AS4VERS.
SELECT * FROM DD03L
WHERE TABNAME = MYTABLE-TABNAME AND
AS4LOCAL = MYTABLE-AS4LOCAL AND AS4VERS = MYTABLE-AS4VERS.
WRITE: / DD03L-FIELDNAME, 11 DD03L-KEYFLAG, 13 DD03L-ROLLNAME,
24 DD03L-CHECKTABLE, 35 DD03L-INTTYPE, 37 DD03L-REFTABLE,
48 DD03L-DATATYPE.
SELECT SINGLE * FROM DD04T
WHERE ROLLNAME = DD03L-ROLLNAME AND
AS4LOCAL = MYTABLE-AS4LOCAL AND AS4VERS = MYTABLE-AS4VERS AND
DDLANGUAGE = 'E'.
WRITE: 53 DD04T-DDTEXT.
ENDSELECT.

Click Here to Read More !!!!

Lock All Users in a Client

Sometimes it is useful to be able to lock all the users out of a client; for instance, during a client copy (you can also do this with tp locksys, but you have to issue that command from the OS level, and then you can only use DDIC or SAP* to log on). You can use this program to lock out all users except yourself. Of course, access to this type of program should be controlled tightly.



This program (un)locks all the users in a client, except for the current user, and the SAP* user. You might want to add somthing like SELECT-OPTIONS EXEMPTUS FOR USR02-BNAME to allow a list of usernames not to be processed.
Un/Lock all users in a client
*&---------------------------------------------------------------------*
*& Report YUSRLOCK *
*& *
*&---------------------------------------------------------------------*
*& *
*& *
*&---------------------------------------------------------------------*
REPORT YUSRLOCK MESSAGE-ID Z1 .
TABLES: USR02.
PARAMETERS: LOCK AS CHECKBOX, LISTLOCK AS CHECKBOX.
DATA: UFLAGVAL TYPE I, LOCKSTRING(8) TYPE C.
*-------------- Authorization check -----------------------*
AUTHORITY-CHECK OBJECT 'ZPROG_RUN' ID 'PROGRAM' FIELD SY-CPROG.
IF SY-SUBRC <> 0.
IF SY-SUBRC = 4.
MESSAGE E000 WITH SY-CPROG. "some message about authorization check failure
ELSE.
MESSAGE E005 WITH SY-SUBRC. "some message about authorization check failure
ENDIF.
ENDIF.
IF LISTLOCK = 'X'.
WRITE:/ 'List all locked users: '.
SELECT * FROM USR02 WHERE UFLAG = 64.
WRITE: / USR02-BNAME.
ENDSELECT.
EXIT.
ENDIF.
IF LOCK = 'X'.
UFLAGVAL = 64. "lock all users
LOCKSTRING = 'locked'.
ELSE.
UFLAGVAL = 0. "unlock all users
LOCKSTRING = 'unlocked'.
ENDIF.
SELECT * FROM USR02 WHERE BNAME <> 'SAP*' AND BNAME <> SY-UNAME.
IF USR02-UFLAG <> 0 AND USR02-UFLAG <> 64.
WRITE: 'User', USR02-BNAME, 'untouched; please handle manually.'.
CONTINUE.
ENDIF.
** check that user has authority to make these changes
AUTHORITY-CHECK OBJECT 'S_USER_GRP'
ID 'CLASS' FIELD USR02-CLASS
ID 'ACTVT' FIELD '05'.
IF SY-SUBRC <> 0.
IF SY-SUBRC = 4.
WRITE: /'You are not authorized to lock/unlock user ',
USR02-BNAME, USR02-CLASS.
ELSE.
WRITE: /'Authorization error checking user ',
USR02-BNAME, USR02-CLASS, '(return code', SY-SUBRC, ').'.
ENDIF.
ELSE. "has authority
UPDATE USR02 SET UFLAG = UFLAGVAL WHERE BNAME = USR02-BNAME.
WRITE: / 'User', USR02-BNAME, LOCKSTRING, '.'.
ENDIF.

Click Here to Read More !!!!