Supportnet / Forum / Datenbanken
Daten umstrukturieren
Frage
Hallo,
ich habe eine AccessTabelle, die so aussieht (zwei Spalten)
Spalte1 , Spalte2
Name , Hans
Straße ,Strasse1
Ort ,Ort1
Name ,Paul
Straße , Strasse2
Ort ,Ort2
Name ,FRank
Straße ,Strasse3
Ort ,Ort3
(...)
und möchte diese so per Abfrage strukturieren
Name ,Straße , Ort
Hans , Straße1 ,Ort1
Paul , Straße2 ,Ort2
Frank ,Straße3 ,Ort3
(...)
Kann mir da jemand weiterhelfen
Vielen Dank
Juergen
Antwort 1 von piano
Hi
Hier hilft eine kleine Funktion, die in einem beliebigen Modul abgelegt wird:
Zum Aufruf am besten ein kleines Formular mir einem Butten mit nur 2 Zeilen anlegen:
Damit diese Funktion richtig funktioniert, muß - wie in der Angabe - jeder Block mit dem Feld "Ort" abgeschlossen sein!
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Hier hilft eine kleine Funktion, die in einem beliebigen Modul abgelegt wird:
Public Function Umstrukturieren()
Dim db As Database
Dim rIn As Recordset, rOut As Recordset
Dim N, S, O
Set db = CurrentDb
Set rIn = db.OpenRecordset("Tabelle3")
Set rOut = db.OpenRecordset("NeueTabelle")
Do While Not rIn.EOF
If rIn!Text1 = "Name" Then N = rIn!Text2
If rIn!Text1 = "Straße" Then S = rIn!Text2
If rIn!Text1 = "Ort" Then
O = rIn!Text2
rOut.AddNew
rOut!Name = N
rOut!Straße = S
rOut!Ort = O
rOut.Update
End If
rIn.MoveNext
Loop
rIn.Close
rOut.Close
End Function
Zum Aufruf am besten ein kleines Formular mir einem Butten mit nur 2 Zeilen anlegen:
Private Sub Befehl0_Click()
Dim x
x = Umstrukturieren()
End Sub
Damit diese Funktion richtig funktioniert, muß - wie in der Angabe - jeder Block mit dem Feld "Ort" abgeschlossen sein!
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 2 von Juergene
Hallo, vielen Dank für die Antwort.
Leide erhalte ich bei diesem Script bei der Zeile
Dim db As Database
einen Fehler Benutzerdefinierter Typ nicht definiert.
In der Hilfe ist in den Beispielen diese Syntax aber so verwendet. Da ich nicht wirklich Ahnung von VB habe, bitte ich hier noch einmal um Hilfe.
beste Grüße
Juergen
Leide erhalte ich bei diesem Script bei der Zeile
Dim db As Database
einen Fehler Benutzerdefinierter Typ nicht definiert.
In der Hilfe ist in den Beispielen diese Syntax aber so verwendet. Da ich nicht wirklich Ahnung von VB habe, bitte ich hier noch einmal um Hilfe.
beste Grüße
Juergen
Antwort 3 von Juergene
So die besten Fehler sind die, die sich von selber erledigen. Der o.g. Fehler entstand durch einen fehlenden Verwes auf eine Bibliothek.
Leider bin ich jetzt aber immer noch nicht viel weiter. Jetzt erhalte ich bei der Zeile
Set rIn = db.OpenRecordset("Tabelle3")
den Fehler 13 Typen unverträglich
und hänge leider wieder fest.*gg*
Ich danke euch schon mal...
Leider bin ich jetzt aber immer noch nicht viel weiter. Jetzt erhalte ich bei der Zeile
Set rIn = db.OpenRecordset("Tabelle3")
den Fehler 13 Typen unverträglich
und hänge leider wieder fest.*gg*
Ich danke euch schon mal...
Antwort 4 von pelle
Hallo Juergen,
deine Anfrage und "piano´s" Antwort sind mir nicht ganz klar!
Zu "piano´s" Antwort kann ich leider nichts sagen,
weil ich keine Ahnung zu VBA habe!
Zu deiner Anfrage:
Wieso hast du zwei Spalten?
Du hast, wenn ich deine Anfrage richtig lese:
a) eine Spalte/Feldnamen für Name;
b) eine Spalte/Feldnamen für Straße;
c) eine Spalte/Feldnamen für Ort!
also 3 Spalten/Feldnamen!
Wenn deine Tabelle so aufgebaut ist, besteht doch kein "Problem"?
Oder sehe ich da was falsch??????
Ich verstehe nicht, was da über eine Abfrage strukturiert werden soll???
gruss
pelle
deine Anfrage und "piano´s" Antwort sind mir nicht ganz klar!
Zu "piano´s" Antwort kann ich leider nichts sagen,
weil ich keine Ahnung zu VBA habe!
Zu deiner Anfrage:
Wieso hast du zwei Spalten?
Du hast, wenn ich deine Anfrage richtig lese:
a) eine Spalte/Feldnamen für Name;
b) eine Spalte/Feldnamen für Straße;
c) eine Spalte/Feldnamen für Ort!
also 3 Spalten/Feldnamen!
Wenn deine Tabelle so aufgebaut ist, besteht doch kein "Problem"?
Oder sehe ich da was falsch??????
Ich verstehe nicht, was da über eine Abfrage strukturiert werden soll???
gruss
pelle
Antwort 5 von piano
Hi!
Die Ferndiagnose ist ein bisschen kompliziert !
Hab es bei mir ausprobiert,und hat einwandfrei funktioniert.
Ist der Name "rIn" richtig geschrieben ? muß wie bei "Dim" lauten (ist ein grpßes i)!
"Tabelle3" soll der Name der Tabelle sein, die die 2 Textfelder enthält. Den kannst Du natürlich anpassen!
noch ein Versuch ?
Du kannst mir deine email adresse geben, dann schick ich dir ein Beispiel als zip-datei
piano
Die Ferndiagnose ist ein bisschen kompliziert !
Hab es bei mir ausprobiert,und hat einwandfrei funktioniert.
noch ein Versuch ?
Du kannst mir deine email adresse geben, dann schick ich dir ein Beispiel als zip-datei
piano
Antwort 6 von piano
hallo @pelle
sieh dir die vorgabe nochmal an, hier sind tatsächlich 2 spalten mit für relative datenbanken fatalem strukurfehler! in spalte 1 wiederholen sich die bezeichnungen name, strasse, ort!
gruß piano
sieh dir die vorgabe nochmal an, hier sind tatsächlich 2 spalten mit für relative datenbanken fatalem strukurfehler! in spalte 1 wiederholen sich die bezeichnungen name, strasse, ort!
gruß piano
Antwort 7 von Juergene
Vielen Dank für die Antworten, ich werde das noch mal bei mir prüfen.
Vielleicht noch zur Erklärung:
Ich bekomme die Daten genau so von einem anderen Prozess.
Die Angaben Name , Straße, etc habe ich als Beispiel eingesetzt. Die Daten sehen in Wirklichkeit ursprünglich so aus (als .txt File):
Item
{
Serial 0x6ae14dc3
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i1975
CProp GateDestY i266
CProp GateDestZ i8
DecayAt 25235207
}
Item
{
Serial 0x6ae67646
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i2770
CProp GateDestY i853
CProp GateDestZ i0
DecayAt 26444029
}
Item
{
Serial 0x6aec86bf
ObjType 0x6203
Graphic 0x1
X 0
Y 0
Z 0
Facing 29
CProp DestX i3005
CProp DestY i809
CProp DestZ i0
DecayAt 28067054
}
(...)
Diese habe ich jetzt unter Access so in als eingebundene Tabelle eingerichtet, dass zwei Spalten entstehen.
Ich kann somit schon mal gut die Daten dauernd importieren, nur liegen die dann in der beschriebenen Reihenfolge vor.
Beispiel der Accesstabelle
(leider formatiert das Forum hier die Abstände zwischen den Spalten nicht mit)
Feld2 Feld3
Serial 0x6ae14dc3
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i1975
CProp GateDestY i266
CProp GateDestZ i8
DecayAt 25235207
Serial 0x6ae67646
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i2770
CProp GateDestY i853
CProp GateDestZ i0
DecayAt 26444029
(...)
Mein Ziel ist jetzt daraus eine ganz normale Tabelle mit jeweils einer Spalte für Serial, ObjType, Graphic, etc zu machen
Wobei es kein Problem ist, wenn die mehrfach vorhandenen Werte (CProp) alle als gemeinsamer String in eine Zelle geschrieben werden.
Ich weis, es ist eine ziemlich unsinnige Ausgangsstruktur, aber leider nicht zu ändern
Viele Grüße,
Juergen
Vielleicht noch zur Erklärung:
Ich bekomme die Daten genau so von einem anderen Prozess.
Die Angaben Name , Straße, etc habe ich als Beispiel eingesetzt. Die Daten sehen in Wirklichkeit ursprünglich so aus (als .txt File):
Item
{
Serial 0x6ae14dc3
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i1975
CProp GateDestY i266
CProp GateDestZ i8
DecayAt 25235207
}
Item
{
Serial 0x6ae67646
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i2770
CProp GateDestY i853
CProp GateDestZ i0
DecayAt 26444029
}
Item
{
Serial 0x6aec86bf
ObjType 0x6203
Graphic 0x1
X 0
Y 0
Z 0
Facing 29
CProp DestX i3005
CProp DestY i809
CProp DestZ i0
DecayAt 28067054
}
(...)
Diese habe ich jetzt unter Access so in als eingebundene Tabelle eingerichtet, dass zwei Spalten entstehen.
Ich kann somit schon mal gut die Daten dauernd importieren, nur liegen die dann in der beschriebenen Reihenfolge vor.
Beispiel der Accesstabelle
(leider formatiert das Forum hier die Abstände zwischen den Spalten nicht mit)
Feld2 Feld3
Serial 0x6ae14dc3
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i1975
CProp GateDestY i266
CProp GateDestZ i8
DecayAt 25235207
Serial 0x6ae67646
ObjType 0x6008
Graphic 0xf6c
X 0
Y 0
Z 0
Facing 2
CProp GateDestX i2770
CProp GateDestY i853
CProp GateDestZ i0
DecayAt 26444029
(...)
Mein Ziel ist jetzt daraus eine ganz normale Tabelle mit jeweils einer Spalte für Serial, ObjType, Graphic, etc zu machen
Wobei es kein Problem ist, wenn die mehrfach vorhandenen Werte (CProp) alle als gemeinsamer String in eine Zelle geschrieben werden.
Ich weis, es ist eine ziemlich unsinnige Ausgangsstruktur, aber leider nicht zu ändern
Viele Grüße,
Juergen
Antwort 8 von piano
OK, dann ist ja alles klar.
Der Feldinhalt "DecayAt" ist in meinem Makro dem "Ort" entsprechend und somit das Kriterium zum Schreiben des Satzes.
Du mußt nur die Dim-Anweisung um die benötigten Variablen ergänzen und auch die Ausgabe in die Felder der neuen Tabelle.
Die neue Tabelle muß natürlich bereits die Struktur mit den exakt übereinstimmenden Feldnamen enthalten!
Du machst mich schwach - jetzt sehe ich noch, daß Werte mehrfach vorkommen: dazu mußt Du ergänzen:
Annahme:
vor "Do while ..."
wenn Cprop:
Gruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Der Feldinhalt "DecayAt" ist in meinem Makro dem "Ort" entsprechend und somit das Kriterium zum Schreiben des Satzes.
Du mußt nur die Dim-Anweisung um die benötigten Variablen ergänzen und auch die Ausgabe in die Felder der neuen Tabelle.
Die neue Tabelle muß natürlich bereits die Struktur mit den exakt übereinstimmenden Feldnamen enthalten!
Du machst mich schwach - jetzt sehe ich noch, daß Werte mehrfach vorkommen: dazu mußt Du ergänzen:
Annahme:
Dim vCprop als Variablevor "Do while ..."
vCprop = ""wenn Cprop:
If rIn!Text1 = "Cprop" Then
O = O & " " & rIn!Text2
end ifGruß piano
Es wäre nett, wenn Du ein Feedback abgeben könntest,
ob der Lösungsvorschlag Dein Problem gelöst hat.
Antwort 9 von piano
Korrektur:
letzer Code muß lauten:
letzer Code muß lauten:
If rIn!Text1 = "Cprop" Then
vCprop = vCprop & " " & rIn!Text2
end ifAntwort 10 von Teddy7
Wäre es in dem Fall nicht sinnvoll, das Einlesen der Daten gleich richtig zu machen ?
Man definiere in Access mit VBA-Codierung eine Textdatei, lese diese zeilenweise und entscheide dann in welches Feld der Accesstabelle man den Wert ablegen will.
Sowas macht ein bisschen Arbeit, lohnt sich aber.
Gruß
Teddy
Man definiere in Access mit VBA-Codierung eine Textdatei, lese diese zeilenweise und entscheide dann in welches Feld der Accesstabelle man den Wert ablegen will.
Sowas macht ein bisschen Arbeit, lohnt sich aber.
Gruß
Teddy
Antwort 11 von Juergene
Hallo Teddy,
ja das hört sich gut an,
nur leider schaffe ich es bisher nicht, dass Access die Daten besser importiert.
Meinst du, dass es einfacher ist, hier eine spezielle Importfunktion zu erstellen als die Daten nachträglich umzuschaufel?
Grüße
Juergen
ja das hört sich gut an,
nur leider schaffe ich es bisher nicht, dass Access die Daten besser importiert.
Meinst du, dass es einfacher ist, hier eine spezielle Importfunktion zu erstellen als die Daten nachträglich umzuschaufel?
Grüße
Juergen
Antwort 12 von Teddy7
Hallo Juergen !
Naja - die bisherigen Daten wirst Du wohl konvertieren müssen, aber für die Zukunft kannst Du es Dir wesentlich bequemer machen.
Die Zugriffsroutine zu schreiben macht ein bisschen Arbeit, aber danach sollte der Ablauf automatisiert sein.
Wenn man z.B. täglich eine oder mehrere Textdateien zu verarbeiten hat, dann kann man sogar ein Verzeichnis nach neuen Dateien durchsuchen und diese dann gezielt öffnen und verarbeiten.
Gruß
Teddy
Naja - die bisherigen Daten wirst Du wohl konvertieren müssen, aber für die Zukunft kannst Du es Dir wesentlich bequemer machen.
Die Zugriffsroutine zu schreiben macht ein bisschen Arbeit, aber danach sollte der Ablauf automatisiert sein.
Wenn man z.B. täglich eine oder mehrere Textdateien zu verarbeiten hat, dann kann man sogar ein Verzeichnis nach neuen Dateien durchsuchen und diese dann gezielt öffnen und verarbeiten.
Gruß
Teddy

