Supportnet Computer
Planet of Tech

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:


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

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



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



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

  • 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

    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

    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:
    Dim vCprop
    als Variable
    vor "Do while ..."
    vCprop = ""

    wenn Cprop:
       
    If rIn!Text1 = "Cprop" Then
          O =  O & " " & rIn!Text2
    end if


    Gruß 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:
    
    If rIn!Text1 = "Cprop" Then
          vCprop  =  vCprop  & " " & rIn!Text2
    end if


    Antwort 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

    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



    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