ZREISSQMAIN Queries Load_PROGRAM_NOT_FOUND nach Update beheben

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