*---------------------------------------------------------------------*
*                     Z _ B J H _ D Y N P R O _ T C                   *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Beispielprogramm für die Be- und Verarbeitung eines Dynpros. Für    *
* die Auswahl werden zum Test die Lieferantennummer und ähnliche      *
* Felder eingegeben. Danach ermittel das System eine Liste, welche im *
* Dynpro als Table-Control angezeigt wird. Einzige Aktion (außer Ende)*
* ist das Anklicken oder Verändern der Menge, es erfolgt (nur zu      *
* Anschauungszwecken) eine Addtion der Menge um 0,1 und das Zurück-   *
* setzen der Markierung. PBO und PAI sind im Programm, keine Includes.*
*---------------------------------------------------------------------*
* (D) Dynpro - Table Control, Dynpro - Icon Create (Grafik und Push-  *
* button)                                                             *
*---------------------------------------------------------------------*
* 23.12.2003 BHaa: Programm erstellt                                  *
* 05.01.2004 BHaa: Beispiel-Aktion für Anmarkern hinterlegt           *
* 25.05.2005 BHaa: Ampel als Grafiksymbil im Table Control            *
*---------------------------------------------------------------------*
REPORT  z_bjh_dynpro_tc .

INCLUDE .

TABLES:
 ekko,       "Einkaufsbelegkopf
 ekpo.       "Einkaufsbelegposition

* für das Beispiel dient die Bestellpositionstabelle
DATA:
 wa_ekko LIKE ekko,
 wa_ekpo LIKE ekpo,

* Tabelle für das Dynpro erweitert um xmarked zum Markieren
* Werteinhalte für die auszugebende Liste. Achtung: anscheinend können
* geschachtelte Strukturen nicht ordnungsgemäß ausgegeben werden,
* deswegen der Umweg über ausw-Struktur und move-corresponding
 BEGIN OF ausw,
   xmarked(1) TYPE c,
   ebeln LIKE ekko-ebeln,
   ebelp LIKE ekpo-ebelp,
   lifnr LIKE ekko-lifnr,
   matnr LIKE ekpo-matnr,
   meins LIKE ekpo-meins,
   menge LIKE ekpo-menge,
   werks LIKE ekpo-werks,
 END OF ausw,

* interner Parameter
 anzahl(5) TYPE n.
* Data-Anweisungen speziell nur für den Table-Control
DATA:
* Rückgabewert Aktion im Dynpro
 okcode LIKE sy-ucomm,
* Table-Control für die Anzeige am Bildschirm
 itab_ausw LIKE TABLE OF ausw.

***************
* Dynpro 9200 *
***************
CONTROLS:
* Kontrolle für den TableControl-Bildschirm
 tc9200 TYPE TABLEVIEW USING SCREEN '9200'.

DATA:
* Systemfelder für den Table Control im Dynpro
* wieviel Zeilen gibt es
 loop9200 LIKE sy-loopc,

 cursor_9200 LIKE sy-stepl,

* selektierte Zeile
 select9200 LIKE sy-stepl,
* Datensatznummer referiert auf die interne Tabelle zur Auswahl der
* Tabellenzeile
 datensatz9200 LIKE sy-tabix,

* Ampel als grafische Auflockerung im Dynpro
 icon_ampel LIKE icons-text,
* Materialnummer als Pushbutton
 icon_matnr LIKE icons-text,

* lesen aus der Tabelle, dient aber auch zum Anwählen der Materialien
 idx_9200 LIKE sy-tabix.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Auswahlbildschirm zur Eingrenzung der Auswahl
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
SELECT-OPTIONS:
* Lieferantennummer
 solifnr FOR ekko-lifnr,
* Bestellung
 soebeln FOR ekko-ebeln,
* Materialnummer
 somatnr FOR ekpo-matnr.
SELECTION-SCREEN: END OF BLOCK a1.

INITIALIZATION.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
* beim Dynpro muß hier "at Selektion-Screen" stehen anstatt
* "Start-of-selection". Beim Select-Options ist die Dynpro-Nummer
* normalerweise die 1000, diese muß der Transaktion zugeordnet sein
AT SELECTION-SCREEN.
* Selektion der Datensätze auf Basis der Vorabauswahl
* hier mal als geschachtelte Einlesevariante
 SELECT * FROM ekko INTO wa_ekko
 WHERE ebeln IN soebeln
 AND   lifnr IN solifnr
 AND   loekz = ' '.
   SELECT * FROM ekpo INTO wa_ekpo
   WHERE ebeln = wa_ekko-ebeln
   AND   matnr IN somatnr
   AND   loekz = ' '.
     CLEAR: ausw.
     MOVE-CORRESPONDING wa_ekko TO ausw.
     MOVE-CORRESPONDING wa_ekpo TO ausw.

     APPEND ausw TO itab_ausw.
   ENDSELECT.
 ENDSELECT.

* Alternativ-Beispiel
* 100 Datensätze 1:1 in die interne Tabelle kopieren
*  SELECT * FROM ekpo into
*           UP TO 100 ROWS
*           INTO TABLE itab_ekpo.

 DESCRIBE TABLE itab_ausw LINES anzahl.
* es wurden Datensätze selektiert
 IF anzahl > 0.
* Liste nach Bestellnummer sortieren
   SORT itab_ausw BY ebeln ebelp ASCENDING.

   LEAVE TO SCREEN '9200'.
 ENDIF.

 EXIT.

*---------------------------------------------------------------------*
*                                                                     *
*                          P B O    Routinen                          *
*                                                                     *
*---------------------------------------------------------------------*
* Module                 S T A T U S _ 9 2 0 0                 Output *
*---------------------------------------------------------------------*
* allgemeiner Teil des Dynpros, was wie gesetzt werden soll.          *
*---------------------------------------------------------------------*
MODULE status_9200 OUTPUT.

* umschalten der Toolbar und eventuell des Titels, hier keine Aktion

*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.

 DESCRIBE TABLE itab_ausw LINES tc9200-lines.

ENDMODULE.

*---------------------------------------------------------------------*
* Module         G E T _ L O O P L I N E S _ 9 2 0 0           Output *
*---------------------------------------------------------------------*
* Table-Control spezifischer Teil. Dieser Part gilt für nur den Table *
* Control, welcher im Dynpro in der Ablauflogik-Schleife dazu hinter- *
* legt ist. Das Setzen der Loop-Lines sollte immer geschehen, weiter- *
* hin wird hier noch die Grafik bestimmt. Die kann von Zeile zu Zeile *
* sich ändern, auch wenn es immer die gleiche Variable ist !          *
*---------------------------------------------------------------------*
MODULE get_looplines_9200 OUTPUT.

 loop9200 = sy-loopc.

* anhand der Auswahlmenge eine Ampel am Bildschirm anzeigen
 IF ausw-menge < 10.
   PERFORM upro-bildschirm_icon
           USING 'ICON_GREEN_LIGHT' 'kleine Menge'
           CHANGING icon_ampel.
 ELSEIF ausw-menge < 100.
   PERFORM upro-bildschirm_icon
           USING 'ICON_YELLOW_LIGHT' 'geht noch'
           CHANGING icon_ampel.
 ELSEIF ausw-menge < 1000000.
   PERFORM upro-bildschirm_icon
           USING 'ICON_RED_LIGHT' 'na ja'
           CHANGING icon_ampel.
 ELSE.
   PERFORM upro-bildschirm_icon
           USING 'ICON_ALERT' 'etwas zu viel ?'
           CHANGING icon_ampel.
 ENDIF.

* Materialnummer als Push-Button (Hintenrumtrick für die Anzeige)
* wie dieser angelegt wird, siehe auch Beschreibung im Dynpro
 CALL FUNCTION 'ICON_CREATE'
      EXPORTING
           name       = '@'
           text       = ausw-matnr
           info       = 'Transaktion MM03'
*           ADD_STDINF = 'X'
      IMPORTING
           result     = icon_matnr.

ENDMODULE.

*---------------------------------------------------------------------*
*                                                                     *
*                          P A I    Routinen                          *
*                                                                     *
*---------------------------------------------------------------------*
* Module           U S E R _ C O M M A N D _ E N D E            Input *
*---------------------------------------------------------------------*
* harter Abbruch ausgelöst. Hier sofort das gesamte Programm verlassen*
*---------------------------------------------------------------------*
MODULE user_command_ende INPUT.

 LEAVE PROGRAM.

ENDMODULE.

*---------------------------------------------------------------------*
* Module           U S E R _ C O M M A N D _ 9 2 0 0            Input *
*---------------------------------------------------------------------*
* Prüfen auf Funktionscodes im Dynpro und allgmeiner Nachlaufroutinen.*
* Im Dynpro ist die allgemeine Funktion "Ende" hinterlegt, allerdings *
* diese auch als harter Abbruch (Funktions-Typ "E") sowie es gibt     *
* einen Pushbutton auf das Material, welcher bei Drücken in den Mate- *
* rialstamm verzweigt.                                                *
*---------------------------------------------------------------------*
MODULE user_command_9200 INPUT.

 CASE okcode.
   WHEN 'MM03'.
* Klick auf die Materialnummer, wechseln in Transaktion MM03
     PERFORM upro-sprung_mm03.
   WHEN 'ENDE'.
     LEAVE PROGRAM.
 ENDCASE.

ENDMODULE.

*---------------------------------------------------------------------*
* Module            M O D I F Y _ I T A B _ A U S W             INPUT *
*---------------------------------------------------------------------*
* Aktion für eine Änderung in einem Feld. Im Beispiel hier soll bei   *
* geänderter Menge oder Markierung die Menge ein wenig erhöht werden. *
*---------------------------------------------------------------------*
MODULE modify_itab_ausw INPUT.

* Beispiel: markierte Zeile demarkieren
* und die Menge in der Zeile zu entsprechenden Wert erhöhen
 MOVE ' ' TO ausw-xmarked.
 ADD '0.1' TO ausw-menge.

* ermittelte Zeile (alle Werte) des Bildschirmes in interne Tabelle
* übertragen und dort aktualisieren
 MODIFY itab_ausw FROM ausw INDEX tc9200-current_line.

ENDMODULE.

*---------------------------------------------------------------------*
*                                                                     *
*                           Unterprogramme                            *
*                                                                     *
*---------------------------------------------------------------------*
*                       S P R U N G _ M M 0 3                         *
*---------------------------------------------------------------------*
* Klick auf den Materialstamm. Sprung in den Materialdatenverwaltung  *
* mit der geklickten Materialnummer und dem Werk der Bestellposition. *
*---------------------------------------------------------------------*
FORM upro-sprung_mm03.

 DATA:
   mm03_matnr LIKE mara-matnr,
   mm03_werks LIKE marc-werks.

 CLEAR: mm03_matnr, mm03_werks.

* in welcher Zeile wurde die Materialanzeige gedrückt
 GET CURSOR LINE cursor_9200.
 IF sy-subrc = 0.
   idx_9200 = tc9200-top_line + cursor_9200 - 1.

* Bildschirmzeile einlesen
   READ TABLE itab_ausw INTO ausw INDEX idx_9200.
   IF sy-subrc = 0.
     MOVE ausw-matnr TO mm03_matnr.
     MOVE ausw-werks TO mm03_werks.
   ENDIF.
 ENDIF.

* Materialnummer vorhanden, wechseln in das Materialanzeigeprogramm
 IF NOT mm03_matnr IS INITIAL.
   SET PARAMETER ID 'MAT' FIELD mm03_matnr.
   SET PARAMETER ID 'WRK' FIELD mm03_werks.
   SET PARAMETER ID 'LAG' FIELD '    '.
* welche Sichten sollen in Transaktion MM03 aufgeblendet werden
* B=Buchhaltung1, D=Disposition1, E=Einkauf, K=Grunddaten,
* G=Kalkulation, L=Werksdaten / Lagerung 1, X=Werksbestand, Z=
   SET PARAMETER ID 'MXX' FIELD 'D'.
   CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
 ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*                    B I L D S C H I R M _ I C O N                    *
*---------------------------------------------------------------------*
* Bildchen / Grafik im Dynpro umwandeln auf das richtige Format für   *
* eine Anzeige. Es wird nur der Funktionsbaustein bedient, alle Ein-  *
* gaben müssen gemacht und vorgegeben werden.                         *
*---------------------------------------------------------------------*
* =>] p_icon_name: welche Grafik soll gezeichnet werden               *
* =>] p_icon_info: Zusatztext, erscheint bei Maus darüber (HTML ALT=) *
* ]=> p_icon: SAP interne Darstellung der Grafik                      *
*---------------------------------------------------------------------*
FORM upro-bildschirm_icon
    USING    p_icon_name
             p_icon_info
    CHANGING p_icon.

 CALL FUNCTION 'ICON_CREATE'
      EXPORTING
           name       = p_icon_name
*           TEXT       = p_icon_text
           info       = p_icon_info
*           ADD_STDINF = 'X'
      IMPORTING
           result     = p_icon.

ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005