Calling SAP Gannt Chart Graphics, With Dialog 
The following ABAP program illustrates some of the function module calls discussed in the preceding topics.
*-------------------------------------------------------------*
* This program calls SAP Gantt Chart.
* GRGANT_2 calls GRAPH_GANTT, sending chart data (line
* items, events, and milestones). The online user can then
* update the chart by moving, modifying, deleting or
* inserting new elements. The ABAP program responds by
* updating its own data.
*-------------------------------------------------------------*
REPORT NO STANDARD PAGE HEADING.
*-------------------------------------------------------------*
* Definition of ITEM table (Line items in the graph)
*-------------------------------------------------------------*
DATA: BEGIN OF ITEM OCCURS 1.
INCLUDE STRUCTURE GGAIT.
DATA: NEWNUM LIKE SY-TABIX, "// for moving ITEMS
MODIF(1), "// `X` (change), 'D' (delete)
END OF ITEM.
*------------------------------------------------------------*
* Definition of ELEM table (Event elements in the graph)
*-------------------------------------------------------------*
DATA: BEGIN OF ELEM OCCURS 1.
INCLUDE STRUCTURE GGAEL.
DATA: TBEG TYPE T, "// not send
MODIF(1), "// 'X' = modif, 'D' = deleted
END OF ELEM.
DATA: BEGIN OF LGEL OCCURS 1.
INCLUDE STRUCTURE GGAEL.
DATA: END OF LGEL.
DATA: BEGIN OF DFEL OCCURS 1.
INCLUDE STRUCTURE GGAEL.
DATA: END OF DFEL.
*-------------------------------------------------------------*
* Definition of MIST table (Milestones in the graph)
*-------------------------------------------------------------*
DATA: BEGIN OF MIST OCCURS 1.
INCLUDE STRUCTURE GGAMI.
DATA: TBEG TYPE T, "// not send
MODIF(1), "// 'X' = modif, 'D' = deleted
END OF MIST.
DATA: BEGIN OF LGMS OCCURS 1.
INCLUDE STRUCTURE GGAMI.
DATA: END OF LGMS.
DATA: BEGIN OF DFMS OCCURS 1.
INCLUDE STRUCTURE GGAMI.
DATA: END OF DFMS.
*-------------------------------------------------------------*
* Definition of return-msg table
(NOTE: DEF. MUST LOOK EXACTLY LIKE THIS!!)
*------------------------------------------------------------*
DATA: BEGIN OF BACK OCCURS 1.
INCLUDE STRUCTURE GGABA.
DATA: END OF BACK.
*-------------------------------------------------------------*
* More declarations
*-------------------------------------------------------------*
DATA: DATE_NULL TYPE D VALUE '18991230'.
DATA: GANTT_STAT, DAYS(3).
DATA: TABIX LIKE SY-TABIX,
TAB_INDEX LIKE SY-TABIX.
DATA: T TYPE T,
D TYPE D.
DATA C(10).
DATA: M_TYP(1), G_TYP(1), CUA_ID(10). "// Dialog return-msg
DATA ITEMNO TYPE P.
SET PF-STATUS 'GRAF'.
ITEM-ITEXT = 'ARD'. ITEM-UCOLOR = 'GREEN'. APPEND ITEM.
CLEAR ITEM-UCOLOR.
ITEMNO = 1.
PERFORM FILL_ELEM USING 'Today Show'
'19931126' '200000' 15 'M' 'BLUE' '15' 'C'.
PERFORM FILL_ELEM USING 'Play Romeo & Julia'
'19931126' '201800' 90 'M' 'GREEN' '15' 'L'.
PERFORM FILL_ELEM USING 'Current Issues'
'19931126' '223000' 30 'M' 'BLUE' '15' 'C'.
ITEM-ITEXT = 'ZDF'. APPEND ITEM.
ITEMNO = 2.
PERFORM FILL_ELEM USING 'Football DFB League'
'19931127' '203000' 120 'M' 'GREEN' '15' 'L'.
ITEM-ITEXT = 'SAT 1'. APPEND ITEM.
ITEMNO = 3.
PERFORM FILL_ELEM USING 'Today Show'
'19931128' '200000' 15 'M' 'BLUE' '15' 'C'.
PERFORM FILL_ELEM USING 'Focus '
'19931128' '201600' 45 'M' 'GREEN' '15' 'L'.
ITEM-ITEXT = 'Cable channel'. APPEND ITEM.
ITEMNO = 4.
PERFORM FILL_ELEM USING 'Sport Highlights'
'19931130' '210000' 90 'M' 'BLUE' '15' 'C'.
ITEM-ITEXT = 'PRO 7'. APPEND ITEM.
ITEMNO = 5.
PERFORM FILL_ELEM USING 'Rambo I'
'19931201' '150000' 170 'M' 'GREEN' '15' 'L'.
MIST-ITEMNO = 1.
MIST-BEG = ELEM-BEG.
MIST-TBEG = ELEM-TBEG.
MIST-TXT = 'TV Coord. Committee'.
MIST-FORM = 'SQUARE'.
MIST-COLOR = 'BLACK'.
APPEND MIST.
PERFORM AUSGABE.
AT PF8.
SY-LSIND = 0.
GANTT_STAT = SPACE.
DO.
REFRESH BACK.
DFEL-FILLD = '1'.
DFEL-BRDON = '1'.
DATA: BEG LIKE GGAEL-BEG.
DATA: END LIKE GGAEL-BEG.
DATA: LIN LIKE GGAEL-BEG.
DATA: VIW LIKE GGAEL-BEG.
DATA: TIM LIKE GGAEL-BEG.
READ TABLE ELEM INDEX 1.
BEG = ELEM-BEG.
END = ELEM-BEG + 9000000.
VIW = ELEM-BEG + 3000000.
LIN = ELEM-BEG + 7200.
CALL FUNCTION 'GRAPH_GANTT'
EXPORTING
* VGRID = 'X'
HGRID = 'X'
WHEADER = 'Studio Schedule'
TTITLE = 'SAP AG : Studio 3'
TTEXT = 'Programs'
LEGEND = 'Legend'
* TLENGTH = '5'
* TMBEG = BEG
* TMEND = END
* TLINE = LIN
* TMVIEW = VIW
NOTXT = SPACE
TUNIT = 'H' "// Time unit: Hour
DFEL = DFEL
DFMS = DFMS
MODIF = 'ON'
STAT = GANTT_STAT
IMPORTING
M_TYP = M_TYP
G_TYP = G_TYP "// 'C', 'S', '0', '1', '2'
CUA_ID = CUA_ID
TABLES
ITEM = ITEM
MIST = MIST
ELEM = ELEM
LGMS = MIST
LGEL = ELEM
MSGT = BACK.
GANTT_STAT = '4'. "// just wait next time
*------------------------------------*
* Evaluate msg from graphics program *
*------------------------------------*
IF M_TYP = 'D'. EXIT. ENDIF. "// Graph closed
CASE G_TYP.
WHEN 'C'. "// Pickup, ignore
WHEN 'U'. "// Timer, ignore
WHEN 'S'. "// Save, exit
EXIT. "// Dialogloop
WHEN '0'. "// CUA-Action bar
"// CUA_ID contains
"// ACT_ID
"// will not happen
WHEN '1'. "// CUA-Help request
"// not yet
"// will not happen
WHEN '2'. "// CUA-Helpline
"// CUA_ID contains
"// ACTSTRING
"// will not happen
ENDCASE.
ENDDO. "// Dialog Loop
* Close will do nothing, if already closed.
CALL FUNCTION 'GRAPH_DIALOG'
EXPORTING
CLOSE = 'X'.
* ----------------------------------------------------------- *
* When processing multiple saves, events, milestones and line
* items are not really deleted from the output table. Instead,
* they are marked as deleted (ELEM-MODIF = 'D').
* However, before the next data-transfer to the graphics
* program, these elements must be removed from their
* respective tables. This ensures that objects known internally
* to the graphics program can be matched up correctly with the
* corresponding table rows. (PERFORM PACK)
* ----------------------------------------------------------- *
* Merge BACK to Original Data
* Mark changes
LOOP AT BACK.
IF BACK-OBJ = 'E'. "// ELEMENTS
CASE BACK-ACT.
WHEN 'M'. "// Move
TABIX = BACK-ELM.
READ TABLE ELEM INDEX TABIX.
ELEM-MODIF = 'X'.
ELEM-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
ELEM-BEG = BACK-BEG.
ELEM-TXT = BACK-TXT.
ELEM-DUR = BACK-DUR.
ELEM-ITEMNO = BACK-ITM.
MODIFY ELEM INDEX TABIX.
DELETE BACK.
WHEN 'A'. "// Edit (Length etc)
TABIX = BACK-ELM.
READ TABLE ELEM INDEX TABIX.
ELEM-MODIF = 'X'.
ELEM-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
ELEM-BEG = BACK-BEG.
ELEM-TXT = BACK-TXT.
ELEM-DUR = BACK-DUR.
ELEM-ITEMNO = BACK-ITM.
MODIFY ELEM INDEX TABIX.
DELETE BACK.
WHEN 'I'. "// Insert New
ELEM-MODIF = 'X'.
ELEM-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
ELEM-BEG = BACK-BEG.
ELEM-TXT = BACK-TXT.
ELEM-DUR = BACK-DUR.
ELEM-ITEMNO = BACK-ITM.
APPEND ELEM.
DELETE BACK.
WHEN 'D'. "// Delete Element
TABIX = BACK-ELM.
READ TABLE ELEM INDEX TABIX.
ELEM-MODIF = 'D'.
MODIFY ELEM INDEX TABIX.
DELETE BACK.
ENDCASE.
ENDIF. "// ELEMENTS
IF BACK-OBJ = 'M'. "// MILESTONES
CASE BACK-ACT.
WHEN 'M'.
TABIX = BACK-ELM.
READ TABLE MIST INDEX TABIX.
MIST-MODIF = 'X'.
MIST-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
MIST-BEG = BACK-BEG.
MIST-TXT = BACK-TXT.
MIST-ITEMNO = BACK-ITM.
MODIFY MIST INDEX TABIX.
DELETE BACK.
WHEN 'A'.
TABIX = BACK-ELM.
READ TABLE MIST INDEX TABIX.
MIST-MODIF = 'X'.
MIST-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
MIST-BEG = BACK-BEG.
MIST-TXT = BACK-TXT.
MIST-ITEMNO = BACK-ITM.
MODIFY MIST INDEX TABIX.
DELETE BACK.
WHEN 'I'.
MIST-MODIF = 'X'.
MIST-TBEG = BACK-BEG - ( ( BACK-DAT - DATE_NULL) *
86400).
MIST-BEG = BACK-BEG.
MIST-TXT = BACK-TXT.
MIST-ITEMNO = BACK-ITM.
APPEND MIST.
DELETE BACK.
WHEN 'D'.
TABIX = BACK-ELM.
READ TABLE MIST INDEX TABIX.
MIST-MODIF = 'D'.
MODIFY MIST INDEX TABIX.
DELETE BACK.
ENDCASE.
ENDIF. "// MILESTONES
IF BACK-OBJ = 'I'. "// ITEMS
CASE BACK-ACT.
WHEN 'A'. "// Change without moving -> text only
TABIX = BACK-ITM.
READ TABLE ITEM INDEX TABIX.
ITEM-MODIF = 'X'.
ITEM-ITEXT = BACK-TXT.
MODIFY ITEM INDEX TABIX.
DELETE BACK.
WHEN 'I'. "// Insert -> new number with append
ITEM-MODIF = 'N'.
ITEM-ITEXT = BACK-TXT.
APPEND ITEM.
DELETE BACK.
WHEN 'M'. "// Move -> exchange the order
"// ITM : old number, ELM : new number
TABIX = BACK-ITM.
READ TABLE ITEM INDEX TABIX.
ITEM-NEWNUM = BACK-ELM.
IF BACK-ITM NE BACK-ELM.
IF ITEM-MODIF NE 'N'. "// save 'NEW'-Info
ITEM-MODIF = 'M'. "// Marker for PACK
"// nothing to do
ENDIF.
MODIFY ITEM INDEX TABIX.
ELSE.
"// unchanged item
"// inserting items
"// reports
"// ALL items
"// this is not an error
"// just ignore it
ENDIF.
DELETE BACK.
WHEN 'D'. "// Delete -> ELEM and MIST intentionally
"// deleted
TABIX = BACK-ITM.
READ TABLE ITEM INDEX TABIX.
ITEM-MODIF = 'D'.
MODIFY ITEM INDEX TABIX.
DELETE BACK.
ENDCASE.
ENDIF. "// ITEMS
* DELETE BACK. "// global for all cases
ENDLOOP.
* Reorg ELEM after ITEM-Move
LOOP AT ELEM.
TABIX = ELEM-ITEMNO.
READ TABLE ITEM INDEX TABIX.
IF ITEM-MODIF = 'M' OR ITEM-MODIF EQ 'N'.
ELEM-ITEMNO = ITEM-NEWNUM.
MODIFY ELEM.
ENDIF.
ENDLOOP.
* Reorg MIST after ITEM-Move
LOOP AT MIST.
TABIX = MIST-ITEMNO.
READ TABLE ITEM INDEX TABIX.
IF ITEM-MODIF = 'M' OR ITEM-MODIF EQ 'N'.
MIST-ITEMNO = ITEM-NEWNUM.
MODIFY MIST.
ENDIF.
ENDLOOP.
LOOP AT ITEM. "// Causes unambiguous Sort for Merge/Reorder
IF ITEM-MODIF = 'M' OR ITEM-MODIF EQ 'N'.
"// already has new
"// number
ELSE.
ITEM-NEWNUM = SY-TABIX. "// current number
MODIFY ITEM.
ENDIF.
ENDLOOP.
SORT ITEM BY NEWNUM.
* End of Merge
* Changes are marked
PERFORM AUSGABE.
SET PF-STATUS 'GRAF'.
* Clear Markers
* Delete physically
PERFORM PACK.
*-------------------------------------------------------------*
* FORM AUSGABE (No USING-Parameter)
*-------------------------------------------------------------*
FORM AUSGABE.
DETAIL.
TAB_INDEX = 0.
LOOP AT ITEM.
TAB_INDEX = TAB_INDEX + 1.
CASE ITEM-MODIF.
WHEN SPACE.
WRITE: / ITEM-ITEXT.
WHEN 'X'.
WRITE: / ITEM-ITEXT INPUT ON.
WHEN 'M'.
WRITE: / ITEM-ITEXT, '<reorder>' INPUT ON.
WHEN 'N'.
WRITE: / ITEM-ITEXT, '<new>' INPUT ON.
WHEN 'D'.
WRITE: '<deleted>' INPUT ON.
ENDCASE.
LOOP AT ELEM.
* ONLY IF SORTED
* IF ELEM-ITEMNO GT TAB_INDEX.
* EXIT.
* ENDIF.
IF ELEM-ITEMNO EQ TAB_INDEX.
D = ( ( ELEM-BEG - ELEM-TBEG) / 86400) + DATE_NULL.
T = ELEM-DUR.
DAYS = ( ELEM-DUR - T) / 86400.
CASE ELEM-MODIF.
WHEN 'X'.
WRITE: /2 ELEM-TXT(29) INPUT ON.
MOVE D TO C.
WRITE C USING EDIT MASK '____.__.__' INPUT ON.
MOVE ELEM-TBEG TO C.
WRITE: C USING EDIT MASK '__:__:__' INPUT ON.
IF DAYS = 0.
WRITE: ' 0' INPUT ON, ':' INPUT ON.
ELSE.
WRITE: DAYS INPUT ON, ':' INPUT ON.
ENDIF.
MOVE T TO C.
WRITE: C USING EDIT MASK '__:__:__' INPUT ON.
WHEN 'D'.
WRITE: /2 '<deleted>' INPUT ON.
WHEN SPACE.
WRITE: /2 ELEM-TXT(29).
MOVE D TO C.
WRITE C USING EDIT MASK '____.__.__'.
MOVE ELEM-TBEG TO C.
WRITE: C USING EDIT MASK '__:__:__'.
IF DAYS = 0.
WRITE: ' 0', ':'.
ELSE.
WRITE: DAYS, ':'.
ENDIF.
MOVE T TO C.
WRITE: C USING EDIT MASK '__:__:__'.
WHEN OTHERS.
ENDCASE.
ENDIF.
ENDLOOP.
LOOP AT MIST.
IF MIST-ITEMNO EQ TAB_INDEX.
D = ( ( MIST-BEG - MIST-TBEG) / 86400) + DATE_NULL.
CASE MIST-MODIF.
WHEN 'X'.
WRITE: /2 MIST-TXT(29) INPUT ON.
MOVE D TO C.
WRITE: C USING EDIT MASK '____.__.__' INPUT ON.
MOVE MIST-TBEG TO C.
WRITE: C USING EDIT MASK '__:__:__' INPUT ON.
WHEN 'D'.
WRITE: / 'MS : deleted' INPUT ON.
WHEN SPACE.
WRITE: /2 MIST-TXT(29).
MOVE D TO C.
WRITE: C USING EDIT MASK '____.__.__'.
MOVE MIST-TBEG TO C.
WRITE: C USING EDIT MASK '__:__:__'.
ENDCASE.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*-------------------------------------------------------------*
* FORM PACK (No USING-Parameter)
*-------------------------------------------------------------*
FORM PACK.
LOOP AT ELEM.
IF ELEM-MODIF = 'D'.
DELETE ELEM.
ELSE.
ELEM-MODIF = SPACE.
MODIFY ELEM.
ENDIF.
ENDLOOP.
LOOP AT MIST.
IF MIST-MODIF = 'D'.
DELETE MIST.
ELSE.
MIST-MODIF = SPACE.
MODIFY MIST.
ENDIF.
ENDLOOP.
LOOP AT ITEM.
IF ITEM-MODIF = 'D'.
DELETE ITEM. "// related elements already gone
ENDIF.
IF ITEM-MODIF = 'M'. "// Shift order
"// Adapt all elements
"// Adapt all milestones
ITEM-NEWNUM = SPACE.
ITEM-MODIF = SPACE.
MODIFY ITEM.
ENDIF.
ENDLOOP.
ENDFORM.
TOP-OF-PAGE.
PERFORM TOP_TEXT.
TOP-OF-PAGE DURING LINE-SELECTION.
PERFORM TOP_TEXT.
*-------------------------------------------------------------*
* FORM FILL_ELEM
*-------------------------------------------------------------*
FORM FILL_ELEM USING TEXT DBEG TBEG DUR UNIT COL SIZE POS.
ELEM-ITEMNO = ITEMNO.
ELEM-TXT = TEXT.
D = DBEG.
T = TBEG.
ELEM-TBEG = T.
ELEM-BEG = ( D - DATE_NULL) * 86400 + T.
CASE UNIT.
WHEN 'S'.
ELEM-DUR = DUR.
WHEN 'M'.
ELEM-DUR = DUR * 60.
WHEN 'H'.
ELEM-DUR = DUR * 60 * 60.
WHEN 'D'.
ELEM-DUR = DUR * 60 * 60 * 24.
WHEN 'W'.
ELEM-DUR = DUR * 60 * 60 * 24 * 7.
WHEN 'N'.
ELEM-DUR = DUR * 60 * 60 * 24 * 30.
WHEN 'Q'.
ELEM-DUR = DUR * 60 * 60 * 24 * 90.
WHEN 'Y'.
ELEM-DUR = DUR * 60 * 60 * 24 * 365.
ENDCASE.
ELEM-BAKGR = COL.
* ELEM-PLACE = POS.
ELEM-HEIGH = SIZE.
CASE POS.
WHEN 'U'.
ELEM-PLACE = 'ABOVE'.
WHEN 'C'.
ELEM-PLACE = 'CENTER'.
WHEN 'L'.
ELEM-PLACE = 'BELOW'.
ENDCASE.
APPEND ELEM.
ENDFORM.
*-------------------------------------------------------------*
* FORM TOP_TEXT (No USING-Parameter)
*-------------------------------------------------------------*
FORM TOP_TEXT.
WRITE: /32 'Dispo-System for Studios'.
ULINE.
WRITE: / ' Programs Date Time '.
WRITE: 'Length'.
ULINE.
ENDFORM.