Hallo Access-Profis
Folgendes Ding der Möglichkeit:
Tabelle tblOverview enthält Kunden. Die letzte Spalte enthält leider in einer einzigen Zelle Aktivitäten beim Kunden. Das sieht etwa so aus:
01.01.2011
- Kunde Kontaktiert
- Vertrag gesandt
02.01.2011
- Vertrag erhalten
- weitere Schritte besprochen
03.01.2011
- ...
Ziel wäre für jeden Arbeisschritt einen neuen Datensatz in der tblHistory. Ausserdem soll jedem Arbeitsschritt das Vorangehende Datum in ein separates Feld zugewiesen, sowie die ParentID des Kunden mitgegeben werden. Felder in der tblHistory: KundenID, Datum, Arbeitschritt.
Habe diese Funktion gefunden, die alles vor 2x Zeilenschaltung in ein separates Feld schreibt.
Function TxtVBCRLFSplit(MyText As String, Num As Integer)
Dim sMyText As Variant
sMyText = Split(MyText, vbCrLf)
If UBound(sMyText) >= Num - 1 Then
TxtVBCRLFSplit = sMyText(Num - 1)
Else
TxtVBCRLFSplit = "#FEHLER#"
End If
End Function
welche dann via AktualisierungsAbfrage: TxtVBCRLFSplit([Kunden History];1) ausgeführt wird.
Allerdings wird so dem Kundendatensatz je eine neue Spalte angefügt.
Besten Dank jetzt schon für alle Hirnereien.
Daniel
Hallo,
statt mit einer Aktualisierungsabfrage zu arbeiten, schreibe eine Funktion, die genau(!) die "zielführenden" Schritte erledigt.
Recordset öffen und mittels Schleife durchlaufen.
Bei jedem Durchgang (jedem Kunden) das Memo-Feld mit der Funktion (die vermutlich aber noch nicht das macht, was erforderlich ist. Ich sehe da nur die Möglichkeit, einen "Datumsblock" so zu erkennen, als dass jede Zeile auf ein gültiges Datum am Zeilenanfang getestet und solange Zeile für Zeile eingelesen wird, bis ein weiteres Datum gefunden ist) in die einzelnen Datumsblöcke splitten.
Nach jedem solcher Splits den Block selber (wenn noch nicht vorher durch den "Datumstest" geschehen) aufteilen in das am Anfang stehende Datum und die nachfolgenden Textzeilen . Sodann die einzelnen Werte in einen neuen Datensatz eines zweiten Recordsets (Basis tblHistorie) schreiben.
vielen Dank für die prompte Antwort.
Die Arbeitsschritte kann ich mir vorstellen. Beim Code / Funktion wird's schon schwieriger, beschäftige mich erst steit ein paar Tagen mit VBA. kann jemand ein Beispiel platzieren?
ich denke da müsste man mit der splitfunktion etwas machen.
schreibe ich aber jede zeile in eine separate tabelle mit übernahme der ID als Fremdschlüssel?
gruss, daniel
Hallo,
ja, die Split-Funktion erlaubt es , den Gesamttext im Feld zeilenweise aufzuteilen:
Dim Zeilen()
Zeilen=Split(Me!LetzteSpalte,vbCrLf)
Wieso separate Tabellen?
"Ziel wäre für jeden Arbeisschritt einen neuen Datensatz in der tblHistory."
Das willst Du doch...
genau, aktuell befinden sich alle zeilen in der tblKunden im memofeld "history".
jede zeile sollte nun als separater datensatz in die tblHistory, jeweils mit ID des Kunden und Datum aus Memofeld.
Mir fehlt der Befehl um die gesplitteten Zeilen in die tblHistory zu schreiben.
Hallo,
erstell einen Recordset mit Basis zu tblHistorie und füge die einzelnen DS mit rs.AddNew ein.
Oder benutz eine Anfügeabfrage (passend zusammengebauter SQL-String) und führe den mit Currentd.Execute (zum Testen auch mit Docmd.RunSQL) aus.
Ich komme dem Ziel näher...
Mit untenstehendem Code extrahiere ich die einzelnen Zeilen des Memofelds 'Freetext' der tblOld nach tblNew in einzelne Datensätze. Dabei wird die ID des Datensatzes aus tblOld jedem neuen Datensatz im Feld FI hinzugefügt.
Nun stehe ich wieder an (wen wunderts nach 2 Wochen Access Erfahrung und keinerlei Informatikausbildung...) Das Datum sollte auch noch für jeden neuen Datensatz geschrieben werden - dieses befindet sich im Memo als Titel
Bsp eines Memofelds
01.01.2011
- Kunde angerufen
- Vertrag versandt
05.03.2011
- Vertragsabschluss erfolgreich
- etc.
Natürlich sollen nur die Aktionen unter dem Datum eigene Datensätze werden, mit dem entsprechenden Datum im Titel des Textblocks in einem separaten Feld. Aktuell schreibt mein Code auch für das Datum einen separaten Datensatz, was natürlich unsinn ist.
Sub SplitMemo()
Dim rstOld As DAO.Recordset, rstNew As DAO.Recordset
Dim items As Variant, thing As Variant
Set rstOld = CurrentDb.OpenRecordset( _
"SELECT ID, Freetext FROM tblOld", _
dbOpenSnapshot)
Set rstNew = CurrentDb.OpenRecordset( _
"tblNew", _
dbOpenTable)
Do While Not rstOld.EOF
items = Split(rstOld!Freetext, vbCrLf)
For Each thing In items
rstNew.AddNew
rstNew!FI = rstOld!ID
rstNew!Freetext = thing
rstNew.Update
Next
rstOld.MoveNext
Loop
rstNew.Close
Set rstNew = Nothing
rstOld.Close
Set rstOld = Nothing
End Sub
hier 2 screenshots damit man sich das besser vorstellen kann.
history_im_excel (vorher)
tblhistory (nach dem laufen des skripts)
nun
- wie extrahiere ich das datum in ein separates feld einer jeden aufgabe?
- wie unterdrücke ich den laufzeitfehler 94 "unzulässige verwendung von null" (passiert falls nichts im history-feld zu extrahieren vorhanden ist)
grüsse aus bern
[Anhang gelöscht durch Administrator]
Hallo,
-- In der "Ding"- Schleife eine Prüfung einbauen ob ein "Ding" ein Datum darstellt, dieses in eine temp-Variable schreiben und in der Schleife solange weiterarbeiten, bis das nächste Datum auftaucht. Die temp-Variable dabei für jeden neuen Datensatz mit in die Tabelle schreiben.
-- entweder mit der nz()-Funktion das Feld "Freetext" durch einen Leerstring ersetzen , bzw. mit der ISNull()-Funktion testen oder besser gleich beim OpenRecordset im SQl-String die Datensätze filtern: SELECT ID, Freetext FROM tblOld Where Freetext is not null
Franz,
Ich bin dir wirklich dankbar - lerne viel mit dir.
Die Fehlermeldung wegen leeren Feldern habe ich weggekriegt.
Mit der Datumsprüfung brauche ich weitere Unterstützung google kann mir bis jetzt nicht helfen - keine Ahnung wie ich da beginnen soll. Temporäre Variable?! Puh..
Gruss aus Bern
Daniel