Sehr nützliches Programm, dass ich geschaffen habe, um stundenlange Aufwände nach jedem Update zu eliminieren. Bei Firmen, die exzessiv Queries über diese Art verwenden, ist der Aufwand noch erheblich größer.
Nach jeder Kopie muss jedes Query per SQ01 aufgerufen werden, wenn es in einem TCode oder per CALL TRANSACTION verwendet wird.
Ansonsten erhält man einen Dump beim Aufruf des TCodes oder per CALL TRANSACTION mit der Fehlermeldung LOAD_PROGRAM_NOT_FOUND.
Als Lösung existiert daneben lt. SAP ein Report namens REISSQMAIN.
Dieser muss pro Query mit Anhaken des Arbeitsbereiches und Eingabe der Usergruppe und generierten Programmnamen laut TCode gestartet werden.
Also pro aufgetretenen und gemeldeten Fehler für jedes Upgrade.
Das untige Programm reduziert den erheblichen Aufwand.
Idee dahinter:
Das Programm verifiziert alle TCodes mit Queries, erhebt deren Arbeitsbereich, Usergruppe und Aufruf Programmname und ruft REISSQMAIN per Batchinput für jeden Query auf.
Zeitersparnis pro Update: Mehrere Stunden
Qualitätsvorteil: Zumeist werden nicht alle Fehler erkannt oder gemeldet, es schlummern also latente Fehler im System, dieses Problem wird vom Programm gelöst.
*&---------------------------------------------------------------------*
*& Report ZREISSQMAIN
*&---------------------------------------------------------------------*
*& Version 001:
*& Aus Tabelle
*& Info TCode und Programm
*& Version 002:
*& Aus TSTC
*& Varsion 003:
*& Alle Usergroups
*& Version 004:
*& Global eingebaut
*& Testlauf eingebaut
*& Nur Fehler eingebaut
*& Globaler Arbeitsbereich
*& AQZZ/SAPQUERY/BPFSBP-BILDER===
*& Anm.:
*& Variante ist egal und damit auch die Fehlermeldung, da die Generierung
*& stattfindet
*&---------------------------------------------------------------------*
REPORT zreissqmain.
TABLES tstc.
TYPES: BEGIN OF ty_data,
tcode TYPE tcode,
pgmna TYPE program_id.
TYPES END OF ty_data.
DATA: gt_data TYPE TABLE OF ty_data.
DATA: gv_global TYPE boolean.
DATA: wa_data TYPE ty_data.
*&---------------------------------------------------------------------*
*INCLUDE bdcrecx1.
*----------------------------------------------------------------------*
* data definition aus INCLUDE
*----------------------------------------------------------------------*
* Batchinputdata of single transaction
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
* messages of call transaction
DATA: messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
* error session opened (' ' or 'X')
*----------------------------------------------------------------------*
* data definition statt Parameter in INCLUDE
*----------------------------------------------------------------------*
DATA: ctumode TYPE char1 VALUE 'N'. "A Alle Dynpors anzeigen E Fehler anzeigen N Dunkel P Dunkel und Debug
DATA: cupdate TYPE char1 VALUE 'L'. "L Lokal S Synchron A Asynchron
DATA: nodata TYPE char1 VALUE '/'.
DATA: gv_field TYPE char40.
PARAMETERS: p_test TYPE allgtest DEFAULT 'X'. "Testlauf
PARAMETERS: p_fehler TYPE uc_upl_log_err DEFAULT 'X'. "Nur Fehlerhafte Sätez
*----------------------------------------------------------------------*
* Start new transaction according to parameters *
*----------------------------------------------------------------------*
* Kommentieren der für Batch Input Mappen
*----------------------------------------------------------------------*
FORM bdc_transaction USING tcode.
DATA: l_mstring(480).
DATA: l_subrc LIKE sy-subrc.
** batch input session
* IF session = 'X'.
* CALL FUNCTION 'BDC_INSERT'
* EXPORTING
* tcode = tcode
* TABLES
* dynprotab = bdcdata.
* IF smalllog <> 'X'.
* WRITE: / 'BDC_INSERT'(i03),
* tcode,
* 'returncode:'(i05),
* sy-subrc,
* 'RECORD:',
* sy-index.
* ENDIF.
** call transaction using
* ELSE.
REFRESH messtab.
if p_test is initial.
CALL TRANSACTION tcode USING bdcdata
MODE ctumode
UPDATE cupdate
MESSAGES INTO messtab.
endif.
l_subrc = sy-subrc.
"Nur Fehler oder wenn alle (p_fehler blank) oder wenn Testmodus (p_test X)
IF l_subrc <> 0 OR p_fehler IS INITIAL or p_test = 'X'.
WRITE: / 'CALL_TRANSACTION',
tcode,
'returncode:'(i05),
l_subrc,
'RECORD:',
sy-index,
wa_data-tcode,
wa_data-pgmna.
LOOP AT messtab.
MESSAGE ID messtab-msgid
TYPE messtab-msgtyp
NUMBER messtab-msgnr
INTO l_mstring
WITH messtab-msgv1
messtab-msgv2
messtab-msgv3
messtab-msgv4.
WRITE: / messtab-msgtyp, l_mstring(250).
ENDLOOP.
ENDIF.
"SKIP.
* ENDIF.
*** Erzeugen fehlermappe ************************************************
* IF L_SUBRC <> 0 AND E_GROUP <> SPACE.
* IF E_GROUP_OPENED = ' '.
* CALL FUNCTION 'BDC_OPEN_GROUP'
* EXPORTING CLIENT = SY-MANDT
* GROUP = E_GROUP
* USER = E_USER
* KEEP = E_KEEP
* HOLDDATE = E_HDATE.
* E_GROUP_OPENED = 'X'.
* ENDIF.
* CALL FUNCTION 'BDC_INSERT'
* EXPORTING TCODE = TCODE
* TABLES DYNPROTAB = BDCDATA.
* ENDIF.
* ENDIF.
REFRESH bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
IF fval <> nodata.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDIF.
ENDFORM.
START-OF-SELECTION.
* SELECT a~tcode, b~pgmna FROM zxx_c_query AS a
* INNER JOIN tstc AS b
* ON a~tcode = b~tcode
* "WHERE a~tcode = 'ZQ_ABCXYZ_ANALYSE'
* INTO TABLE @gt_data.
SELECT b~tcode, b~pgmna FROM
tstc AS b
"WHERE b~pgmna like 'AQABGRUPPEABCD==%'
"WHERE b~pgmna like 'AQAB%' "Nur Standard
WHERE b~pgmna LIKE 'AQ%'
INTO TABLE @gt_data.
"Ab 5ter Stelle 26 Zeichen
"Ab 3ter Stelle 2 Zeichen ZZ
LOOP AT gt_data INTO wa_data.
IF wa_data-pgmna+2(2) = 'ZZ'.
gv_global = 'X'.
ELSE.
CLEAR gv_global.
ENDIF.
***********
PERFORM bdc_dynpro USING 'SAP_QUERY_CALL' '1000'.
PERFORM bdc_field USING 'BDC_CURSOR'
'P_QUERY'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ONLI'.
MOVE wa_data-pgmna+4(12) TO gv_field.
REPLACE ALL OCCURRENCES OF '=' IN gv_field WITH ' '.
PERFORM bdc_field USING 'P_UGROUP'
gv_field.
PERFORM bdc_field USING 'P_WSID'
gv_global.
MOVE wa_data-pgmna+16(14) TO gv_field.
REPLACE ALL OCCURRENCES OF '=' IN gv_field WITH ' '.
PERFORM bdc_field USING 'P_QUERY'
gv_field.
* CONCATENATE 'AQABGRUPPEABCD==' wa_data-pgmna+16(14) INTO gv_field.
* CONCATENATE 'AQABGRUPPEABCD==' wa_data-pgmna+16(14) INTO gv_field.
"'AQABGRUPPEABCD==FUSELAGE_SERIE'
move wa_data-pgmna to gv_field.
***********
PERFORM bdc_dynpro USING gv_field
'1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EE'.
*perform bdc_field using 'BDC_CURSOR'
* 'SP$00001-LOW'.
***********
PERFORM bdc_dynpro USING 'SAP_QUERY_CALL' '1000'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/EE'.
PERFORM bdc_transaction USING 'REISSQMAIN'.
ENDLOOP.
* T REISSQMAIN
*SAP_QUERY_CALL 1000 X "Hier nun in REISSQMAIN
* BDC_CURSOR P_QUERY
* BDC_OKCODE =ONLI
* P_WSID "X bei Global
* P_UGROUP gruppeabcd
* P_QUERY MAST
*AQABGRUPPEABCD==MAST========== 1000 X "Hier nun im Query
* BDC_OKCODE /EE "Abbruch
* BDC_CURSOR SP$00001-LOW "Erstes Feld dieses Query
*SAP_QUERY_CALL 1000 X "Hier nun in REISSQMAIN
* BDC_OKCODE /EE "Abbrechen
* BDC_CURSOR P_UGROUP