Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1952to1956
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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.
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige