Saturday, April 5, 2008

MACRO

PROGRAM FOR MACRO
REPORT ZSUBR .
*MACRO DEFINITION

*DEFINE DISP.
*WRITE : / 'HELLO '.
*END-OF-DEFINITION.
*
*DISP.
*
*DO 3 TIMES.
*DISP.
*ENDDO.

* PASSING PARAMETERS TO A MACRO ...
*PARAMETERS :
* A TYPE I,
* B TYPE I.
*DATA RES TYPE I.
*
* DEFINE DISP.
* RES = &1 &2 &3.
* WRITE : / RES.
* END-OF-DEFINITION.
*
* DISP A + B.
* DISP A - B.
* DISP A * B.
* DISP A / B.
*
* NESTED MACRO'S


REPORT ZMACRO1 .
*DEFINE DISP.
*WRITE : / ' TESTING MACRO ... TESTED OK '.
*END-OF-DEFINITION.

*********** PASSING PARAMETERS TO A MACRO ****************
*PARAMETERS :
* A TYPE I,
* B TYPE I.
*DATA RES TYPE I.
*
* DEFINE DISP.
* RES = &1 &2 &3.
* WRITE : / RES.
* END-OF-DEFINITION.

* :CHAIN OPERATOR CAN USED TO CALL A MACRO REPEATEDLY WITH RELEVANT * *
* PARAMETERS AND IT TAKES SEQUENCE OF PARAMETERS LIKE &1, &2, &3 ,
* THIS IS DEPENDING ON THE NUMBER OF PARAMETERS , WE CANNOT *
* CHANGE THE *ORDER AND TYPE

* DISP A : + B, - B, * B , / B.
* ANOTHER WAY OF CALLING
*DISP A + B.
*DISP A - B.
*DISP A * B.
*DISP A / B.

* ONE MORE WAY OF CALLING
DISP : A + B , A - B, A * B , A / B.
*----------------------------------------------------------------------*
* INCLUDE Y_F4_VALUES *
*----------------------------------------------------------------------*
DEFINE INSERT_SEPARATORS.
MOVE '|' TO T_F4_HELP-COL1.
MOVE '|' TO T_F4_HELP-COL2.
MOVE '|' TO T_F4_HELP-COL3.
MOVE '|' TO T_F4_HELP-COL4.
END-OF-DEFINITION.

* MACRO F4_VALUE_REQUEST
* &1 PARAMETER FOR F4 VALUE REQUEST FROM ABAP PROGRAM
* &2 TABLE TO SELECT POSSIBLE VALUES FROM FOR &1
* &3 FIELD FOR PARAMETER FROM RELEVANT TABLE
* &4 FIELD FOR DESCRIPTION OF &3
* &5 TRANSLATION FIELD KEY
* &6 TITLE FOR THE F4 POPUP
* &7,8 AND 9 - TEXT HEADERS FOR COLUMNS
*
DEFINE F4_VALUE_REQUEST.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR &1.
*
*
* AT THE MOMENT, SELECT ALL COMPANY CODES,
*
DATA: BEGIN OF T_F4_HELP OCCURS 0,
COL1 TYPE C,
&3 LIKE &2-&3,
COL2 TYPE C,
&4 LIKE &2-&4,
COL3 TYPE C,
IAS(15) TYPE C,
COL4 TYPE C,
END OF T_F4_HELP,
*
W_SAP_DATA TYPE ZOUTWARDS,
W_LEGACY_DATA TYPE ZINWARDS,
W_CHOISE LIKE SY-TABIX,
W_LINES LIKE SY-TABIX,
W_ENDPOS_COL TYPE I.
*
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
MOVE &7 TO T_F4_HELP-&3.
MOVE &8 TO T_F4_HELP-&4.
MOVE &9 TO T_F4_HELP-IAS.
INSERT_SEPARATORS.
APPEND T_F4_HELP.
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
SELECT &3 &4
INTO (T_F4_HELP-&3,
T_F4_HELP-&4)
FROM &2
WHERE SPRAS = SY-LANGU.
APPEND T_F4_HELP.
ENDSELECT.
*
* LOOP ROUND THE TABLE DELETING THOSE CODES THAT DO NOT
* HAVE AN ENTRY IN THE LEGACY TRANSLATION TABLES
*
LOOP AT T_F4_HELP.
IF SY-TABIX > 3.
MOVE T_F4_HELP-&3 TO W_SAP_DATA.
CALL FUNCTION 'Z_LEGACY_TRANSLATE'
EXPORTING
I_FIELD = '&5'
I_SAP = W_SAP_DATA
IMPORTING
E_LEGACY_DATA = W_LEGACY_DATA
EXCEPTIONS
X_NO_TRANSLATION = 1
X_NO_DATA_TO_TRANSLATE = 2
X_COULD_NOT_UPDATE = 3
X_INVALID_SYSTEM = 4
X_INVALID_FIELD = 5
OTHERS = 6.
IF SY-SUBRC = 0.
MOVE W_LEGACY_DATA TO
T_F4_HELP-IAS.
INSERT_SEPARATORS.
MODIFY T_F4_HELP.
ELSE.
DELETE T_F4_HELP.
ENDIF.
ENDIF.
ENDLOOP.
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
*
DESCRIBE TABLE T_F4_HELP LINES W_LINES.
IF W_LINES > 4.
* DISPLAY....
*
* CALCULATE THE WIDTH OF THE TABLE.
*
READ TABLE T_F4_HELP INDEX 1.
COMPUTE W_ENDPOS_COL = 10 + STRLEN( T_F4_HELP ).
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING
ENDPOS_COL = W_ENDPOS_COL
ENDPOS_ROW = 25
STARTPOS_COL = 10
STARTPOS_ROW = 10
TITLETEXT = &6
IMPORTING
CHOISE = W_CHOISE
TABLES
VALUETAB = T_F4_HELP
EXCEPTIONS
BREAK_OFF = 1
OTHERS = 2.
IF SY-SUBRC = 0.
*
* MAKE SURE THAT THEY HAVEN'T SELECTED A TITLE OR AN
* UNDERSCORE.
*
IF W_CHOISE > 3
AND W_CHOISE < W_LINES.
READ TABLE T_F4_HELP INDEX W_CHOISE.
MOVE T_F4_HELP-&3 TO &1.
ENDIF.
ENDIF.
ELSE.
MESSAGE W000 WITH 'NO VALUES FOR LIST'.
ENDIF.
END-OF-DEFINITION.

DEFINE F4_VALUE_REQUEST_BELNR.
*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR &1.
*
* AT THE MOMENT, SELECT ALL COMPANY CODES,
*
DATA: BEGIN OF T_F4_HELP OCCURS 0,
COL1 TYPE C,
&3 LIKE &2-&3,
COL2 TYPE C,
&4 LIKE &2-&4,
COL3 TYPE C,
IAS(15) TYPE C,
COL4 TYPE C,
END OF T_F4_HELP,
*
W_SAP_DATA TYPE ZOUTWARDS,
W_LEGACY_DATA TYPE ZINWARDS,
W_CHOISE LIKE SY-TABIX,
W_LINES LIKE SY-TABIX,
W_ENDPOS_COL TYPE I.
*
* GET THE COMPANY CODE....
*
PERFORM READ_SCREEN_VALUES.
*
IF P_BUKRS <> ''.
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
MOVE &7 TO T_F4_HELP-&3.
MOVE &8 TO T_F4_HELP-&4.
MOVE &9 TO T_F4_HELP-IAS.
INSERT_SEPARATORS.
APPEND T_F4_HELP.
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
SELECT &3 &4
INTO (T_F4_HELP-&3,
T_F4_HELP-&4)
FROM &2
WHERE BUKRS = P_BUKRS.
APPEND T_F4_HELP.
ENDSELECT.
*
* LOOP ROUND THE TABLE DELETING THOSE CODES THAT DO NOT
* HAVE AN ENTRY IN THE LEGACY TRANSLATION TABLES
*
LOOP AT T_F4_HELP.
IF SY-TABIX > 3.
MOVE T_F4_HELP-&3 TO W_SAP_DATA.
CALL FUNCTION 'Z_LEGACY_TRANSLATE'
EXPORTING
I_FIELD = '&5'
I_SAP = W_SAP_DATA
IMPORTING
E_LEGACY_DATA = W_LEGACY_DATA
EXCEPTIONS
X_NO_TRANSLATION = 1
X_NO_DATA_TO_TRANSLATE = 2
X_COULD_NOT_UPDATE = 3
X_INVALID_SYSTEM = 4
X_INVALID_FIELD = 5
OTHERS = 6.
IF SY-SUBRC = 0.
MOVE W_LEGACY_DATA TO
T_F4_HELP-IAS.
INSERT_SEPARATORS.
MODIFY T_F4_HELP.
ELSE.
DELETE T_F4_HELP.
ENDIF.
ENDIF.
ENDLOOP.
MOVE SY-ULINE TO T_F4_HELP.
APPEND T_F4_HELP.
*
DESCRIBE TABLE T_F4_HELP LINES W_LINES.
IF W_LINES > 4.
*
* DISPLAY....
*
* CALCULATE THE WIDTH OF THE TABLE.
*
READ TABLE T_F4_HELP INDEX 1.
COMPUTE W_ENDPOS_COL = 10 + STRLEN( T_F4_HELP ).
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING
ENDPOS_COL = W_ENDPOS_COL
ENDPOS_ROW = 25
STARTPOS_COL = 10
STARTPOS_ROW = 10
TITLETEXT = &6
IMPORTING
CHOISE = W_CHOISE
TABLES
VALUETAB = T_F4_HELP
EXCEPTIONS
BREAK_OFF = 1
OTHERS = 2.
IF SY-SUBRC = 0.
*
* MAKE SURE THAT THEY HAVEN'T SELECTED A TITLE OR AN
* UNDERSCORE.
*
IF W_CHOISE > 3
AND W_CHOISE < W_LINES.
READ TABLE T_F4_HELP INDEX W_CHOISE.
MOVE T_F4_HELP-&3 TO &1.
ENDIF.
ENDIF.
ELSE.
MESSAGE W000 WITH 'NO VALUES FOR LIST'.
ENDIF.
ENDIF.
END-OF-DEFINITION.



INCLUDE YRBINC .
************************************************************************
*
* YRBINC.
*
* THIS INCLUDE CONTAINS CONSTANT DEFINITIONS THAT ARE USED BY
* THE INCLUDES ZREPINC AND ZBDCINC
*
* INCLUDE THIS FILE IN FRONT OF ANY INCLUDE Z*INC
* STATEMENT.
*
************************************************************************
*
*
CONSTANTS: TRUE TYPE BOOLEAN VALUE 'X',
FALSE TYPE BOOLEAN VALUE ' ',
ALT_TRUE TYPE C VALUE 'T',
ALT_FALSE TYPE C VALUE 'F',
*
C_YES TYPE BOOLEAN VALUE 'J',
C_NO TYPE BOOLEAN VALUE 'N',
C_ON TYPE BOOLEAN VALUE 'X',
C_OFF TYPE BOOLEAN VALUE ' ',
*
C__NUMERIC(4) TYPE C VALUE ' PFI',
C_NUMBERS(11) TYPE C VALUE '0123456789 '.
*
* MACROS AND COMMON PERFORMS.
*
*EJECT
***********************************************************************
*
* MACRO: COPY_STRUCTURE
*
* PURPOSE: COPIES THE STRUCTURE OF A SPECIFIED TABLE INTO
* AN INTERNAL TABLE OF A SPECIFIED NAME PREFIXED
* WITH A T_
*
* ENTRY: TABLE NAME TO COPY
* ENTRY: INTERNAL DECLARATION NAME MIN
*
* EXIT: DECLARATION FOR TABLE T_NNNNNN
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE COPY_STRUCTURE.
DATA BEGIN OF T_&1 OCCURS 0.
INCLUDE STRUCTURE &2.
DATA END OF T_&1.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: COPYBOOK
*
* PURPOSE: COPIES THE STRUCTURE OF A SPECIFIED TABLE INTO
* AN INTERNAL TABLE OF THE SAME NAME PREFIXED WITH
* T_
*
* ENTRY: TABLE NAME TO COPY
*
* EXIT: DECLARATION FOR TABLE T_NNNNNN
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE COPYBOOK.
COPY_STRUCTURE &1 &1.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: INITIAL_DATA.
*
* PURPOSE: THE STATEMENT 'IF W_VAR IS INITIAL' IS A BIT
* FLAKY AND SOMETIMES DOES NOT WORK AS EXPECTED,
* WITH INITIAL VALUES NOT RETURNING A 'TRUE',
*
* HOWEVER, IF YOU COMPARE THE VARIABLE WITH AN
* INITIAL VALUE OF THE SAME TYPE IT WORKS.....
*
* THIS IS PREDOMINANT WHEN YOU PASS A VARIABLE TO
* A PROCEDURE WITH AN ARGUMENT OF THE SAME TYPE...
*
* DON'T ASK WHY THIS IS....I DON'T KNOW WHY...IT
* JUST MADE MY HEAD HURT.....
*
* THIS MACRO PROVIDES INITIAL DATA VALUES FOR
* A VARIABLE TYPE.
*
* ENTRY: VARIABLE NAME FOR INITIAL VALUES.
* VARIABLE TYPE FOR INITIAL VALUES.
*
* EXIT:
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE INITIAL_VALUES.
DATA &1 LIKE &2.
CLEAR &1.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: ZAP.
*
* PURPOSE: CLEARS AND REFRESHES A TABLE
*
* ENTRY: TABLE TO CLEAR
*
* EXIT: TABLE HEADER CLEARED
* TABLE CONTENTS DELETED
*
* CALLED BY: ZAP T_TABLE
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE ZAP.
CLEAR &1.
REFRESH &1.
FREE &1.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* PROCEDURE: ASCCHAR
*
* PURPOSE: ASCII(C$) OR CHR$(N)
*
* ENTRY: CHARACTER TO RETURN ASCII CODE FOR
* OR NUMBER TO RETURN CHARACTER FOR
*
* EXIT: OPPOSITE OF ABOVE
*
*
* CALLED BY: PERFORM ASCCHAR USING 98 CHANGING W_CHAR
* PERFORM ASCCHAR USING 'A' CHANGING W_NUM.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM ASCCHAR USING PU_IN CHANGING PC_OUT.
*
DATA: BEGIN OF T__CHR, "ASCII/CHR CONVERTER
ASC TYPE X,
END OF T__CHR,
*
W__CHR(5) TYPE C,
W__NUM TYPE I,
W__LEN TYPE I,
W__TYPE(1) TYPE C.
*
* IF PU_IN IS A CHARACTER, RETURN THE ASCII VALUE, IF IT'S
* A VALUE RETURN THE CHARACTER.
*
MOVE 0 TO PC_OUT.
DESCRIBE FIELD PU_IN TYPE W__TYPE.
CASE W__TYPE.
WHEN 'C'.
MOVE PU_IN TO W__CHR.
COMPUTE W__LEN = STRLEN( W__CHR ).
MOVE W__CHR TO T__CHR.
MOVE T__CHR-ASC TO PC_OUT.
WHEN OTHERS.
MOVE PU_IN TO W__NUM.
IF W__NUM > 0
AND W__NUM < 256.
MOVE W__NUM TO T__CHR-ASC.
MOVE T__CHR TO PC_OUT.
ENDIF.
ENDCASE.
ENDFORM.
*EXIT
**********************************************************************
*
* PROCEDURE: CHECK_DOMAIN_VALUES
*
* PURPOSE: CHECKS THAT A VALUE EXISTS IN THE
* SPECIFIED DOMAIN
*
* ENTRY: DOMAIN NAME TO USE
* ENTRY: VALUE TO CHECK
*
* EXIT: TRUE - DOMAIN CONTAINS VALUE
* EXIT: FALSE - DOMAIN DOES NOT CONTAIN VALUE
*
* CALLED BY: PERFORM CHECK_DOMAIN_VALUES
* USING W_DOMAIN W_VALUE
* CHANGING W_VALID.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM CHECK_DOMAIN_VALUES USING PU_DOMAIN LIKE DD07L-DOMNAME
PU_VALUE
CHANGING PC_VALID TYPE BOOLEAN.
*
CALL FUNCTION 'CHECK_DOMAIN_VALUES'
EXPORTING
DOMNAME = PU_DOMAIN
VALUE = PU_VALUE
EXCEPTIONS
NO_DOMNAME = 1
WRONG_VALUE = 2
DOM_NOT_FOUND = 3
OTHERS = 4.
IF SY-SUBRC = 0.
MOVE TRUE TO PC_VALID.
ELSE.
MOVE FALSE TO PC_VALID.
ENDIF.
ENDFORM.
*EJECT
**********************************************************************
*
* PROCEDURE: FORMATKEY
*
* PURPOSE: FORMATS A KEY. IF IT IS ALL ZEROES, THEN
* IT IS RIGHT JUSTFIED AND PADDED WITH
* ZEROES
*
* IF IT IS ALPHA-NUMERIC THEN IT IS LEFT
* JUSTIFIED AND PADDED WITH SPACES
*
* ENTRY: VALUE TO FORMAT
*
* EXIT: FORMATTED VALUE
*
* CALLED BY: PERFORM FORMATKEY USING W_KEY CHANGING
* W_NEWKEY.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM FORMATKEY USING PU_KEY CHANGING PC_KEY.
*
DATA: W_FLEN TYPE I, " FIELD LENGTH
W_NKEY(132) TYPE N, " NUMERIC KEY
W_CKEY(132) TYPE C, " CHARACTER
W_START TYPE I. " READ KEY FROM
*
DESCRIBE FIELD PU_KEY LENGTH W_FLEN.
IF PU_KEY CO C_NUMBERS.
MOVE PU_KEY TO W_NKEY.
*
* THIS IS RIGHT JUSTIFIED.....
*
COMPUTE W_START = 132 - W_FLEN.
MOVE W_NKEY+W_START(W_FLEN) TO PC_KEY.
ELSE.
MOVE PU_KEY TO W_CKEY.
MOVE W_CKEY+0(W_FLEN) TO PC_KEY.
TRANSLATE PC_KEY TO UPPER CASE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: GIVELINE.
*
* PURPOSE: PROVIDES TEXT ON LINE NUMBER 'N' FROM A LINE OF
* TEXT WITHIN A SPECIFIED COLUMN WIDTH
*
* ENTRY: LINE NUMBER OF REQUIRED LINE IN TEXT
* ENTRY: WIDTH OF COLUMN
* ENTRY: TEXT TO SPLIT
*
* EXIT: LINE N OF SPECIFIED TEXT WITHIN A SPECIFIED
* LINE WIDTH
*
* CALLED BY: PERFORM GIVELINE
* USING LINENO COLWIDTH FULLTEXT
* CHANGING TEXT
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM GIVELINE USING P_LINENO TYPE I
P_COLWIDTH TYPE I
P_FULLTEXT
CHANGING P_TEXT.
DATA: BEGIN OF W__TEXTTABLE OCCURS 0,
WORD(20) TYPE C,
END OF W__TEXTTABLE,
W__LINECOUNT TYPE I,
W__LINELEN TYPE I,
W__WORDLEN TYPE I,
W__TOTALLEN TYPE I.
*
* SPLIT THE INCOMING TEXT INTO SEPERATE WORDS.
*
CLEAR W__TEXTTABLE.
SPLIT P_FULLTEXT AT ' ' INTO TABLE W__TEXTTABLE.
MOVE 1 TO W__LINECOUNT.
MOVE SPACE TO P_TEXT.
LOOP AT W__TEXTTABLE.
COMPUTE W__LINELEN = STRLEN( P_TEXT ).
COMPUTE W__WORDLEN = STRLEN( W__TEXTTABLE-WORD ).
COMPUTE W__TOTALLEN = W__LINELEN + W__WORDLEN + 1.
*
* SPACE TO ADD THIS WORD ONTO THE LINE ?
*
IF W__TOTALLEN < P_COLWIDTH.
IF W__LINELEN <> 0.
COMPUTE W__LINELEN = W__LINELEN + 1.
ENDIF.
MOVE W__TEXTTABLE-WORD TO P_TEXT+W__LINELEN.
ELSE.
COMPUTE W__LINECOUNT = W__LINECOUNT + 1.
IF W__LINECOUNT > P_LINENO.
EXIT.
ELSE.
MOVE W__TEXTTABLE-WORD TO P_TEXT.
ENDIF.
ENDIF.
ENDLOOP.
*
* END OF THE TABLE ?
*
IF W__LINECOUNT < P_LINENO.
MOVE SPACE TO P_TEXT.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: PRG_DOC_HELP
*
* PURPOSE: DISPLAYS HELP FOR CURRENT PROGRAM
*
* ENTRY:
*
* EXIT:
*
* CALLED BY: PERFORM PRG_DOC_HELP
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM PRG_DOC_HELP.
*
TABLES: TTCDS.
*
DATA: W_ABAPNAME LIKE DOKHL-OBJECT,
W_PF15 TYPE C,
W_HOMETEXT LIKE DSYGH-DOKTITLE,
*
BEGIN OF T_PLINE OCCURS 100,
TEXT(80),
END OF T_PLINE.
*
SELECT SINGLE * FROM TTCDS WHERE
PROGNAME = SY-REPID .
IF SY-SUBRC = 0.
CALL FUNCTION 'DSYS_SHOW'
EXPORTING
DOKCLASS = TTCDS-DOKCLASS
DOKLANGU = SPACE
DOKNAME = TTCDS-DOKNAME
DOKTITLE = ' '
HOMETEXT = W_HOMETEXT
OUTLINE = TTCDS-DSYSGLDRG
IMPORTING
PF15 = W_PF15
EXCEPTIONS
CLASS_UNKNOWN = 0
OBJECT_NOT_FOUND = 0.
ELSE.
*
* DISPLAY ABAP DOCUMENTATION TEXT
*
MOVE SY-REPID TO W_ABAPNAME.
CALL FUNCTION 'DOCU_PRINT'
EXPORTING
DIALOG = 'X'
FORM = 'S'
ID = 'RE'
LANGU = SY-LANGU
NEW_PAGE = SPACE
OBJECT = W_ABAPNAME
OPERATION = 'P'
PRINTER = SPACE
TYP = 'E'
TABLES
LINE = T_PLINE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: STRIPSTRING.
*
* PURPOSE: REMOVES SPECIFIED CHARACTERS FROM STRING
*
* ENTRY: STRING TO REMOVE CHARACTERS FROM.
* ENTRY: STRING OF CHARACTERS TO REMOVE
*
* EXIT: ENTRY STRING WITH STRIP CHARS REMOVED
*
* CALLED BY: PERFORM STRIPTRING
* USING P_STRING P_REMOVE
* CHANGING P_OUT
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM STRIPSTRING USING P_STRING P_REMOVE
CHANGING P_OUT.
DATA: W__REMCHAR(3) TYPE C, " THE CHARACTER TO REMOVE
W__REMPOS TYPE I, " REMOVE CHARACTER POS
W__REMLEN TYPE I, " LENGTH OF P_REMOVE
W__LEN TYPE I, " LENGTH OF TARGET STR
W__FDPOS LIKE SY-FDPOS, " POSITION OF REMCHAR
W__CPSTR(255) TYPE C.
*
MOVE P_STRING TO P_OUT.
COMPUTE W__REMLEN = STRLEN( P_REMOVE ).
DO W__REMLEN TIMES.
*
* GET THE CHARACTER TO REMOVE FROM THE STRING.
*
COMPUTE W__REMPOS = SY-INDEX - 1.
MOVE P_REMOVE+W__REMPOS(1) TO W__REMCHAR.
*
* IF THIS IS A FULL STOP OR A SPACE CHANGE IT TO
* '...' OR '. .'.
*
IF W__REMCHAR = '.'.
MOVE '...' TO W__REMCHAR.
ELSE.
IF W__REMCHAR = ' '.
MOVE '. .' TO W__REMCHAR.
ENDIF.
ENDIF.
COMPUTE W__LEN = STRLEN( P_OUT ).
SEARCH P_OUT FOR W__REMCHAR.
*
* IF WE ARE REMOVING SPACES, AND THE STRING IS SHORTER THAN
* THE DECLARED LENGTH THEN THIS WILL LOOP FOREVER UNLESS WE
* STOP IT....
*
WHILE SY-SUBRC = 0
AND W__LEN > SY-FDPOS.
MOVE SY-FDPOS TO W__FDPOS.
IF W__FDPOS > 0.
MOVE P_OUT TO W__CPSTR+0(W__FDPOS).
COMPUTE W__FDPOS = SY-FDPOS + 1.
IF W__FDPOS < W__LEN.
MOVE P_OUT+W__FDPOS TO W__CPSTR+SY-FDPOS.
ELSE.
SUBTRACT 1 FROM W__FDPOS.
MOVE P_OUT+0(W__FDPOS) TO W__CPSTR.
ENDIF.
MOVE W__CPSTR TO P_OUT.
ELSE.
IF W__LEN = 1.
MOVE '' TO P_OUT.
ELSE.
MOVE P_OUT+1 TO P_OUT.
ENDIF.
ENDIF.
SEARCH P_OUT FOR W__REMCHAR.
IF SY-SUBRC = 0.
COMPUTE W__LEN = STRLEN( P_OUT ).
ENDIF.
ENDWHILE.
ENDDO.
ENDFORM.



INCLUDE YREPINC.
***********************************************************************
*
* YREPINC
*
* RE-USABLE CODE ROUTINES.
*
* THIS INCLUDE FILE CONTAINS SELF CONTAINED ROUTINES RESPONSIBLE
* FOR REPORTING ONLY
*
***********************************************************************
*
INCLUDE .
INCLUDE .
INCLUDE .
*
TYPES: SYSTEM_ID TYPE SYSYSID, " SYSTEM ID.
DECIMAL_VALUE TYPE P DECIMALS 2,
FORMAT_TYPE(16) TYPE C,
FORMAT_FIELD TYPE FIELDNAME.
*
FIELD-SYMBOLS: .
*
* REPORT DEFINITION TABLE
*
DATA: BEGIN OF REPORTTABLE OCCURS 0, " TABLE FOR REPORT FORMTS
TABLE TYPE TABNAME, " TABLE NAME
FIELDNAME TYPE FIELDNAME, " FIELD NAME
TITLE TYPE AS4TEXT, " TITLE TEXTS
CONVEXIT TYPE CONVEXIT, " FIELD CONVERSION EXIT
UNIT(30) TYPE C, " UNIT FORMAT FIELD
CURRENCY(30) TYPE C, " CURRENCY FORMAT FIELD
FORMAT(16) TYPE C, " ANOTHER FORMAT TYPE MASK
DATATYPE TYPE DATATYPE_D, " FIELD DATA TYPE
COLWIDTH TYPE I, " COLUMN WIDTH
STARTPOS TYPE I, " STARTPOSITION FOR COLUMN
CHECKBOX TYPE BOOLEAN, " DISPLAY AS CHECK BOX FLG
ISYNAME(20) TYPE C, " ICON OR SYMBOL NAME
FALSESYM(20) TYPE C, " FALSE SYMBOL NAME
ICON TYPE BOOLEAN, " DISPLAY AS ICON
SYMBOL TYPE BOOLEAN, " DISPLAY AS SYMBOL
HOTSPOT TYPE BOOLEAN, " IS THIS A HOTSPOT ?
FIRST TYPE I, " FIRST COLUMN OF REPORT
MAXWIDTH TYPE I, " MAX WIDTH OF REPORT
MAXTLINE TYPE I, " MAX NO OF TITLE LINES.
END OF REPORTTABLE.
*
*
* REPORT SUMMARY AND BREAKPOINTS
*
DATA: BEGIN OF REPORTBREAKS OCCURS 0, " SUB TOTAL AND REPORT BRK
FIELD LIKE REPORTTABLE-FIELDNAME, " FIELD NAME
TITLE LIKE REPORTTABLE-TITLE, " FIELD TITLE
FFEED TYPE BOOLEAN, " FORM FEED AFTER BREAK
PRINT TYPE BOOLEAN, " PRINT THIS BREAK ?
VALUE(70) TYPE C, " CURRENT VALUE
TOTALS TYPE DECIMAL_VALUE " TOTAL BY COLUMNS
OCCURS 0,
END OF REPORTBREAKS,
*
* STACKED REPORT FORMATS
*
BEGIN OF T__REPORTSTACK OCCURS 0, " REPORT STACK
REPNAME(10) TYPE C, " REPORT NAME
REPORTS LIKE REPORTTABLE OCCURS 0,
REPBREAKS LIKE REPORTBREAKS OCCURS 0,
END OF T__REPORTSTACK,
*
W__GROUPHDR TYPE BOOLEAN, " IN GROUP HEADER ROUTINE
W__LINEPRINTED TYPE BOOLEAN, " LINE PRINTED FLAG
W__RUNTOTAL TYPE BOOLEAN, " RUN TOTAL REC NEEDED,
W__CENTRE TYPE BOOLEAN, " CENTRE REPORT ON PAGE ?
W__LAST_COLOUR TYPE C, " LAST COLOR OUTPUT
W__INTENSE_FLAG TYPE BOOLEAN, " INTENSITY FLAG
W__CURREP LIKE T__REPORTSTACK-REPNAME,
W__SUBLINES TYPE I, " NUMBER OF LINES IN STLE
W__EOR_DONE TYPE BOOLEAN, " END OF REPORT TITLE ?
W__ALLHDR_DONE TYPE BOOLEAN. " CHECK BREAKS INIT HEADER
*EJECT
***********************************************************************
*
* MACRO: VARIOUS MACROS FOR SELECTION SCREENS.
*
* MACRO ARGUMENTS FUNCTION
* BEGIN_OF_BLOCK, BLOCK NAME SIMPLIFIES CREATION OF
* BLOCK TITLE SCREEN BLOCKS
*
* BLANKLINE NONE PUTS A LINE ON A SCREEN
*
* END_OF_BLOCK BLOCK NAME SIMPLIFIES CREATION OF
* SCREEN BLOCKS
*
* RADIOLEFT POSITION PLACES A RADIO BUTTON
* TITLE LENGTH ON A SELECTION SCREEN
* TITLE WITH COMMENT TO LEFT.
* PARAMETER
* GROUP
* (_COMMAND) USER COMMAND
*
* RADIORIGHT POSITION PLACES A RADIO BUTTON
* TITLE LENGTH ON A SELECTION SCREEN
* TITLE WITH COMMENT TO RIGHT
* PARAMETER
* GROUP
* (_COMMAND) USER COMMAND
*
* CHECKLEFT POSITION PLACES A CHECK BOX
* TITLE LENGTH ON A SELECTION SCREEN
* TITLE WITH COMMENT TO LEFT.
* PARAMETER
*
* CHECKRIGHT POSITION PLACES A CHECK BOX
* TITLE LENGTH ON A SELECTION SCREEN
* TITLE WITH COMMENT TO RIGHT
* PARAMETER
DEFINE BEGIN_OF_BLOCK.
SELECTION-SCREEN BEGIN OF BLOCK &1 WITH FRAME TITLE &2.
END-OF-DEFINITION.
*
DEFINE END_OF_BLOCK.
SELECTION-SCREEN END OF BLOCK &1.
END-OF-DEFINITION.
*
DEFINE BEGIN_OF_LINE.
SELECTION-SCREEN BEGIN OF LINE.
END-OF-DEFINITION.
*
DEFINE END_OF_LINE.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE BLANKLINE.
SELECTION-SCREEN ULINE.
* SELECTION-SCREEN SKIP 1.
END-OF-DEFINITION.
*
DEFINE RADIOLEFT_COMMAND.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
SELECTION-SCREEN COMMENT (&2) &3.
PARAMETER &4 RADIOBUTTON GROUP &5 USER-COMMAND &6.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE RADIORIGHT_COMMAND.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
PARAMETER &4 RADIOBUTTON GROUP &5 USER-COMMAND &6.
SELECTION-SCREEN COMMENT (&2) &3.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE RADIOLEFT.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
SELECTION-SCREEN COMMENT (&2) &3.
PARAMETER &4 RADIOBUTTON GROUP &5.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE RADIORIGHT.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
PARAMETER &4 RADIOBUTTON GROUP &5.
SELECTION-SCREEN COMMENT (&2) &3.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE CHECKLEFT.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
SELECTION-SCREEN COMMENT (&2) &3.
PARAMETER &4 AS CHECKBOX.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*
DEFINE CHECKRIGHT.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION &1.
PARAMETER &4 AS CHECKBOX.
SELECTION-SCREEN COMMENT (&2) &3.
SELECTION-SCREEN END OF LINE.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: ADDRANGE, ADDDISCRETE, ADDCONSEC.
*
* PURPOSE: ADDS AN 'EQ' ENTRY TO A RANGE TABLE
* ADDDISCRETE - COPIED VERSION OF ADDRANGE FOR
* BACKWARDS COMPATABILITY.
* ADDCONSEC - ADDS A 'BT' ENTRY TO A RANGE TABLE
*
* ENTRY: VALUE TO ADD,
* ENTRY RANGE TABLE TO USE
*
* EXIT:
*
*
* CALLED BY: ADDRANGE R_VALUE R_TABLE.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE ADDRANGE.
CLEAR &2.
MOVE 'I' TO &2-SIGN.
MOVE 'EQ' TO &2-OPTION.
MOVE &1 TO &2-LOW.
APPEND &2.
END-OF-DEFINITION.
*
DEFINE ADDDISCRETE.
CLEAR &2.
MOVE 'I' TO &2-SIGN.
MOVE 'EQ' TO &2-OPTION.
MOVE &1 TO &2-LOW.
APPEND &2.
END-OF-DEFINITION.
*
DEFINE ADDCONSEC.
CLEAR &3.
MOVE 'I' TO &3-SIGN.
MOVE 'BT' TO &3-OPTION.
MOVE &1 TO &3-LOW.
MOVE &2 TO &3-HIGH.
APPEND &3.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: FORMAT_SELECTS
*
* PURPOSE: FORMATS SELECT OPTIONS USING FORNMAT KEY
*
* ENTRY: SELECT OPTION TO FORMAT
*
* EXIT: SELECT OPTIONS FORMATTED AS PER FORMAT KEY
*
* CALLED BY: FORMAT_SELECTS S_OPTIONS
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE FORMAT_SELECTS.
LOOP AT &1.
PERFORM FORMATKEY USING &1-LOW CHANGING &1-LOW.
PERFORM FORMATKEY USING &1-HIGH CHANGING &1-HIGH.
MODIFY &1.
ENDLOOP.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: PSUB.
*
* PURPOSE: PRINTS A SET OF SUB TITLES.
*
* ENTRY: SELECT OPTION TABLE TO USE
* ENTRY: TITLE FOR THIS SELECTION BLOCK.
*
* EXIT: REPORT HEADER PRODUCED FOR CURRENT REPORT
*
*
* CALLED BY: PSUB S_VKORG TEXT-021
*
* CALLS: SUBTITLES.
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE PSUB.
*
* NOTE THAT THESE ARE NORMALLY PRINTED IN THE TOP OF PAGE EVENT.
*
* IN SOME CASES WHERE THERE ARE LOADS OF CRITERIA (MORE THAN A PAGE
* LENGTH THEN THIS WILL CAUSE A TOP OF PAGE LONGER THAN ONE PAGE
* WHICH MEANS THAT THE TOP OF PAGE IS CALLED AGAIN... AND SO ON AND
* SO FORTH.
*
* CHECK HOW MANY LINES THERE ARE AND IF THERE ARE MORE THAN A
* PAGES WORTH THEN DISPLAY THEM AT THE END OF THE REPORT.
*
DESCRIBE TABLE &1 LINES W__SUBLINES.
IF W__SUBLINES < 5.
LOOP AT &1.
PERFORM SUBTITLES USING &2
&1-SIGN &1-OPTION
&1-LOW &1-HIGH
FALSE.
ENDLOOP.
ELSE.
*
* TOO MANY OPTIONS HERE - PRINT THEM AT THE END OF THE REPORT.
*
PERFORM PARAM_SUBTITLE USING &2
'SEE OPTION LIST AT END OF REPORT'
.
ENDIF.
END-OF-DEFINITION.
*EJECT
***********************************************************************
*
* MACRO: END_OF_REPORT.
*
* PURPOSE: PERFORMS END OF REPORT PROCESSING.
*
* ENTRY: SELECT OPTION TABLE TO USE
* ENTRY: TITLE FOR THIS SELECTION BLOCK.
*
* EXIT: REPORT FOOTER PRINTED
*
*
* CALLED BY: PSUB S_VKORG TEXT-021
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*EJECT
DEFINE END_OF_REPORT.
*
* IF THERE ARE ANY TOTALS TO PRINT THEN REPORTBRREAKS RECORD COUNT
* WILL BE > 1......
*
READ TABLE REPORTBREAKS INDEX 2.
IF SY-SUBRC = 0.
PERFORM RUNTOTALS.
ELSE.
PERFORM TABLELINE.
ENDIF.
*
* ANY SELECT OPTIONS ?
*
DESCRIBE TABLE &1 LINES W__SUBLINES.
IF W__SUBLINES > 4.
SKIP 1.
IF W__EOR_DONE = FALSE.
WRITE :/ 'THE FOLLOWING SELECT OPTIONS WERE ALSO USED',
'DURING THE SELECTION PROCESS:'.
MOVE TRUE TO W__EOR_DONE.
ELSE.
PERFORM TABLELINE.
SKIP 1.
ENDIF.
LOOP AT &1.
PERFORM SUBTITLES USING &2
&1-SIGN &1-OPTION
&1-LOW &1-HIGH
TRUE.
ENDLOOP.
ENDIF.
END-OF-DEFINITION.
***********************************************************************
*
* PROCEDURE: READ_SCREEN_VALUES
*
* PURPOSE: PROVIDES ACCESS TO SCREEN FIELDS BEFORE USERS
* PRESSES ENTER.....
*
* ENTRY:
*
* EXIT: SCREEN FIELDS ARE AVAILABLE TO THE CALLING
* PROGRAM
*
* CALLED BY: PERFORM READ_SCREEN_VALUES
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM READ_SCREEN_VALUES.
*
FIELD-SYMBOLS .
*
DATA: BEGIN OF T_DYNPREAD OCCURS 0.
INCLUDE STRUCTURE DYNPREAD.
DATA: END OF T_DYNPREAD.
*
ZAP T_DYNPREAD.
LOOP AT SCREEN.
IF SCREEN-GROUP3 = 'PAR'.
MOVE SCREEN-NAME TO T_DYNPREAD-FIELDNAME.
APPEND T_DYNPREAD.
ENDIF.
ENDLOOP.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SYST-CPROG
DYNUMB = SYST-DYNNR
* REQUEST = 'A'
TABLES
DYNPFIELDS = T_DYNPREAD
EXCEPTIONS
INVALID_ABAPWORKAREA = 0
INVALID_DYNPROFIELD = 0
INVALID_DYNPRONAME = 0
INVALID_DYNPRONUMMER = 0
INVALID_REQUEST = 0
NO_FIELDDESCRIPTION = 0
INVALID_PARAMETER = 0
UNDEFIND_ERROR = 0
OTHERS = 0.
LOOP AT T_DYNPREAD.
ASSIGN (T_DYNPREAD-FIELDNAME) TO .
MOVE T_DYNPREAD-FIELDVALUE TO .
ENDLOOP.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: REPHEADER.
*
* PURPOSE: PROVIDES A STANDARDIZED REPORT HEADER FOR USE
* IN PRINTED REPORTS
*
* ENTRY: COMPANY CODE
* ENTRY: REPORT TITLE
*
* EXIT: REPORT HEADER PRODUCED FOR CURRENT REPORT
*
*
* CALLED BY: PERFORM REPHEADER USING COMPANY CODE TITLE.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM REPHEADER USING P_COCODE TYPE BUKRS
P_REPTITLE TYPE SYTITLE.
TABLES: T001.
DATA: W__OFFSET TYPE I.
MOVE FALSE TO W__GROUPHDR.
MOVE FALSE TO W__LINEPRINTED.
*
* TOP LINE - REPORT - CO - USER
*
PERFORM UNDERLINE USING 0 SY-LINSZ.
WRITE: / 'REPORT:' NO-GAP,SY-REPID.
*
* GET THE COMPANY NAME AND CENTRALISE THIS WITHIN THE REPORT LINE
* WIDTH
*
SELECT SINGLE * FROM ZT001 WHERE BUKRS = P_COCODE.
COMPUTE W__OFFSET = ( SY-LINSZ - STRLEN( ZT001-BUTXT ) ) / 2.
POSITION W__OFFSET.
WRITE ZT001-BUTXT.
*
* USER DETAILS
*
COMPUTE W__OFFSET = SY-LINSZ - 17.
POSITION W__OFFSET.
WRITE: 'USER:' NO-GAP,SY-UNAME.
*
* LINE 2 - SYSID AND DATE.
*
WRITE: / ' SYSID:' NO-GAP, SY-SYSID.
COMPUTE W__OFFSET = ( SY-LINSZ - 10 ) / 2.
POSITION W__OFFSET.
WRITE: 'SAP R3/' NO-GAP, SY-SAPRL.
COMPUTE W__OFFSET = SY-LINSZ - 17.
POSITION W__OFFSET.
WRITE: 'DATE:' NO-GAP,SY-DATUM.
*
* LINE 3 - PAGE - REPORT TITLE - TIME.
*
WRITE: / ' PAGE:' NO-GAP,SY-PAGNO.
*
* REPORT TITLE.
*
COMPUTE W__OFFSET = ( SY-LINSZ - STRLEN( P_REPTITLE ) ) / 2.
POSITION W__OFFSET.
WRITE P_REPTITLE.
*
* TIME
*
COMPUTE W__OFFSET = SY-LINSZ - 17.
POSITION W__OFFSET.
WRITE: 'TIME:' NO-GAP,SY-UZEIT.
*
PERFORM UNDERLINE USING 0 SY-LINSZ.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: PARAM_SUBTITLE.
*
* PURPOSE: PRINTS A SUBTITLE ON THE REPORT FOR THE
* SPECIFIED PARAMETER
*
* ENTRY: TEXT STRING TO USE
* ENTRY: PARAMETER TO USE
*
* EXIT:
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM PARAM_SUBTITLE USING PU_TEXT PU_PARAM.
*
DATA: W__TEXT TYPE NATXT.
*
IF PU_PARAM <> ''.
WRITE PU_PARAM TO W__TEXT.
CONDENSE W__TEXT.
CONCATENATE PU_TEXT W__TEXT
INTO W__TEXT
SEPARATED BY ' '.
PERFORM WRITECENTRE USING W__TEXT.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: GET_REPORT_WIDTH.
*
* PURPOSE: GETS THE CURRENTLY DEFINED REPORT'S WIDTH
*
* ENTRY:
*
* EXIT: REPORT WIDTH
*
* CALLED BY: PERFORM GET_REPORT_WIDTH CHANGING W_WIDTH.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM GET_REPORT_WIDTH CHANGING P_WIDTH.
READ TABLE REPORTTABLE INDEX 1.
IF SY-SUBRC = 0.
MOVE REPORTTABLE-MAXWIDTH TO P_WIDTH.
ADD 10 TO P_WIDTH.
ELSE.
MOVE 0 TO P_WIDTH.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: GROUPHDR.
*
* PURPOSE: PRINTS A GROUP HEADER LINE
*
* ENTRY: GROUP HEADER TITLE
* ENTRY: GROUP HEADER VALUE
*
* EXIT: NONE
*
* CALLED BY: PERFORM GROUPHEADER USING TITLE VALUE.
*
* CALLS: WLINE
* PRINTTITLES
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM GROUPHEADER USING P_TITLE
P_VALUE.
DATA: W__REPLINE(255) TYPE C,
W__OFFSET TYPE I,
W__REQUIRED TYPE I.
*
IF W__LINEPRINTED = TRUE.
PERFORM TABLELINE.
ENDIF.
*
* HAVE WE ENOUGH ROOM TO PRINT THIS PLUS COLUMN TITLES
*
*
* IF MAXTLINE IS 0, THEN THE TITLES HAVE NOT BEEN PRINTED, AND
* WE MUST BE AT THE TOP OF THE PAGE SO WE DON'T REALLY CARE ANYWAY.
*
* HOWEVER, IF MAXTLINE<>0 THEN THE TITLES HAVE BEEN PRINTED AT
* LEAST ONCE AND WE CAN BE ANYWHERE ON THE PAGE....
*
IF W__GROUPHDR = FALSE.
READ TABLE REPORTTABLE INDEX 1.
MOVE TRUE TO W__GROUPHDR.
IF REPORTTABLE-MAXTLINE <> 0.
COMPUTE W__REQUIRED = REPORTTABLE-MAXTLINE + 3.
RESERVE W__REQUIRED LINES.
ENDIF.
MOVE SPACE TO W__REPLINE.
COMPUTE W__OFFSET = REPORTTABLE-STARTPOS.
MOVE SY-VLINE TO W__REPLINE+W__OFFSET.
COMPUTE W__OFFSET = W__OFFSET + 1.
MOVE P_TITLE TO W__REPLINE+W__OFFSET.
COMPUTE W__OFFSET = W__OFFSET + STRLEN( P_TITLE ) + 1.
MOVE P_VALUE TO W__REPLINE+W__OFFSET.
COMPUTE W__OFFSET = REPORTTABLE-STARTPOS + REPORTTABLE-MAXWIDTH.
MOVE SY-VLINE TO W__REPLINE+W__OFFSET.
PERFORM SETINTENSIFIED USING TRUE.
PERFORM WLINE USING W__REPLINE COL_GROUP.
PERFORM TABLELINE.
MOVE FALSE TO W__GROUPHDR.
MOVE FALSE TO W__LINEPRINTED.
ENDIF.
ENDFORM. " GROUP HEADER.
*EJECT
***********************************************************************
*
* PROCEDURE: PRINTTITLES.
*
* PURPOSE: PRINTS TITLES FOR THE COLUMNS OF THE REPORT
*
* ENTRY:
*
* EXIT: NONE
*
* CALLED BY: PERFORM PRINTTITLES
*
* CALLS: WLINE
* GIVELINE
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM PRINTTITLES.
DATA: W__REPLINE(255) TYPE C, " DATA LINE TO PRINT
W__TITLE TYPE AS4TEXT, " COLUMN TITLE
W__OFFSET TYPE I, " OFFSET TO START OF COLUMN
W__HDRLINE TYPE I, " NUMBER OF TITLE LINE
W__LASTPOS TYPE I, " LAST COLUMN OF REPORT
W__MORE TYPE C. " MORE TO PRINT ?
*
PERFORM SETINTENSIFIED USING FALSE.
PERFORM TABLELINE.
MOVE 1 TO W__HDRLINE.
*
* GET THE LAST REPORT COLUMN POSITION
*
READ TABLE REPORTTABLE INDEX 1.
COMPUTE W__LASTPOS = REPORTTABLE-STARTPOS + REPORTTABLE-MAXWIDTH.
DO.
MOVE SPACE TO W__REPLINE.
MOVE FALSE TO W__MORE.
LOOP AT REPORTTABLE.
MOVE SPACE TO W__TITLE.
*
* GET A TITLE FOR THIS COLUMN
*
PERFORM GIVELINE
USING W__HDRLINE
REPORTTABLE-COLWIDTH
REPORTTABLE-TITLE
CHANGING W__TITLE.
COMPUTE W__OFFSET = REPORTTABLE-STARTPOS.
MOVE SY-VLINE TO W__REPLINE+W__OFFSET.
IF W__TITLE <> ' '.
COMPUTE W__OFFSET = W__OFFSET + 1.
MOVE W__TITLE TO W__REPLINE+W__OFFSET.
MOVE TRUE TO W__MORE.
ENDIF.
ENDLOOP.
*
* ANYTHING TO PRINT ?
*
IF W__MORE = TRUE.
COMPUTE W__HDRLINE = W__HDRLINE + 1.
MOVE SY-VLINE TO W__REPLINE+W__LASTPOS.
PERFORM SETINTENSIFIED USING TRUE.
PERFORM WLINE USING W__REPLINE COL_HEADING.
ELSE.
EXIT.
ENDIF.
ENDDO.
*
* UPDATE THE MAX TITLE LINE FIELD ?
*
READ TABLE REPORTTABLE INDEX 1.
IF REPORTTABLE-MAXTLINE = 0.
LOOP AT REPORTTABLE.
COMPUTE REPORTTABLE-MAXTLINE = W__HDRLINE + 1.
MODIFY REPORTTABLE.
ENDLOOP.
ENDIF.
PERFORM TABLELINE.
ENDFORM. " PRINTTITLES
*
*EJECT
***********************************************************************
*
* PROCEDURE: ALLHDRS.
*
* PURPOSE: PRINTS ALL GROUP HEADERS
*
* ENTRY:
*
* EXIT:
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM ALLHDRS.
*
DATA W__LINES TYPE I.
DESCRIBE TABLE REPORTBREAKS LINES W__LINES.
*
* DON'T PRINT RUN TOTALS HERE.
*
WHILE W__LINES > 0.
READ TABLE REPORTBREAKS INDEX W__LINES.
IF REPORTBREAKS-FIELD <> '*'.
PERFORM GROUPHEADER
USING REPORTBREAKS-TITLE REPORTBREAKS-VALUE.
ENDIF.
COMPUTE W__LINES = W__LINES - 1.
ENDWHILE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: UNDERLINE.
*
* PURPOSE: PLACES A LINE ON A REPORT
*
* ENTRY: STARTPOSITION
* ENTRY: WIDTH
*
* EXIT: GLOBAL FLAG W__LINE PRINTED SET TO TRUE.
*
* CALLED BY: PERFORM UNDERLINE USING START,WIDTH.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM UNDERLINE USING P_START TYPE I
P_WIDTH TYPE I.
*
STATICS: W__LASTLINE TYPE SYLINNO, " LAST UNDERLINE
W__LASTWIDTH TYPE I. " AND LENGTH
*
DATA: W__START TYPE I,
W__REPLINE(255) TYPE C.
*
* IF THE CURRENT LINE IS AN UNDERLINE,
* DON'T DO ANOTHER ONE. THIS AIDS IN JOINING UP REPORTS OF
* DIFFERENT FORMATS, UNLESS THE LAST LINE WAS SHORTER THAN THE
* CURRENT LINE.
*
IF W__LASTLINE <> SY-LINNO
OR W__LASTWIDTH < P_WIDTH.
MOVE SPACE TO W__REPLINE.
MOVE SY-ULINE TO W__REPLINE+P_START(P_WIDTH).
MOVE SY-LINNO TO W__LASTLINE.
MOVE P_WIDTH TO W__LASTWIDTH.
IF W__LASTLINE = SY-LINNO.
WRITE / W__REPLINE.
ELSE.
POSITION 1.
WRITE W__REPLINE.
ENDIF.
ELSE.
SKIP 2.
ENDIF.
ENDFORM. "UNDERLINE
*EJECT
***********************************************************************
*
* PROCEDURE: TABLELINE.
*
* PURPOSE: PLACES A LINE ON A REPORT SPANNING THE CURRENT
* REPORT.
*
* ENTRY: NONE
*
* EXIT: GLOBAL FLAG W__LINE PRINTED SET TO TRUE.
*
* CALLED BY: PERFORM TABLELINE
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM TABLELINE.
DATA: W__MAXWIDTH TYPE I.
READ TABLE REPORTTABLE INDEX 1.
COMPUTE W__MAXWIDTH = REPORTTABLE-MAXWIDTH + 1.
PERFORM UNDERLINE USING REPORTTABLE-STARTPOS W__MAXWIDTH.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SPLITTABLEBLE
*
* PURPOSE: SPLIT A TABLE-FIELDNAME INTO TABLE AND FIELD
* NAME.
*
* ENTRY: DATA-FIELD NAME
*
* EXIT: TABLE NAME
* EXIT: FIELD NAME
*
* CALLED BY: PERFORM SPLITTABLE USING 'YFIBER-COLOR'
* CHANGING W_TABLE W_FIELD
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM SPLITTABLE USING P_FIELD CHANGING PC_TABLE PC_FIELD.
SEARCH P_FIELD FOR '-'.
IF SY-SUBRC = 0.
SPLIT P_FIELD AT '-' INTO PC_TABLE PC_FIELD.
ELSE.
MOVE P_FIELD TO PC_FIELD.
ENDIF.
TRANSLATE PC_TABLE TO UPPER CASE.
TRANSLATE PC_FIELD TO UPPER CASE.
ENDFORM .
*EJECT
***********************************************************************
*
* PROCEDURE: BUILDREPORT.
*
* PURPOSE: ADDS REPORT DATA FIELD TO TABLE
*
* ENTRY: DATA-FIELD NAME
* ENTRY: DATA FIELD TITLE
* ENTRY: DATA FIELD LENGTH
* ENTRY: FORMATTYPE. 'UNIT' OR 'CURRENCY' OR FORMAT MASK
* ENTRY: FORMAT FIELD
*
* EXIT: NONE
*
* CALLED BY: PERFORM BUILDREPORT
* USING FIELD TITLE FORMAT FIELD
* FORMAT-FIELD
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM BUILDREPORT USING P_FIELD
P_TITLE TYPE AS4TEXT
P_LEN TYPE DDLENG
P_FORMATTYPE TYPE FORMAT_TYPE
P_FORMATFIELD TYPE FORMAT_FIELD.
*
TABLES: DD01L, DD03L, DD04T.
DATA: BEGIN OF T_DD01L OCCURS 0,
DATATYPE TYPE DATATYPE_D,
CONVEXIT TYPE CONVEXIT,
END OF T_DD01L,
*
BEGIN OF T_DD03L OCCURS 0,
DOMNAME TYPE DOMNAME,
AS4LOCAL TYPE AS4LOCAL,
AS4VERS TYPE AS4VERS,
ROLLNAME TYPE ROLLNAME,
LENG TYPE DDLENG,
END OF T_DD03L,
*
BEGIN OF SPLITTAB OCCURS 0,
WORD(50) TYPE C,
END OF SPLITTAB,
*
W__TABLE TYPE TABNAME,
W__FIELD TYPE FIELDNAME,
W__FMASK TYPE FORMAT_TYPE,
W__FFIELD TYPE FORMAT_FIELD,
W__TLEN TYPE I.
*
CLEAR REPORTTABLE.
*
* CHECK FOR TABLE-FIELD NAME OR JUST FIELD NAME.....
*
PERFORM SPLITTABLE USING P_FIELD CHANGING W__TABLE W__FIELD.
*
* FORMAT MASKS, UNITS AND CURRENCIES
*
MOVE P_FORMATTYPE TO W__FMASK.
TRANSLATE W__FMASK TO UPPER CASE.
MOVE P_FORMATFIELD TO W__FFIELD.
TRANSLATE W__FFIELD TO UPPER CASE.
*
REPORTTABLE-TABLE = W__TABLE.
REPORTTABLE-FIELDNAME = W__FIELD.
REPORTTABLE-TITLE = P_TITLE.
REPORTTABLE-COLWIDTH = P_LEN.
REPORTTABLE-STARTPOS = 0.
REPORTTABLE-CONVEXIT = ''.
REPORTTABLE-DATATYPE = ''.
CASE W__FMASK.
WHEN 'UNIT'. MOVE W__FFIELD TO REPORTTABLE-UNIT.
WHEN 'CURRENCY'. MOVE W__FFIELD TO REPORTTABLE-CURRENCY.
WHEN OTHERS. MOVE W__FMASK TO REPORTTABLE-FORMAT.
ENDCASE.
*
* GET THE DETAILS FROM THE DATA DICTIONARY ?
*
IF W__TABLE <> ' '.
ZAP T_DD01L.
ZAP T_DD03L.
SELECT DOMNAME AS4LOCAL AS4VERS ROLLNAME LENG
INTO TABLE T_DD03L
FROM DD03L
WHERE TABNAME = W__TABLE
AND FIELDNAME = W__FIELD
AND AS4LOCAL = 'A'
AND AS4VERS = '0000'.
*
* VARIABLE CHARACTERISTICS
*
READ TABLE T_DD03L INDEX 1.
SELECT SINGLE DATATYPE CONVEXIT
INTO T_DD01L
FROM DD01L
WHERE DOMNAME = T_DD03L-DOMNAME
AND AS4LOCAL = T_DD03L-AS4LOCAL
AND AS4VERS = T_DD03L-AS4VERS.
*
* TITLE TEXTS
*
READ TABLE T_DD01L INDEX 1.
IF REPORTTABLE-TITLE = ' '.
SELECT REPTEXT
UP TO 1 ROWS
INTO REPORTTABLE-TITLE
FROM DD04T
WHERE ROLLNAME = T_DD03L-ROLLNAME
AND DDLANGUAGE = SY-LANGU
AND AS4LOCAL = 'A'.
ENDSELECT.
ENDIF.
*
* FILL IN THE DEFAULTS FROM THE DICTIONARY IF THEY HAVE NOT
* BEEN PROVIDED BY THE CALLED.
*
IF P_LEN = 0.
MOVE T_DD03L-LENG TO REPORTTABLE-COLWIDTH.
ELSE.
MOVE P_LEN TO REPORTTABLE-COLWIDTH.
ENDIF.
IF NOT T_DD01L-CONVEXIT IS INITIAL.
CONCATENATE '==' T_DD01L-CONVEXIT INTO REPORTTABLE-CONVEXIT.
ENDIF.
MOVE T_DD01L-DATATYPE TO REPORTTABLE-DATATYPE.
ENDIF.
*
* IS COLUMN WIDTH LESS THAN AN INDIVIDUAL WORD IN THE TITLE ?
*
CLEAR SPLITTAB.
SPLIT REPORTTABLE-TITLE AT ' ' INTO TABLE SPLITTAB.
LOOP AT SPLITTAB.
COMPUTE W__TLEN = STRLEN( SPLITTAB-WORD ).
IF W__TLEN >= REPORTTABLE-COLWIDTH.
REPORTTABLE-COLWIDTH = W__TLEN + 2.
ENDIF.
ENDLOOP.
APPEND REPORTTABLE.
ENDFORM. "BUILDREPORT.
*EJECT
***********************************************************************
*
* PROCEDURE: CENTREREPORT.
*
* PURPOSE: SETS A FLAG TO TELL FORMATREPORT TO CENTRE THE
* REPORT ON THE PAGE OR NOT.
*
* ENTRY: TRUE OR FALSE
*
* EXIT:
*
* CALLED BY: PERFORM CENTREREPORT USING TRUE
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*
FORM CENTREREPORT USING PU_CENTRE LIKE TRUE.
MOVE PU_CENTRE TO W__CENTRE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: CHANGEFORMAT.
*
* PURPOSE: CHANGES THE FORMAT OPTION ON A SPECIFIED
* COLUMN IN THE REPORT
*
* ENTRY: REPORT FIELD TO CHANGE
* ENTRY: NEW FORMAT OPTION.
*
* EXIT:
*
* CALLED BY: PERFORM CHANGEFORMAT USING 'YFIBER-COLOR'
* 'INPUT'
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*
FORM CHANGEFORMAT USING PU_FIELD
P_FORMATTYPE TYPE FORMAT_TYPE.
*
DATA: W__TABLE TYPE TABNAME,
W__FIELD TYPE FIELDNAME.
*
PERFORM SPLITTABLE USING PU_FIELD CHANGING W__TABLE W__FIELD.
READ TABLE REPORTTABLE WITH KEY TABLE = W__TABLE
FIELDNAME = W__FIELD.
IF SY-SUBRC = 0.
MOVE P_FORMATTYPE TO REPORTTABLE-FORMAT.
TRANSLATE REPORTTABLE-FORMAT TO UPPER CASE.
MODIFY REPORTTABLE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: CHECKBOX.
*
* PURPOSE: ADDS REPORT DATA FIELD TO TABLE AS A CHECK BOX
*
* ENTRY: DATA-FIELD TABLE
* ENTRY: DATA FIELD TITLE
* ENTRY: DATA FIELD LENGTH
*
* EXIT: NONE
*
* CALLED BY: PERFORM CHECKBOX
* USING TABLE NAME TITLE LENGTH
*
* CALLS: BUILDREPORT
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM CHECKBOX USING P_NAME TYPE FIELDNAME
P_TITLE TYPE AS4TEXT
P_LENGTH TYPE DDLENG.
*
CONSTANTS: C__CBOXWIDTH TYPE I VALUE 3.
*
DATA: W__TABLE TYPE TABNAME,
W__NAME TYPE FIELDNAME.
*
PERFORM BUILDREPORT USING P_NAME P_TITLE P_LENGTH '' ''.
*
* LOCATE THIS RECORD AND SET THE CHECK BOX FLAG.
*
SEARCH P_NAME FOR '-'.
IF SY-SUBRC = 0.
SPLIT P_NAME AT '-' INTO W__TABLE W__NAME.
ELSE.
MOVE P_NAME TO W__NAME.
ENDIF.
TRANSLATE W__TABLE TO UPPER CASE.
TRANSLATE W__NAME TO UPPER CASE.
READ TABLE REPORTTABLE WITH KEY TABLE = W__TABLE
FIELDNAME = W__NAME.
IF SY-SUBRC = 0.
MOVE TRUE TO REPORTTABLE-CHECKBOX.
IF REPORTTABLE-COLWIDTH < C__CBOXWIDTH.
MOVE C__CBOXWIDTH TO REPORTTABLE-COLWIDTH.
ENDIF.
MODIFY REPORTTABLE INDEX SY-TABIX.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: DUMP_TABLE
*
* PURPOSE: THIS ROUTINE DUMPS THE SPECIFIED TABLE
* ONE FULL RECORD AT A TIME.
*
* ENTRY: NONE
*
* TABLES: UNSTRUCTURED TABLE FOR DUMP
*
* EXIT: NONE
*
* CALLED BY: PERFORM DUMPTABLE TABLES T_TABNAME.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM DUMP_TABLE TABLES T_DUMPTABLE.
*
FIELD-SYMBOLS .
*
DATA: W__FWIDTH TYPE DDLENG,
W__TWIDTH LIKE W__FWIDTH,
W__NWIDTH LIKE W__FWIDTH,
W__LINSZ TYPE SYLINSZ.
*
MOVE SY-LINSZ TO W__LINSZ.
PERFORM SAVEREPORT USING 'DUMPTAB'.
PERFORM NEWREPORT.
*
* GET THE TABLE FIELD DETAILS.
*
READ TABLE T_DUMPTABLE INDEX 1.
DO.
ASSIGN COMPONENT SY-INDEX
OF STRUCTURE T_DUMPTABLE
TO .
IF SY-SUBRC = 0.
DESCRIBE FIELD OUTPUT-LENGTH W__FWIDTH.
COMPUTE W__NWIDTH = W__TWIDTH + W__FWIDTH + 2.
IF W__NWIDTH < 255.
PERFORM BUILDREPORT USING SY-INDEX '' W__FWIDTH '' ''.
MOVE W__NWIDTH TO W__TWIDTH.
ELSE.
EXIT.
ENDIF.
ELSE.
EXIT.
ENDIF.
ENDDO.
NEW-PAGE LINE-SIZE 255.
PERFORM FORMATREPORT.
*
LOOP AT T_DUMPTABLE.
PERFORM WRITELINE USING T_DUMPTABLE COL_NORMAL.
ENDLOOP.
MOVE 1 TO SY-LSIND.
NEW-PAGE LINE-SIZE W__LINSZ.
PERFORM USEREPORT USING 'DUMPTAB'.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: END_OF_REPORT
*
* PURPOSE: PRINTS ANY OUTSTANDING SELECT OPTIONS
*
* ENTRY: NONE - TABLE T__SELOPTS POPULATED BY MACRO PSUB
* EXIT: NONE
*
* CALLED BY: PERFORM END_OF_REPORT.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM END_OF_REPORT.
*
FIELD-SYMBOLS: .
*
DATA: W__SELSTRING(200) TYPE C, " DON'T KNOW THE STRUC
W__SELLEN TYPE I, " SO USE FIELD DEFS
W__SIGN(1) TYPE C, " SELECT OPTS STRUC
W__OPTION(2) TYPE C,
W__LOW(198) TYPE C,
W__HIGH(198) TYPE C,
W__POS TYPE I.
*
PERFORM WRITECENTRE USING 'END OF REPORT'.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: ICON, SYMBOL, GRAPHIC
*
* PURPOSE: ADDS AN ICON OR A SYMBOL TO A REPORT
*
* ENTRY: ICON: ICON NAME TO PRINT
* ENTRY: SYMBOL: SYMBOL NAME TO PRINT WHEN CHECK FIELD
* IS TRUE.
* ENTRY: GRAPHIC: ICON/SYMBOL NAME, NAME TYPE
* NOT CALLABLE DIRECTLY BY USER
*
* ENTRY: HOTSPOT - TRUE OR FALSE
* ENTRY: SYMBOL: FIELD FOR SYMBOL VALUE CHECK
* ENTRY: SYMBOL: SYMBOL NAME TO PRINT WHEN CHECK FLD IS
* FALSE.
* EXIT: NONE
*
* CALLED BY: PERFORM ICON USING ICON_CHANGE.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM ICON USING P_ICONNAME
P_HOTSPOT LIKE TRUE.
PERFORM GRAPHIC USING P_ICONNAME
TRUE
P_HOTSPOT
''
''.
ENDFORM.
*
FORM SYMBOL USING P_TRUE_SYMBOL
P_HOTSPOT LIKE TRUE
P_CHECK_FIELD
P_FALSE_SYMBOL.
PERFORM GRAPHIC USING P_TRUE_SYMBOL
FALSE
P_HOTSPOT
P_CHECK_FIELD
P_FALSE_SYMBOL.
ENDFORM.
*
FORM GRAPHIC USING P_NAME
P_ICON
P_HOTSPOT LIKE TRUE
P_CHECK_FIELD
P_FALSE_SYMBOL.
CLEAR REPORTTABLE.
IF P_ICON = TRUE.
MOVE TRUE TO REPORTTABLE-ICON.
ELSE.
MOVE TRUE TO REPORTTABLE-SYMBOL.
ENDIF.
MOVE P_HOTSPOT TO REPORTTABLE-HOTSPOT.
MOVE P_FALSE_SYMBOL TO REPORTTABLE-FALSESYM.
MOVE P_NAME TO REPORTTABLE-ISYNAME.
MOVE P_CHECK_FIELD TO REPORTTABLE-FIELDNAME.
MOVE 3 TO REPORTTABLE-COLWIDTH.
APPEND REPORTTABLE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: FORMATREPORT.
*
* PURPOSE: CALCULATES THE POSITIONS OF THE REPORT COLUMNS
* SPECIFIED IN TABLE REPTAB.
*
* ENTRY: NONE REPTABLE IS GLOBAL
*
* EXIT: NONE
*
* CALLED BY: PERFORM FORMATREPORT.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM FORMATREPORT.
DATA: W__MAXLEN TYPE I,
W__NUMCOLS TYPE I,
W__PREVPOS TYPE I,
W__WIDTH TYPE I,
W__GAP TYPE I,
W__FIRST TYPE I.
*
* FIND THE MAXIMUM WIDTH OF THE REPORT. ALLOW FOR VERTICAL LINES
*
MOVE 0 TO W__MAXLEN.
MOVE 1 TO W__NUMCOLS.
*
* CENTRALISE THE REPORT OR NOT ??
*
LOOP AT REPORTTABLE.
IF SY-TABIX = 1.
COMPUTE REPORTTABLE-STARTPOS = 1.
ELSE.
COMPUTE REPORTTABLE-STARTPOS = W__PREVPOS + W__WIDTH + 1.
ENDIF.
MODIFY REPORTTABLE.
W__PREVPOS = REPORTTABLE-STARTPOS.
W__WIDTH = REPORTTABLE-COLWIDTH.
COMPUTE W__MAXLEN = W__MAXLEN + REPORTTABLE-COLWIDTH + 1.
ENDLOOP.
*
IF W__MAXLEN > SY-LINSZ.
MESSAGE ID 'SU' TYPE 'E' NUMBER 0
WITH 'REPORT WIDTH > DEFINED WIDTH:'
W__MAXLEN
SY-LINSZ.
ENDIF.
*
* CENTRALISE THE REPORT
*
COMPUTE W__NUMCOLS = W__NUMCOLS + 1.
COMPUTE W__GAP = ( SY-LINSZ - W__MAXLEN ) / 2.
READ TABLE REPORTTABLE INDEX 1.
IF W__CENTRE = TRUE.
COMPUTE W__FIRST = W__GAP / 2.
ELSE.
MOVE 1 TO W__FIRST.
ENDIF.
LOOP AT REPORTTABLE.
IF W__CENTRE = TRUE.
COMPUTE REPORTTABLE-STARTPOS
= REPORTTABLE-STARTPOS + W__GAP.
ENDIF.
MOVE W__FIRST TO REPORTTABLE-FIRST.
MOVE W__MAXLEN TO REPORTTABLE-MAXWIDTH.
MODIFY REPORTTABLE.
ENDLOOP.
ENDFORM. "FORMATREPORT
*EJECT
***********************************************************************
*
* PROCEDURE: NEWREPORT
*
* PURPOSE: INITIALISES REPORT TABLE AND BREAKS TABLE
* SETS DEFAULT SETTINGS.
*
* ENTRY:
*
* EXIT:
*
* CALLED BY: PERFORM SAVEREPORT USING 'REPNAME'
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM NEWREPORT.
ZAP REPORTTABLE.
ZAP REPORTBREAKS.
PERFORM CENTREREPORT USING TRUE.
MOVE TRUE TO W__RUNTOTAL.
MOVE FALSE TO W__GROUPHDR.
MOVE FALSE TO W__LINEPRINTED.
MOVE '' TO W__LAST_COLOUR.
MOVE FALSE TO W__EOR_DONE.
MOVE FALSE TO W__ALLHDR_DONE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SAVEREPORT
*
* PURPOSE: TAKES THE CURRENTLY DEFINED REPORT
* AND PLACES IT IN THE REPORT STACK. IF THE
* REPORT ALREADY EXISTS IN THE STACK THEN
* THE CURRENT RECORD IS OVERWRITTEN
*
* ENTRY: REPORT NAME
*
* EXIT:
*
* CALLED BY: PERFORM SAVEREPORT USING 'REPNAME'
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM SAVEREPORT USING PU_REPNAME LIKE T__REPORTSTACK-REPNAME.
*
DATA: W__REPNAME LIKE T__REPORTSTACK-REPNAME.
*
* IS THE REPORT ALREADY HERE ?
*
MOVE PU_REPNAME TO W__REPNAME.
TRANSLATE W__REPNAME TO UPPER CASE.
READ TABLE T__REPORTSTACK WITH KEY REPNAME = W__REPNAME.
IF SY-SUBRC = 0.
MOVE REPORTTABLE[] TO T__REPORTSTACK-REPORTS[].
MOVE REPORTBREAKS[] TO T__REPORTSTACK-REPBREAKS[].
MODIFY T__REPORTSTACK INDEX SY-TABIX.
ELSE.
MOVE W__REPNAME TO T__REPORTSTACK-REPNAME.
MOVE REPORTTABLE[] TO T__REPORTSTACK-REPORTS[].
MOVE REPORTBREAKS[] TO T__REPORTSTACK-REPBREAKS[].
APPEND T__REPORTSTACK.
ENDIF.
MOVE W__REPNAME TO W__CURREP.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: USEREPORT
*
* PURPOSE: RETREIVES A SPECIFIED REPORT FROM THE REPORT
* STACK AFTER SAVING THE CURRENT REPORT
*
* ENTRY: REPORT NAME
*
* EXIT:
*
* CALLED BY: PERFORM USEREPORT USING 'REPNAME'
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*EJECT
FORM USEREPORT USING PU_REPNAME LIKE T__REPORTSTACK-REPNAME.
*
DATA: W__REPNAME LIKE T__REPORTSTACK-REPNAME,
W__SAVREP LIKE T__REPORTSTACK-REPNAME,
W__NEXTLINE TYPE SYLINNO.
*
MOVE PU_REPNAME TO W__REPNAME.
TRANSLATE W__REPNAME TO UPPER CASE.
IF W__REPNAME <> W__CURREP.
*
* SAVE THE CURRENT REPORT.
*
IF NOT W__CURREP IS INITIAL.
*
* UNDERLINE THE CURRENT REPORT, BUT DON'T CAUSE A NEW LINE
*
IF W__LINEPRINTED = TRUE.
PERFORM TABLELINE.
ENDIF.
MOVE W__CURREP TO W__SAVREP.
PERFORM SAVEREPORT USING W__SAVREP.
ENDIF.
READ TABLE T__REPORTSTACK WITH KEY REPNAME = W__REPNAME.
IF SY-SUBRC = 0.
ZAP: REPORTTABLE, REPORTBREAKS.
MOVE T__REPORTSTACK-REPORTS[] TO REPORTTABLE[].
MOVE T__REPORTSTACK-REPBREAKS[] TO REPORTBREAKS[].
MOVE W__REPNAME TO W__CURREP.
*
* MOVE BACK UP ONE LINE.
*
* COMPUTE W__NEXTLINE = SY-LINNO - 1.
* SKIP TO LINE W__NEXTLINE.
PERFORM PRINTTITLES.
ENDIF.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: GETMASK
*
* PURPOSE: LOCATES A CURRENCY OR UNIT MASK
*
* ENTRY: VARIABLE OR LITERAL MASK
*
* EXIT: ACTUAL MASK TO USE.
*
* CALLED BY: PERFORM GETMASK USING MASK_IN CHANGING MASK_OUT
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM GETMASK USING P_MVIN CHANGING P_MVOUT.
*
FIELD-SYMBOLS .
*
MOVE '' TO P_MVOUT.
IF NOT P_MVIN IS INITIAL.
ASSIGN (P_MVIN) TO .
*
* IS THIS A VARIABLE OR A LITERAL...
*
IF SY-SUBRC = 0.
MOVE TO P_MVOUT. " IS A VARIABLE.
ELSE.
MOVE P_MVIN TO P_MVOUT. " IS A LITERAL.
ENDIF.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: COLUMN_COLOUR
*
* PURPOSE: SETS THE COLOUR OF A SPECIFIC COLUMN
*
* ENTRY: COLUMN WIDTH
* ENTRY: COLOUR TO SET
* ENTRY: VALUE TO WRITE
* ENTRY: ACTUAL COLOUR CODE TO USE.
*
* EXIT: ACTUAL MASK TO USE.
*
* CALLED BY: PERFORM GETMASK USING MASK_IN CHANGING MASK_OUT
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM COLUMN_COLOUR USING P_WIDTH P_VALUE P_FORMAT P_COLOUR.
*
* NEED TO SET INTENSIFIED ON FOR DARK COLOURS ??
*
DATA W__FORMAT(20) TYPE C.
*
MOVE P_FORMAT TO W__FORMAT.
IF W__FORMAT+0(4) = 'DARK'.
PERFORM SETINTENSIFIED USING TRUE.
ELSE.
PERFORM SETINTENSIFIED USING FALSE.
ENDIF.
*
PERFORM SETCOLOUR USING P_COLOUR.
WRITE AT (P_WIDTH) P_VALUE NO-GAP.
*
* OK, PUT INTENSITY BACK TO WHAT IT SHOULD BE.....
*
* W__INTENSE_FLAG IS THE NEXT NOT THE CURRENT INTENSITY SETTING
* FOR THE LINE....SO IF IT'S FALSE, INTENSITY IS ALREADY ON,
* IF IT'S TRUE THEN INTENSITY IS OFF.....
*
* OH MY GAWD.....
*
IF W__FORMAT+0(4) = 'DARK'.
IF W__INTENSE_FLAG = TRUE.
PERFORM SETINTENSIFIED USING FALSE.
ENDIF.
ELSE.
IF W__INTENSE_FLAG = FALSE.
PERFORM SETINTENSIFIED USING TRUE.
ENDIF.
ENDIF.
PERFORM SETCOLOUR USING W__LAST_COLOUR.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: WRITEVALUE
*
* PURPOSE: OUTPUTS A SPECIFIC VALUE TO THE REPORT PAYING
* ATTENTION TO FORMATTING MASKS ETC
*
* ENTRY: WIDTH OF OUTPUT FIELD
* ENTRY: VALUE TO WRITE
* ENTRY: CONVERSION EXIT ROUTINE
* ENTRY: CURRENCY FIELD
* ENTRY: UNIT FIELD
* ENTRY: OTHER FORMAT FIELD.
*
* EXIT:
*
* CALLED BY: PERFORM WRITEVALUE USING P_WIDTH
* P_VALUE
* P_CONVEXIT
* P_CURRENCY
* P_UNIT
* P_FORMAT.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*
* PRINT HIERACHY.
*
* 1. IF THERE IS A CONVEXIT USE THAT
* 2. CHECK CURRENCY - USE IF PRESENT
* 3. CHECK UNIT - USE IF PRESENT
* 4. JUST PRINT IT.
*
FORM WRITEVALUE USING P_WIDTH P_VALUE P_CONVEXIT
P_CURRENCY P_UNIT P_FORMAT.
*
DATA: W__FCODE(10) TYPE C, " UNIT/CURRENCY CODE
W__TYPE(1) TYPE C.
*
* NOW WRITE OUT THE VALUE.
*
IF NOT P_CONVEXIT IS INITIAL.
WRITE AT (P_WIDTH) P_VALUE NO-GAP
USING EDIT MASK P_CONVEXIT.
ELSE.
IF NOT P_CURRENCY IS INITIAL.
PERFORM GETMASK USING P_CURRENCY CHANGING W__FCODE.
WRITE AT (P_WIDTH) P_VALUE CURRENCY W__FCODE NO-GAP.
ELSE.
IF NOT P_UNIT IS INITIAL.
PERFORM GETMASK USING P_UNIT CHANGING W__FCODE.
WRITE AT (P_WIDTH) P_VALUE UNIT W__FCODE NO-GAP.
ELSE.
IF P_FORMAT IS INITIAL.
*
* IS THIS AN ICON ??
*
DESCRIBE FIELD P_VALUE TYPE W__TYPE.
IF W__TYPE = 'C'.
IF P_VALUE+0(1) = '@'
AND P_VALUE+3(1) = '@'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP AS ICON.
ELSE.
WRITE AT (P_WIDTH) P_VALUE NO-GAP.
ENDIF.
ELSE.
WRITE AT (P_WIDTH) P_VALUE NO-GAP.
ENDIF.
ELSE.
CASE P_FORMAT.
WHEN 'NO-ZERO'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP NO-ZERO.
WHEN 'NO-SIGN'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP NO-SIGN.
WHEN 'NO GROUPING'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP
NO-GROUPING.
WHEN 'DD/MM/YY'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP DD/MM/YY.
WHEN 'MM/DD/YY'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP MM/DD/YY.
WHEN 'DD/MM/YYYY'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP DD/MM/YYYY.
WHEN 'MM/DD/YYYY'.
WRITE AT (P_WIDTH) P_VALUE NO-GAP MM/DD/YYYY.
WHEN 'INPUT'.
FORMAT INPUT ON.
WRITE AT (P_WIDTH) P_VALUE NO-GAP.
FORMAT INPUT OFF.
*
* COLOURS....
*
WHEN 'COL_BACKGROUND' OR 'GREY'.
PERFORM SETCOLOUR USING COL_BACKGROUND.
WRITE AT (P_WIDTH) P_VALUE NO-GAP.
PERFORM SETCOLOUR USING W__LAST_COLOUR.
WHEN 'COL_HEADING' OR 'BLUE' OR 'DARK_BLUE'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_HEADING.
WHEN 'COL_NORMAL' OR 'WHITE' OR 'BEIGE'.
IF P_FORMAT <> 'BEIGE'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_NORMAL.
ELSE.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
'DARK_WHITE'
COL_NORMAL.
ENDIF.
WHEN 'COL_TOTAL' OR 'YELLOW' OR 'DARK_YELLOW'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_TOTAL.
WHEN 'COL_KEY' OR 'YUK' OR 'DARK_YUK'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_KEY.
WHEN 'COL_POSITIVE' OR 'GREEN' OR 'DARK_GREEN'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_POSITIVE.
WHEN 'COL_NEGATIVE' OR 'RED' OR 'DARK_RED'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_NEGATIVE.
WHEN 'COL_GROUP' OR 'MAUVE' OR 'DARK_MAUVE'.
PERFORM COLUMN_COLOUR USING P_WIDTH
P_VALUE
P_FORMAT
COL_GROUP.
ENDCASE.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: WRITESYMBOL
*
* PURPOSE: WRITES SYMBOL TO THE SCREEN. THE SYMBOL CAN
* BE WRITTEN AS A HOTSPOT.
*
* ENTRY: SYMBOL NAME TO USE
* ENTRY: HOTSPOT FLAG.
*
* EXIT:
*
* CALLED BY: PERFORM WRITESYMBOL USING W_SYMBOL W_HOTSPOT.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM WRITESYMBOL USING P_SYMBOL P_HOTSPOT.
IF P_HOTSPOT <> TRUE.
WRITE: ' ' NO-GAP, P_SYMBOL
AS SYMBOL.
ELSE.
WRITE: ' ' NO-GAP, P_SYMBOL
AS SYMBOL HOTSPOT ON.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: WRITELINE
*
* PURPOSE: WRITES A DATA LINE TO THE SCREEN, CREATING
* HIDE FIELDS AT THE SAME TIME.
*
* ENTRY: TABLE CONTAINING REPORT DATA
* ENTRY: COLOUR TO USE TO PRINT THE DATA IN.
*
* EXIT:
*
* CALLED BY: PERFORM WRITELINE USING TABLENAME P_COLOUR
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM WRITELINE USING P_DATATABLE P_COLOUR.
*
CONSTANTS: C__BLANKS(100) TYPE C VALUE ' '.
*
DATA: T__COLTOTALS TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE,
W__IDX TYPE SYINDEX,
W__POS TYPE I,
W__SPACES TYPE I,
W__TYPE(1) TYPE C,
W__SYMBOL(2) TYPE C.
*
* IF THE LAST COLOR IS DIFFERENT TO THE CURRENT COLOR, SWITCH
* INTENSE OFF.
*
IF W__LAST_COLOUR <> P_COLOUR.
MOVE P_COLOUR TO W__LAST_COLOUR.
MOVE FALSE TO W__INTENSE_FLAG.
ENDIF.
*
* DO WE NEED TO ADD A RUN TOTAL BREAK ?
*
* PERFORM SETINTENSIFIED USING FALSE.
IF W__RUNTOTAL = TRUE.
PERFORM INITBREAK USING '*' 'RUN TOTAL:' C_NO C_YES.
MOVE FALSE TO W__RUNTOTAL.
ENDIF.
*
IF W__INTENSE_FLAG = TRUE.
PERFORM SETINTENSIFIED USING TRUE.
ELSE.
PERFORM SETINTENSIFIED USING FALSE.
ENDIF.
*
WRITE /001 ''.
LOOP AT REPORTTABLE.
*
* POINT TO THE RELEVANT FIELD.
*
IF REPORTTABLE-FIELDNAME CO C_NUMBERS.
MOVE REPORTTABLE-FIELDNAME TO W__IDX.
ASSIGN COMPONENT W__IDX
OF STRUCTURE P_DATATABLE TO .
ELSE.
ASSIGN COMPONENT REPORTTABLE-FIELDNAME
OF STRUCTURE P_DATATABLE TO .
ENDIF.
COMPUTE W__POS = REPORTTABLE-STARTPOS + 1.
POSITION W__POS.
WRITE: SY-VLINE NO-GAP.
*
* CHECK BOX ?
*
CASE TRUE.
WHEN REPORTTABLE-CHECKBOX.
*
* CENTRE THE CHECK BOX WITHIN THE COLUMN
*
W__SPACES = ( REPORTTABLE-COLWIDTH - 1 ) / 2.
WRITE AT (W__SPACES) C__BLANKS NO-GAP.
WRITE AS CHECKBOX NO-GAP.
HIDE .
WHEN REPORTTABLE-ICON.
IF REPORTTABLE-HOTSPOT <> TRUE.
WRITE: ' ' NO-GAP, REPORTTABLE-ISYNAME AS ICON.
ELSE.
WRITE: ' ' NO-GAP, REPORTTABLE-ISYNAME
AS ICON HOTSPOT ON.
ENDIF.
HIDE .
WHEN REPORTTABLE-SYMBOL.
*
* CHECK TO SEE IF THIS IS A VARIABLE SYMBOL AND
* SET THE SYMBOL VALUE ACCORDINGLY.
*
IF REPORTTABLE-FIELDNAME IS INITIAL.
PERFORM WRITESYMBOL USING REPORTTABLE-ISYNAME
REPORTTABLE-HOTSPOT.
ELSE.
*
* THIS IS A VARIABLE SYMBOL. THE SYMBOL TO
* USE FOR TRUE IS IN ISYNAME, FALSE_SYM IS FALSE
* THE FIELD TO CHECK THE VALUE OF IS IN FIELDNAME
*
IF IS INITIAL.
PERFORM WRITESYMBOL USING REPORTTABLE-FALSESYM
REPORTTABLE-HOTSPOT.
ELSE.
PERFORM WRITESYMBOL USING REPORTTABLE-ISYNAME
REPORTTABLE-HOTSPOT.
ENDIF.
HIDE .
ENDIF.
WHEN OTHERS.
*
* SET THE OUTPUT COLOUR.
*
PERFORM SETCOLOUR USING P_COLOUR.
PERFORM WRITEVALUE USING REPORTTABLE-COLWIDTH

REPORTTABLE-CONVEXIT
REPORTTABLE-CURRENCY
REPORTTABLE-UNIT
REPORTTABLE-FORMAT.
HIDE .
ENDCASE.
FORMAT COLOR OFF.
*
* TOTAL BREAKS ?
*
DESCRIBE FIELD TYPE W__TYPE.
IF C__NUMERIC CS W__TYPE.
*
* UPDATE REPORT TOTALS AT LEVEL 1.
*
MOVE SY-TABIX TO W__POS.
READ TABLE REPORTBREAKS INDEX 1.
MOVE REPORTBREAKS-TOTALS[] TO T__COLTOTALS[].
READ TABLE T__COLTOTALS INDEX W__POS.
*

COMPUTE T__COLTOTALS = T__COLTOTALS + .
MODIFY T__COLTOTALS INDEX W__POS.
MOVE T__COLTOTALS[] TO REPORTBREAKS-TOTALS[].
MODIFY REPORTBREAKS INDEX 1.
ENDIF.
ENDLOOP.
READ TABLE REPORTTABLE INDEX 1.
COMPUTE W__POS = REPORTTABLE-STARTPOS + REPORTTABLE-MAXWIDTH + 1.
WRITE AT W__POS SY-VLINE.
MOVE TRUE TO W__LINEPRINTED.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SETCOLOUR
*
* PURPOSE: SETS THE OUTPUT COLOUR
*
* ENTRY: COLOUR TO SET
*
* EXIT:
*
* CALLED BY: PERFORM SETCOLOUR USING P_COLOUR
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM SETCOLOUR USING P_COLOUR.
*
DATA: W__COLOUR LIKE COL_HEADING.
*
MOVE P_COLOUR TO W__COLOUR.
FORMAT COLOR = W__COLOUR.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SETINTENSIFIED
*
* PURPOSE: SETS INTENSIFIED ON OR OFF
*
* ENTRY: TRUE/FALSE
*
* EXIT: INTENSIFIED FLAG SET
*
* CALLED BY: PERFORM SETINTENSIFIED USING TRUE
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM SETINTENSIFIED USING P_INTENSE.
*
IF P_INTENSE = TRUE.
FORMAT INTENSIFIED ON.
MOVE FALSE TO W__INTENSE_FLAG.
ELSE.
FORMAT INTENSIFIED OFF.
MOVE TRUE TO W__INTENSE_FLAG.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: WRITECENTRE.
*
* PURPOSE: CENTRES AND WRITES THE TEXT ACROSS THE CURRENT
* REPORT WIDTH
*
* ENTRY: TEXT TO CENTRE
*
* EXIT:
*
* CALLED BY: PERFORM WRITECENTRE USING W__TEXT
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM WRITECENTRE USING P_TEXT.
DATA: W__OFFSET TYPE I,
W__REPLINE(255) TYPE C.
MOVE SPACE TO W__REPLINE.
COMPUTE W__OFFSET = ( SY-LINSZ - STRLEN( P_TEXT ) ) / 2.
MOVE P_TEXT TO W__REPLINE+W__OFFSET.
WRITE /001 W__REPLINE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: WLINE.
*
* PURPOSE: PRINTS THE SUPPLIED DATA LINE TO THE REPORT
*
* ENTRY: DATALINE TO PRINT
* ENTRY: COLOUR OF LINE
*
* EXIT:
*
* CALLED BY: PERFORM WLINE USING W__DATALINE COL_GROUP
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM WLINE USING P_DATALINE P_COLOUR.
DATA: W__REPLINE(255) TYPE C,
W__FILLER(255) TYPE C,
W__OFFSET TYPE I,
W__COUNT TYPE I.
*
* WHEN YOU WRITE DATA LINES TO THE SCREEN THE COLOUR FORMATTING
* EXTENDS BACK TO COLUMN 1. THIS ROUTINE ATTEMPTS TO GET RID OF IT
*
* AND YOU CAN'T SPECIFY PARAMETERS FOR THE COLOUR STATEMENT.
* ANOTHER BYTE YER BUM FROM SAP!
*
SEARCH P_DATALINE FOR SY-VLINE.
IF SY-SUBRC = 0.
COMPUTE W__OFFSET = SY-FDPOS + 1.
MOVE P_DATALINE+0(W__OFFSET) TO W__FILLER.
MOVE P_DATALINE TO W__REPLINE.
ELSE.
MOVE P_DATALINE TO W__REPLINE.
ENDIF.
PERFORM SETCOLOUR USING P_COLOUR.
WRITE: / W__REPLINE.
FORMAT COLOR OFF.
*
* HERE'S ANOTHER BUM BYTER. YOU CAN'T SPECIFY A VARIABLE POSITION
* IN A WRITE STATEMENT - LIKE WRITE VARPOS VARIABLE......
*
* HOWEVER, THERE IS THE 'POSITION' STATEMENT WHICH I'VE ONLY JUST
* DISCOVERED AFTER WRITING THIS THE HARD WAY.
*
* ALL I WANT TO DO IS CLEAR A FEW SPACES AT THE START OF THE LINE
* AND AT THE END OF THE LINE.
*
COMPUTE W__COUNT = STRLEN( W__REPLINE ) + 1.
DO.
POSITION W__COUNT.
WRITE ' ' NO-GAP.
COMPUTE W__COUNT = W__COUNT + 1.
IF W__COUNT > SY-LINSZ.
EXIT.
ENDIF.
ENDDO.
*
WRITE 001 ' ' NO-GAP.
COMPUTE W__COUNT = SY-FDPOS - 1.
DO W__COUNT TIMES.
WRITE ' ' NO-GAP.
ENDDO.
ENDFORM.


*EJECT
***********************************************************************
*
* PROCEDURE: SORTREP
*
* PURPOSE: SORTS A REPORT BASED UPON AT USER-COMMAND.
*
* ENTRY: TABLE TO SORT.
*
* EXIT: TABLE SORTED.
* EXIT: REPORT COLUMN TABLE SORTED ON
* EXIT: SORT DIRECTION 'A' OR 'D'
*
* CALLED BY: AT USER-COMMAND.
* PERFORM SORTREP
* TABLES RDATA
* CHANGING P_FIELD P_DIR
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
* GET THE COLUMN TO SORT BY.
*
FORM SORTREP TABLES P_TABLE CHANGING P_SORTFD P_SORTDIR.
FIELD-SYMBOLS: , .
DATA: W__FPOS TYPE I, " POSITION ON SCREEN WHERE FIELD IS.
W__SORTFD TYPE I, " NUMBER OF SORT FIELD IN DATA TABLE.
W__DIST TYPE I, " DISTANCE BETWEEN FIELDS
W__CUCOL TYPE SYCUCOL. " CURSOR POSITION ON REPORT
*
* FIND THE REPORT COLUMN THEY WANT TO SORT ON. SY-CUCOL IS THE
* CURRENT SCREEN CURSOR POSITION.
*
MOVE 0 TO W__SORTFD.
*
* ADD THE FIRST DISPLAYED COLUMN + THE ACTUAL COLUMN ON SCREEN
*
COMPUTE W__CUCOL = SY-STACO + SY-CUCOL.
LOOP AT REPORTTABLE.
COMPUTE W__FPOS = REPORTTABLE-STARTPOS + REPORTTABLE-COLWIDTH.
IF W__FPOS >= W__CUCOL.
ASSIGN COMPONENT REPORTTABLE-FIELDNAME
OF STRUCTURE P_TABLE TO .
EXIT.
ENDIF.
ENDLOOP.
*
* IF THIS IS A VALID SORT FIELD THEN TRANSLATE THE REPORT FIELD
* TO THE DATA TABLE.
*
DO.
ASSIGN COMPONENT SY-INDEX OF STRUCTURE P_TABLE TO .
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
DESCRIBE DISTANCE BETWEEN
AND
INTO W__DIST.
IF W__DIST = 0.
IF = .
MOVE SY-INDEX TO W__SORTFD.
EXIT.
ENDIF.
ENDIF.
ENDDO.
IF NOT W__SORTFD IS INITIAL.
*
* RETRIEVE THE FIELD NAME FROM REPORTTABLE AND SORT ON IT.
*
MOVE W__SORTFD TO P_SORTFD.
ASSIGN COMPONENT REPORTTABLE-FIELDNAME
OF STRUCTURE P_TABLE TO .
CASE SY-UCOMM.
WHEN 'STUP'. SORT P_TABLE BY .
MOVE 'A' TO P_SORTDIR.
WHEN 'STDN'. SORT P_TABLE DESCENDING BY .
MOVE 'D' TO P_SORTDIR.
ENDCASE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SUBTITLE
*
* PURPOSE: PRINTS A LIST OF SEARCH CRITERIA
*
* ENTRY: SEARCH CRITERIA
*
* EXIT:
*
* CALLED BY: LOOP AT T_OPTS.
* PERFORM SUBTITLES SORT SIGN OPTION LOW HIGH
*
* CALLS: WRITECENTRE
* REPORTLINE
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM SUBTITLES USING P_TEXT P_SIGN P_OPTION P_LOW P_HIGH P_EOR.
*
* GET THE COLUMN TO SORT BY.
*
DATA: W__SUBTITLE(150) TYPE C,
W__OPTION(50) TYPE C,
W__JOIN(4) TYPE C,
W__SIGN(20) TYPE C,
W__PLURAL(60) TYPE C,
W__LOW(150) TYPE C,
W__HIGH(150) TYPE C.
*
* FORMAT THE INPUT PARAMETERS.
*
WRITE P_LOW TO W__LOW.
CONDENSE W__LOW.
WRITE P_HIGH TO W__HIGH.
CONDENSE W__HIGH.
*
* DECIDE ON THE INITIAL WORDING.
*
MOVE 'THAT' TO W__JOIN.
CASE P_OPTION.
WHEN 'EQ'. IF P_SIGN = 'I'.
MOVE 'ARE EQUAL TO' TO W__OPTION.
ELSE.
MOVE 'ARE NOT EQUAL TO' TO W__OPTION.
ENDIF.
WHEN 'NE'. MOVE 'ARE NOT EQUAL TO' TO W__OPTION.
WHEN 'CP'. IF P_SIGN = 'I'.
MOVE 'CONTAIN' TO W__OPTION.
ELSE.
MOVE 'DO NOT CONTAIN' TO W__OPTION.
ENDIF.
WHEN 'NP'. MOVE 'DOES NOT CONTAIN PATTERN' TO W__OPTION.
WHEN 'GE'. MOVE 'ARE GREATER THAN OR EQUAL TO' TO W__OPTION.
WHEN 'LT'. MOVE 'ARE LESS THAN' TO W__OPTION.
WHEN 'LE'. MOVE 'ARE LESS THAN OR EQUAL TO' TO W__OPTION.
WHEN 'GT'. MOVE 'ARE GREATER THAN' TO W__OPTION.
WHEN 'BT'. MOVE 'ARE BETWEEN' TO W__OPTION.
WHEN 'NB'. MOVE 'ARE NOT BETWEEN' TO W__OPTION.
ENDCASE.
*
* FORM THE SENTENCE.
*
CONCATENATE P_TEXT 'S' INTO W__PLURAL.
IF P_OPTION <> 'BT'
AND P_OPTION <> 'NB'.
CONCATENATE 'FOR ALL' W__PLURAL W__JOIN W__OPTION
W__LOW W__SIGN
INTO W__SUBTITLE
SEPARATED BY ' '.
ELSE.
CONCATENATE 'FOR ALL' W__PLURAL W__JOIN W__OPTION
W__LOW 'AND' W__HIGH W__SIGN
INTO W__SUBTITLE
SEPARATED BY ' '.
ENDIF.
IF P_EOR <> TRUE.
PERFORM WRITECENTRE USING W__SUBTITLE.
ELSE.
WRITE :/5 W__SUBTITLE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: CHECKBREAKS
*
* PURPOSE: CHECKS AND PRINTS TOTAL BREAKS
*
* ENTRY: BREAKTOTALS TABLE ESTABLISHED
* ENTRY REPORTDATA TABLE.
*
* EXIT:
*
* CALLED BY: PERFORM CHECKBREAKS USING P_DATATABLE.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM CHECKBREAKS USING P_DATATABLE.
*
FIELD-SYMBOLS: .
DATA: T__COLTOTALS TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE,
T__CARRY TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE,
W__BREAKLEVEL TYPE I VALUE -1,
W__TOTPRINT TYPE I,
W__POS TYPE I,
W__FFEED LIKE C_YES,
W__DATATABLE(2000) TYPE C.
*
MOVE P_DATATABLE TO W__DATATABLE.
IF W__ALLHDR_DONE = FALSE.
PERFORM ALLHDRS.
MOVE TRUE TO W__ALLHDR_DONE.
ENDIF.
LOOP AT REPORTBREAKS.
*
* ANY VALUE FROM A LOWER SUB TOTAL ?
* DON'T DO RUN TOTALS HERE....
*
IF REPORTBREAKS-TITLE <> 'RUN TOTAL:'.
ASSIGN (REPORTBREAKS-FIELD) TO .
IF <> REPORTBREAKS-VALUE.
*
* PRINT A GROUP TOTAL.
*
MOVE SY-TABIX TO W__BREAKLEVEL.
*
* FORM FEED ?
*
IF REPORTBREAKS-FFEED = C_YES.
MOVE C_YES TO W__FFEED.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
*
* BREAK AT WHAT LEVEL ?
*
IF W__BREAKLEVEL <> -1.
ZAP T__CARRY.
COMPUTE W__TOTPRINT = W__BREAKLEVEL + 1.
DO W__TOTPRINT TIMES.
*
* ADD THE TOTALS FROM THE PREVIOUS LEVEL.
*
READ TABLE REPORTBREAKS INDEX SY-INDEX.
MOVE REPORTBREAKS-TOTALS[] TO T__COLTOTALS[].
LOOP AT T__COLTOTALS.
MOVE SY-TABIX TO W__POS.
READ TABLE T__CARRY INDEX W__POS.
IF SY-SUBRC = 0.
COMPUTE T__COLTOTALS = T__COLTOTALS + T__CARRY.
MODIFY T__COLTOTALS INDEX W__POS.
MOVE T__COLTOTALS TO T__CARRY.
MODIFY T__CARRY INDEX W__POS.
ELSE.
CLEAR T__CARRY.
MOVE T__COLTOTALS TO T__CARRY.
APPEND T__CARRY.
ENDIF.
ENDLOOP.
MOVE T__COLTOTALS[] TO REPORTBREAKS-TOTALS[].
MODIFY REPORTBREAKS INDEX SY-INDEX.
*
* PRINT THE TOTALS AT THIS LEVEL.
*
IF SY-INDEX <= W__BREAKLEVEL.
PERFORM PRINTTOTALS USING SY-INDEX.
READ TABLE REPORTBREAKS INDEX SY-INDEX.
*
* UPDATE THE BREAK VALUE AND SET THE TOTALS TO 0.
*
ASSIGN (REPORTBREAKS-FIELD) TO .
MOVE TO REPORTBREAKS-VALUE.
LOOP AT T__COLTOTALS.
CLEAR T__COLTOTALS.
MODIFY T__COLTOTALS.
ENDLOOP.
MOVE T__COLTOTALS[] TO REPORTBREAKS-TOTALS[].
MODIFY REPORTBREAKS INDEX SY-INDEX.
ENDIF.
ENDDO.
*
* FORM FEED REQUIRED ?
*
IF W__FFEED = C_YES.
PERFORM TABLELINE.
NEW-PAGE.
ENDIF.
*
* GROUP HEADERS.
*
COMPUTE W__TOTPRINT = W__BREAKLEVEL.
WHILE W__TOTPRINT > 0.
READ TABLE REPORTBREAKS INDEX W__TOTPRINT.
PERFORM GROUPHEADER
USING REPORTBREAKS-TITLE REPORTBREAKS-VALUE.
COMPUTE W__TOTPRINT = W__TOTPRINT - 1.
ENDWHILE.
ENDIF.
MOVE W__DATATABLE TO P_DATATABLE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: PRINTTOTALS
*
* PURPOSE: PRINTS BREAK LEVEL TOTALS.
*
* ENTRY: DATA TABLES TO PRINT TOTALS FOR
* ENTRY: CURRENT TOTAL LEVEL
*
* EXIT:
*
* CALLED BY: PERFORM PRINTTOTALS
* USING P_TOTALLEVEL
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM PRINTTOTALS USING P_TOTALLEVEL.
*
DATA: T__COLTOTALS TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE,
W__TVAR TYPE FIELDNAME,
W__POS TYPE I,
W__POS1 TYPE I,
W__TITLE(255) TYPE C.
*
FIELD-SYMBOLS:.
*
*
* LOOP AROUND THE TOTALS TABLES AT THE SPECIFIED LEVEL.
*
READ TABLE REPORTBREAKS INDEX P_TOTALLEVEL.
*
* PRINT THIS BREAK ?
*
IF REPORTBREAKS-PRINT = C_YES.
IF W__LINEPRINTED = TRUE.
PERFORM TABLELINE.
ENDIF.
WRITE /001 ''.
READ TABLE REPORTTABLE INDEX 1.
COMPUTE W__POS = REPORTTABLE-STARTPOS + 1.
COMPUTE W__POS1 = REPORTTABLE-STARTPOS +
REPORTTABLE-MAXWIDTH + 1.
IF REPORTBREAKS-TITLE <> 'RUN TOTAL:'.
CONCATENATE REPORTBREAKS-TITLE
REPORTBREAKS-VALUE
'TOTAL:' INTO W__TITLE SEPARATED BY ' '.
ELSE.
MOVE REPORTBREAKS-TITLE TO W__TITLE.
ENDIF.
POSITION W__POS.
WRITE: AT W__POS SY-VLINE NO-GAP,
W__TITLE(REPORTTABLE-MAXWIDTH)
NO-GAP COLOR COL_GROUP INTENSIFIED.
MOVE REPORTBREAKS-TOTALS[] TO T__COLTOTALS[].
LOOP AT T__COLTOTALS.
IF NOT T__COLTOTALS IS INITIAL.
*
* GET THE COLUMN POSITIONS TO PRINT AT AND ALSO THE
* DECIMAL PLACES.
*
READ TABLE REPORTTABLE INDEX SY-TABIX.
COMPUTE W__POS = REPORTTABLE-STARTPOS + 1.
WRITE AT W__POS SY-VLINE NO-GAP.
PERFORM SETCOLOUR USING COL_TOTAL.
*
* PUT COLTOTALS BACK INTO THE SAME VARIABLE TYPE.....
*
IF REPORTTABLE-TABLE <> ''.
CONCATENATE REPORTTABLE-TABLE '-'
REPORTTABLE-FIELDNAME
INTO W__TVAR.
ELSE.
MOVE REPORTTABLE-FIELDNAME TO W__TVAR.
ENDIF.
ASSIGN (W__TVAR) TO .
MOVE T__COLTOTALS TO .
IF REPORTBREAKS-FIELD = '*'.
PERFORM SETINTENSIFIED USING TRUE.
ELSE.
PERFORM SETINTENSIFIED USING FALSE.
ENDIF.
PERFORM WRITEVALUE USING REPORTTABLE-COLWIDTH

REPORTTABLE-CONVEXIT
REPORTTABLE-CURRENCY
REPORTTABLE-UNIT
REPORTTABLE-FORMAT.
WRITE SY-VLINE NO-GAP.
FORMAT COLOR OFF.
ENDIF.
ENDLOOP.
POSITION W__POS1.
WRITE SY-VLINE.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: RUNTOTALS
*
* PURPOSE: PRINTS ALL SUB TOTAL LEVELS AND A FINAL RUN TOTAL
*
* ENTRY: REPORT DATA TABLE
*
* EXIT:
*
* CALLED BY: PERFORM RUNTOTALS.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM RUNTOTALS.
*
DATA: W__POS TYPE I,
W__BREAKLEVEL TYPE I,
T__COLTOTALS TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE,
T__CARRY TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE.
*
ZAP T__COLTOTALS.
ZAP T__CARRY.
LOOP AT REPORTBREAKS.
*
* CARRY FORWARD PREVIOUS LEVEL TOTALS
*
MOVE SY-TABIX TO W__BREAKLEVEL.
MOVE REPORTBREAKS-TOTALS[] TO T__CARRY[].
LOOP AT T__CARRY.
MOVE SY-TABIX TO W__POS.
READ TABLE T__COLTOTALS INDEX W__POS.
IF SY-SUBRC = 0.
COMPUTE T__COLTOTALS = T__COLTOTALS + T__CARRY.
MODIFY T__COLTOTALS INDEX W__POS.
ELSE.
MOVE T__CARRY TO T__COLTOTALS.
APPEND T__COLTOTALS.
ENDIF.
ENDLOOP.
MOVE T__COLTOTALS[] TO REPORTBREAKS-TOTALS[].
MODIFY REPORTBREAKS INDEX W__BREAKLEVEL.
PERFORM PRINTTOTALS USING W__BREAKLEVEL.
ENDLOOP.
PERFORM TABLELINE.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: INITBREAK
*
* PURPOSE: INITIALISES REPORT BREAKS TABLE
*
* ENTRY: FIELD TO BREAK ON.
* ENTRY: TITLE OF FIELD.
*
* EXIT:
*
* CALLED BY: PERFORM INITBREAK USING 'FIELDNAME'
* 'TITLE'
* FORMFEED YES/NO
* PRINT BREAK YES/NO
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*
* INITIALISE A REPORT BREAK.
*
FORM INITBREAK USING P_FIELD P_TITLE P_FORMFEED P_PRINT.
FIELD-SYMBOLS .
*
DATA: T__COLS TYPE DECIMAL_VALUE OCCURS 0 WITH HEADER LINE.
*
* GET ACCESS TO THE FIELD VALUE TO SET THE INITIAL BREAK VALUE
*
CLEAR REPORTBREAKS.
*
* GET THE TABLE NAME....
*
MOVE P_FIELD TO REPORTBREAKS-FIELD.
MOVE P_TITLE TO REPORTBREAKS-TITLE.
MOVE P_FORMFEED TO REPORTBREAKS-FFEED.
MOVE P_PRINT TO REPORTBREAKS-PRINT.
IF P_FIELD <> '*'.
ASSIGN (P_FIELD) TO .
MOVE TO REPORTBREAKS-VALUE.
ELSE.
MOVE '*' TO REPORTBREAKS-VALUE.
ENDIF.
*
* SET UP THE TOTALS COLUMNS.
*
ZAP T__COLS.
LOOP AT REPORTTABLE.
CLEAR T__COLS.
MOVE 0 TO T__COLS.
APPEND T__COLS.
ENDLOOP.
MOVE T__COLS[] TO REPORTBREAKS-TOTALS[].
APPEND REPORTBREAKS.
ENDFORM.
*EJECT
**********************************************************************
*
* PROCEDURE: WRITETABLE
*
* PURPOSE: WRITES A TABLE INTO ASINGLE COLUMN
*
* ENTRY: TABLE TO PRINT
* ENTRY: COLUMN TO USE.
*
* EXIT:
*
* CALLED BY: WRITETABLE T_TABLE 'VBELN'.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
DEFINE WRITETABLE.
LOOP AT &1.
PERFORM WRITECOL USING &1 &2.
ENDLOOP.
END-OF-DEFINITION.
*EJECT
**********************************************************************
*
* PROCEDURE: WRITECOLUMN
*
* PURPOSE: WRITES A SINGLE COLUMN.
*
* ENTRY: DATA LINE AND COLUMN TO PRINT
* ENTRY: COLUMN TO USE.
*
* EXIT:
*
* CALLED BY: PERFORM WRITECOL USING P_COLUMN P_DATA.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
FORM WRITECOL USING P_DATA P_FIELDNAME.
*
DATA: W__FIELDNAME(10) TYPE C, " UPPER CASE COLUMN NAME
W__DATA(255) TYPE C, " DATA TO PRINT
W__POS TYPE I.
*
MOVE P_FIELDNAME TO W__FIELDNAME.
MOVE P_DATA TO W__DATA.
TRANSLATE W__FIELDNAME TO UPPER CASE.
*
* FIND THE REPORT TABLE ENTRY FOR THIS COLUMN.
*
IF SY-SUBRC = 0.
WRITE /001 ''.
LOOP AT REPORTTABLE.
COMPUTE W__POS = REPORTTABLE-STARTPOS + 1.
WRITE AT W__POS SY-VLINE NO-GAP.
IF REPORTTABLE-FIELDNAME = W__FIELDNAME.
FORMAT COLOR COL_NORMAL.
WRITE AT (REPORTTABLE-COLWIDTH) W__DATA.
FORMAT COLOR OFF.
ENDIF.
ENDLOOP.
READ TABLE REPORTTABLE INDEX 1.
COMPUTE W__POS = REPORTTABLE-STARTPOS
+ REPORTTABLE-MAXWIDTH + 1.
WRITE AT W__POS SY-VLINE NO-GAP.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: FIRSTCOL.
*
* PURPOSE: SETS THE FIRST COLUMN OF THE REPORT
*
* ENTRY: ACTION TO PERFORM
* '<<' - MOVE TO THE LEFT MARGIN.
* '<' - MOVE LEFT 0NE COLUMN
* '>' - MOVE RIGHT ONE COLUMN.
* '>>' - MOVE TO RIGHT MARGIN.
* BLANK - MOVE TO LAST CALCULATED FIRST COLUMN
*
* EXIT:
*
* CALLED BY: PERFORM FIRSTCOL USING '>>'.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
FORM FIRSTCOL USING P_ACTION.
*
STATICS: W__MACOL TYPE SYMACOL, " CURRENT MARGIN
W__COLS TYPE I, " NUMBER OF COLUMNS
W__NEWM TYPE SYMACOL. " NEW COLUMN
*
IF W__MACOL IS INITIAL.
MOVE 1 TO W__MACOL.
DESCRIBE TABLE REPORTTABLE LINES W__COLS.
ENDIF.
CASE P_ACTION.
WHEN ''. IF W__NEWM <> 0.
SCROLL LIST TO COLUMN W__NEWM.
ENDIF.
WHEN '<<'. MOVE 0 TO W__MACOL. " LEFT MARGIN
WHEN '<'. IF W__MACOL > 0.
SUBTRACT 1 FROM W__MACOL.
ENDIF.
WHEN '>'. IF W__MACOL < W__COLS.
ADD 1 TO W__MACOL.
ENDIF.
WHEN '>>'. MOVE W__COLS TO W__MACOL. " RIGHT MARGIN
ENDCASE.
IF P_ACTION <> ''.
IF W__MACOL <> 0.
READ TABLE REPORTTABLE INDEX W__MACOL.
COMPUTE W__NEWM = REPORTTABLE-STARTPOS + 2.
SCROLL LIST TO COLUMN W__NEWM.
ELSE.
SCROLL LIST TO COLUMN 0.
ENDIF.
ENDIF.
ENDFORM.
*EJECT
***********************************************************************
*
* PROCEDURE: SHOW_PROGRESS
*
* PURPOSE: DISPLAYS A PROGRESS MESSAGE ON THE STATUS LINE
*
* ENTRY: MESSAGE TO DISPLAY
* MAX VALUE
* VALUE COMPLETE
* DIFFERENCE TO SHOW....
*
* EXIT:
*
* CALLED BY:
*
* CALLS:
*
* MODIFICATION HISTORY:
*
FORM SHOW_PROGRESS USING PU_TEXT TYPE NATXT
PU_MAX TYPE I
PU_DONE TYPE I
PU_DIFF TYPE I.
*
STATICS S_PRCNT TYPE P DECIMALS 2.
*
DATA: W_TEXT TYPE NATXT,
W_PRCNT TYPE DECIMAL_VALUE,
W_MAX TYPE DECIMAL_VALUE,
W_DONE TYPE DECIMAL_VALUE,
W_DIFF TYPE DECIMAL_VALUE.
*
MOVE 0 TO W_PRCNT.
IF PU_MAX <> 0.
MOVE PU_MAX TO W_MAX.
MOVE PU_DONE TO W_DONE.
COMPUTE W_PRCNT = ( W_DONE / W_MAX ) * 100.
WRITE W_PRCNT TO W_TEXT DECIMALS 2.
CONDENSE W_TEXT.
CONCATENATE PU_TEXT W_TEXT '% COMPLETE'
INTO W_TEXT
SEPARATED BY ' '.
ELSE.
MOVE PU_TEXT TO W_TEXT.
ENDIF.
IF W_PRCNT < S_PRCNT.
MOVE 0 TO S_PRCNT.
ENDIF.
COMPUTE W_DIFF = W_PRCNT - S_PRCNT.
IF W_DIFF > PU_DIFF
OR PU_DIFF = 0.
MOVE W_PRCNT TO S_PRCNT.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE = W_PRCNT
TEXT = W_TEXT
EXCEPTIONS
OTHERS = 0.
ENDIF.
ENDFORM.




INCLUDE YVALWERK.
***********************************************************************
*
* MACRO: MACRO WERKS_POPUP
*
* PURPOSE: HANDLES AN ON VALUE REQUEST FOR A WERKS (OR
* PLANT CODE FIELD)
*
* ENTRY: FIELD NAME OF PARAMETER
* ENTRY: TEXT TITLE OF POPUP.
* ENTRY: TEXT 'PLANT CODE'
* ENTRY: TEXT 'PLANT NAME'
*
* EXIT:
*
* CALLED BY: WERK_POPUP P_WERKS TEXT-001 TEXT-002 TEXT-003.
*
* CALLS:
*
* MODIFICATION HISTORY:
*
* DATE REASON VERSION WHO
*
*
* SELECT PLANT CODES.
*
DEFINE WERKS_POPUP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR &1.
*
TABLES: T001W. " PLANTS
DATA: BEGIN OF TB_WERKS OCCURS 0, " TABLE FOR WERKS LOOKUP
WERKS LIKE T001W-WERKS,
COL1(3) TYPE C,
NAME1 LIKE T001W-NAME1,
END OF TB_WERKS,
W_TABIX LIKE SY-TABIX. " SELECTED ROW IN TABLE.
*
PERFORM READ_SCREEN_VALUES.
ZAP TB_WERKS.
MOVE &3 TO TB_WERKS-WERKS.
MOVE &4 TO TB_WERKS-NAME1.
APPEND TB_WERKS.
MOVE SY-ULINE TO TB_WERKS-WERKS.
MOVE SY-ULINE TO TB_WERKS-COL1.
MOVE SY-ULINE TO TB_WERKS-NAME1.
APPEND TB_WERKS.
*
SELECT WERKS NAME1
FROM T001W
APPENDING CORRESPONDING FIELDS OF TABLE TB_WERKS.
*
* ADD IN A COLUMN SEPERATOR
*
LOOP AT TB_WERKS.
IF SY-TABIX <> 2.
MOVE ' | ' TO TB_WERKS-COL1.
MODIFY TB_WERKS.
ENDIF.
ENDLOOP.
*
CALL FUNCTION 'POPUP_WITH_TABLE_DISPLAY'
EXPORTING ENDPOS_COL = 70
ENDPOS_ROW = 17
STARTPOS_COL = 30
STARTPOS_ROW = 5
TITLETEXT = &2
IMPORTING CHOISE = W_TABIX
TABLES VALUETAB = TB_WERKS
EXCEPTIONS BREAK_OFF = 1
OTHERS = 2.
*
* DID THEY MAKE A SELECTION ?
*
IF W_TABIX > 2.
READ TABLE TB_WERKS INDEX W_TABIX.
MOVE TB_WERKS-WERKS TO &1.
ENDIF.
END-OF-DEFINITION.

No comments: