PDA

Vollständige Version anzeigen : Datensätze aus einer Zeile ziehen und einen neuen Datensatz erzeugen


Zuri
21.01.2008, 17:12
Hallo zusammen,

ich habe eine Tabelle mit zwei Spalten.

In der Spalte A stehen Nummern, die nur einmal vorkommen. In der Spalte B stehen Werte, die durch Komma und einen Leerschritt getrennt sind.

Beispiel:

Spalte A / Spalte B

1 / 564355627D, 547638432D, 746372897D
2 / 657458394D, 563782948D
3 / 768459305D, 674839204D, 674839458D


Ich möchte jetzte 1 : 1 Beziehung herstellen von dem Wert in Spalte A zu jedem Wert der Spalte B.

Beispiel:

Spalte A / Spalte B

1 / 564355627D
1 / 547638432D
1 / 746372897D
2 / 657458394D
2 / 563782948D
3 / 768459305D
3 / 674839204D
3 / 674839458D

Das Komma und der Leerschritt wäre wahrscheinlich das Kriterium zum Abgreifen? Wobei es hier eventuell Probleme beim ersten oder letzten Wert geben könnte?

Kann ich das Problem mit einer SQL-Funktion im Access lösen?

Es kann allerdings noch ein Problem geben. Im Moment sind die Daten noch nicht nach Access importiert worden. Sie befinden sich in einer Exceltabelle. In der Exceltabelle könnten zum einen in der Spalte B Zeilenumbrüche vorhanden sein und vor allem mehr als drei Werte wie im o. g. Beispiel. Ich schätze über den Daumen gepeilt, dass es eventuell bis maximal 50 Werte sein können, die in Spalte B durch Komma und Leerschritt getrennt sind. Ich weiß gar nicht, ob ich die Spalte B so überhaupt nach Access importiert bekomme. Da gibt es doch sicherlich eine Längenbeschränkung? :(

Ist Access hier überhaupt der richtige Lösungsweg? Wäre die Aufgabenstellung eventuell besser im Excel-Forum aufgehoben? :confused:

Ich hoffe, dass Ihr mir die richtige Richtung weißt, wie ich die Aufgabe am besten löse.

Viele Grüße aus

Stuttgart

Zuri

:rolleyes:

Arne Dieckmann
21.01.2008, 17:21
Importiere oder verknüpfe die Excel-Datei, so wie sie ist. Lege eine entsprechende Zieltabelle an.

Nun durchlaufe die Quelldaten mittels Recordset, lasse Replace() auf SpalteB los, um die manuell eingefügten Umbrüche loszuwerden. Generiere dann mittels Split() ein Array aus SpalteB und durchlaufe nun dieses Array von vorn bis hinten (UBound() hilft). Füge dann jeden Wert in der Zieltabelle an.

So ungefähr sollte das mit Verweis auf DAO gehen:
Dim db As Database
Dim rsQ As DAO.Recordset, rsZ As DAO.Recordset
Dim i As Long
Dim v As Variant

Set db = CurrentDb
Set rsQ = db.OpenRecordset("Quelle")
Set rsZ = db.OpenRecordset("Ziel")

Do Until rsQ.EOF
v = Split(Replace(rsQ![SpalteB], vbCrLf, ""), ",")
For i = LBound(v) To UBound(v)
rsZ.AddNew
rsZ![SpalteA] = rsQ![SpalteA]
rsZ![SpalteB] = Trim(v(i))
rsZ.Update
Next i
rsQ.MoveNext
Loop

rsQ.Close
rsZ.Close
Set rsQ = Nothing
Set rsQ = Nothing
Set db = Nothing

Zuri
21.01.2008, 17:44
Hallo Arne,

für das Erstellen der SQL-Funktion fehlt mir wahrscheinlich leider noch ein bischen die Erfahrung. :(

Der Lösungsansatz mit dem verknüpfen hört sich aber schon sehr gut an. Ich werde also die Excel-Tabelle auf alle Fälle ins Access verknüpfen. :top: Ich weiß nicht ob das Importieren geht, weil eventuell die Werte in Spalte B zu lang sind?

Dann erzeuge ich die Zieltabelle mit den neuen leeren Spalte A und B, die ich mit leben füllen muß!

Bei der Funktion brauche ich leider noch Unterstützung. Ich kenne mich leider nur mit den Abfragen aus. Ich kann doch sicherlich Deine Befehle alle in einer SQL-Funktion einbauen oder muß ich hier mehrere Arbeitsschritte ausführen in dem ich verschiedene Abfragen ausführe?
:(

Wahrscheinlich ist es nun notwendig, dass ich die Excel-Tabelle noch ein wenig genauer beschreibe? Mich interessieren aus der Excel-Tabelle zwei Spalten, die ich oben A und B genannt habe. Es gibt hier aber noch mehr Spalten, die mich aber eigentlich nicht weiter interessieren. Sind die zusätzlichen Spalten schlimm oder muß ich erst einmal eine neue Excel-Tabelle erzeugen wo nur die Spalten A und B stehen?

Viele liebe Grüße aus Stuttgart nach Berlin

von

Zuri

:rolleyes:

Arne Dieckmann
21.01.2008, 17:46
Ich habe oben mal Code angehängt. Das Ganze ist eine VBA-Lösung, mit SQL sollte das eher nicht gehen. Die anderen Spalten sollten nicht stören, da diese im Code nicht angesprochen werden.

Gruss nach Stuttgart (seit wann bist du denn da?).

Zuri
21.01.2008, 17:47
Hallo Arne,

danke für die Visual-Basic Lösung! :boah:

Ich konnte gar nicht so schnell antworten. In der Zwischenzeit hast Du mir ja schon eine ganze Visual-Basic-Lösung zusammengebaut! :top:

Ich habe die Daten im Moment auf Arbeit. Ich werde, die Visual-Basic Lösung morgen früh im Büro gleich testen. Die Visual-Basic Formatierungen müßte ich soweit hinbekommen.

Ersteinmal vielen Dank.

Viele liebe Grüße nach Berlin

von

Zuri

:rolleyes:

p.s. : Ich habe unsere wunderschöne Bundeshauptstadt verlassen und bin in den sonnigen Süden gezogen! :sun:

Zuri
22.01.2008, 08:08
Hallo zusammen,

ich laufe auf einen Fehler beim Kompilieren!

Function Baumuster()

Dim db As Database
Dim rsQ As DAO.Recordset, rsZ As DAO.Recordset
Dim i As Long
Dim v As Variant

Set db = CurrentDb
Set rsQ = db.OpenRecordset("Klassenliste NFZ Stamm")
Set rsZ = db.OpenRecordset("Tabelle2")

Do Until rsQ.EOF
v = Split(Replace(rsQ![Feld8], vbCrLf, ""), ",")
For i = LBound(v) To UBound(v)
rsZ.AddNew
rsZ![Feld7] = rsQ![Feld7]
rsZ![Feld8] = Trim(v(i))
rsZ.Update
Next i
rsQ.MoveNext
Loop

rsQ.Close
rsZ.Close
Set rsQ = Nothing
Set rsQ = Nothing
Set db = Nothing

End Function

Er merkert die zweite Zeile "db As Database" an.

Ich habe übrigens keine Excel-Tabelle eingebunden, sondern habe aus der Excel-Tabelle eine Text-Datei gemacht. Die Text-Datei habe ich nach Access verknüpft.

Wahrscheinlich fehlt jetzt nur noch eine Kleinigkeit?

Viele liebe Grüße aus Stuttgart

von

Zuri

:rolleyes:

Arne Dieckmann
22.01.2008, 08:30
Dann hast du bestimmt das hier übersehen:

So ungefähr sollte das mit Verweis auf DAO gehen:


S. auch FAQ 7.11 (Link in meiner Signatur).

Zuri
22.01.2008, 11:54
Hallo Arne,

vielen Dank für die Ratschläge! Ich habe die fehlenden DAO unter Verweise eingebunden. Ich hatte noch einige Leerfelder in den Spalten. Ich mußte den Code noch ein bischen anpassen.

Function Baumuster()

Dim db As Database
Dim rsQ As DAO.Recordset, rsZ As DAO.Recordset
Dim i As Long
Dim v As Variant

Set db = CurrentDb
Set rsQ = db.OpenRecordset("Klassenliste NFZ Stamm")
Set rsZ = db.OpenRecordset("Tabelle2")

Do Until rsQ.EOF
If Not IsNull(rsQ![Feld8]) Then
v = Split(Replace(rsQ![Feld8], vbCrLf, ""), ",")
For i = LBound(v) To UBound(v)
If rsQ![Feld7] <> " " Then
rsZ.AddNew
rsZ![Feld7] = rsQ![Feld7]
rsZ![Feld8] = Trim(v(i))
rsZ.Update
End If
Next i
End If
rsQ.MoveNext
Loop

rsQ.Close
rsZ.Close
Set rsQ = Nothing
Set rsQ = Nothing
Set db = Nothing

End Function



Viele liebe Grüße aus Stuttgart

von

Zuri

:rolleyes:

Zuri
23.01.2008, 11:24
Hallo zusammen,

ich habe das Thema wieder aufgemacht! Leider habe ich mich zu früh gefreut. Ich habe heute noch ein Problem bemerkt, mit dem ich fast schon gerechnet habe.

Die Funktion funktioniert!

Das Problem ist, dass mir aufgrund der Längenbeschränkung von 255 Zeichen in der Spalte [Feld 8] Daten fehlen.

Ich habe die Daten nicht importiert, sondern habe eine Textdatei eingebunden. Aber auch hier werden die Daten abgeschnitten angezeigt.

Ich sehe ein, dass die Funktion natürlich nur die Daten bearbeiten kann, die tatsächlich da sind. Aber eigentlich sind sie doch da? Es ist ja nicht so, dass ich die Daten importiert habe und die Daten abgeschnitten worden, die Daten werden in der Verknüpfung nur nicht angezeigt.

Sollte man das Problem doch lieber in Excel angehen? Das wäre sehr schade, weil die Funktion doch wunderbar funktioniert.

Viele Grüße aus Stuttgart

von

Zuri

:rolleyes:

Zuri
23.01.2008, 11:49
Hallo zusammen,

ich habe es am Rande der Verzweiflung hinbekommen. :)

Ich habe [Feld 8] als Memo eingebunden. Die Daten werden zwar beim Öffnen der Verknüpfung nicht angezeigt aber dafür trotzdem bearbeitet! ;)

Viele liebe Grüße aus Stuttgart

von

Zuri

:rolleyes: