Neuigkeiten:

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

Mobiles Hauptmenü

Prüfung Text - dann hinzufügen von X

Begonnen von Off147, November 15, 2018, 11:16:58

⏪ vorheriges - nächstes ⏩

Off147

Hallo.
Bin Neu hier ,-)
Zu mir: Leider habe ich keine Ahnung vom Programmieren ... und erst wenig Ahnung von Access. Wollte mich damit jetzt aber befassen ....
Und schon taucht bei mir ein "Einstiegsproblem" auf.
Da ich nicht alles "fertigmachen" will und dann mittendrin Probleme lösen will, gleich meine Frage zum Anfang.
Ich nutze WIN10 mit Access16.

Eine Tabelle mit dem Namen "tbl_aufgaben" wurde erstellt.
Beim zweiten Feld stockt es (schon) - ich habe dort:
ID = Autowert = OK
Bezeichnung = Text = ... Beispielwert "ABC123-18-x"
weitere Felder folgen.

Zur Info: Sonst existiert noch nichts (keine Abfragen, Formulare etc.).

Damit hätte ich beim ausgeben zB folgende Liste:
ABC123-18-a
ABC123-18-b
ABC123-17-a
ABÜ123-17-a
YYZ890-15-a
YYZ890-15-b
YYZ890-15-c
YYZ890-15-d
YYZ891-15-a

Das sah/sieht schon gut aus.
Jetzt möchte ich das ganze natürlich automatisieren (um "Fehler" zu vermeiden/eleminieren).

Mein Ziel ist: Wenn ich eine Bezeichnung eingebe (Tabelle oder Formular?) wie zum Beispiel "ABC123-18" soll Access die Datenbank bzw. das Feld prüfen.
A) Liegt eine/mehrere Übereinstimmung vor, dann prüfe welches Zeichen als letztes da ist (in diesem Fall ist das letzte Zeichen "b") und setze das nächste logische Zeichen (in diesem Fall also "c").
B) Gibt es diese Bezeichnung "ABC123-18" noch nicht, füge den ersten Buchstaben an (wäre dann "a") = ABC123-18-a.

Ich komme mit den Buchstaben hin, da es mit Sicherheit keine 26 werden (oder sind Zahlen bei diesem Problem besser?).

Bitte für einen Anfänger schreiben. Ich danke Euch schon mal im Voraus.

VG
Frank

MzKlMu

Hallo,
das Feld sollte in mehrere Felder aufgeteilt werden. Jeder Teil des Feldes hat ja eine Bedeutung.
In einem Datenbank feld speichert man immer nur einen Wert (1.Normalform, atomare Inhalte).

Erkläre mal die Bedeutung der einzelnen Teile des Textes.
Gruß Klaus

Off147

Hallo Klaus.
Also ...
1) Die ersten 3 Buchstaben (ABC) sind die Anfangsbuchstaben einer Straße (oder ausserhalb von unserer Stadt der Ort). Für die Kurfürstenallee wäre es also KUR (für Kassel wäre es KAS).

2) Die nächsten drei Zahlen sind die Hausnummer. Für die Hausnummer 99 wäre das daher also die 099.

3) Die nächste Zahl ist die Jahreszahl. Das ist aber nicht gleichzusetzen mit dem aktuellen Jahr. für 2017 wäre es daher die 17.

4) Und dann kommt eben die weitere fortlaufende Bezeichnung A-Z ... in dewm Fall also z.B. ein c.

Ich hatte mir die Zerlegung auch schon überlegt - aber bei maximal insgesamt 500 Projekten pro Jahr macht das für "mich" zumindest mengentechnisch keinen Sinn, sondern verkompliziert es (wohlbemerkt für mich - wahrscheinlich aus DB Sicht nicht) ?!

Danke Dir schon mal für Deine Rückinfo im Voraus.

VG
Frank

MzKlMu

Hallo,
wenn die Jaheszahl aus einem Datum, die Hausnummer und die Stadt aus einer Adresse ermittelt werden kann, so sind für die erten 3 Bestandteile des Ges.Textes keine Tabellenfelder erforderlich, weil die entsprechenden Texte aus bereits vorhanden Text ermittelt werden kann und dann automatisch zusammengesetzt werden können. Nur die fortlaufende Bezeichnung benötigt ein Tabellenfeld.

Du solltest Dir erst mal eine Gesamtstruktur anlegen, bevor Du Dich mit anderen Dingen beschäftigst.

Was machst Du eigentlich wenn die ersten 3 Buchstaben bei Straße oder Stadt gleich sind ?

Und die Grundlagen zu Access wären auch noch wichtig.
Hier 2 Links dazu.
https://www.hdm-stuttgart.de/~riekert/lehre/db-kelz/
https://www.access-tutorial.de/
Gruß Klaus

Off147

Hy,

diese Bezeichnung wird nicht aus anderen Adressen generiert, da es diese in Datenform nicht gibt.

Die doppelte Bezeichnung ;-) Ja ... das ist bekannt - wurde aber immer mit einer anderen Nummer (Hausnummer) gelöst. Finde ich persönlich nicht schick - ist aber auch nicht so dramatisch.

Dieses System gibt es seit ca. 10 Jahren ....
Ich bin ja schon mal froh, da man sich dazu durchgerungen hat, bei einem weiteren Projekt unter der gleichen Adresse nicht die gleiche Nummer zu verwenden ... ... da war die Suche vorher wunderbar ;-/

Daher kommt jetzt hinter jedem Projekt (auch wenn es ein Projekt dort schon gibt). ein weiteres Zeichen - somit kann man diese auseinander halten.

Ich hätte das aus einem Mix aus Stadt und Str.  gemacht - hatte damit aber keinen Anklang gefunden ... zu lang die Begründung.

VG
Frank

MzKlMu

Hallo,
dann verwende 4 Felder und setze das zusammen. Das 4. Feld wird hochgezählt. Am besten mit einer Zahl, aus der sich zur Ansicht auch ein Kleinbuchstabe gewinnen lässt.
Gruß Klaus

Off147

Hy.
Du meinst 4 Felder = Str | Nr | Jahr | LfdNr  ... ?
Und Zahl wie a=1 b=2 etc ?

.... Wenn ich eine TestDB baue - dürfte ich Dir diese dann senden / hier posten?

VG
Frank

Off147

Nochmal ich.
Baue ich denn in die Tabelle die laufende Zahl/Buchstabe schon direkt ein - oder generiere ich diese erst bei einer Abfrage o.ä.?

Die muss ja später nicht nur virtuell da stehen sondern auch im Projekt verankert sein ..


MzKlMu

Hallo,
die Zahl/Buchstabe muss in die Tabelle. In einer Abfrage macht das keinen Sinn. Bei einem neuen Datensatz wird der Maximale Wert der Zahl bestimmt und 1 addiert.
Aber das ist nicht ganz so einfach wie sich das anhört, denn das Hochzählen erfolgt mit den 3 anderen Felder als Kriterium.

Du wirst hier auch etwas VBA benötigen.
Gruß Klaus

Lachtaube

Im Bei Änderung Ereignis kannst Du die Anzahl geschriebener Zeichen feststellen und nach dem 9. Zeichen, DMax() bemühen,Dir den höchsten Wert zu suchen und einzutragen.

Luftcode:Private Sub EinTextCtrl_Change()
   Dim v As Variant
   
   With Me.EinTextCtrl      'funktioniert nicht beim Einfügen über die Zwischenablage
      If Len(.Text) = 9 Then
      v = DMax("DerFeldname", "DerTabellenname", _
               BuildCriteria("DerFeldname", dbText, "LIKE " & .Text & "*"))
      If IsNull(v) Then
         .Text = .Text & "-a"
      Else
         .Text = .Text & "-" & Chr$(Asc(Right(v, 1)) + 1)
      End If
   End With
End Sub

Private Sub EinTextCtrl_KeyDown(KeyCode As Integer, Shift As Integer)
   'nicht mehr als 9 Zeichen bei der Eingabe zulassen
   If Len(Me.EinTextCtrl.Text) = 9 Then KeyCode = 0
End Sub

PS: für das Feld sollte ein eindeutiger Index definiert werden.
Grüße von der (⌒▽⌒)

Off147

Uiihh ... ;-)
Verstehe davon (VBA) nicht viel.
Ich schaue mir das mal an .. und melde mich dann wieder.

Derweil hatte ich angefangen eine neue Tabelle anzulegen (siehe Anlage) mit den getrennten Werten (siehe Post von Klaus).

Könnt Ihr Euch das mal anschauen ob das so ist wie es Klaus gemeint hatte?
Ich habe ein Feld gemacht, in dem ich die Projektnummer zusammensetzen lasse ...

VG
Frank

MzKlMu

#11
Hallo,
auf die Projektnummer in der Tabelle solltest Du verzichten, das ist auch nicht notwendig. Die gleiche Berechnung kannst Du auf die gleiche Art auch in einer Abfrage machen.
Die Nummer sollte natürlich eine Zahl sein (Integer) und kein kurzer Text. Auch das Jahr ist eine Zahl.

Was machst Du eigentlich, wenn es in einer Stadt/Ort mit den 3 gelichen Anfangsbuchstaben auch eine Straße gibt mit den 3 gleichen Anfangsbuchstaben und der gleichen Hausnummer ?
Dann wird für 2 unterschiedliche Orte/Straße/Hnr die lfd.Nummer hochgezählt.
Das System hinkt.
Gruß Klaus

Off147

Hallo Lachtaube.

----------
und nach dem 9. Zeichen,
-------------
Das wir wohl so nicht gehen. Ich hatte zwar geschrieben das die Hausnummer 3 Stellen hat, macht aber keinen Sinn diese so "auf"zufüllen ... zumal es auch Hausnummern mit "3c" oder "3-5" gibt. Das Ergebnis sieht bis jetzt wie die Anhänge vom letzten Post aus. Da gibt es dann bis zum ersten "-" eine unterschiedliche Anzahl von Zahlen und/oder Buchstaben.


@Klaus - OK.
Da kann/muss ich die "Formel" auch so wie in der Tabelle hinterlegen oder? Liege ich da falsch mit - aber wenn ich es in einer Abfrage mache - wie/wo ist denn dann diese gesamte Projektnummer gespeichert?

VG
Frank

MzKlMu

Hallo,
Zitatwie/wo ist denn dann diese gesamte Projektnummer gespeichert?
nirgends, ist auch nicht notwendig.
Warum verkettest Du eigentlich einen Leerstring (& "") ?
Immer wenn die Projektnummer benötigt wird, verwendest Du eine Abfrage.
Man verwendet beim Zugriff auf die Daten ohnehin im Regelfall eine Abfrage und nicht die Tabelle direkt, sodass sich da kein Nachteil ergibt.

Hast Du meine Einwände zu den Doppelungen gelesen ?
Gruß Klaus

Off147

Ok mit der Projektnummer.

Mit der Dopplung ... Ja, gerade gelesen und verstanden.
----
Dann wird für 2 unterschiedliche Orte/Straße/Hnr die lfd.Nummer hochgezählt.
Das System hinkt.
------
Stimmt.
Allerdings ist das in 10 Jahren bisher noch nie vorgekommen ... aber ich verstehe Deine Einwände ...
Hast Du eine Idee (vielleicht ja schon mal ähnlich vorgekommen) wie man da im kleinen ändern könnte? ich möchte jetzt nicht unbedingt eine neue Struktur in der Projektbezeichnung reinbringen ...