Um eine Excel-Tabelle direkt in das R/3-System einzulesen kann folgender Report genutzt werden.
Der Report wurde während einer R/2 zu R/3-Migration benutzt um Exceltabellen auf dem Applikationsserver abzulegen, die dann von dort aus im Hintergrund automatisch (nachts) eingelesen werden konnten. Die Umwandlung erfolgte im Online während der Migrationsvorbereitung.
Begrenzungen:
Der Feldinhalt eines Excel-Feldes darf maximal 50 CHAR haben [ALSM_EXCEL_TO_INTERNAL_TABLE].
Upload nur für Dateien vom Typ MaterialklasseXX-Achse.xls
>> Die Struktur der Datei darf sich nicht ändern. Die Feldanordnung ist Fix, die Feldlängen sind fix. Sinnvoller wäre also mindestens CSV-Format (wegen dann variabler Feldlängen), da man sich dann nicht 'verzählen' kann sondern mit einem simplen Split-Befehl die Datei wieder zerpflücken kann. Doch können die Standarduser dieses Format i.d.R. nicht fehlerfrei erzeugen. Aus langer Erfahrung kann ich sagen, dass für die User, die die Tabellen herstellen müssen, alles andere wie reines Excel-Formal nicht 'handhabbar' ist. Allein der Versuch den User zu überreden 'Datei speichern unter...' mit einem anderen Format (z.B. CSV) auszuführen, überfordert den Standard-User schon. Das ist gar nicht böse oder abfällig gemeint sondern eine bloße Feststellung.
Und modernere Formate wie XLM unterstützt Office 2000 (die momentan häufigste beim Kunden anzutreffende Version) noch nicht.
********************************************************************* * Developer: Thorsten Neubüser www.4ap.de * ********************************************************************* * Report ZS3T_ECXEL_TO_APPSERV * * Programm entwickelt zur Konvertierung von Excel-Tabellen * die dann auf dem Applikatiobnsserver abgelegt werden * innerhalb der R/2 R/3 Migration * *********************************************************************
REPORT zs3t_ecxel_to_appserv.
DATA: i_itab TYPE TABLE OF alsmex_tabline WITH HEADER LINE,
count TYPE i.
* at the end of each downloaded line
DATA:BEGIN OF final, " Zeilenende
cr TYPE x VALUE '0D', " carriage return = 013 dec
lf TYPE x VALUE '0A', " line feed = 010 dec
END OF final.
DATA:
* Tabelle mit den Merkmalswerten
BEGIN OF imerk OCCURS 0,
sach_nr(13),
mtext(40),
mtart(4),
k_lagerung_bolzentyp(8),
k_bezeichnung(7),
k_tonnage(3),
k_lappenausfuehrung(6),
k_bremse(4),
k_spur(4),
k_lm(4),
k_gm(4),
k_grpl_bauart(1),
k_radart(3),
k_gestaengesteller_achse(1),
k_abs(1),
k_ak-wandstaerke(2),
k_bremsstellung(3),
k-belag(2),
k-trommelbreite(1),
k_nabenbesonderheiten(1),
k_kunden_laenderausfuehrung(2),
k_typschild(1),
k_abdeckblech(1),
k_radmutter_fuer_alu_raeder_32(2),
k_nur_fuer_al2(1),
k_radbolzenlaenge(2),
k_bemerkung_hachse(5),
final(2),
END OF imerk.
* text-001 = * 'Der Feldinhalt eines Excel-Feldes darf maximal 50 CHAR haben.' * text-002 = 'Upload nur für Dateien vom Typ MaterialklasseXX-Achse.xls'
SELECTION-SCREEN COMMENT /1(72) text-001.
SELECTION-SCREEN COMMENT /1(72) text-002.
SELECTION-SCREEN SKIP.
PARAMETERS:
* Angaben müssen an die verwendete Tabelle angepasst werden!
p_online LIKE rlgrap-filename, " Name der Datei
p_bcol TYPE i DEFAULT 1, " Beginn Spalte
p_brow TYPE i DEFAULT 2, " Beginn Reihe
p_ecol TYPE i DEFAULT 27, " Ende Spalte
p_erow TYPE i DEFAULT 10000. " Ende Reihe
INITIALIZATION.
p_online = 'F:\MaterialklasseTH-Achse.xls'.
*LOS Geht's
START-OF-SELECTION.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_online
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.
* BREAK-POINT.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
* sort i_itab ascending by row col.
LOOP AT i_itab.
CASE i_itab-col.
WHEN 1.
MOVE i_itab-value TO imerk-sach_nr.
WHEN 2.
MOVE i_itab-value TO imerk-mtext.
WHEN 3.
MOVE i_itab-value TO imerk-mtart.
WHEN 4.
MOVE i_itab-value TO imerk-k_lagerung_bolzentyp.
WHEN 5.
MOVE i_itab-value TO imerk-k_bezeichnung.
WHEN 6.
MOVE i_itab-value TO imerk-k_tonnage.
WHEN 7.
MOVE i_itab-value TO imerk-k_lappenausfuehrung.
WHEN 8.
MOVE i_itab-value TO imerk-k_bremse.
WHEN 9.
MOVE i_itab-value TO imerk-k_spur.
WHEN 10.
MOVE i_itab-value TO imerk-k_lm.
WHEN 11.
MOVE i_itab-value TO imerk-k_gm.
WHEN 12.
MOVE i_itab-value TO imerk-k_grpl_bauart.
WHEN 13.
MOVE i_itab-value TO imerk-k_radart.
WHEN 14.
MOVE i_itab-value TO imerk-k_gestaengesteller_achse.
WHEN 15.
MOVE i_itab-value TO imerk-k_abs.
WHEN 16.
MOVE i_itab-value TO imerk-k_ak-wandstaerke.
WHEN 17.
MOVE i_itab-value TO imerk-k_bremsstellung.
WHEN 18.
MOVE i_itab-value TO imerk-k-belag.
WHEN 19.
MOVE i_itab-value TO imerk-k-trommelbreite.
WHEN 20.
MOVE i_itab-value TO imerk-k_nabenebesonderheiten.
WHEN 21.
MOVE i_itab-value TO imerk-k_kunden_laenderausfuehrung.
WHEN 22.
MOVE i_itab-value TO imerk-k_typschild.
WHEN 23.
MOVE i_itab-value TO imerk-k_abdeckblech.
WHEN 24.
MOVE i_itab-value TO imerk-k_radmutter_fuer_alu_raeder_32.
WHEN 25.
MOVE i_itab-value TO imerk-k_nur_fuer_al2.
WHEN 26.
MOVE i_itab-value TO imerk-k_radbolzenlaenge.
WHEN 27.
MOVE i_itab-value TO imerk-k_bemerkung_hachse.
*break-point.
WRITE final TO imerk-final.
APPEND imerk.
CLEAR imerk.
WHEN OTHERS.
* do nothing
ENDCASE.
ENDLOOP.
ENDIF.
DATA:
pfad(128),
filename(128),
p_appserv(128).
SPLIT p_online AT '\' INTO pfad filename.
SPLIT filename AT '.' INTO filename pfad.
TRANSLATE filename TO LOWER CASE.
TRANSLATE filename USING '-_'.
CONCATENATE '/usr/sap/mig/' filename INTO p_appserv.
*break-point.
WRITE: / p_appserv.
OPEN DATASET p_appserv FOR OUTPUT.
IF sy-subrc NE 0.
* message e000
ENDIF.
LOOP AT imerk.
TRANSFER imerk TO p_appserv.
count = count + 1.
ENDLOOP.
CLOSE DATASET p_appserv.
WRITE: / count, 'Datenzeilen geschrieben.'(003).
END-OF-SELECTION.
* Eingabehilfen
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_online.
PERFORM get_online_filename USING p_online.
********************************************************************* * Ab hier nur noch F O R M - Routinen *********************************************************************
*&---------------------------------------------------------------------* *& Form get_online_filename *&---------------------------------------------------------------------*
FORM get_online_filename USING file_name.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
* PROGRAM_NAME = SYST-REPID * DYNPRO_NUMBER = SYST-DYNNR * FIELD_NAME = ' '
static = 'X'
mask = '*.*' " bis 4.6 oder z.B. '*.xls'
* mask = ',Excel-Dateien,*.xls' " ab 4.7 ',Beschreibung,*.ausgewählt'
* mask = ',*.*,*.*.' " ab 4.7 zeigt alle an
CHANGING
file_name = file_name
EXCEPTIONS
mask_too_long = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM. " get_online_filename
*
|