Hallo zusammen,
ich habe eine Tabelle wie folgt:
Artikel | Farbe | Größe
ABC123 | weiß | 180
Diese muss regelmässig/dynamisch bzw. konkreter jeweils bei einem Export (täglich) wie folgt umstrukturiert werden:
Artikel | Attribut1 | Attribut1 Wert | Attribut2 | Attribut2 Wert
ABC123 | Farbe | weiß | Größe | 180
***** EDIT: Was Entscheidendes vergessen, echtes Beispiel 2 Beiträge weiter unten ******
Wie kann ich das umsetzen per Abfragen/Makro/VBA (von letzterem habe ich leider (noch) keine Ahnung), quasi dass dieser "Umbau" auf Knopfdruck funktioniert?
Vielen Dank vorab
Gruss
Frank
Hallo,
---besteht die Tabelle nur aus diesen einen Datensatz?
mach mal ein ausführlicheres Beispiel.
---in WAS soll exportiert werden?
---Müssen die einzelnen Werte in separate Felder gelegt werden oder können sie zu einen einzelnen String zusammengefasst werden?
Hallo Franz,
die Tabelle hat mehrere zehntausend Datensätze (hier: ABC123), es geht um ca. 80 Attribute (hier: Farbe, Größe).
Das Ergebnis kann in der gleichen oder einer neuen Tabelle stehen, spielt keine Rolle, der Export an sich ist auch nicht das Thema, ich brauche die Export-Basis.
Die Werte müssen wie oben geschildert in einzelnen Felder stehen.
Wobei ich noch etwas Wichtiges vergessen habe, deshalb das Beispiel von oben nochmal konkreter:
Ausgangsbasis:
Artikel | Farbe | Größe
ABC123 | weiß | 180
ABC234 | NULL | 170
Gewünschtes Ergebnis:
Artikel | Attribut1 | Attribut1 Wert | Attribut2 | Attribut2 Wert
ABC123 | Farbe | weiß | Größe | 180
ABC234 | Größe | 170 --> Hier wurde Attribut "Farbe" plus entsprechender Wert "übersprungen", weil es keinen Wert gibt. Größe war also beim ersten Artikel "Attribut 2", bei Artikel ABC234 ist es "Attribut 1".
Hallo,
Zitates geht um ca. 80 Attribute (hier: Farbe, Größe).
und warum zeigst Du das nicht im Beispiel??
entspr. dem dargestellten Beispiel:
SELECT Artikel, IIf([Farbe] Is Null,"Größe","Farbe") AS Attr1, IIf([Farbe] Is Null,[Größe],[Farbe]) AS Wert1, IIf([Farbe] Is Null,Null,"Größe") AS Attr2, IIf([Farbe] Is Null,Null,[Größe]) AS Wert2
FROM Tabelle1Wenn es sich um mehr als diese zwei Attribute handelt und die leeren Spalten unterdrückt werden sollen, ist eine entspr. VBA-Prozedur von Nöten.
OK, danke, klappt aber so ja nicht mit 80 Attributen und allen Kombinationen :)
Zitatund warum zeigst Du das nicht im Beispiel??
Wie meinst Du das? Warum ich nicht 80 Beispiel-Attribute aufschreibe? Dass es 80 sind habe ich doch geschrieben...
Hallo,
lies nochmal mein letztes Posting wegen dem Nachsatz.
Weiterhin muss (müsste) der Export am Besten in eine CSV-Datei erfolgen.
ZitatWenn es sich um mehr als diese zwei Attribute handelt und die leeren Spalten unterdrückt werden sollen, ist eine entspr. VBA-Prozedur von Nöten.
Ok, dabei bräuchte ich Hilfe.
Export in csv wäre ok.
Hallo FrankiLi,
Frage zum Verständnis:
Woher stammen die Attribut-Bezeichnungen? Sind dies tatsächlich 80 Felder in der Artikel-Tabelle?
lg
crystal
Hallo Crystal,
ja, genau so ist es.
Gruss
Frank
Hallo,
Export in eine CSV:
Public Function FktCsvExport()
Dim DB As DAO.Database, RS As DAO.Recordset, i As Long, Tmp As String, LU As Long
Set DB = CurrentDb()
LU = FreeFile
Open "C:\Temp\Output.CSV" For Output As LU
Set RS = DB.OpenRecordset("Select * from tbl_ArtikelAttribute order by Artikel", dbOpenSnapshot)
Do Until RS.EOF
Tmp = """" & RS(0) & """"
For i = 1 To RS.Fields.Count - 1 Step 2
If Not IsNull(RS(i)) Then
Tmp = Tmp & ";""" & RS(i).Name & """;""" & RS(i) & """;""" & RS(i + 1).Name & """;""" & RS(i + 1) & """"
End If
Next
RS.MoveNext
'Debug.Print Tmp
Print #LU, Tmp
Loop
RS.Close
Set RS = Nothing
Close LU
End Function
Hallo,
hier noch ein anderer Ansatz, der ohne VBA auskommt:
erstelle eine Abfrage wie
ZitatSELECT "Artikel|"& ArtId as Artikel,
IIf(Nz([Farbe]),"|Farbe|" & [Farbe]) AS F1,
IIf(Nz([Größe]),"|Größe|" & [Größe]) AS F2,
IIf(Nz([Länge]),"|Länge|" & [Länge]) AS F3,
IIf(Nz([Breite]),"|Breite|" & [Breite]) AS F4
FROM Artikel;
Anmerkungen:
1. im Abfrage-Entwurf SQL-Ansicht
2. die 2. Zeile kopieren und einfügen
3. Attribut-Namen anpassen
4. als Trennzeichen habe ich hier "|" benutzt
5. Dies ist eine kleine Fleißarbeit, sozusagen als "Strafe" für das "missglückte" Design der Artikel-Tabelle.
Ausgehend von folgender Mini-Tabelle
Zitat-----------------------------------------------------------------------------------------------------
| ArtId | Farbe | Größe | Länge | Breite |
-----------------------------------------------------------------------------------------------------
| 1 | blau | 170 | | |
-----------------------------------------------------------------------------------------------------
| 2 | rot | 180 | | |
-----------------------------------------------------------------------------------------------------
| 3 | blau | | 17 | 5 |
-----------------------------------------------------------------------------------------------------
| 4 | grün | | 123 | 45 |
-----------------------------------------------------------------------------------------------------
liefert diese Abfrage, wenn man sie als Text exportiert:
ZitatArtikel|1 |Farbe|blau |Größe|170
Artikel|2 |Farbe|rot |Größe|180
Artikel|3 |Farbe|blau |Länge|17 |Breite|5
Artikel|4 |Farbe|grün |Länge|123 |Breite|45
In der Export-Definition musst du (nach Klick auf Erweitert) als Feldtrennzeichen (Leerzeichen) und als Textqualifizierer (kein) eintragen.
Leider entstehen dadurch Leerzeichen in der Ausgabe, das wird aber den späteren Import vermutlicch nicht stören. Ansonsten müsste man als Trennzeichen z.B. "§" definieren und dann mit einem Editor in der exportierten Datei durch <nichts> ersetzen.
OK - dieser Ansatz ist natürlich nicht so elegant wie der von DF6GL, aber es klappt (einigermaßen).
lg
crystal
Meine Güte, danke Ihr Beiden!
Zitat5. Dies ist eine kleine Fleißarbeit, sozusagen als "Strafe" für das "missglückte" Design der Artikel-Tabelle.
Ischweiss, das ist aber momentan noch bewusst/absichtlich falsch, geht aus div. Gründen gerade nicht anders.
Ich würde jetzt mal Franz' Lösung testen, weil ich ohnehin VBA und Module gerne grundsätzlich besser verstehen würde (Crystal, Dein Ansatz hilft mir trotzdem in einem anderen aber ähnlichen Sachverhalt)
@Franz: Es läuft soweit, im Fenster sieht man auch die Ergebnisse, die Datei wird auch erstellt - aber sie ist leer. Mache ich etwas falsch?
Und: Lässt sich mit einfachen Mitteln noch dazu-coden, dass dieses Prinzip erst ab der 3. Spalte der Ausgangstabelle gilt und die ersten beiden (IDs) unverändert übernommen werden?
Hallo,
hast Du den Tabellenamen angepasst?
Zitatdass dieses Prinzip erst ab der 3. Spalte der Ausgangstabelle gilt und die ersten beiden (IDs) unverändert übernommen werden?
Wie meinst Du das? Was sind die "ersten beiden" ID's?
Und wieso habe die nicht die selbe Struktur wie die restlichen DS?
Zitatmomentan noch bewusst/absichtlich falsch, geht aus div. Gründen gerade nicht anders.
Warum nicht? Hier wird vermutlich der Teufel mit dem Beelzebub ausgetrieben...
Zitathast Du den Tabellenamen angepasst?
Klar, ich sehe ja auch die Ergebnisse/Datensätze im Direktbereich durchlaufen.
ZitatWie meinst Du das? Was sind die "ersten beiden" ID's?
Und wieso habe die nicht die selbe Struktur wie die restlichen DS?
Naja... wie soll ichs besser beschreiben, ok so:
ID | Artnr | Farbe | Größe
Die Funktion soll erst ab Spalte 3 (Farbe) diesen "Umbau" veranstalten.
ID und Artnr sollen so bleiben, wie sie sind, Felder mit Werten.
Hallo,
Du willst doch üben/verstehen..
Du brauchst nur bei der Initialisierung der TMP-Variablen RS(1) hinzufügen und die For-Schleife beim Startwert anpassen.
...und ein solches statement einbauen:
write LU, tmp (zusätzlich zu debug.print tmp, das dann auskommentieren)
@DF6GL: bitte mein statement korrigieren
Frage noch: wozo die vielen Anführungszeichen?
lg
crystal
Hallo,
ja, danke für den Hinweis, das Schreiben in die Datei hat gefehlt. (Habe meinen Beitrag dementsprechend korrigiert)
Zitatwozo die vielen Anführungszeichen
Gänsefüße in einer CSV-Datei definieren den Wert als TEXT.
Sie sind aber hier eigentlich nicht unbedingt nötig und sollen nur als Beispiel dienen.
@DF6GL
ZitatGänsefüße in einer CSV-Datei definieren den Wert als TEXT.
Das war schon klar, die Frage ist nur, welche Trennzeichen bzw. Textmarkierer beim Import benötigt werden und ob beim Import "170" dann auch als Zahl 'ankommt' und der Text <blau> (ohne spitze Klammern) als Text.
Wenn alle 80 Atribute numerisch sind, braucht man keine Gänsefüßchen.
Nur so Gedanken, es hängt wohl davon ab, wie tolerant die Import-Funktion ist.
lg
crystal
Zitat von: DF6GL am November 10, 2016, 15:59:58
Du willst doch üben/verstehen..
Du brauchst nur bei der Initialisierung der TMP-Variablen RS(1) hinzufügen und die For-Schleife beim Startwert anpassen.
Hallo Franz,
Du hast natürlich völlig Recht: Will ich.
Ich muss allerdings darauf achten, dass sich Lernen einerseits, und der Projektfortschritt andererseits die Waage halten.
Kannst Du mir bei einem Punkt bitte auf die Sprünge helfen:
In der CSV-Datei sollen noch die Spalten-Namen mitgegeben werden. Für Spalte 1-3 der Originalname (da wird ja nichts verändert), und dann Attribut 1 Name | Attribut 1 Wert - Attribut 2 Name | Attribut 2 Wert usw....