Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

ABAP - Fehler beim Lesen einer Datei

Empfohlene Antworten

Veröffentlicht

Hallo,

ich habe mal wieder ein Problem.

Mein Ziel ist es eine Datei zu lesen und den Inhalt dann in eine interne Tabelle zu schreiben. Mein Code sieht ausschnittsweise so aus:


OPEN DATASET verzeichnis FOR INPUT.


      DO.


        READ DATASET verzeichnis INTO itab.


      ENDDO.


verzeichnis enthält: D:\Daten\test.txt

Den Fehler bekomme ich bei: READ DATASET verzeichnis INTO itab.

Fehler: Die Datei ... konnte nicht geöffnet werden.

Fehlertext: No such file or directory

Unklar ist mir, dass die Fehlermeldung nicht shcon beim OPEN-Befehl kommt, da ja dort auch schon die Datei geöffnet wird.

mfg hyperion

OPEN DATASET öffnet eine Datei auf dem Applikationsserver, nicht auf dem Frontend! Um Dateien vom Frontend zu laden / darauf zu schreiben, kannst du die Methoden der Klasse CL_GUI_FRONTEND_SERVICES, oder die Funktionsbausteine GUI_UPLOAD / GUI_DOWNLOAD nutzen.

Gruß,

Tom.

Hallo,

hat funktioniert, danke.

mfg hyperion

Hallo,

hmm ich finde die Dokumentation dieses FuBas irgendwie knapp. Ich sehe nirgendwo beschrieben was ich alles für has_field_seperator einsetzen kann. Für die anderen Parameter gilt das gleiche. Gibt es einen has_field_seperator für enter?

Ich habe ein File test.txt worin folgendes steht:

1

1

Wo liegt Rom?

Italien

Deutschland

A

1

3

Was kommt nach D?

A

E

B

Nun will ich, dass das ganze in eine interne Tabelle geschrieben wird mit folgender Struktur:

Index, Nummer, Frage, AntwortA, AntwortB, Richtig

Am Ende des Einlesens sollte das ganze dann etwa so aussehen:


Index  Nummer  Frage                   AntwortA  AntwortB      Richtig


1        1           Wo liegt Rom?        Italien      Deutschland A

1        3           Was kommt nach D B             E                B

Probiert habe ich schon 1000-Versionen. Meine aktuelle sieht so aus:

*Zählen der Einträge in zmtquizdb um den letzten Index zu ermitteln.

  SELECT * FROM zmtquizdb.


    n = n + 1.


  ENDSELECT.



CALL FUNCTION 'GUI_UPLOAD'

     EXPORTING

          filename = verzeichnis

          read_by_line = 'X'

     TABLES

          data_tab = itab.


LOOP AT itab.


*Der Index wird angepasst.

 itab-ind = ( n + 1 ).


*Aktueller Datensatz wird nach struc1 verschoben.

  MOVE-CORRESPONDING itab TO struc1.


*Einfügen des Arbeitsbereiches in zmtquizdb.

  INSERT INTO zmtquizdb VALUES struc1.


ENDLOOP.

Was passiert? Des Programm läuft zwar durch trägt mir aber nur Leerzeichen ein (mal abgesehen zmtquizdb-ind, aber das beeinflusse ich ja auch anders.)

Bitte um Hilfe.

mfg hyperion

Was du da versuchst, kann nicht so funktionieren wie du es dir vorstellst! Habe grade nicht genug Zeit, das wie und warum auszuformulieren...

Poste doch mal bitte den kompletten Quellcode, dann sollte ich es dir genauer erklären können. :)

Hmm eigentlich ist das schon der Ganze, mal abgesehen vom Deklerationsteil und noch einem anderen Teil welcher die Eingabe von Datensätzen über Eingabefelder ermöglicht, aber das hat eigentlich nichts mit dem obigen CODE zu tun.

mfg hyperion

Oh ok hätte nicht gedacht, dass der Fehler hier liegt;) Naja vorsichtshalber gebe ich dir dan nauch den restlichen Deklerationsteil.


*Verwendete Tabelle. Enthält die Fragen zu zmtquizmitdb.

TABLES: zmtquizdb.


*Dekleration eines Arbeitsbereiches.

DATA: BEGIN OF struc1,

         ind(3),

         nummer(3),

         frage(100),

         antworta(25),

         antwortb(25),

         antwortc(25),

         antwortd(25),

         richtig(1),

       END OF struc1.


*Dekleration einer internen Tabelle.

DATA: itab LIKE zmtquizdb OCCURS 10 WITH HEADER LINE.


*Deklerationen für Felder die mit Dynpros verknüpft sind.

DATA: nummer(3),

      frage(100),

      a(25),

      b(25),

      c(25),

      d(25),

      richtig(1),

      verzeichnis type string,

      ok_code(4).


*Deklerationen für den Code.

DATA: n       TYPE i.  "Enthält die Anzahl der Fragen

mfg hyperion

Das Problem liegt in der Struktur der Datei. Hier sind die einzelnen Spalten der Tabelle in die du später schreiben willst, in unterschiedlichen Zeilen enthalten! Soll bedeuten:

Datei Zeile 1 enthält den Wert für Spalte "ind" der Tabelle,

Datei Zeile 2 enthält den Wert für Spalte "nummer" der Tabelle usw.

Der Funktionsbaustein GUI_UPLOAD liest jetzt aber die Datei zeilenweise ein, und versucht die eingelesene Zeile der Zielstruktur anzupassen.

Beispiel: Zeile x deiner Datei enthält folgenden Wert: "Wo liegt Rom?". GUI_UPLOAD splitted diesen String jetzt in die einzelnen Komponenten der Zielstruktur auf. Die Zeile deiner internen Tabelle enthält jetzt also


IND NUMMER FRAGE

Wo  lie    gt Rom?

Schaus dir im Debugger an!

Du hast jetzt zwei Möglichkeiten: Entweder du passt die Struktur deiner Datei entsprechend an, so dass sie die Werte in der Form enthält die der deiner Tabelle entspricht, oder - und das ist aufwändiger - du liest alle Zeilen der Datei in eine temporäre Tabelle die nur eine(!) Spalte besitzt, LOOPst danach über diese Tabelle, lässt einen Zähler mitlaufen anhand dessen du entscheidest welcher Spalte deiner Zieltabelle die aktuelle Zeile der temporären Tabelle entspricht und baust mit diesen Informationen deine eigentliche Zieltabelle auf.

Ah Danke, ich seh shcon ich habe heute wieder Spaß in der Arbeit;)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.