PDA

Vollständige Version anzeigen : Datensatz beim kopieren prüfen ändern speichern


BSG
20.04.2011, 22:10
Hallo,

ich habe ein problem mit MS Access 2003 VBA.

Ich habe ein Formular mit einer Schaltfläche "Speichern & Weiter".
Dabei wird vom Feld(renr) die daten in das Feld(gsrenr) in der gleichen Tabelle kopiert und ein Kürzel angefügt.

Das Feld(defg) soll nach Feld(gsdefg) kopiert und ein Kürzel angefügt werden.
Hier ist das Problem, die Daten in diesem Feld haben teilweise vorne IAGS/BARE und/oder teilweise hinten -IA/BA angehängt. Das muß beim kopieren, vor dem einfügen im neuen Feld, rausgeschnitten werden.

Es fehlt eine prüf und entfern schleife, die beim kopieren und einfügen checkt, ob die werte vorne und/oder hinten vorhanden sind, die dann rausschneidet, den kürzel anfügt und in das neue Feld(gsdefg) einfügt.


Private Sub save_next_Click()
On Error GoTo Err_save_next_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70

Me!gsrenr = "AL" & Me!renr
Me!gsdefg = "AG" (prüfen und ggf. entfernen von IAGS/BARE bzw. -IA/BA) & Me!defg

DoCmd.GoToRecord , , acNewRec
Exit_save_next_Click:
Exit Sub

Ich habe hier und mit Goolge gesucht und einiges mit trim, replace, remove.. probiert aber nichts funktionierendes auf die beine gestellt.
Hat jemand eine Idee?

maikek
20.04.2011, 22:45
Hallo, und willkommen hier im Forum!
Der Ansatz mit Replace war schon nicht schlecht:
Me!gsdefg = "AG" & Replace(Replace(Me!defg, "IAGS/BARE", ""),"IIA/BA", "")
Zu überlegen wäre evtl., ob das Kürzel nicht in einem eigenen Feld gespeichert werden kann. Wenn später danach gesucht oder gefiltert werden soll, würde ich auf jeden Fall dazu raten. Das Zusammenfügen von zwei Feldern in Abfragen, Berichten, Formularen ist leichter, als hinterher zu trennen oder eine Suche nach Teilen eines Feldes.
maike

Marsu65
20.04.2011, 22:54
Hallo und willkommen im Forum.
die Daten in diesem Feld haben teilweise vorne IAGS/BARE und/oder teilweise hinten -IA/BA angehängt.
Ist der Rest der "Daten" eine Zahl?
Meinst du mit "haben teilweise vorne IAGS/BARE" das alternativ "IAGS" oder "BARE" stehen können oder steht dort wirklich "IAGS/BARE"?
Sind die voran-/nachgestellten Zeichen durch ein bestimmtes Zeichen getrennt z.B. 4711-IA?
Sind die Zeichen immer (zuverlässig) groß geschrieben?

Eine Mögliche Lösung für das Format IAGS/BAREDATEN-IA/BA
Dim sCache As String
...
sCache = "IAGS/BARE47100-IA/BA" 'Me!defg
If InStr(1, sCache, "IAGS/BARE", vbTextCompare) = 1 Then
sCache = Mid(sCache, 10)
End If
If InStrRev(sCache, "-IA/BA") Then
sCache = Mid(sCache, 1, Len(sCache) - 6)
End If
'mit sCache bildest du dann deinen neuen Wert

Du siehst, je genauer und informationsreicher die Frage gestellt wird, desto einfacher ist es eine Lösung zu finden ;)

[Edit]
Maikes Lösung ist die kürzere(und schönere ?!?;)) Geht jedoch davon aus, dass der DATENKERN nicht auch IAGS/BARE usw. beinhaltet ;)

BSG
21.04.2011, 08:50
Hallo,
schonmal danke für die Antworten.
War gestern recht spät habe daher Informationen vergessen.
Also im Feld sind Daten wie z.B.:
IAGS45B980 oder iags45C980
BARE45G980 oder bare45T980
45L980-IA oder 45D980ia
45R980BA oder 45P980-ba

Sie kommen teilweise auch gemischt vor wie z.B.
iags45980-BA oder BARE45980-ia

Es wurde einfach wahllos eingegeben. -> War(!) auch keine "Gültigkeitsprüfung" hinterlegt.
Nach zahlen kann ich nicht trennen, da dazwischen auch Buchstaben sind.
Einfach vorne oder hinten 4 bzw 3 zeichen abschneiden geht auch nicht.

Ich muß also irgendwie beim kopieren die Daten prüfen ob die Werte IAGS, iags, BARE, bare vorne und -IA, -ia, ia, -BA, BA, -ba hinten da sind und diese dann rausfiltern.

Danke für die Hilfe.

maikek
21.04.2011, 10:04
@Marsu: :winken:
Nach Konkretisierung des Problems würde ich aber zu deinem Vorschlag neigen, bei mehr als zwei umeinandergewickelten Replaces wird's dann doch kritisch ...
Entnehme ich das deinem Post richtig, vbTextCompare ist case-sensitiv?
@BSG
Meine Frage ist immer noch, ob das Kürzel wirklich angehängt werden soll/muss oder nicht doch besser in einem gesonderten Feld aufgehoben ist? Würde auch neben den Such- und Filtermöglichkeiten eine spätere Gültigkeitsprüfung erleichtern.
maike

BSG
21.04.2011, 12:09
Hallo,
erstmal danke an euch beiden.

Nachdem es mir zu Blöd geworden ist zum rumtesten, habe ich ein neues Feld angelegt, alle Daten rüber kopiert. Das neue Feld habe ich dann mit

Replace([Datenbankfeld], Suchtext, Ersatztext)

für jede kombination beackert bis nur noch das was ich brauchte übrig blieb.
Ist vielleicht nicht die beste Lösung aber die schnellste Lösung.

Danke nochmal.

ebs17
21.04.2011, 12:32
für jede kombination beackert bis nur noch das was ich brauchte übrig blieb
Dann war das wohl eine einmalige Aktion?
Zum Beseitigen von ungewünschten Bestandteilen könnte man auch ein RegEx.Replace einsetzen.

Marsu65
21.04.2011, 12:36
Hallo!
Unter den genannten Voraussetzungen würde ich das in eine öffentliche Funktion ausgliedern:
Public Function GetKerndaten(ByVal sDaten As String) As String
Dim sCache As String

sCache = sDaten 'Me!defg
'Vorne eliminieren
If InStr(1, sCache, "IAGS", vbTextCompare) = 1 _
Or InStr(1, sCache, "BARE", vbTextCompare) = 1 Then
sCache = Mid(sCache, 5)
End If
'Hinten eliminieren
If InStrRev(sCache, "IA") _
Or InStrRev(sCache, "BA") Then
sCache = Mid(sCache, 1, Len(sCache) - 2)
End If
'evtl. vorhandenes "-" wegzaubern
GetKerndaten = Replace(sCache, "-", "")
'mit GetKerndaten(Me!defg) bildest du dann deinen neuen Wert
End Function


In deiner Sub dann entspr.
Me!gsdefg = "AG" & GetKerndaten(Me!defg)
Du kannst auch die Funktion in einer Aktualiesierungsabfrage verwenden

Mit deinen "Testdaten" funktionierts jedenfalls ;)

Auch solltest du wirklich über Maikes Vorschlag nachdenken, das "AG" vlt. nicht wieder dranzuhängen, sondern in einem eigenen Kennzeichenfeld zu speichern. Wie du siehst, ist das Zusammenführen immer leichter als das Trennen von Daten ;)

@Maike
Wenn ich mich nicht irre, ist vbTextCompare nicht case-Sensitive, vbBinaryCompare dagegen schon.
Meine Glaskugel hatte mir schon nebulös angedeutet, dass Groß/klein gemischt sein könnten ;)

Marsu65
21.04.2011, 18:36
Wenn du dein Problem - wie auch immer - gelöst hast,
bitte den Thread als ERLEDIGT kennzeichnen!