Kurzdump Batchinput

Getting started ... Alles für einen gelungenen Start.
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Kurzdump Batchinput

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
hallo miteinander
ich habe mal ein programm geschrieben der per Batchinput die Höhe von Excel tabelle einliest.
das einlesen bis zu 9000 Excel Zeilen hat immer wunderbar geklappt, aber ich habe ein excel datei
der bis zu 32000 zeilen umfasst. Wenn ich siehe Excel datei mit 32000 Zeile einlese, bricht das Programm
immer ab.

Code: Alles auswählen.

Zeitlimit überschritten                                               
                                                                      
                                                                      
Was ist passiert?                                                     
                                                                      
                                                                      
Das Programm "ZRUTBAINHOEHE" hat die maximal zulässige Laufzeit ohne  
Unterbrechung überschritten und wurde deshalb abgebrochen.            
                                                                      
                                                                      
Was können Sie tun?                                                   
                                                                      
                                                                      
Notieren Sie bitte, welche Aktionen und Eingaben zu dem Fehler geführt
haben.                                                                
                                                                      
Wenden Sie sich bitte zur weiteren Bearbeitung des Problems an Ihren  
SAP-Administrator.                                                    
                                                                      
Mit der Transaktion ST22 zur ABAP-Dumpanalyse können Sie              
Abbruchmeldungen anschauen und verwalten, insbesondere längere Zeit   
aufbewahren.                                                          
verwalten, insbesondere längere Zeit aufbewahren.
Mein Programm

Code: Alles auswählen.

REPORT ZRUTIBAINPUT LINE-SIZE 100.

* Tabellen
TABLES: MARM.

* Excel Struktur nachbilden
DATA: I_ITAB TYPE TABLE OF ALSMEX_TABLINE WITH HEADER LINE,
  COUNT TYPE I.

*Interne Tabelle definition
DATA: BEGIN OF I_DATEN OCCURS 1,
         MATNR LIKE MARA-MATNR, " Materialnummer
         MAKTX LIKE MAKT-MAKTX, " Materialkurztext
         MEINH LIKE MARM-MEINH, " AME
         UMREN LIKE MARM-UMREN, " Nenner
         UMREZ LIKE MARM-UMREZ, " Zähler
         MEINS LIKE MARA-MEINS, " BME
         HOEHE LIKE MARM-HOEHE, " Höhe
         MEABM LIKE MARM-MEABM, " Einheit
     END OF I_DATEN.

DATA: I_DATEN_CL LIKE I_DATEN OCCURS 1 WITH HEADER LINE.

* Interne Tabellen
DATA:    BEGIN OF R_MES.
        INCLUDE STRUCTURE MESSAGE.
DATA:    END OF R_MES.

DATA: BEGIN OF I_BDC OCCURS 10.
        INCLUDE STRUCTURE BDCDATA.
DATA: END OF I_BDC.


* Variablen
DATA: V_LAE, " Nachrichten
      V_INDEX LIKE SY-INDEX, " Schleifen, aktueller Schleifendurchlauf
      OPEN, " Datei öffnen
      V_ERR, " Fehler
      P_BCOL TYPE I, " Spalteanfang
      P_BROW TYPE I, " Zeileanfang
      P_ECOL TYPE I, " Spalteende
      P_EROW TYPE I, " Zeileende
      V_SMTEXTH(20), " Hoehe Feld bestimmen
      V_SMTEXTM(20), " Mass Feld bestimmen
      V_MATNR LIKE MARA-MATNR, " Materialnummer
      V_UMREZ LIKE MARM-UMREZ, " Zähler
      V_HOEHE(13), " Höhe
      V_MEABM LIKE MARM-MEABM," Einheit
      V_COUNTER(2)," Zähler für Häheinhalt
      V_ROW(5), " Für Spalten Berechnung
      BILDFLAG LIKE T130F-KZREF,
      RMMZU_BILDPROZ LIKE RMMZU-BILDPROZ,
      RMMZU_BILDFOLGE LIKE RMMZU-BILDFOLGE.


* Parameter
PARAMETERS: P_PFAD LIKE RLGRAP-FILENAME OBLIGATORY. " Pfadangabe

************************************************************************
*
* Start der Selektion
*
************************************************************************
START-OF-SELECTION.

  CLEAR: P_BCOL, P_BROW, P_ECOL, P_EROW.

* Spalte- und Zeileanfang und Spalte- und Zeileende bestimmen
  P_BCOL = 1.
  P_BROW = 2.
  P_ECOL = 8.
  P_EROW = 9000.


* Überprüfen, ob Datei vorhanden ist
  PERFORM CHECK_PATH.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_PFAD
      I_BEGIN_COL             = P_BCOL
      I_BEGIN_ROW             = P_BROW
      I_END_COL               = P_ECOL
      I_END_ROW               = P_EROW
    TABLES
      INTERN                  = I_ITAB
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.

* Wenn Datei leer ist
  IF I_ITAB IS INITIAL.
    WRITE: / TEXT-001.
    EXIT.
  ENDIF.

  CLEAR: I_ITAB.
  REFRESH: I_DATEN.

* Tabellekonvertierung
  LOOP AT I_ITAB.

*    Überprüft Zeilenummer
    IF I_ITAB-ROW NE V_ROW.

      MOVE I_ITAB-ROW TO V_ROW.

      LOOP AT I_ITAB WHERE ROW EQ V_ROW.

        IF I_ITAB-COL EQ '0001'. " Materialnummer
          MOVE I_ITAB-VALUE TO I_DATEN-MATNR.
        ENDIF.

        IF I_ITAB-COL EQ '0002'. " Materialkurztext
          MOVE I_ITAB-VALUE TO I_DATEN-MAKTX.
        ENDIF.

        IF I_ITAB-COL EQ '0003'. " AME
          MOVE I_ITAB-VALUE TO I_DATEN-MEINH.
        ENDIF.

        IF I_ITAB-COL EQ '0004'. " Nenner
          MOVE I_ITAB-VALUE TO I_DATEN-UMREN.
        ENDIF.

        IF I_ITAB-COL EQ '0005'. " Zähler
          MOVE I_ITAB-VALUE TO I_DATEN-UMREZ.
        ENDIF.

        IF I_ITAB-COL EQ '0006'. " BME
          MOVE I_ITAB-VALUE TO I_DATEN-MEINS.
        ENDIF.

        IF I_ITAB-COL EQ '0007'. " Höhe
          MOVE I_ITAB-VALUE TO I_DATEN-HOEHE.
        ENDIF.

        IF I_ITAB-COL EQ '0008'. " Einheit
          MOVE I_ITAB-VALUE TO I_DATEN-MEABM.
        ENDIF.

      ENDLOOP.
    ENDIF.

*   Daten werden nur gespeichert, wenn Inhalte nicht identisch sind
    IF I_DATEN IS NOT INITIAL.
      APPEND I_DATEN.
    ENDIF.

    CLEAR: I_DATEN.
  ENDLOOP.

  REFRESH I_DATEN_CL.

* I_DATEN-Werte kopieren
  LOOP AT I_DATEN.
    CLEAR I_DATEN_CL.
    MOVE-CORRESPONDING I_DATEN TO I_DATEN_CL.
    APPEND I_DATEN_CL.
  ENDLOOP.

* Fehlermeldung ausgeben
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.

*   Beginnen mit den Höheeintrag
    PERFORM HOEHE_FUELLEN.

  ENDIF.

* Pfad selektieren per Fenster
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PFAD.
  PERFORM F4_HELP_FOR_PATH USING P_PFAD.

END-OF-SELECTION.


*----------------------------------------------------------------------*
* Beginn of FORM
*----------------------------------------------------------------------*

***********************************************************************
*  Öffnet den Datei-Dialog                                            *
***********************************************************************
FORM F4_HELP_FOR_PATH CHANGING P_PATH.

  DATA: LT_FILE_TABLE TYPE FILETABLE,
        LS_FILE_TABLE TYPE FILE_TABLE,
        LV_RC TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = 'Datei öffnen'              " Fenster Titel
      DEFAULT_EXTENSION       = 'XLS'                       " Files bestimmen
    CHANGING
      FILE_TABLE              = LT_FILE_TABLE
      RC                      = LV_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      OTHERS                  = 4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  IF LV_RC = 1.
    READ TABLE LT_FILE_TABLE INDEX 1 INTO LS_FILE_TABLE.
    P_PATH = LS_FILE_TABLE-FILENAME.
  ENDIF.


ENDFORM.                    "F4_HELP_FOR_PATH

***********************************************************************
*  Überprüft den angegebenen Pfad.                                    *
***********************************************************************
FORM CHECK_PATH.

  DATA : LV_RESULT TYPE ABAP_BOOL,
         LV_FILENAME TYPE STRING.

  LV_FILENAME = P_PFAD.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_EXIST
    EXPORTING
      FILE            = LV_FILENAME
    RECEIVING
      RESULT          = LV_RESULT
    EXCEPTIONS
      CNTL_ERROR      = 1
      ERROR_NO_GUI    = 2
      WRONG_PARAMETER = 3
      OTHERS          = 4.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
           WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  IF LV_RESULT IS INITIAL.
    MESSAGE E000(ZBINPUT) WITH P_PFAD.
  ENDIF.


ENDFORM.                    " CHECK

**********************************************************************
* Füllen der Hoehe und Längeneinheit mit Funktionsbaustein
* Struktur
* Material| Hoehe| Längeneinheit|
* --------|------|--------------|
*        X|     X|             X|
**********************************************************************
FORM HOEHE_FUELLEN.

* Variablen definition
  DATA: L_HEADDATA LIKE BAPIMATHEAD,"Kopfsegment mit Steuerungsinformation
        L_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,"Returnparameter
        V_MATNR LIKE MARA-MATNR,"Allgemeine Materialdaten
        V_TEXT(200),"Material mit .......
        V_ZAHLER(3),"Der Zaehler
        V_NULL(3), "Der Zaehler
        V_MESSAGE(100)."Message

* Interne Tabelledefinition
  DATA: BEGIN OF I_NULL OCCURS 0,
              MATNR LIKE MARA-MATNR,"Materialnummer
              HOEHE LIKE MARM-HOEHE,"Höhe
              MEINH LIKE MARM-MEINH,"Alternativmengeneinheit zur Lagermengeneinheit
              MEABM LIKE MARM-MEABM,"Einheit für Länge/Breite/Höhe
        END OF I_NULL.

  DATA: BEGIN OF I_UCCESS OCCURS 0,
              MATNR LIKE MARA-MATNR,"Materialnummer
              HOEHE LIKE MARM-HOEHE,"Höhe
              MEINH LIKE MARM-MEINH,"Alternativmengeneinheit zur Lagermengeneinheit
              MESSAGE LIKE BAPIRET2-MESSAGE,"Meldungstext
              MEABM LIKE MARM-MEABM,"Einheit für Länge/Breite/Höhe
        END OF I_UCCESS.

* Mengeneinheiten
  DATA BEGIN OF LT_BAPIE1MARMRT OCCURS 0.
          INCLUDE STRUCTURE BAPI_MARM.
  DATA END OF LT_BAPIE1MARMRT.

* Ankreuzleiste zu BAPI_MARM
  DATA BEGIN OF LT_BAPIE1MARMRTX OCCURS 0.
          INCLUDE STRUCTURE BAPI_MARMX.
  DATA END OF LT_BAPIE1MARMRTX.

*---------------------------------*
* START-OF-FORM
*---------------------------------*
  CLEAR: I_DATEN, V_MATNR, V_ZAHLER, V_NULL.
  REFRESH: LT_BAPIE1MARMRT, LT_BAPIE1MARMRTX, I_NULL, I_UCCESS.

  LOOP AT I_DATEN.
*** BEGIN Daten initialisieren
    CLEAR: L_HEADDATA-MATERIAL,
           L_HEADDATA-BASIC_VIEW,
           LT_BAPIE1MARMRTX,
           LT_BAPIE1MARMRT.
*   Refreshen von Tabelle nötig, sonst ist der Fehlertyp immer noch im Speicher enthalten
    REFRESH: LT_BAPIE1MARMRT, LT_BAPIE1MARMRTX.
*** ENDE  Daten initialisieren

    L_HEADDATA-MATERIAL = I_DATEN-MATNR."Materialnummer
    L_HEADDATA-BASIC_VIEW = 'X'. "Sicht Grunddaten

*   Liest nur ein einzige Datensatz herraus
    READ TABLE I_DATEN_CL WITH KEY MATNR = I_DATEN-MATNR
                                   MEINH = I_DATEN-MEINH.

*   Datensatz für Änderung an der MARM
    IF SY-SUBRC EQ 0.
      LT_BAPIE1MARMRT-ALT_UNIT = I_DATEN_CL-MEINH. "Alternativmengeneinheit zur Lagermengeneinheit
      LT_BAPIE1MARMRT-ALT_UNIT_ISO = I_DATEN_CL-MEINH."Alternativmengeneinheit zur Lagermengeneinheit
      LT_BAPIE1MARMRT-NUMERATOR = I_DATEN_CL-UMREZ."Zähler
      LT_BAPIE1MARMRT-HEIGHT = I_DATEN_CL-HOEHE. "Höhe
      LT_BAPIE1MARMRT-UNIT_DIM = I_DATEN_CL-MEABM. "Längen-Einheit
      APPEND LT_BAPIE1MARMRT.

*   Ankreuzfelder (die Schlüsselfelder genauso wie bei den Datenfeldern
*   belegen, die restlichen Felder mit 'X')
      LT_BAPIE1MARMRTX-ALT_UNIT = I_DATEN_CL-MEINH."Alternativmengeneinheit zur Lagermengeneinheit
      LT_BAPIE1MARMRTX-ALT_UNIT_ISO = I_DATEN_CL-MEINH."Alternativmengeneinheit zur Lagermengeneinheit
      LT_BAPIE1MARMRTX-NUMERATOR = 'X'.
      LT_BAPIE1MARMRTX-HEIGHT = 'X'.
      LT_BAPIE1MARMRTX-UNIT_DIM = 'X'.
      APPEND LT_BAPIE1MARMRTX.
    ENDIF.

*   Wenn Hoehe nicht gleich NULL ist
    IF LT_BAPIE1MARMRT-HEIGHT IS NOT INITIAL.

*   Änderungen durchführen je Material
      CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
        EXPORTING
          HEADDATA        = L_HEADDATA
        IMPORTING
          RETURN          = L_RETURN
        TABLES
          UNITSOFMEASURE  = LT_BAPIE1MARMRT
          UNITSOFMEASUREX = LT_BAPIE1MARMRTX.
    ENDIF.

    CLEAR: I_NULL, I_UCCESS.

*   Wenn das Material nicht geändert wurde
    IF L_RETURN-TYPE EQ 'E'.
      PACK I_DATEN_CL-MATNR TO I_UCCESS-MATNR.
      CONDENSE I_UCCESS-MATNR.
      MOVE I_DATEN_CL-HOEHE TO I_UCCESS-HOEHE.
      MOVE I_DATEN_CL-MEINH TO I_UCCESS-MEINH.
      MOVE L_RETURN-MESSAGE TO I_UCCESS-MESSAGE.
      V_ZAHLER = V_ZAHLER + 1.
      APPEND I_UCCESS.
*   Wenn die Hoehe gleich 0 ist
    ELSEIF LT_BAPIE1MARMRT-HEIGHT IS INITIAL
           AND LT_BAPIE1MARMRT-UNIT_DIM IS NOT INITIAL.
      PACK I_DATEN_CL-MATNR TO I_NULL-MATNR.
      CONDENSE I_NULL-MATNR.
      MOVE I_DATEN_CL-HOEHE TO I_NULL-HOEHE.
      MOVE I_DATEN_CL-MEINH TO I_NULL-MEINH.
      MOVE I_DATEN_CL-MEABM TO I_NULL-MEABM.
      V_NULL = V_NULL + 1.
      APPEND I_NULL.
    ENDIF.

    CLEAR: L_RETURN.
  ENDLOOP.
  SKIP.
*-------------------------------------
* Ausgabeliste-Verarbeitung          *
*-------------------------------------
* Wird ausgegeben, wenn Fehlermeldungen vorhanden sind
  IF V_ZAHLER NE 0.
    WRITE: / TEXT-005.
    WRITE: /(50) SY-ULINE.
    CLEAR: V_MATNR.
    LOOP AT I_UCCESS.
      IF I_UCCESS-MATNR NE V_MATNR.
        CLEAR V_TEXT.
        WRITE TEXT-010 TO V_TEXT.
        WRITE I_UCCESS-MATNR TO V_TEXT+9.
        WRITE TEXT-011 TO V_TEXT+14.
        WRITE: / V_TEXT, 30 I_UCCESS-HOEHE, I_UCCESS-MEINH, '>', 55 I_UCCESS-MESSAGE.
        MOVE I_UCCESS-MATNR TO V_MATNR.
      ELSE.
        WRITE: /30 I_UCCESS-HOEHE, I_UCCESS-MEINH, '>', 55 I_UCCESS-MESSAGE.
      ENDIF.
    ENDLOOP.
    SKIP.
    SKIP.
  ENDIF.

* Wird ausgegeben, wenn Längeneinheiten vorhanden sind, aber Hoehe gleich 0
  IF V_NULL NE 0.
    WRITE: / TEXT-006.
    WRITE /(63) SY-ULINE.
    CLEAR: V_MATNR.
    LOOP AT I_NULL.
      IF I_NULL-MATNR NE V_MATNR.
        CLEAR V_TEXT.
        WRITE TEXT-010 TO V_TEXT.
        WRITE I_NULL-MATNR TO V_TEXT+9.
        WRITE TEXT-002 TO V_TEXT+14.
        WRITE: / V_TEXT, 30 I_NULL-MEINH.
        MOVE I_NULL-MATNR TO V_MATNR.
      ELSE.
        WRITE: /30 I_NULL-MEINH.
      ENDIF.
    ENDLOOP.
  ENDIF.

* Wird ausgegeben, wenn in der Datenbank erfolgreich eingetragen wurde
  IF V_NULL EQ 0 AND V_ZAHLER EQ 0.

    WRITE: / TEXT-013.
    WRITE: /(10) SY-ULINE.
    WRITE: / TEXT-012.

  ENDIF.
ENDFORM. "HOEHE_FUELLEN


gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von zzcpak (Expert / 673 / 5 / 68 ) »
ich gehe mal davon aus, daß du diesem Programm im Dialog laufen lässt. In der Regel ist für jedes System eine Zeit definiert, die ein Dialogprozess ohne Unterbrechung laufen darf. Ist diese Zeit überschritten, erfolgt ein Kurzdump mit dem Titel TIME_OUT. Das dürfte bei dir der Fall sein.

Wie hoch dieser Wert auf dem System ist, kannst du z.B. mit Transaktion RZ11 ersehen (als Parameter "rdisp/max_wprun_time" eintragen). Die folgende Seite zeigt dir die maximale Anzahl an Sekunden, die ein Dialogprozess laufen darf.

Jetzt hast du mehrere Möglichkeiten.
1. Bereite dein Programm so auf, daß es auch im Batch lauffähig ist (also Dateien z.B. als CSV-Dateien auf einen Applikationsserver speichern etc.)
2. setze in bestimmten Abständen (z.B. immer nach 1.000 Matieralnummern) ein COMMIT WORK ab. Das setzt den sog. Zeitscheibenzähler wieder auf 0

Würde jedoch 1. Variante bevorzugen.

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
danke erstmal für deine antwort, aber kannst du den vorgang für mich bitte genauer beschreiben, variante 1?

Code: Alles auswählen.

1. Bereite dein Programm so auf, daß es auch im Batch lauffähig ist (also Dateien z.B. als CSV-Dateien auf einen Applikationsserver speichern etc.)

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
Dein Programm läuft einfach zu lang. Es gibt verschiedene Krücken, wie man das umgehen kann.

Dein Programm habe ich mir nicht angesehen, weil ohnehin nichts zur Abbruchstelle angegeben war (wenn du das nachreichst, sehe ich mir dein Programm auch gerne mal an ;) ). Inosfern gehe ich jetzt nicht auf "Beschleunigungspotential" in deinem Programm ein.

Grundsätzliche (also von deinem Programm unabhängige Tipps sind):

* Verringere die Laufzeit des Programms (zum Beispiel durch Splitten der Tabelle oder durch andere Techniken bei der Programmierung)

* Je nachdem, WO das Programm abbricht, kann man die Laufzeitbeschränkung durch einen COMMIT WORK umgehen.

* Wenn es sich um einmalige oder seltene Vorgänge handelt (Datenübernahme aus dem Altsystem) kann man die max. Laufzeit durch den Admin auch erhöhen lassen.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
kostonstyle hat geschrieben:danke erstmal für deine antwort, aber kannst du den vorgang für mich bitte genauer beschreiben, variante 1?

Code: Alles auswählen.

1. Bereite dein Programm so auf, daß es auch im Batch lauffähig ist (also Dateien z.B. als CSV-Dateien auf einen Applikationsserver speichern etc.)
Er meint, dass du deine Datei wahrscheinlich vom lokalen Client (Präsentationsserver) aus lädst. Wenn du sie aber auf den Applikationsserver (also die Maschine, auf der auch das SAP läuft) hochlädst und DANN das Programm im Hintergrund startest* hast du das Problem nicht mehr.

* im Hintergrund kann es nur laufen, wenn keine Verbindung zum lokalen Rechner (Präs.server) nötig ist


Ralf *hat den Tip in seiner Liste gerade vergessen
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
Verantwortlich für abbruchstelle ist der zeile hier

Code: Alles auswählen.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_pfad
      i_begin_col             = p_bcol
      i_begin_row             = p_brow
      i_end_col               = p_ecol
      i_end_row               = p_erow
    TABLES
      intern                  = i_itab
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
kostonstyle hat geschrieben:Verantwortlich für abbruchstelle ist der zeile hier

Code: Alles auswählen.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_pfad
      i_begin_col             = p_bcol
      i_begin_row             = p_brow
      i_end_col               = p_ecol
      i_end_row               = p_erow
    TABLES
      intern                  = i_itab
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
Er bricht also im Funktionsbaustein ab? Steht in der Doku was zu Laufzeitproblemen? Ich hab grad kein System zur Hand, darum kann ich mir das nicht angucken.

Versuch die Datei auf den Applikationsserver zu kopieren und sie von da aus im Hintergrund einzuspielen. Wenn der Anwender stresst (die haben manchmal Angst vor Servern) kopier das programmtechnisch rüber.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
also, ich habe das programm nochmals gedebuggt, und programmabbruch geschieht in der loop schleife. soll ich in loop commit work setzen?

Code: Alles auswählen.

LOOP AT i_itab.

*    Überprüft Zeilenummer
    IF i_itab-row NE v_row.

      MOVE i_itab-row TO v_row.

      LOOP AT i_itab WHERE row EQ v_row.

        IF i_itab-col EQ '0001'. " Materialnummer
          MOVE i_itab-value TO i_daten-matnr.
        ENDIF.

        IF i_itab-col EQ '0002'. " Materialkurztext
          MOVE i_itab-value TO i_daten-maktx.
        ENDIF.

        IF i_itab-col EQ '0003'. " AME
          MOVE i_itab-value TO i_daten-meinh.
        ENDIF.

        IF i_itab-col EQ '0004'. " Nenner
          MOVE i_itab-value TO i_daten-umren.
        ENDIF.

        IF i_itab-col EQ '0005'. " Zähler
          MOVE i_itab-value TO i_daten-umrez.
        ENDIF.

        IF i_itab-col EQ '0006'. " BME
          MOVE i_itab-value TO i_daten-meins.
        ENDIF.

        IF i_itab-col EQ '0007'. " Höhe
          MOVE i_itab-value TO i_daten-hoehe.
        ENDIF.

        IF i_itab-col EQ '0008'. " Einheit
          MOVE i_itab-value TO i_daten-meabm.
        ENDIF.

      ENDLOOP.
    ENDIF.

*   Daten werden nur gespeichert, wenn Inhalte nicht identisch sind
    IF i_daten IS NOT INITIAL.
      APPEND i_daten.
    ENDIF.

    CLEAR: i_daten.
  ENDLOOP.

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
Fehlermeldung

Code: Alles auswählen.

Nach einer bestimmten Zeit wird das Programm abgebrochen, um den      
Arbeitsbereich für einen anderen wartenden Benutzer zu räumen.        
Damit soll verhindert werden, daß ein Arbeitsbereich z.B. durch       
- Endlosschleifen (DO, WHILE, ...),                                   
- Datenbankzugriffe mit großer Ergebnismenge,                         
- Datenbankzugriffe ohne geeigneten Index (full table scan)           
unnötig lang blockiert wird.                                          
                                                                      
Die maximale Laufzeit eines Programms wird vom Systemprofilparameter  
"rdisp/max_wprun_time" begrenzt. Die aktuelle Einstellung ist         
600 Sekunden. Nach Überschreiten dieser Zeitgrenze wird versucht,     
ein evtl. laufendes SQL-Statement abzubrechen bzw. dem ABAP-Prozessor 
signalisiert, das laufende Programm abzubrechen. Danach wird nochmals 
max. 60 Sekunden gewartet. Falls danach das Programm immer noch aktiv 
ist, wird der Work-Prozeß durchgestartet.                             
erfolgreicher Bearbeitung nicht sofort abgebrochen wird, steht dem    
Programm nochmal die Zeit von 600 Sekunden zur Verfügung.             
Die maximale Laufzeit eines Programms beträgt dadurch mindestens den  
doppelten Wert des Systemprofilparameters "rdisp/max_wprun_time".    

Beitrag von black_adept (Top Expert / 4090 / 127 / 940 ) »
Wenn die Tabelle so groß ist, teil den Aufruf in kleinere Bereiche auf und füge die dann nachher zusammen.

Also statt 1x
P_BROW = 1
P EROW = 32000
zu setzen machst du etwa 4 Aufrufe mit

P_BROW = 1
P EROW = 8000
,
P_BROW = 8001
P EROW = 16000
,
P_BROW = 16001
P EROW = 24000
,
P_BROW = 24001
P EROW = 32000

Zwischen den jeweiligen Aufrufen schreibst du jeweils "COMMIT WORK" ( auch wenn du nix auf der DB machst) damit der Laufzeitzähler zurückgesetzt wird
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
sehr gut thx

Beitrag von Helmut (ForumUser / 19 / 0 / 0 ) »
Auf jeden Fall solltest du pro Aufruf des FuBas unter 10000 einzulesenden Zeilen bleiben, da die Zeilennummer in i_itab mit NUMC(4) definiert ist und der geschachtelte

Code: Alles auswählen.

LOOP AT i_itab. 

*   Überprüft Zeilenummer 
    IF i_itab-row NE v_row. 

      MOVE i_itab-row TO v_row. 

      LOOP AT i_itab WHERE row EQ v_row. 
mit 32000 Zeilen nicht wunschgemäß funktionieren wird. (Der FuBa liest zwar auch mehr Zeilen ein, macht nach Zeile 9999 aber mit Zeilennr 0000 weiter).

Außerdem könnte man auch mit einem einfachen Loop auskommen, wenn man den Wechsel der Zeilennummer entsprechend abfragt, was laufzeitmäßig vielleicht auch was bringt. i_itab hat immerhin 8 * 32000 Zeilen.

MfG
Helmut

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
so habe jetzt mein programm angepasst. Der commit work habe ich noch in loop eingefügt.

Code: Alles auswählen.

* Tabellekonvertierung
  LOOP AT i_itab.

*    Überprüft Zeilenummer
    IF i_itab-row NE v_row.

      MOVE i_itab-row TO v_row.

      LOOP AT i_itab WHERE row EQ v_row.

        IF i_itab-col EQ '0001'. " Materialnummer
          MOVE i_itab-value TO i_daten-matnr.
        ENDIF.

        IF i_itab-col EQ '0002'. " Materialkurztext
          MOVE i_itab-value TO i_daten-maktx.
        ENDIF.

        IF i_itab-col EQ '0003'. " AME
          MOVE i_itab-value TO i_daten-meinh.
        ENDIF.

        IF i_itab-col EQ '0004'. " Nenner
          MOVE i_itab-value TO i_daten-umren.
        ENDIF.

        IF i_itab-col EQ '0005'. " Zähler
          MOVE i_itab-value TO i_daten-umrez.
        ENDIF.

        IF i_itab-col EQ '0006'. " BME
          MOVE i_itab-value TO i_daten-meins.
        ENDIF.

        IF i_itab-col EQ '0007'. " Höhe
          MOVE i_itab-value TO i_daten-hoehe.
        ENDIF.

        IF i_itab-col EQ '0008'. " Einheit
          MOVE i_itab-value TO i_daten-meabm.
        ENDIF.

      ENDLOOP.
    ENDIF.

    v_count = v_count + 1.
*   Daten werden nur gespeichert, wenn Inhalte nicht identisch sind
    IF i_daten IS NOT INITIAL.
      APPEND i_daten.
    ENDIF.

    CLEAR: i_daten.

    IF v_count > 10000.
      CLEAR v_count.
      COMMIT WORK.
    ENDIF.
  ENDLOOP.
bei bestimmter Material erhalte ich die fehlermeldung

Code: Alles auswählen.

Geben Sie eine Materialart ein
was ist ein materialart

Beitrag von ralf.wenzel (Top Expert / 3924 / 200 / 280 ) »
kostonstyle hat geschrieben:so habe jetzt mein programm angepasst. Der commit work habe ich noch in loop eingefügt.
Aber die vielen Ratschläge nicht befolgt.



Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Beitrag von kostonstyle (Specialist / 247 / 0 / 0 ) »
aber ich weiss leider nicht wie mit applikationsserver :cry:
habe dein vorschlag genommen.

Vergleichbare Themen

0
Antw.
1193
Views
CV01N im Batchinput
von chfreise » 21.01.2008 19:06 • Verfasst in ABAP® Core
4
Antw.
2642
Views
Batchinput in der Transaktion MM42
von erich1986 » 04.10.2013 12:14 • Verfasst in ABAP® für Anfänger
7
Antw.
6100
Views
Transaktion KB31N / BatchInput
von Timmi1981 » 09.02.2009 17:43 • Verfasst in ABAP® für Anfänger
9
Antw.
3275
Views
Batchinput und Steploop/Tablecontrol
von Gast » 15.07.2005 10:17 • Verfasst in ABAP® Core
1
Antw.
545
Views
Kurzdump
von Rabea1103 » 07.07.2021 20:29 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 23 / 3718
User Exit EXIT_RQCPRM10_001
vor 14 Stunden von a-dead-trousers 2 / 284
Trennen Strasse und Hausnummer
vor 20 Stunden von payten 13 / 10646
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1338

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 23 / 3718
User Exit EXIT_RQCPRM10_001
vor 14 Stunden von a-dead-trousers 2 / 284
Trennen Strasse und Hausnummer
vor 20 Stunden von payten 13 / 10646
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1338

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2872
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9465