:li *----------------------------------------------------------------------- * Report GENLDS * Mai 1996 * Dr. Ulrich Mende * Mummert + Partner Unternehmensberatung AG * Hans-Henny-Jahnn-Weg 9 * 22085 Hamburg * Tel.: 040-22703267 * e-mail: umende@hh.mup.de *----------------------------------------------------------------------- * Report zum Generieren des Verarbeitungsprogramms einer logischen * Dateischnittstelle ( LDS ). * Ausgangspunkt: * LDS als logische Datenbankbestehend aus Strukturen im DD definiert * Jede Struktur beschreibt eine Zeilenstruktur * Parameter: * Name der LDS * Default-Dateiname für Verarbeitungsprogramm * Generiert werden: * Leseprogramnm SAPDB * Include für SELECT-Options DBSEL *----------------------------------------------------------------------- REPORT GENLDS . * Makros A1 bis A5 zum Füllen der internen Programmtabelle DEFINE A1. PROGTAB-ZEILE = &1. APPEND PROGTAB. END-OF-DEFINITION. DEFINE A2. CONCATENATE &1 &2 INTO PROGTAB-ZEILE. APPEND PROGTAB. END-OF-DEFINITION. DEFINE A3. CONCATENATE &1 &2 &3 INTO PROGTAB-ZEILE. APPEND PROGTAB. END-OF-DEFINITION. DEFINE A4. CONCATENATE &1 &2 &3 &4 INTO PROGTAB-ZEILE. APPEND PROGTAB. END-OF-DEFINITION. DEFINE A5. CONCATENATE &1 &2 &3 &4 &5 INTO PROGTAB-ZEILE. APPEND PROGTAB. END-OF-DEFINITION. TABLES: TRDIR, " ABAP/4-Programme DD03L, " Felder von Strukturen u. Tabellen TLDB. " log. Datenbanken DATA PEINTRAG LIKE TLDB-EINTRAG. DATA SEINTRAG LIKE TLDB-EINTRAG. DATA RASTER TYPE I. DATA O TYPE I. DATA PROGNAME(12). " Leseprogramm SAPDB DATA SELNAME(12). " Include für Selectoptions DBSEL * Tabelle der Namen der an der beteiligten DD-Strukturen DATA: BEGIN OF STRUTAB OCCURS 20, STRUNAME(15), END OF STRUTAB. DATA ANZSTRUTAB TYPE I VALUE 0. * Tabelle des generierten Programmcodes DATA: BEGIN OF PROGTAB OCCURS 400, ZEILE(72), END OF PROGTAB. *----------------------------------------------------------------------- PARAMETERS: LDB(3) DEFAULT 'BFF', FILENAME(150) DEFAULT '/tmp/bff.txt' LOWER CASE. *----------------------------------------------------------------------- CLEAR STRUTAB. REFRESH STRUTAB. CLEAR PROGTAB. REFRESH PROGTAB. * Lesen und Auswerten der Tabelle der logischen Datenbanken SELECT SINGLE * FROM TLDB WHERE DBNAME = LDB(2) AND SYSTEM = LDB+2(1) AND KENNUNG = 'P'. PEINTRAG = TLDB-EINTRAG. SELECT SINGLE * FROM TLDB WHERE DBNAME = LDB(2) AND SYSTEM = LDB+2(1) AND KENNUNG = 'S'. SEINTRAG = TLDB-EINTRAG. RASTER = 0. DO. IF PEINTRAG(1) = SPACE. RASTER = RASTER + 1. SHIFT PEINTRAG LEFT. ELSE. EXIT. ENDIF. ENDDO. O = 0. DO. STRUTAB-STRUNAME = SEINTRAG+O(RASTER). IF STRUTAB-STRUNAME NE SPACE. APPEND STRUTAB. O = O + RASTER. ELSE. EXIT. ENDIF. ENDDO. DESCRIBE TABLE STRUTAB LINES ANZSTRUTAB. *---------------------------------------------------------------------- *----- Reportname mit LDB-Bezug A5 'REPORT SAPDB' LDB '#DEFINING DATABASE#' LDB '.'. *----- Tabellen A1 'TABLES: DD03L,'. LOOP AT STRUTAB. IF SY-TABIX LT ANZSTRUTAB. A3 '############' STRUTAB-STRUNAME ','. ELSE. A3 '############' STRUTAB-STRUNAME '.'. ENDIF. ENDLOOP. *----- Makro für PUT-Forms A1 '*----------------------------------------------------------------'. A1 'DEFINE MAKROPUT.'. A1 'DATA STRUNAME(30).'. A1 'DO.'. A1 ' IF ZEILE = SPACE.'. A1 ' READ DATASET FILENAME INTO ZEILE.'. A1 ' IF SY-SUBRC > 0. EXIT. ENDIF.'. A1 ' ANZZEILEN = ANZZEILEN + 1.'. A1 ' ENDIF.'. A1 ' STRUNAME = ZEILE(10).'. A1 ' READ TABLE STRUTAB WITH KEY STRUNAME = STRUNAME.'. A1 ' IF SY-SUBRC = 0. " keine Kommentarzeile'. A1 ' IF STRUNAME = &1.'. A1 ' PERFORM SPLITLINE USING ZEILE STRUNAME.'. A1 ' ZEILE = SPACE.'. A1 ' PUT# &2.'. A1 ' ELSE.'. A1 ' EXIT.'. A1 ' ENDIF.'. A1 ' ELSE. " Kommentarzeile überlesen'. A1 ' ZEILE = SPACE.'. A1 'ENDIF.'. A1 'ENDDO.'. A1 'END-OF-DEFINITION.'. A1 '*----------------------------------------------------------------'. *----- Parameter und Datenfelder A1 'DATA: BEGIN OF STRUTAB OCCURS 20,'. A1 ' STRUNAME(15),'. A1 ' END OF STRUTAB.'. A1 'DATA FELDTAB LIKE DD03L OCCURS 100 WITH HEADER LINE.'. A1 'DATA ZEILE(150) VALUE SPACE.'. A1 'DATA ANZZEILEN TYPE I VALUE ''0''.'. A1 '*----------------------------------------------------------------'. A1 '*----------------------------------------------------------------'. *----- FORMs A1 'FORM BEFORE_EVENT USING EVENT.'. A1 ' CASE EVENT.'. A1 ' WHEN ''START-OF-SELECTION''.'. A1 ' SELECT * INTO TABLE FELDTAB FROM DD03L WHERE'. LOOP AT STRUTAB. IF SY-TABIX < ANZSTRUTAB. A3 ' TABNAME = ''' STRUTAB-STRUNAME ''' OR'. ELSE. A3 ' TABNAME = ''' STRUTAB-STRUNAME ''' .'. ENDIF. ENDLOOP. A1 ' SORT FELDTAB BY TABNAME POSITION.'. A1 '*'. A1 ' CLEAR STRUTAB. REFRESH STRUTAB.'. LOOP AT STRUTAB. A3 ' STRUTAB-STRUNAME = ''' STRUTAB-STRUNAME '''.'. A1 ' APPEND STRUTAB.'. ENDLOOP. A1 '*'. A1 ' OPEN DATASET FILENAME FOR INPUT IN TEXT MODE.'. A1 ' IF SY-SUBRC > 0. STOP. ENDIF.'. A1 ' ENDCASE.'. A1 ' ENDFORM.'. A1 '*----------------------------------------------------------------'. A1 'FORM AFTER_EVENT USING EVENT.'. A1 ' CASE EVENT.'. A1 ' WHEN ''END-OF-SELECTION''.'. A1 ' CLOSE DATASET FILENAME.'. A1 ' ENDCASE.'. A1 ' ENDFORM.'. A1 '*----------------------------------------------------------------'. A1 '*----------------------------------------------------------------'. A1 '* Die FORMs PUT_ werden von Systemroutinen gerufen.'. A1 '* Ihre Namen dürfen nicht verändert werden.'. LOOP AT STRUTAB. A1 '*----------------------------------------------------------------'. A3 'FORM PUT_' STRUTAB-STRUNAME '.'. A5 ' MAKROPUT ''' STRUTAB-STRUNAME '''#' STRUTAB-STRUNAME '.'. A1 'ENDFORM.'. ENDLOOP. A1 '*----------------------------------------------------------------'. A1 'FORM PBO. ENDFORM. '. A1 'FORM PAI USING FNAME MARK. ENDFORM. '. A1 '*----------------------------------------------------------------'. A1 'FORM SPLITLINE USING ZEILE STRUNAME.'. A1 'FIELD-SYMBOLS .'. A1 'FIELD-SYMBOLS .'. A1 'DATA FELD(45).'. A1 'DATA D(30).'. A1 'DATA O TYPE I.'. A1 'DATA L TYPE I.'. A1 'DATA RC LIKE SY-SUBRC.'. A1 'O = 10.'. A1 'READ TABLE STRUTAB INDEX 1.'. A1 'CONCATENATE STRUTAB-STRUNAME ''-FEHLER'' INTO FELD.'. A1 'ASSIGN (FELD) TO .'. A1 'LOOP AT FELDTAB WHERE TABNAME = STRUNAME.'. A1 ' L = FELDTAB-LENG. " Datei enthält Felder im externen Format'. A1 ' D = ZEILE+O(L).'. A1 ' CONCATENATE FELDTAB-TABNAME ''-'' FELDTAB-FIELDNAME INTO FELD.'. A1 ' ASSIGN (FELD) TO .'. A1 ' PERFORM CHECKFORMAT USING D FELDTAB-INTTYPE RC.'. A1 ' IF RC = 0.'. A1 ' = D.'. A1 ' = SPACE.'. A1 ' ELSE.'. A1 '* MESSAGE ID ... TYPE ''S'' NUMBER ...'. A1 '* WITH ANZZEILEN STRUNAME FELD.'. A1 ' = ''X''.'. A1 ' ENDIF.'. A1 ' O = O + L.'. A1 'ENDLOOP.'. A1 'ENDFORM.'. A1 '*----------------------------------------------------------------'. A1 'FORM CHECKFORMAT USING FELD FELDTYP RC.'. A1 'DATA L TYPE I.'. A1 'L = STRLEN( FELD ).'. A1 'RC = 1.'. A1 'CASE FELDTYP.'. A1 ' WHEN ''C''.'. A1 ' RC = 0.'. A1 ' WHEN ''N''.'. A1 ' IF FELD CO ''0123456789'' OR SY-FDPOS >= L. RC = 0.'. A1 ' ELSE. RC = 1.'. A1 ' ENDIF.'. A1 ' WHEN ''D''.'. A1 ' IF FELD CO ''0123456789'' OR SY-FDPOS >= L. RC = 0.'. A1 ' ELSE. RC = 1.'. A1 ' ENDIF.'. A1 ' WHEN ''X''.'. A1 ' IF FELD CO ''0123456789ABCDEF'' OR SY-FDPOS >= L. RC = 0.'. A1 ' ELSE. RC = 1.'. A1 ' ENDIF.'. A1 ' WHEN ''P''.'. A1 ' IF FELD CO ''+-.0123456789'' OR SY-FDPOS >= L. RC = 0.'. A1 ' ELSE. RC = 1.'. A1 ' ENDIF.'. A1 'ENDCASE.'. A1 'ENDFORM.'. ULINE. LOOP AT PROGTAB. DO. REPLACE '#' WITH SPACE INTO PROGTAB-ZEILE. IF SY-SUBRC > 0. EXIT. ENDIF. ENDDO. MODIFY PROGTAB. WRITE: / PROGTAB-ZEILE. ENDLOOP. CONCATENATE 'SAPDB' LDB INTO PROGNAME. INSERT REPORT PROGNAME FROM PROGTAB. * * Generieren der SELECT-Options CLEAR PROGTAB. REFRESH PROGTAB. READ TABLE STRUTAB INDEX 1. A3 'PARAMETERS FILENAME(150) DEFAULT#''' FILENAME ''' LOWER CASE'. A3 ' FOR TABLE#' STRUTAB-STRUNAME '.'. ULINE. WRITE: / 'Generierte SELECT-Options:'. ULINE. LOOP AT PROGTAB. DO. REPLACE '#' WITH SPACE INTO PROGTAB-ZEILE. IF SY-SUBRC > 0. EXIT. ENDIF. ENDDO. MODIFY PROGTAB. WRITE: / PROGTAB-ZEILE. ENDLOOP. CONCATENATE 'DB' LDB 'SEL' INTO SELNAME. INSERT REPORT SELNAME FROM PROGTAB. SELECT SINGLE * FROM TRDIR WHERE NAME = SELNAME. TRDIR-SUBC = 'I'. " Auf Include-Typ umschalten MODIFY TRDIR.