Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Access Datenbank = Kalkulation (CK13N Export) SAP-System

Forumthread: Access Datenbank = Kalkulation (CK13N Export) SAP-System

Access Datenbank = Kalkulation (CK13N Export) SAP-System
20.11.2023 19:45:57
Ron89e
Hallo zusammen,

vielleicht hat einer von euch eine Idee wie man geschickt eine Datenbank in Access aus Exportdateien (Beispiel Export: https://www.herber.de/bbs/user/164465.txt) aus dem SAP-System (CK13N) aufbaut. Es sollen alle Daten abgebildet werden aus der CK13N normalisiert.

Grundsätzliche Idee:
=> über VBA die 1000 Textdateien durchlaufen und Zeile für Zeile in die Datenbank in normalisiert Form laden

Datenmodell Idee:
https://access-im-unternehmen.de/Stuecklisten_Teil_I/

Wie würdet ihr vorgehen und würdet ihr das Datenmodell irgendwie geschickter hinbekommen?

Über alle Ideen und Anregungen bin ich sehr dankbar.

Grüße
Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Access Datenbank = Kalkulation (CK13N Export) SAP-System
20.11.2023 20:06:36
onur
Schau mal ganz oben auf dieser Seite: Was steht da ?
Userbild
EXCEL und nicht ACCESS - oder ?
AW: Access Datenbank = Kalkulation (CK13N Export) SAP-System
20.11.2023 20:16:25
Ron
Das stimmt, aber deßhalb auch die Frage nach dem vba Teil welches aus Excel heraus gestartet werden soll. Also hier mit Excel Kontext.
Anzeige
AW: Access Datenbank = Kalkulation (CK13N Export) SAP-System
20.11.2023 20:27:26
onur
Das Wort EXCEL fällt in deiner Beschreibung kein einziges Mal.
VBA gibt es in allen Office-Programmen.
AW: Access Datenbank = Kalkulation (CK13N Export) SAP-System
20.11.2023 23:03:11
Alwin Weisangler
Hallo Ron,

Angepasst an die Struktur des Exportformates (UTF-8) deiner Text Datei wäre der Import in Excel so:


Option Explicit
Dim DateiName$

'Daten aus der txt in die Excel holen
Sub NeuanmeldungenHolen()
Dim ZeileAusImport$, row_number&, i&, lz&, ls&, var$
Dim objStream As Object
Dim ZeilenNummer
DateiName = Tabelle1.Cells(2, 1)
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Charset = "utf-8"
.Open
If DateiName = "" Then DateiOeffnen
If Dir(DateiName) > "" Then
.LoadFromFile (DateiName)
Else
DateiOeffnen
If DateiName = "Falsch" Then Exit Sub
.LoadFromFile (DateiName)
End If
.LineSeparator = 10
End With
row_number = 1
With Tabelle2
lz = .Cells(Rows.Count, 1).End(xlUp).Row
ls = .Cells(1, Columns.Count).End(xlToLeft).Column
.Range(.Cells(1, 1), .Cells(lz, ls)).ClearContents
Do Until objStream.EOS
ZeileAusImport = objStream.ReadText(-2)
If InStr(1, ZeileAusImport, "---") = 0 Then
ZeilenNummer = Split(ZeileAusImport, "|")
For i = 1 To UBound(ZeilenNummer) - 1
var = ZeilenNummer(i)
.Cells(row_number, i).Value = Replace(ZeilenNummer(i), Chr(100), "ä")
Next i
row_number = row_number + 1
End If
Loop
End With
Set objStream = Nothing

End Sub

Private Sub DateiOeffnen()
ChDrive Left(ThisWorkbook.Path, 3)
ChDir ThisWorkbook.Path
DateiName = Application.GetOpenFilename("Excel (*.txt), *.txt")
If DateiName = "" Then Exit Sub
End Sub

Da wären die Rohdaten noch aufzubereiten und in ein anderes Tabellenblatt zu übergeben, um daraus die Tabelle in der Access Datenbank zu füttern.
Dazu braucht es aber erst mal genaue Aussagen deinerseits.
Du kannst ja schon mal in Access die Tabelle anlegen mit fertigen Spaltenaufbau und im Entwurfsmodus die Formateinstellungen der Zellen soweit erforderlich vornehmen.
Beachte dabei, dass die 1. Spalte als Primiär Key mit AutoWert formatiert wird.
Lade dann diese Access Datei hoch.

Gruß Uwe


Anzeige
Parent-Child nicht vergessen
20.11.2023 23:26:03
Yal
Hallo zusammen,

die Daten zeilenweise ins Access zu übergeben, sollte nicht ein grosses Problem sein. Nur eins sollte man nicht vergessen: es handelt sich um eine Stückliste, also um eine Zusammenhang von Aggregate und Komponente (auch Parent und Child genannt), genau an der Stelle, wo in Zeile n Stufe 1 steht (Parent) und Zeile n+1 und weitere Stufe 2 (Child). Dementsprechend sind die 276 USD in Zeile 3 nicht eine eigene Wert sondern die Summe der darunterliegende Stufe 2 (nicht zweimal zählen!)

Erst wenn wieder in Stufe 1 haben wir die Komponente-Liste verlassen.

@Uwe: Ich könnte in deinem Code diese Unterscheidung nicht entdecken.

VG
Yal
Anzeige
AW: Parent-Child nicht vergessen
21.11.2023 06:29:48
Ron
Hallo zusammen,

vielen Dank @Uwe und @Yal für eure Ideen und das VBA Skript. Da mehrere Text Dateien vorhanden sind (in einem Ordner) so rund 700 bis 1000 Stück sollen alle durchlaufen werden und in eine Access Datenbank überführt werden. Da z.B. eine Gewindeschraube in mehreren Produkten und Stücklisten vorkommen kann (also mehreren Text Dateien) möchte ich diese eigentlich normalisiert ablegen. Da sonst redundante Daten in der Datenbank liegen. Wie würdet ihr das Datenmodell hierfür aufbauen Kostenstellen, Kostenarten, Bemessungseinheit, Leistungsart usw. sollen mit in die Datenbank aufgenommen werden.

Viele Grüße
Ron
Anzeige
AW: Parent-Child nicht vergessen
21.11.2023 11:15:17
Alwin Weisangler
Hallo Ron,

die Textdateien aus einem Verzeichnis abzuarbeiten ist eher das geringste bis gar kein Problem.

Das eigentliche Problem ist aus den importierten Rohdaten die Zusammenhänge richtig aufzubereiten und in eine/mehrere zu verknüpfende Access Tabelle(n) zu übergeben.
Ich selbst kenne SAP nur vom Namen.
In Spalte A der importierten Rohdaten aus der zur Verfügung stehenden txt finden sich der Wert .1 und ..2
Wie hängen diese zusammen.
Meine Vermutung:
in Spalte A: .1 ist der gesamte Artikel (Aggregat)
in Spalte A: ..2 sind die mit .1 in Zusammenhang stehenden einzelnen Baugruppen (Komponente) dieses Artikels.
Welcher Zusammenhang besteht zwischen Positionstyp M bzw. E und Stufe .1 bzw ..2
Ich denke mal dass Positionstyp M der gesamte Artikel (Aggregat) ist und Positionstyp E die im Zusammenhang mit M stehenden einzelnen Baugruppen (Komponente).

Lade bitte 2 Beispiele hoch wie diese fertig aufbereitet aussehen sollen.
1. Beipiel:
|.1 |M |CCWA1064|DL00| aus Zeile 6 der txt mit den dazugehörigen Komponenten
2. Beispiel:
|..2 |M |TRTR1064|DL00| aus Zeile 9 der txt mit allen ev. noch dazugehörigen Komponenten
Gibt es noch ..3 u.s.w. in Spalte A
Gibt es auße M und E noch Weitere?

Im Import war noch eine kleine Ungereimtheit in Spalte A drin. Die erste Spalte des Imports muss als Text formatiert werden.
Änderung der Prozedur so:


'Daten aus der txt in die Excel holen
Sub NeuanmeldungenHolen()
Dim ZeileAusImport$, row_number&, i&, j&, lz&, ls&
Dim objStream As Object
Dim ZeilenNummer
DateiName = Tabelle1.Cells(2, 1)
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Charset = "utf-8"
.Open
If DateiName = "" Then DateiOeffnen
If Dir(DateiName) > "" Then
.LoadFromFile (DateiName)
Else
DateiOeffnen
If DateiName = "Falsch" Then Exit Sub
.LoadFromFile (DateiName)
End If
.LineSeparator = 10
End With
row_number = 1
With Tabelle2
lz = .Cells(Rows.Count, 1).End(xlUp).Row
ls = .Cells(1, Columns.Count).End(xlToLeft).Column
.Range(.Cells(1, 1), .Cells(lz, ls)).ClearContents
Do Until objStream.EOS
ZeileAusImport = objStream.ReadText(-2)
If InStr(1, ZeileAusImport, "---") = 0 Then
ZeilenNummer = Split(ZeileAusImport, "|")
For i = 1 To UBound(ZeilenNummer) - 1
If i = 1 Then
If j > 0 Then
.Cells(row_number, i).NumberFormat = "@"
.Cells(row_number, i).Value = ZeilenNummer(i)
Else
.Cells(row_number, i).Value = ZeilenNummer(i)
End If
j = j + 1
Else
.Cells(row_number, i).Value = ZeilenNummer(i)
End If
Next i
row_number = row_number + 1
End If
Loop
End With
Set objStream = Nothing
End Sub


Gruß Uwe

Anzeige
AW: Parent-Child nicht vergessen
21.11.2023 21:43:41
Alwin Weisangler
Hallo Ron,

ich habe jetzt mal ein bisschen gebastelt.
Es werden in einer Tabelle die Aggregate, versehen mit einer sekundären ID eingelesen und in einer weiteren Tabelle die Baugruppen, welche der sek. ID des betreffenden Aggregates zugeordnet werden um diese Verknüpft aufzurufen, zu bearbeiten und falls erforderlich neu zu berechnen.
Beide Access Tabellen haben den gleichen Aufbau und das Auslesen wäre über sekundäre ID (ID_Agg) problemlos möglich.

Zum Einlesen aller txt Dateien müssten noch ein paar Dinge geklärt sein.
Gibt es Doppellungen von Datensätzen von Datei zu Datei, welche ausgeschlossen werden müssen.
Wenn ja wie wären die Ausschlussbedingungen.

Was bisher noch völlig im Dunkeln liegt ob es sich nur um eine Eltern Kind Verknüpfung handelt oder ob es tiefer geht.
Wenn die erforderliche Verzweigung tiefer geht, braucht es die entsprechende Datenlage zum Aufdröseln und testen.
https://www.herber.de/bbs/user/164495.xlsm

Gruß Uwe



Anzeige
AW: Parent-Child nicht vergessen
22.11.2023 12:03:19
Yal
Hallo zusammen,

ich sehe noch 2 Punkte zu klären:
Die Datei liefert die Stückliste für ein "zusammengestellte" Material. Es baut sich aus Material ("M" als PositTyp, Spalte 2) und Aufwand ("E" als PositTyp).
Wenn diese Material selbst eine Zusammenstellung (=Aggregat), dann gibt es eine Unterstückliste aus Material und Aufwand, aber auch eine Menge. Siehe Zeile 3, CCWA1064 hat "Menge" = 2.

Frage 1:
Hier ist es nicht klar, ob in eine der 1000 Dateien die Stückliste für CCWA1064 vorhanden ist. Es gäbe dann eine Doppelung.
Frage 2:
Es ist nicht klar, ob CCWA1064 an sich ein Aggregat darstellt, der einzel dokumentiert werden soll (eigentlich muss, weil das Datenmodell kein Tiefe aufnehmen kann).

Dabei ist zu berücksichtigen, dass bei Menge=2, alle Angabe über den CCWA1064 in der Beispieldatei um Faktor 2 vorliegen. Also eine CCWA1064 allein beinhaltet alle nur die Hälfte der hier aufgelisteten Komponenten (sowohl Material als auch Aufwand).

Das Datenmodell in dem gegebenen Link ( https://access-im-unternehmen.de/Stuecklisten_Teil_I/ ) zeigt es, aber nicht ganz leicht zu erkennen (den Artikel selbst habe ich nicht gelesen): es müssen die Information über jede einzelne Komponent und die Information über der Zusammensetzung separat voneinander aufgelistet werden.

VG
Yal
Anzeige
AW: Parent-Child nicht vergessen
22.11.2023 21:53:00
Alwin Weisangler
Hallo Yal,

den Verdacht, dass es noch weiterer Tabellen incl. Verknüpfungen bedarf, hatte ich schon geäußert. Ich habe deswegen mich erst mal in Wartestellung begeben, da ich SAP nur vom Namen her kenne. Ich brauch da einfach konkrete Aussagen wie was zusammenhängt. Dann was zu programmieren um es in die erforderlichen Tabellen aufzudröseln ist vermutlich nicht so das Problem.
Vorhin habe ich mal noch den Import aller txt Dateien eines Verzeichnisses zusammengestellt. Den Code stell ich mal noch mit rein.


Option Explicit
Dim DateiName$

'hier Starten Verzeichnis auslesen
Sub TxtAusVerzeichnisImport()
Dim strPath$, strFile$, i&, arrTxtList()
If strPath = "" Then strPath = ShellVerzeichnisBrowser
If strPath > "" Then
strPath = IIf(Right(strPath, 1) = "\", strPath, strPath & "\")
strFile = Dir(strPath & "*.txt", vbNormal)
Do While strFile > ""
i = i + 1
ReDim Preserve arrTxtList(1 To i)
arrTxtList(i) = strPath & strFile
strFile = Dir
Loop
End If
For i = 1 To UBound(arrTxtList)
DateiName = arrTxtList(i)
TxtVerarbeiten
Next i
End Sub

'Daten aus der abzufragenden txt in die Excel holen
Sub TxtVerarbeiten()
Dim ZeileAusImport$, row_number&, i&, lz&, ls&
Dim objStream As Object
Dim ZeilenNummer
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Charset = "utf-8"
.Open
If DateiName = "" Then Exit Sub
.LoadFromFile (DateiName)
.LineSeparator = 10
End With
With Tbl_ImpRohdaten
row_number = .Cells(Rows.Count, 1).End(xlUp).Row + 1
lz = .Cells(Rows.Count, 1).End(xlUp).Row
ls = .Cells(1, Columns.Count).End(xlToLeft).Column
Do Until objStream.EOS
ZeileAusImport = objStream.ReadText(-2)
If InStr(1, ZeileAusImport, "---") = 0 And InStr(1, ZeileAusImport, "Kostenart") = 0 Then
ZeilenNummer = Split(ZeileAusImport, "|")
For i = 1 To UBound(ZeilenNummer) - 1
If i = 1 Then
.Cells(row_number, i).NumberFormat = "@"
.Cells(row_number, i).Value = RTrim(ZeilenNummer(i))
Else
.Cells(row_number, i).Value = RTrim(ZeilenNummer(i))
End If
Next i
row_number = row_number + 1
End If
Loop
End With
Set objStream = Nothing
End Sub

Private Function ShellVerzeichnisBrowser(Optional ByVal defaultPath = "") As String
Dim objItem As Object, objShell As Object, objFolder As Object
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0&, "Bitte Verzeichnis anklicken", 0&, defaultPath)
If objFolder Is Nothing Then GoTo weiter
Set objItem = objFolder.Self
ShellVerzeichnisBrowser = objItem.Path
weiter:
Set objShell = Nothing
Set objFolder = Nothing
Set objItem = Nothing
End Function


Gruß Uwe
Anzeige
;
Anzeige

Infobox / Tutorial

Datenbankerstellung aus CK13N Export im SAP-System


Schritt-für-Schritt-Anleitung

  1. Vorbereitung der Textdateien: Stelle sicher, dass alle Exportdateien im UTF-8 Format vorliegen und im entsprechenden Verzeichnis gespeichert sind.

  2. VBA-Editor öffnen: Starte Excel und öffne den VBA-Editor mit ALT + F11.

  3. Modul einfügen: Klicke mit der rechten Maustaste auf VBAProject (DeineDatei.xlsm) und wähle Einfügen > Modul.

  4. Code für den Import einfügen: Füge den folgenden VBA-Code in das Modul ein, um die Textdateien in Excel zu importieren:

    Option Explicit
    Dim DateiName$
    
    Sub NeuanmeldungenHolen()
       Dim ZeileAusImport$, row_number&, i&, lz&, ls&, var$
       Dim objStream As Object
       Dim ZeilenNummer
       DateiName = Tabelle1.Cells(2, 1)
       Set objStream = CreateObject("ADODB.Stream")
       With objStream
           .Charset = "utf-8"
           .Open
           If DateiName = "" Then DateiOeffnen
           If Dir(DateiName) > "" Then
               .LoadFromFile (DateiName)
           Else
               DateiOeffnen
               If DateiName = "Falsch" Then Exit Sub
               .LoadFromFile (DateiName)
           End If
           .LineSeparator = 10
       End With
       row_number = 1
       With Tabelle2
           lz = .Cells(Rows.Count, 1).End(xlUp).Row
           ls = .Cells(1, Columns.Count).End(xlToLeft).Column
           .Range(.Cells(1, 1), .Cells(lz, ls)).ClearContents
           Do Until objStream.EOS
               ZeileAusImport = objStream.ReadText(-2)
               If InStr(1, ZeileAusImport, "---") = 0 Then
                   ZeilenNummer = Split(ZeileAusImport, "|")
                   For i = 1 To UBound(ZeilenNummer) - 1
                       var = ZeilenNummer(i)
                       .Cells(row_number, i).Value = Replace(ZeilenNummer(i), Chr(100), "ä")
                   Next i
                   row_number = row_number + 1
               End If
           Loop
       End With
       Set objStream = Nothing
    End Sub
    
    Private Sub DateiOeffnen()
       ChDrive Left(ThisWorkbook.Path, 3)
       ChDir ThisWorkbook.Path
       DateiName = Application.GetOpenFilename("Excel (*.txt), *.txt")
       If DateiName = "" Then Exit Sub
    End Sub
  5. Datenmodell erstellen: In Access solltest du eine Tabelle mit dem entsprechenden Aufbau anlegen. Achte darauf, dass die erste Spalte als Primärschlüssel mit AutoWert formatiert wird.

  6. Daten importieren: Führe das Skript aus und importiere die Daten in die Excel-Tabelle. Danach kannst du die Daten in die Access-Datenbank übertragen.


Häufige Fehler und Lösungen

  • Fehler: Datei nicht gefunden
    Lösung: Überprüfe den angegebenen Dateipfad und stelle sicher, dass die Datei im richtigen Format vorliegt.

  • Fehler: Ungültige Zeichen im Import
    Lösung: Achte darauf, dass die Textdateien UTF-8 kodiert sind. Ändere die Kodierung gegebenenfalls in einem Texteditor.

  • Problem mit doppelten Einträgen
    Lösung: Implementiere eine Logik, um doppelte Einträge während des Imports zu vermeiden, insbesondere wenn die selben Materialien in mehreren Dateien vorkommen.


Alternative Methoden

  • Direkter Import in Access: Anstatt die Daten zuerst in Excel zu importieren, könntest du die Textdateien direkt in Access importieren. Dies kann durch die Nutzung von Access-Importassistenten erfolgen.

  • Nutzung von Power Query: In Excel kannst du auch Power Query verwenden, um Daten aus Textdateien zu importieren und zu transformieren, bevor du sie weiterverarbeitest.


Praktische Beispiele

  • Beispiel 1: Importieren von Stücklisten
    Wenn deine Textdateien Stücklisten im SAP-CK13N Format enthalten, kannst du die oben genannten Schritte nutzen, um diese in eine Excel-Datenbank zu importieren und anschließend in Access zu verarbeiten.

  • Beispiel 2: Normalisierung von Daten
    Bei der Verarbeitung der Daten aus den CK13N-Exporten solltest du sicherstellen, dass redundante Daten vermieden werden. Normalisiere die Daten, indem du häufig wiederkehrende Materialarten in separate Tabellen verschiebst.


Tipps für Profis

  • VBA-Optimierung: Optimiere deine VBA-Skripte, indem du Fehlerbehandlungen einbaust und die Leistung durch das Deaktivieren von Bildschirmaktualisierungen während des Imports verbesserst.

  • Verknüpfungen in Access: Stelle sicher, dass du die Beziehungen zwischen den Tabellen in Access richtig angelegst, um die Integrität der Daten zu gewährleisten.

  • Automatisierung: Überlege, ob du den gesamten Prozess automatisieren kannst, sodass der Import und die Verarbeitung der Daten regelmäßig ohne manuelles Eingreifen erfolgen können.


FAQ: Häufige Fragen

1. Wie kann ich SAP-Stücklisten in Excel exportieren?
Du kannst die Stücklisten über den Exportassistenten in SAP exportieren und die Dateien dann in Excel importieren.

2. Was ist der Unterschied zwischen Positionstyp M und E?
Positionstyp M steht für Material, während Positionstyp E für Aufwand steht. Diese Unterscheidung ist wichtig, um die Struktur der Stücklisten korrekt abzubilden.

3. Wie kann ich doppelten Datenimport vermeiden?
Implementiere eine Logik in deinem VBA-Skript, die prüft, ob der Datensatz bereits existiert, bevor er importiert wird.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige