SAP -> Excel (OLE)

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

SAP -> Excel (OLE)

Beitrag von Gast ( / / 0 / 3 ) »
Hallo zusammen,
ich möchte aus dem R/3 eine bestehende Excel-Tabelle aurufen, Werte an bestimmte Zellen (auf einem bestimmten Arbeitsblatt) übergeben und anschließend bestimmte Zellen (Rechenergebnisse auf einem anderen! Arbeitsblatt) wieder ins R/3 bringen...

1. Ist es korrekt, dass ich den gesamten Ablauf im R/3 abbilden kann, also den Datenexport UND Datenimport (Sicht R/3)? :?:
Oder muss die Übergabe der Ergebnisse von Excel nach R/3 im Excel programmiert werden? :shock:

2. Es handelt sich um eine zentral abgelegte Excel-Tabelle. Was ist, falls ein anderer User bereits Zugriff hat. Die Veränderungen sollen im Excel nicht gesichert werden. Kann man die Excel-Datei aus SAP heraus auch schreibgeschütz öffnen? :(

3. Ich habe schon in allen Foren gesucht, und mit den Info´s auch einen kleinen Testreport "gebastelt" der eine Zelle auf einen Excel-Sheet füllt, aber ich finde leider keine Dokumentation über die existierenden Methoden... Damit meine ich jetzt nicht die F1-Hilfe zum Methodenaufruf, sondern WELCHE Methode muss ich aufrufen um z.B. Werte zu lesen... Im Gui(6.2) fand ich im Programmierumfeld zwar den Eintrag OLE->Objektbrowser, aber die dazugehörige Transaktion SOLO gibt es unter 4.5B noch nicht... :evil:

Wer kann mir ein bisschen auf die Sprünge helfen.

Vielen Dank.

Gruss
Oliver

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


Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hi Oliver (der erste),
schau mal hier:
http://www.tricktresor.de/content/index ... 31&aID=177

Bei dem Programm wird eine Excel-Datei erzeugt, es werden werte reingeschrieben und die Datei wird gespeichert.

Ich könnte mir hier ein ähnliches Programm vorstellen, dass eine Datei liest - nämlich die mit den Formeln - (Methode OPEN) Werte an Excel übergibt und die Datei wieder speichert.

Danach könnte man die Datei wieder auslesen (FB ALSM_EXCEL_TO_INTERNAL_TABLE).

Eigentlich müsste es auch eine Methode geben, mit der das Ergebnis der Berechnung wieder ausgelesen wird.

Beim "Öffnen - Ändern - Speichern" müsste nämlich sichergestellt werden, dass nur einer auf die Datei zugreift oder dass immer eine neue Datei mit eindeutiger ID erstellt wird.

Ich hoffe, das hilft weiter.

Wenn du herausgefunden hast, wie die Werte wieder "online" gelesen werden können, sag mal bescheid.

Gruß, Enno.

Beitrag von OliverS ( / / 0 / 3 ) »
Hallo Enno,

nachdem ich heute Nachmittag nicht mehr weiter gemacht habe, hier nun die meine neuesten Erkenntnisse (Mini-SAP läßt grüssen)...

Den FB ALSM_EXCEL_TO_INTERNAL_TABLE finde ich nicht??? Weder in der Firma auf 4.5B noch auf meinem 6.20 Mini-SAP ???? Die Transaktion 'SOLO' die ich ansprach gibt´s hier auch nicht ???? :(

Also, ich bin auf die transp. Tabelle 'OLELOAD' gestossen. Dort findet man alle Methoden zum Objekt 'EXCEL.APPL'. :P

Zum Testen habe ich mir im Verzeichnis 'C:\temp_ole' die Datei 'testole.xls' angelegt. In Zelle A4 soll aus SAP ein Wert gesetzt werden. In B4 steht der Wert 'reich' und in C4 werden A4 und B4 verkettet. :)

Danach habe ich folgendes kleines Programm unter Vorlage des Reports 'RSDEMO01' entwickelt:

REPORT ztestole NO STANDARD PAGE HEADING.

* Excel-Sheet
DATA: var_file(30) VALUE 'C:\temp_ole\testole.xls'.

* Ergebnis
DATA: result(250).


INCLUDE ole2incl.

* handles for OLE objects
DATA: h_excel TYPE ole2_object, " Excel object
h_mapl TYPE ole2_object, " list of workbooks
h_map TYPE ole2_object, " workbook
cell_out TYPE ole2_object, " cell
cell_in TYPE ole2_object, " cell
h_f TYPE ole2_object. " font
*----------------------------------------------------------

* start Excel
CREATE OBJECT h_excel 'EXCEL.APPLICATION'.

* Excel nicht sichtbar ausführen
SET PROPERTY OF h_excel 'Visible' = 0.

CALL METHOD OF h_excel 'Workbooks' = h_mapl.

* bestehendes File öffnen
CALL METHOD OF h_mapl 'OPEN'
EXPORTING
#1 = var_file.

*-----------------------------------------------------------
* Zelle, an die Wert übergeben wird
CALL METHOD OF h_excel 'Cells' = cell_out
EXPORTING
#1 = 4 "Zeile
#2 = 1. "Spalte

* Zellinhalt setzen
SET PROPERTY OF cell_out 'Value' = 'Erfolg'.

*-----------------------------------------------------------
* Zelle, aus der Ergebnis gelesen wird
CALL METHOD OF h_excel 'Cells' = cell_in
EXPORTING
#1 = 4 "Zeile
#2 = 3. "Spalte

* Zellinhalt lesen
GET PROPERTY OF cell_in 'Value' = result.

*-----------------------------------------------------------
* disconnect from Excel
FREE OBJECT h_excel.

WRITE result.

Auf dem Schirm sollte jetzt 'Erfolgreich stehen'.
:mrgreen: Bei mir funktioniert´s.... :mrgreen:
Wie ich jetzt verschieden Arbeitsblätter ansteuere muss ich noch ausprobieren.

Gruss
Oliver

Beitrag von OliverS ( / / 0 / 3 ) »
Da fehlt noch eine Ergänzung

http://www.abapforum.com/forum/viewtopi ... =ole+excel

Gruss
Oliver

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hi Oliver,

bei mir klappt's auch :--)

Mit

Code: Alles auswählen.

FREE OBJECT: h_mapl,
             cell_in,
             cell_out,
             h_excel.
funktionierts auch "richtig".

Ich würde das gerne im Tricktresor veröffentlichen.
Hast du was dagegen?

Gruß, Enno.

Achja: Den Baustein ALSM... gibts wohl erst ab Release 4.6C.

Beitrag von OliverS ( / / 0 / 3 ) »
Hallo Enno,

ist überhaupt kein Problem. Ich bin doch auch immer froh, wenn ich irgendwo etwas finde das mir hilft...

Und auch beim tricktresor bin ich schon fündig geworden :wink:

Gruss
Oliver

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hi Oliver,

dann werde ich da mal was drum rum schreiben.
Danke!

Schade, dass in der Tabelle OLELOAD das Feld "PARAMETER" nicht gefüllt ist. So muss man ja irgendwoher wissen, was die einzelnen Parameter bedeuten :?

Gruß, Enno.

Beitrag von OliverS ( / / 0 / 3 ) »
Hallo Enno,

das mit den Parametern finde ich auch nicht gut. Deswegen habe ich auch noch das Problem mit dem "Wie steuere ich versch. Arbeitsblätter an..." :cry:

Irgendwie funktioniert das mit dem

Code: Alles auswählen.

FREE OBJECT: h_mapl, 
             cell_in, 
             cell_out, 
             h_excel.
noch nicht. Der Prozess bleibt noch bestehen... :?:
Zu allem Überfluss muss ich dann unseren Admin anrufen, weil ich unter Citrix die Prozesse nicht selber abschiessen kann... :?

Mal schauen...

Gruß
Oliver

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hi Oliver,

also bei mir ist der Prozess auch nicht wirklich wech.
aber damit:

CALL METHOD OF h_excel 'Quit'.
FREE OBJECT: h_excel.

Leider fragt Excel noch nach, ob die Änderungen gespeichert werden sollen, oder nicht.

Ich habe mich dumm und dusselig probiert: ich habe es aber nicht hinbekommen, die Datei als Kopie zu öffnen, oder unter einem anderen Namen abzuspeichern oder die Datei auf ReadOnly zu setzen oder aber einfach am Ende mit den Änderungen zu speichern.

Wenn's mal funktioniert hat, dann ist noch ein Prozess im Taskmanager hängen geblieben...

Das mit den Objekten aus dem von dir genannten Thread habe ich auch nicht wirklich kapiert:

Code: Alles auswählen.

CALL METHOD OF h_excel 'Open' = h_open. 
FREE OBJECT h_open.
Bei mir funktioniert'S auch ohne h_open...

Am besten wäre es natürlich, man würde die Datei als Schreibgeschützt öffnen und dann Excel schliessen ohne zu speichern. Vielleicht hast du ja noch eine Idee.

Gruß, Enno.

Beitrag von OliverS ( / / 0 / 3 ) »
Hallo Enno,

ich glaube ich hab´s :mrgreen:

Bitte test das ganze aber auch nochmal.
Da ich zur Zeit über Citrix arbeite kann ich meine Tasks nur über den Admin kontrollieren lassen, und das ist lästig für alle Beteiligten...

Ich habe die Testdatei jetzt auf einem Server abgelegt. Beim anschließenden Testen habe ich das Programm mit versch. R/3 Usern parallel ausgeführt (nicht gleichzeitigt) und es hat funktioniert... :D

Ich habe den Lösungsansatz vom MS-Server (s. Quellcode)

Code: Alles auswählen.

REPORT ztestole NO STANDARD PAGE HEADING.

PARAMETERS: MERKMAL(12) TYPE P DECIMALS 2.

* Excel-Sheet
DATA: VAR_FILE(30) VALUE 'H:\GROUP\OD\ORG\Test_OLE.xls'.
* result
data: result(250).
INCLUDE ole2incl.

* handles for OLE objects
DATA: EXCEL         TYPE OLE2_OBJECT,       " Excel object
      WORKBOOKS     TYPE OLE2_OBJECT,       " list of workbooks
      ACTIVE_WINDOW TYPE OLE2_OBJECT,       " active window
      CELL_OUT      TYPE OLE2_OBJECT,       " cell
      CELL_IN       TYPE OLE2_OBJECT.       " cell.
*-----------------------------------------------------------------------
* create instance...
CREATE OBJECT EXCEL 'EXCEL.APPLICATION'.
* set invisible
SET PROPERTY OF EXCEL  'Visible' = 0.
*-----------------------------------------------------------------------
* open existing file
CALL METHOD OF EXCEL 'Workbooks' = WORKBOOKS.
CALL METHOD OF WORKBOOKS 'OPEN' EXPORTING #1 = VAR_FILE.
*-----------------------------------------------------------------------
* get cell (output)
CALL METHOD OF EXCEL 'Cells' = CELL_OUT
  EXPORTING #1 = 4      "Zeile
            #2 = 1.     "Spalte

* set value od cell
SET PROPERTY OF CELL_OUT 'Value' = MERKMAL.
*-----------------------------------------------------------------------
* get cell (input)
CALL METHOD OF EXCEL 'Cells' = CELL_IN
  EXPORTING #1 = 4      "Zeile
            #2 = 3.     "Spalte

* get value of cell
GET PROPERTY OF cell_in 'Value' = result.

*-----------------------------------------------------------------------
* see http://support.microsoft.com/default.aspx?scid=kb;de;503541
* Close without saving

* get active window
CALL METHOD OF EXCEL 'ACTIVEWINDOW' = ACTIVE_WINDOW.
* set active_window visible
SET PROPERTY OF ACTIVE_WINDOW 'VISIBLE' = 1.
*-----------------------------------------------------------------------
* close active_window without saving
CALL METHOD OF ACTIVE_WINDOW 'CLOSE'
  EXPORTING #1 = 0.
* close Excel
CALL METHOD OF EXCEL 'QUIT'.
*-----------------------------------------------------------------------
* disconnect from Excel
FREE OBJECT: WORKBOOKS,
             CELL_IN,
             CELL_OUT,
             ACTIVE_WINDOW,
             EXCEL.

WRITE RESULT.
Für das Ansteueren der Arbeitsblätter hatte ich noch keine Zeit.

Viele Grüsse,
Oliver

Excel OLE2 via Clipboard

Beitrag von Hendrik ( / / 0 / 3 ) »
Hi,

anbei eine etwas andere Variante zum Up- und Download per OLE2.
Diese verwendet die Copy/Paste Funktionslität des Clipboard und ist gerade für große Datenbestände recht performant.

Das Coding ist nur angerissen und kein Lauffähiges Programm, sollte aber doch recht verständlich sein. Den Part des Download als CSV-Datei hab ich weggelassen, sollten ja die meisten bereits kennen.


TYPES: hexedacimal TYPE x.
types: semicolon(1) type c.
types: excel_cell(4096) type c.
data: export_file type standard table of excel_cell with header line.
* Setzen der Separatoren, um Excel und CSV Upload zu ermöglichen
* P_EXCEL ist hier ein Parameter (Radiobutton)
if p_excel = 'X'.
CREATE DATA dref TYPE hexedacimal.
ASSIGN dref->* TO <separator>.
<separator> = '09'.
elseif p_semic = 'X'.
CREATE DATA dref TYPE semicolon.
ASSIGN dref->* TO <separator>.
<separator> = ';'.
endif.

* Dann ein Paar Datensätze anhängen
* Header Zeile 2
concatenate 'Bestelldatei:' periode into export_file
separated by <separator>.
append export_file.
* Header Zeile 3
concatenate 'Kostenstelle:' kostenstelle into export_file
separated by <separator>.
append export_file.
* Header Zeile 4
concatenate '' kna1-name1 into export_file
separated by <separator>.
append export_file.
* Header Zeile 5
concatenate sy-datum+6(2) '.' sy-datum+4(2) '.' sy-datum(4)
into datum.
concatenate 'Bestelldatum' datum into export_file
separated by <separator>.
append export_file.

* Interne Tabelle ins Clipboard aufnehmen
CALL FUNCTION 'CLPB_EXPORT'
TABLES
DATA_TAB = export_file
EXCEPTIONS
CLPB_ERROR = 1
OTHERS = 2.

CALL FUNCTION 'CONTROL_FLUSH'
EXCEPTIONS
OTHERS = 3.
* Daten des Clipboads infügen
GET PROPERTY OF EXCEL 'ACTIVESHEET' = WORKSHEET.
CALL METHOD OF WORKSHEET 'Cells' = CELL
EXPORTING #1 = 1 #2 = 1.
call method of WORKSHEET 'PASTE'.
free object cell.
CALL FUNCTION 'CONTROL_FLUSH'
EXCEPTIONS
OTHERS = 3.



Änhlich sieht es dann beim Import aus:

* Bestimmem der Anzahl von Zeilen um nur den relevanten Bereich zu
* importieren. Die Anzahl an Spalten hab ich in diesem Beispiel mal
* als bekannt vorrausgesetzt.
***********************************************************
w_curr_row = 1.
do.
call method of APPLICATION 'cells' = h_cell
exporting #1 = w_curr_row
#2 = 5.
get property of h_cell 'value' = w_value.
free object H_CELL.
if w_value = '' . exit. endif.

add 1 to: w_curr_row, anz_zeilen.
enddo.
***********************************************************

GET PROPERTY OF APPLICATION 'ACTIVESHEET' = WORKSHEET.
CALL METHOD OF WORKSHEET 'Cells' = H_CELL
EXPORTING #1 = 1 #2 = 1.
CALL METHOD OF WORKSHEET 'Cells' = H_CELL1
EXPORTING #1 = anz_zeilen #2 = 5.
CALL METHOD OF WORKSHEET 'RANGE' = RANGE
EXPORTING #1 = H_CELL #2 = H_CELL1.

CALL METHOD OF RANGE 'SELECT'.
* copy to Clippboard
CALL METHOD OF RANGE 'COPY'.

* Ohne Flush und Abarbeitung der Automation Queue keine Daten
* im Clipboard, da OLE-Befehl noch nicht bei Excel am FrontEnd
CALL FUNCTION 'CONTROL_FLUSH'
EXCEPTIONS
OTHERS = 3.
REFRESH excel_tab.
* Hol mir die Daten aus dem Clipboard
CALL FUNCTION 'CLPB_IMPORT'
TABLES
DATA_TAB = EXCEL_TAB
EXCEPTIONS
CLPB_ERROR = 1
OTHERS = 2.

* Clipboard löschen, sonst nervt Excel mit Abfragen beim "QUIT"
* ob Daten des Clipboards bestehen bleiben sollen
set property OF APPLICATION 'CutCopyMode' = 0.
* release excel
call method of APPLICATION 'QUIT'.
free object H_CELL.
free object H_CELL1.
free object RANGE.
free object WORKSHEET.
free object WORKBOOK.
free object APPLICATION.
APPLICATION-HANDLE = -1.


danach kann man per loop at excel_tab
und split at separator into "FELDLISTE"
die Daten in die interne Tabelle schreiben

split P_MAT_LINE at <separator> into
datenstruktur-bestellmg
datenstruktur-bez

Hoffe, das kannten nicht schon alle ;-)

Gruß, Hendrik

Beitrag von Google (ForumUser / 51 / 0 / 0 ) »
Weiss jemand, wie ich in verschiedenen Arbeitsblätter eines Excel-Files etwas schreiben kann??

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
google doch mal nach "sheet" im forum...

Beitrag von RiffRaff (Specialist / 379 / 0 / 1 ) »
hallo,

weiß vieleicht jemand, wie ich eine Spalte auf 'optimale Breite' setzen kann???

bzw. links oben im Eck, daß ganze Arbeitsblatt makieren und alle Spalten auf 'optimale Breite' setzen??

mfg
Richard

mehrere Arbeitsblätter

Beitrag von gast ( / / 0 / 3 ) »
Hallo Google,
wenn du die Arbeitsblätter erstellst

* Excel im Hintergrund starten
CREATE OBJECT myexcel 'excel.application'.
SET PROPERTY OF myexcel 'visible' = 0.

* Arbeitsmappe anlegen
CALL METHOD OF myexcel 'Workbooks' = workbook.
CALL METHOD OF workbook 'Add'.


* 1e. Blatt anlegen
CALL METHOD OF myexcel 'Worksheets' = sheet
EXPORTING
#1 = 1.

* Namen vergeben und aktiv setzen 1e Blatt
SET PROPERTY OF sheet 'Name' = 'Tab1'.
CALL METHOD OF sheet 'Activate'.

Vergleichbare Themen

0
Antw.
1700
Views
Excel Upload ohne Excel aber OpenOffice
von MarkusW » 23.01.2008 17:07 • Verfasst in ABAP® Core
2
Antw.
2841
Views
SAP in Excel ueber OLE : Excel Blatt schützen
von angelika m » 01.02.2005 12:02 • Verfasst in ABAP® Core
2
Antw.
3971
Views
EXCEL Export aus SAP mit Excel 2003 / 2007
von hfahrian » 03.02.2014 11:34 • Verfasst in ABAP Objects®
1
Antw.
4055
Views
EXCEL: Ausleitung von Daten von SAP nach EXCEL
von MichaelP » 15.04.2005 09:02 • Verfasst in ABAP® Core
1
Antw.
2348
Views
SAP zu Excel (Verwendung einer Excel Formatvorlage)
von sjung3 » 28.09.2005 14:34 • Verfasst in ABAP® Core

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

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

Regex in where
vor 7 Stunden von edwin 7 / 163
Daten an Tabelle binden
vor 20 Stunden von Bright4.5 3 / 1487

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9822