Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Spalte in Tabelle aufteilen

Begonnen von Torsten., Januar 15, 2011, 13:10:06

⏪ vorheriges - nächstes ⏩

Torsten.

Hallo,
ich habe folgende Situation:
Access 2002
In einer Tabelle mit 70.000 Datensätze ist u.a. eine Spalte (Textformat)
die Eigenschaften enthält die ich in einzelne Spalten aufgeteilt haben muß.
Der Inhalt pro Datensatz ist per Semikolon getrennt.
Beispiel
1. Datensatz:|jung;dynamisch             |
2. Datensatz:|jung;dynamisch;kreativ |
3. Datensatz:|jung                               |
... u.s.w.
Ist es möglich diese 3 Eigenschaften in 3 Spalten zu bekommen?
z.B. wie folgt
|jung|dynamisch|           |
|jung|dynamisch|kreativ|
|jung|                 |          |

Kann mir da jemand helfen?

lumbumba

#1
in etwas so:
Code ("Ohne Gewähr") [Auswählen]


dim rs1 as dao.recordset
dim rs2 as dao.recordset
dim s as string, sf() as string
dim i as long
set rs1=currentdb.openrecordset(DeineUrsprungsTabelle)
set rs2=currentdb.openrecordset("Select sp1, sp2, sp3 from DeineNeueTabelle")

do while rs1.eof = false
s = rs1(NamederTextspalte)
sf() = split(s,";")
rs2.Addnew
for i = 0 to ubound(sf)
    rs2(i) = sf(i)
next
rs2.Update
rs1.movenext
loop




---

Torsten.

Hi,
vielen Dank zunächst.
Komme damit aber nicht weiter.
Bitte helfe:
Wenn kopiert wohin mit dem Code?

lumbumba

Zunächst einmal den Code kannst du nicht so einfach übernehmen, denn in Ermangelung deiner Datenstruktur, sind die Tabellen- und Spaltennamen frei gewählt. den Code hinterlegst du dann am besten auf einen Buttonklick.
---

Torsten.

Mit Buttonklick kann ich nichts anfangen,
kannst Du es mir etwas genauer erklären?

oma

#5
Hallo,

vielleicht hilft dir ein etwas "leichterer" Code:

Public Function Part(pString As String, pDelimiter As String, pPart As Integer) As String
'Teile aus String erstellen

Dim pArray As Variant

   pArray = Split(pString, pDelimiter)
   
   If Not IsNumeric(pPart) Then Exit Function
   If pPart - 1 <= UBound(pArray) Then Part = pArray(pPart - 1)
 
End Function


den Code einfach in ein Modul deiner DB kopieren u. dann eine Abfrage:

select Textfeld, Part([Textfeld],"; ",1) AS Teil1, Part([Textfeld],";",2) AS Teil2, Part([Textfeld],";",3) AS Teil3
from DeineTabelle


gegebenfalls kannst du noch mehrere Teile zufügen u. aus Abfrage kann gegebenfalls eine Tabellenerstellungsabfrage gemacht werden.


Gruß Oma


PS: wenn du mit einen Buttonklick nichts anfangen kannst, wird das ganze schwierig:
das ist ein Ereignis: Beim Klicken, dass man auf ein erstellten Button anwenden kann.

nichts ist fertig!

Torsten.

Hi, vielen Dank für die Unterstützung.
Frage zum Code für die Abfrage:
- ist es richtig, dass ich für "Textfeld" den Namen der Spalte angebe? Im Beispiel "Eigenschaft"  - und das 3mal
- für "DeineTabelle" die Tabelle worin die Spalte "Eigenschaft" enthalten ist?

Gruß

database

Hallo,

ja, das ist richtig.
Allerdings macht der Code noch nicht ganz das was du brauchst, er reagiert nämlich nicht darauf wenn die Reihenfolge der Einträge unterschiedlich ist
und die SQL der Abfrage enthält hier ...  Part([Textfeld],"; ",1) ... nach dem Semikolon ein Leerzeichen zuviel.
Das muss raus, sonst füllt die Abfrage die erste Spalte mit dem Ganzen Text.

@oma  ...    stimmt, mir entgeht fast nix ...    :D ;) ;D

Der Code, den ich hier poste ist zwar nicht einfacher aber er teilt die Textteile in die richtigen Spalten auf.
Zum 'Spielen' habe ich dir ein kleines Beispiel angehängt.
Öffne das Formular in der Entwurfsansicht, setze einen Haltepunkt auf die Kopfzeile der Private Sub...  und klick dann auf den Button.
Du kannst anschließend mit F8 den Code schrittweise durchlaufen und siehst was passiert.



Private Sub cmdSplitt_Click()

Dim splitter() As String
Dim strSQL1 As String, strSQL2 As String, strSQL3 As String

Dim rst As DAO.Recordset

On Error Resume Next

'Access Meldungen unterdrücken
DoCmd.SetWarnings False

'Tabelle einlesen
Set rst = CurrentDb.OpenRecordset("SELECT ID, DeinMischfeld FROM DeineTabelle")

rst.MoveFirst

Do While Not rst.EOF
   'Mischtext ins Array laden
   splitter = Split(rst!DeinMischfeld, ";")

   'Text-Aufteilung vornehmen und in die Einzelfelder eintragen
   Select Case Left(splitter(0), 1)
       Case "j"
           strSQL1 = "UPDATE DeineTabelle SET feld1='" & splitter(0) & "' WHERE ID=" & rst!ID
           DoCmd.RunSQL strSQL1
           If Left(splitter(1), 1) = "d" Then
               strSQL2 = "UPDATE DeineTabelle SET feld2='" & splitter(1) & "' WHERE ID=" & rst!ID
               DoCmd.RunSQL strSQL2
           End If
           If Left(splitter(2), 1) = "k" Then
               strSQL3 = "UPDATE DeineTabelle SET feld3='" & splitter(2) & "' WHERE ID=" & rst!ID
               DoCmd.RunSQL strSQL3
           End If
       
       Case "d"
           strSQL2 = "UPDATE DeineTabelle SET feld2='" & splitter(0) & "' WHERE ID=" & rst!ID
           DoCmd.RunSQL strSQL2
           If Left(splitter(1), 1) = "k" Then
               strSQL3 = "UPDATE DeineTabelle SET feld3='" & splitter(1) & "' WHERE ID=" & rst!ID
               DoCmd.RunSQL strSQL3
           End If
       Case "k"
           strSQL3 = "UPDATE DeineTabelle SET feld3='" & splitter(0) & "' WHERE ID=" & rst!ID
           DoCmd.RunSQL strSQL3
   End Select
   'nächster Datensatz
   rst.MoveNext
Loop

End Sub



Mach eine KOPIE deiner Datenbank, bevor du herumexperimentierst!!!!!

Den Code kopierst du ins Ereignis 'Beim Klicken' eines Button auf einem Formular, erstellst in der betroffenen Tabelle 3 Felder (feld1, feld2,feld3)
Passe die Namen der Felder und der Tabelle im Code an und klick dann mal auf den Button..

Viel Spaß und gutes Gelingen!  ;)

[Anhang gelöscht durch Administrator]

Torsten.

Hallo,
es hat funktioniert.
Vielen Dank an alle die mir geholfen haben.
Jetzt gibts Werder auf Sky und danach geht es mit der nächsten Frage weiter.

Freundliche Grüße

database

SUPER  :D ;D ;)

bitte diesen Thread in DEINEM ersten Beitrag auf 'gelöst' setzen - DANKE!

oma

Hallo,

@Peter: das Leerzeichen habe ich extra eingebaut um zu testen, ob du heute auch fit bist! ;D ;D

Gruß Oma
nichts ist fertig!

database