Excel Tabelle lesen, Open dataset

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
24 Beiträge • Seite 1 von 2 (current) Nächste
24 Beiträge Seite 1 von 2 (current) Nächste

Excel Tabelle lesen, Open dataset

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Leute,
ich habe eine Excel tabelle direkt unter dem Laufwerk C:\ liegt die, zvokabel_tabelle1.csv heißt. Die Tabelle wird geöffnet aber nicht gelesen. Worauf muß bei dem Fall achten?
Danke für die Interesse im Voraus.
Hier ist der Code:

im Top Include:

*Datenübernahme aus EXCEL

DATA: BEGIN OF input,
vokabel_art LIKE wa_zvokabel-vokabel_art,
antwort_art LIKE wa_zvokabel-vokabel_art,
vokabel_de LIKE wa_zvokabel-vokabel_art,
synonym_de LIKE wa_zvokabel-vokabel_art,
vokabel_tr LIKE wa_zvokabel-vokabel_art,
synonym_tr LIKE wa_zvokabel-vokabel_art,
vokabel_eng LIKE wa_zvokabel-vokabel_art,
synonym_eng LIKE wa_zvokabel-vokabel_art,
vokabel_i LIKE wa_zvokabel-vokabel_art,
synonym_i LIKE wa_zvokabel-vokabel_art,
END OF input.

DATA: it_input like TABLE OF input,
wa_input like input.
PARAMETERS p_excel TYPE rlgrap-filename DEFAULT 'C:\\zvokabel_tabelle1.csv'.

DATA: platzhalter(10000) TYPE c,
c_delimiter TYPE c VALUE ';' .


START-OF-SELECTION.

OPEN DATASET p_excel FOR OUTPUT IN TEXT MODE encoding default.
IF sy-subrc <> 0.
WRITE / 'Datei kann nicht geöffnet werden!'.
* PERFORM close_files.
EXIT.
ENDIF.
DO.
READ DATASET p_excel INTO platzhalter.
IF sy-subrc <> 0.
* WRITE / 'Datei kann nicht gelesen werden!'.
EXIT.
ENDIF.
* else.
* IF sy-index > 1.
SPLIT platzhalter AT c_delimiter INTO
wa_input-vokabel_art
wa_input-antwort_art
wa_input-vokabel_de
wa_input-synonym_de
wa_input-vokabel_tr
wa_input-synonym_tr
wa_input-vokabel_eng
wa_input-synonym_eng
wa_input-vokabel_i
wa_input-synonym_i.


* endif.

ENDDO.

ich habe auch mit dem Pfad '\\zvokabel_tabelle1.csv'.
oder '\zvokabel_tabelle1.csv'. oder 'C:\zvokabel_tabelle1.csv'. ausprobiert kann trotzdem nich gelesen werden. Platzhalter ist leer.

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


Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Moin,
Es sieht so aus, als möchtest Du die CSV-Datei aus dem Verzeichnis deines PCs laden und nicht aus dem Verzeichnis des Servers.
Falls meine Vermutung richtig ist, solltest Du die OPEN Dataset/READ DATASET austauschen.
Zeitgemäß sind die Methoden der Klasse CL_GUI_FRONTEND_SERVICES.
Methode:
CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG (Öffnen-Dialog einer Datei )
CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD (Laden der Datei in Itab)

gruß Tron 8)

PS.: Ich verwende bei upload von Texten den horizontal TAB als Trennzeichen, da dieses Steuerzeichen nicht vom User verwendet werden kann und somit nicht ein Semikolon vom User Deine ganze Spaltenstruktur zerstören könnte.
Definition:
constants: htab(1) value %_horizontal_tab. " ab Rel.4.7
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Tron,
vielen Dank für deine Antwort.

Iich habe mit GUI_UPLOAD gearbeitet.
Es funktioniert aber nicht, es kommt die Fehlermeldung: iT_INPUT und PLATZHAKTER sind nicht konvertierbar.
Hast du eine Idee wie ich die csv Tabelle erst lesen dann in eine Datenbanktabelle hier 'ZVOKABEL'' einfügen kann?

Schöne Grüße

DATA: it_input like TABLE OF zvokabel,
wa_input like line of it_zvokabel,
it_input_2 like TABLE OF zvokabel.

*PARAMETERS p_excel TYPE rlgrap-filename
*DEFAULT 'C:\zvokabel_tabelle1.xls'.

DATA: platzhalter(10000) TYPE c,
c_delimiter TYPE c VALUE ';'.

START-OF-SELECTION.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = 'C:\\zvokabel_tabelle1.csv'
filetype = 'ASC'
* HAS_FIELD_SEPARATOR = ' '
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = it_input
EXCEPTIONS
file_open_error = 1
file_read_error = 2
* NO_BATCH = 3
* GUI_REFUSE_FILETRANSFER = 4
* INVALID_TYPE = 5
* NO_AUTHORITY = 6
* UNKNOWN_ERROR = 7
* BAD_DATA_FORMAT = 8
* HEADER_NOT_ALLOWED = 9
* SEPARATOR_NOT_ALLOWED = 10
* HEADER_TOO_LONG = 11
* UNKNOWN_DP_ERROR = 12
* ACCESS_DENIED = 13
* DP_OUT_OF_MEMORY = 14
* DISK_FULL = 15
* DP_TIMEOUT = 16
* OTHERS = 17
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

LOOP AT it_input INTO platzhalter.

IF sy-subrc <> 0.
EXIT.
ENDIF.

IF sy-index > 1.
SPLIT platzhalter AT c_delimiter INTO
wa_input-vokabel_art
wa_input-antwort_art
wa_input-vokabel_de
wa_input-synonym_de
wa_input-vokabel_tr
wa_input-synonym_tr
wa_input-vokabel_eng
wa_input-synonym_eng
wa_input-vokabel_i
wa_input-synonym_i.
ENDIF.
APPEND wa_input TO it_input_2.
ENDLOOP.

MODIFY zvokabel FROM TABLE it_input_2.
UPDATE zvokabel.

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Klar,

Code: Alles auswählen.

REPORT  ZTEST14.

data filename type string.
data itab type table of string.

filename = 'C:\addon.csv'.


CALL METHOD cl_gui_frontend_services=>gui_upload
  EXPORTING
    filename                = filename
*    filetype                = 'ASC'
*    has_field_separator     = SPACE
*    header_length           = 0
*    read_by_line            = 'X'
*    dat_mode                = SPACE
*    codepage                = SPACE
*    ignore_cerr             = ABAP_TRUE
*    replacement             = '#'
*    virus_scan_profile      =
*  IMPORTING
*    filelength              =
*    header                  =
  CHANGING
    data_tab                = itab
  EXCEPTIONS
    file_open_error         = 1
    file_read_error         = 2
    no_batch                = 3
    gui_refuse_filetransfer = 4
    invalid_type            = 5
    no_authority            = 6
    unknown_error           = 7
    bad_data_format         = 8
    header_not_allowed      = 9
    separator_not_allowed   = 10
    header_too_long         = 11
    unknown_dp_error        = 12
    access_denied           = 13
    dp_out_of_memory        = 14
    disk_full               = 15
    dp_timeout              = 16
    not_supported_by_gui    = 17
    error_no_gui            = 18
    others                  = 19
        .
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

*Dann dein Loop at itab into ....
split etc.


gruß Tron :)

PS. vergiss nicht COMMIT WORK nach UPDATE .
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Beitrag von TWP (Specialist / 445 / 0 / 1 ) »
Man kann sich auch etwas arbeit sparen, wenn du die Anzahl der Spalten weißt, kannst du dir eine Tabelle mit entsprechender Anzahl Zeilen erstellen und die Itab dann einlesen. Spart man sich das nachträgliche Trennen der einzelenen Zeilen.
Jede Spalte sollte den Type String haben, damit bekommst du auch alle Werte in deine Tabelle.
Da deine CSV - Datei wahrscheinlich Tab getrennt ist, den Parameter HAS_FIELD_SEPARATOR = 'X' setzen und schon hast du deine einzelnen Felder.

Zu Abbrüchen kommt es meist nut, wenn die Feldtypen nicht passen.

MfG

Thomas

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Tron,

es hat funktioniert. Ich habe gerade getestet. Danke dir :-)))

Ich habe constants: htab(1) value %_horizontal_tab. nicht genau verstanden. CSV datei trennt die Spalten automatisch mit Semikolon oder?
Wie kann ich es machen, dass die Excel-Spalteninhalte mit horizontal tab getrennt werden?

Übrigens, danke für die Erinnerung an Commit Work.

Schöne Grüße

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo TWP,

super, vielen dank für deinen Tipp! Ich habe es ausprobiert, aber es wird nur aus der ersten Spalte eine einzige Buchstabe in die Itab geschrieben. Wo mache ich etwas verkehrt? Ich habe has_field_separator auch lleerzeichen oder ; eingesetzt, funktionirt auch nicht.

Schöne Grüße

DATA: BEGIN OF input,
vokabel_art TYPE string,
antwort_art TYPE string,
vokabel_de TYPE string,
synonym_de TYPE string,
vokabel_tr TYPE string,
synonym_tr TYPE string,
vokabel_eng TYPE string,
synonym_eng TYPE string,
vokabel_i TYPE string,
synonym_i TYPE string,
END OF input.

DATA: itab TYPE TABLE OF input.

START-OF-SELECTION.

filename = 'C:\\zvokabel_tabelle1.csv'.

CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = filename
* filetype = 'ASC'
has_field_separator = 'X'
* HEADER_LENGTH = 0
* READ_BY_LINE = 'X'
* DAT_MODE = ' '
* CODEPAGE = ' '
* IGNORE_CERR = ABAP_TRUE
* REPLACEMENT = '#'
* CHECK_BOM = ' '
* VIRUS_SCAN_PROFILE =
* NO_AUTH_CHECK = ' '
* IMPORTING
* FILELENGTH =
* HEADER =
TABLES
data_tab = itab "it_input
EXCEPTIONS
file_open_error = 1
file_read_error = 2
* NO_BATCH = 3
* GUI_REFUSE_FILETRANSFER = 4
* INVALID_TYPE = 5
* NO_AUTHORITY = 6
* UNKNOWN_ERROR = 7
* BAD_DATA_FORMAT = 8
* HEADER_NOT_ALLOWED = 9
* SEPARATOR_NOT_ALLOWED = 10
* HEADER_TOO_LONG = 11
* UNKNOWN_DP_ERROR = 12
* ACCESS_DENIED = 13
* DP_OUT_OF_MEMORY = 14
* DISK_FULL = 15
* DP_TIMEOUT = 16
* OTHERS = 17
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

LOOP AT itab INTO wa_input.

IF sy-subrc <> 0.
EXIT.
ENDIF.

IF sy-tabix > 1.
APPEND wa_input TO it_container.
ENDIF.

ENDLOOP.

MODIFY zvokabel_2 FROM TABLE it_container.
UPDATE zvokabel_2.
COMMIT WORK.

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
HI,
nun Excel verfügt auch über die Möglichkeit der TAB -Trennung von Spalten
(Siehe Speicherformate), anstelle der Semikolon-Trennung.
Um für den Splitbefehl das Trennzeichen zu definieren, kann man das Tab wie folgt deklarieren:

Code: Alles auswählen.

constants: htab(1) value %_horizontal_tab. " ab Rel.4.7

* ...

split itab at htab into .....
Das %_horizontal_tab ist eine System-Konstante, die hier dem htab zugewiesen wird.
Der "besondere Reiz" den Tabulator zu verwenden liegt darin, daß das Zeichen nicht manuell erzeugt werden kann(wie in z.B. in Kurztexten).
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Beitrag von GastX (Specialist / 283 / 4 / 19 ) »
Kleine Anmerkung:
je nach Releasestand kann man sich für den Tab die Definition einer eigenen Konstanten auch schenken und gleich

Code: Alles auswählen.

CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
benutzen.

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Hallo,

da ich noch mit Release 46C arbeite gibt es das Feld %_horizontal_tab bei mir nicht. Hab ich trotzdem eine Möglichkeit einen Tabstop zu erkennen?

Viele Grüße Michael

Beitrag von edwin (Specialist / 306 / 11 / 68 ) »
Hallo,
unter 4.6 kannst Du folgendes benutzen:
..

Code: Alles auswählen.

*  x'09'  = Tabulator
data h_tab  type x value '09'.

data b(30).

data : a1(10),
       a2(10),
       a3(10).

concatenate 'a' 'b' 'c' into b separated by h_tab.

split b at h_tab into a1 a2 a3.

write: / a1,a2,a3.
...
Gruss Edwin

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Danke edwin!

Mir ist gerade Aufgefallen das ich mittels GUI_UPLOAD nur 75 Zeichen pro Zeile einlesen kann.
Was kann ich nun tun das meine Feldlänge beliebig lang ist.

Die interne Tabelle ist TYPE TABLE OF string, wie oben beschrieben.

Viele Grüße
Michael

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Hi,
Control - Zeichen HTAB (0x09) und CRLF (0x0d0a) unter 4.6

Code: Alles auswählen.

data htab(1).
data crlf(2).

* in 4.7 gibt es Konstanten dafür 
CLASS cl_abap_char_utilities DEFINITION LOAD. 
crlf = cl_abap_char_utilities=>cr_lf. 
htab = cl_abap_char_utilities=>horizontal_tab. 
gruß Tron
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Beitrag von pohlmann-schwarza (ForumUser / 91 / 0 / 0 ) »
Nochmal ne Frage, unter Hilfe - Release Infos finde ich bei mir die Buttons:
"Gesamtliste ab Release 4.0" ; Freitextsuche ; Atributsuche.

Unter "Gesamtliste ab Release 4.0" steht dann 46C.
Ist das mein Release oder nicht?

Ich bin verwirrt da bei mir

Code: Alles auswählen.

CREATE DATA reftabelle TYPE (wa_tabellenname).
für die Deklaration einer dynamischen internen Tabelle funktioniert.
Wobei ich schon sehr oft im Forum gelesen habe das dieser Befehl erst ab Release 6X funktioniert.

Wie kann ich feststellen was ich wirklich für ein Release hab?

Viele Grüße Michael

Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

das hängt nicht mit dem "offiziellen" Release zusammen, sondern mit dem SAP-Kernel.

Und der sollte bei allen aktuellen Systemen heutzutage eine Nummer so um die 600, 620 oder höher haben.

Menü/System/Status und dann weiter surfen.

Gruß
babap

Vergleichbare Themen

1
Antw.
2263
Views
Open Dataset erstellen (excel format auf Appl.-Server sp.)
von amjahid » 29.06.2008 14:05 • Verfasst in ABAP® für Anfänger
0
Antw.
1432
Views
Dynamische Tabelle per open dataset auf dem Server ausgeben
von gast4711 » 01.10.2007 15:25 • Verfasst in ABAP® Core
1
Antw.
2492
Views
Open Dataset, Transfer, Close Dataset.Transfer unvollständig
von mari » 25.09.2007 09:28 • Verfasst in ABAP® Core
0
Antw.
1723
Views
open dataset
von joachim » 18.08.2008 11:05 • Verfasst in ABAP® Core
10
Antw.
7178
Views
Open Dataset Fehler
von petre » 19.06.2008 14:25 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

RFC vs. ODATA
Gestern von DeathAndPain 8 / 999
Frage zur redefinierten Methode
vor 3 Tagen von ralf.wenzel 12 / 1445

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.