Access Daten aus Textfeld in Ja/Nein-Felder ausles

Liebe/-r Experte/-in,
ich habe folgendes Problem

in einer Access Datenbank sind in einem Textfeld viele Informationen gemeinsam gespeichert, die ich

möglichst in einem Schritt trennen und auslesen will.

Also
Max 206 209 509
Fred 207 206 509 208 209
Paul 509 206 507 207

Daraus sollen einzelne Ja/nein-Felder werden also

Max Feld 206: Ja Feld 207: nein Feld 208: nein Feld 209: ja Feld 509: ja

Fred Feld 206: Ja Feld 207: ja Feld 208: ja Feld 209: ja Feld 509: ja

Fred Feld 206: Ja Feld 207: ja Feld 208: ja Feld 209: ja Feld 509: ja

Einzeln schaffe ich es gut, also alle Angaben für das neue Feld 206 aus dem langen String mittels InStr

auszulesen und über eine Änderungsabfrage in dem Ja/Nein Feld zu speichern.

Ich will das aber nicht für jedes Code-Feld einzeln machen, sondern suche nach einer eleganten Lösung,

dass in einem Zug zu machen.

Danke schon mal für die Hilfe.

Viele Grüße
Uwe

Hallo,

bevor ich da Code generiere, der letztendlich keinen zielführenden Sinn und Zweck hat, solltest Du die Hintergründe und Datensituation dieses Vorhabens etwas ausführlicher und genauer beschreiben.

Gruß
Franz, DF6GL

Hi Uwe,

ich würde folgenden Ansatz wählen:
Per VBA zunächst den String in seine Einzelbestandteile zerlegen
indem man immer nach den Leerstellen sucht, die ja hoffentlich immer vorhanden sind.
Die Teile in Variablen speichern und dann wenn die Variable zum Feld passt den Wert in das Feld übergeben.

Das Ganze in eine „schöne“ Schleife und du solltest ein vernünftiges Ergebnis kriegen.

Ich hoffe ich hab dir mit dem Ansatz schon geholfen.
Wenn du noch weitere Hilfe brauchst meld dich.

Gruß
Marco

Hi Uwe

Da wäre wohl mal eine grundlegende Frage zu klären: Warum kommen diese Daten nicht normalisiert daher? Und warum werden die Daten nicht in unterschiedliche Felder eingelesen? Oder warum und wie werden die Daten in das Textfeld gelesen? Mir scheint, die Arbeit an der Struktur würde hier einiges vereinfachen!
Empfehlung: die Daten sollten midestens in der NF3 daherkommen, hier scheint aber nicht mal NF1 erfüllt.

LG, Henri.

Hallo
die Daten kommen so aus einer großen Datenbank und sind nun mal so wie sie sind; Ich muss sie so weiter verarbeiten wie ich sie bekomme und kann da zwar den Hinweis geben, dass Einzelfelder schneller weiter zu verarbeiten wären, aber mehr auch nicht.

Gruß Uwe

Hallo
dahinter stecken verschiedene Funktionen und Funktionalbereiche.

Ich muss die Leute dann den einzelnen Funktionsbereichen zuordnen und einen Suchen aufbauen.

Der Nutzer soll dann suchen können Funktion 206 in 509, oder Funktion 206 und 207 in 508.
Dazu brauche ich die Codierung, die hier in einem großen String ankommt, getrennt in verschiedenen Feldern. Denke, dass dann die Verarbeitung leichter wird und auch der Aufbau der Suche.

Gruß Uwe

Hallo,

dahinter stecken verschiedene Funktionen und
Funktionalbereiche.

Ich muss die Leute dann den einzelnen Funktionsbereichen
zuordnen und einen Suchen aufbauen.

ok, Du hast aber nichts über den Daten- und Tabellenaufbau gesagt…

Der Nutzer soll dann suchen können Funktion 206 in 509, oder
Funktion 206 und 207 in 508.
Dazu brauche ich die Codierung, die hier in einem großen
String ankommt, getrennt in verschiedenen Feldern.

Dass die Funktionen in einem String zusammengelegt sind, ist dann wohl die Ausgangssituation. Ein Aufteilen in unterschiedliche Felder pro Datensatz ist der FALSCHE Weg.

Denke, dass

dann die Verarbeitung leichter wird und auch der Aufbau der Suche.

Nein, garantiert nicht…
Der Tabellenaufbau muss (!) in etwa so aussehen:

tblPersonen (Definition aller möglichen Personen)
PersID (Primärschlüssel, Autowert)
Pers_PersonalNR (Text, oder Zahl,Long)
Pers_Vorname (Text)
Pers_Nachname (Text)
.
.

tblFunktionen (Defintion aller möglichen Funktionen)
FKTNR (Primärschlüssel, Zahl,Long)
FKT_Bezeichnung (Text)
.
.

tblPersonalfunktionen (Zuordnung Funktion(en) zu Person(en)
PFKTID (Primärschlüssel, Autowert)
PFKT_PersID (Fremdschlüssel zu tblPersonen, Zahl, Long)
PFKT_FKTNR (Fremdschlüssel zu tblFunktionen, Zahl, Long)
PFKT_Bezeichnung (Text)
.
zusätzlicher eindeutiger Index über die Felder „PFKT_PersID“ und " PFKT_FKTNR", wenn eine bestimmte Person dieselbe Funktion nicht zweimal innehaben darf.

Beziehungen:

tblPersonen —1:n— tblPersonenfunktionen —n:1— tblFunktionen

Sodann eine Funktion, die die vorhandenen Funktionen aus den Strings ausliest und zum Einen die Tabelle tblFunktionen füllt und zum Anderen die Zuordnungen in tblPersonalfunktionen erledigt.

In bestimmten Fällen könnte auf die Tabelle tblFunktionen verzichtet werden, je nachdem, was sonst noch hinter der DB steckt, bzw. von ihr geleistet werden soll.

Gruß
Franz, DF6GL

Hallo Uwe,

habe dir gerade eine Mail mit einem Word Dokument als Anlage geschickt, da die Antwort doch sehr lang ausfällt. Ich hoffe, das hilft dir dann weiter.
LG Albert

Access Daten aus Textfeld
Hi,

ganz verstehe ich die Frage nicht,

wen du per InStr schaffst die Nummern auszulesen und auch eine Erstellungsanfrage machst ist ja alles gelöst.
Die Nummer gibt den Feldnamen an und auch Nein und Ja machst du true und false.

Bitte stelle dir Frage etwas genauer und sende deinen code mit.

Alois

Hallo Uwe,

die Fähigkeiten von Access-SQL sind sehr beschränkt.
Mir fällt da nur eine entsprechende Schleife ein, die erstmal durch einen String mit allen Werten läuft (206,209,509, …). Wenn der da ist.

Dann könnte man pauschal einen oder mehrere SQL-Strings zusammenbauen.

Allerdings frage ich mich, ob es nciht eine elegantere Lösung gibt? Jede Menge Ja/Nein Felder sind nicht gerade optimal.
Was willst denn damit erreichen?

Gruß
Proteus

Hallo Uwe,

eine elegantere Lösung als jedes Feld einzeln durchzugehen ist mir auch nicht bekann.
Außer: Du designst die Komplette Datenbank/Formulare für die Erfassung um, daß die Werte gleich in die entsprechenden Felder geschrieben werden.

Gruß
Ingo

ich habe in einer normalen Abfrage mittels InStr
das Problem für genau ein Datenfeld und einen Code gelöst.

Sobald ich das für zwei, drei, vier … Codes und Felder in einem Zug (in einer Abfrage) realisieren will, klappt es nicht.

20 Abfragen für 20 Codes einzeln zu erstellen ist zu mühsam und uneffektiv.

Gruß Uwe

Am Ende soll für den Nutzer eine übersichtliche und gut funktionierende Suche stehen.

Er sucht Personen, die die Codes
206, 207 und 509 haben
oder Personen, die 207 und 507 haben
oder Personen, die 206, 207, 208 und 507 haben

so in der Art.

Gruß Uwe

Geht leider nicht, weil ich die Urdaten eben in so einem Riesenstring aus einer großen Datenbank bekomme;
Da kann ich leider keine Wünsche äußern…

Hallo Albert,

konnte dein Word-Doc leider nicht finden.
Bitte schick es als Anhang an [email protected]

Danke Uwe

Hallo Uwe,

also wenn du nicht mehrere 10-Tausen Personen in der Tabelle hast, dann würde ich das über eine einzige SQL-Abfrage machen. (like ‚*206*‘ AND like ‚*502*‘)
und die entsprechenden Codes in ein Feld mit Komma getrennt schreiben.
Zie viele Felder belasten die DB nur und irgendwann ist hat Schluss, und wird außerdem recht groß.

Richtigerweise (Normalisierung) wäre hier natürlich eine n-Tabelle mit den Codes pro Person. Das bleibt dann auch performant.

Damit gibt es in der n-tabelle nur 2 spalten: index der haupttabelle und den Code. Hat den Charme, dass über den SQL mit Join nicht mit LIKE gearbeitet werden muss.

Das wäre eigentlich die richtige Lösung.

Gruß
Proteus

Hallo Uwe,
die Antwort auf deine Frage: Sorry, aber Du musst das für jedes Code-Feld separat machen, da ja unterschiedlich lange Infos enthalten sind. Eine Möglichkeit bietet Dir Excel mit der Funktion Text in Spalten.
Gruß Reinhold

Hallo Uwe,

Grundsätzlich sehe ich da kein Problem, wenn Du es mit der Split-Funktion angehst.
Für eine genaue Lösung brauche ich aber noch Infos :

  • Ist die Anzahl/Definition der Zielfelder eingeschränkt? Dann hilft eine einfache Select-Klausel… also das Array, das Split liefert, in einer foreach Schleife mit einem Select auswerten (vorher evtl. alle Felder auf NEIN setzen)

  • ist weder die Anzahl noch die Definition vorherbestimmbar,geht es zwar auch, ist dann aber etwas aufwendiger.

Sollten noch Fragen sein, melde Dich einfach noch mal…
Burkhard

Hallo Uwe,

eine Möglichkeit wäre noch, für jeden Wertetyp, also 206, 209 etc. eine eigene Update-Anweisung zu erstellen und über die Tabelle laufen zu lassen.

(Update Set [206] = True WHERE INSTR(,‚206‘) > 0)

Ich würde das alles in VBA-Code einbinden (benutze selber keinerlei der fest hinterlegten Abfragen in Access). Ist nur die Frage, wie viel Erfahrung Du damit hast.

Gruß
Ingo

Geht leider nicht, weil ich die Urdaten eben in so einem
Riesenstring aus einer großen Datenbank bekomme;
Da kann ich leider keine Wünsche äußern…

Hallo Ingo,

das scheint mir eine Supi-Lösung. Nur an der Umsetzung hapert es noch bei mir.

Habe ein Formular erstellt - Button namens „Aufteilen“ rein und beim Klick soll die Aktion mit dem Aufteilen der Codes ausgeführt werden
Die Probe-Tabelle heißt „alle_dopp“ das erste Feld zum Probieren „206“ darin soll Ja/Nein abgelegt werden, ob in dem langen String „Kollschl“ der Code 206 steht; später dann erweitert auch für die anderen Codes

Private Sub Aufteilen_Click()
Update alle_dopp

Set 206 = True
WHERE (InStr(Kollschl, „206“) > 0)

End Sub

Im Moment kommt noch die Fehlermeldung „Sub oder Function nicht definiert“
Hast du eine Idee, wo ich noch was falsch geschrieben habe (vielleicht im Syntax)?

Danke und Gruß Uwe