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.