String in alpha- und nummer-Teil trennen

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Mi 1. Nov 2017, 08:20

Hallo Leute,
ich habe hier Strings die mit einem alpha-Teil beginnen und denen Nummern folgen z.B.: "a001" oder "a002" oder "ho001", "ho002" u.s.w.
Ich möchte die Nummer um eins erhöhen, das geht aber ohne trennen der Teile nicht!?
Kann mir bitte jemand helfen?
Danke

Benutzeravatar
4tionov
Site Admin
Beiträge: 251
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von 4tionov » Mi 1. Nov 2017, 09:36

Es geht alles, aber wofür brauchst du das?
Alles Gute,

4tionov

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von gambi » Mi 1. Nov 2017, 11:32

Wie wäre es damit: gambas code
Private Function incString(myStr As String) As String
Dim myPart As String
Dim myNumber, i As Integer

    For i = 1 To Len(myStr)
      If IsNumber(Mid(myStr, i, 1)) Then 
        myNumber = Val(Right(myStr, - i + 1)) + 1
        myPart = Str(myNumber)
        While Len(myPart) < 3
          myPart = "0" & myPart
        Wend
        Return Left(myStr, i - 1) & myPart
      Endif
    Next
 End
gg

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Mi 1. Nov 2017, 12:38

Hallo 5tionov,
ich benötige das, damit ich die Nummer um eins erhöhen kann (wenn ich einen neuen Eintrag erstellen möchte, muss dieser Wert um eins erhöht werden, dies stellt eine Umgehung des sonst üblichen Auto-Increment-Wertes dar, den ich hier ja nicht benutzen kann).
Hallo gambi,
ich werde das mal versuchen, es scheint richtig zu sein, soweit ich das nachvollziehen kann.
Liebe Grüße

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Mi 1. Nov 2017, 12:50

Hallo gambi,
ich habe dein Programm eingebaut, es funktioniert wunderbar.
Danke

Benutzeravatar
4tionov
Site Admin
Beiträge: 251
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von 4tionov » Mi 1. Nov 2017, 16:54

vb6oldie hat geschrieben:
Mi 1. Nov 2017, 12:38
ich benötige das, damit ich die Nummer um eins erhöhen kann (wenn ich einen neuen Eintrag erstellen möchte, muss dieser Wert um eins erhöht werden, dies stellt eine Umgehung des sonst üblichen Auto-Increment-Wertes dar, den ich hier ja nicht benutzen kann).
Danke, ich habe etwas dumm gefragt, denn eigentlich wusste ich das schon. Du hast mir in Wirklichkeit auch den Grund nicht genannt, warum du so vorgehst.

Nur, um das mal in die Runde zu werfen, was du hier verwendest, sind sogenannte "sprechende Schlüssel":

https://de.wikipedia.org/wiki/Sprechend ... %C3%BCssel

Die sollte man wo immer es geht vermeiden. Sie stammen noch aus der Zeit der Karteikartensysteme und hatten da ihren Sinn. Heute (oder zumindest bei relationalen Datenbanken) haben sie keinen Sinn mehr, sondern machen nur unnötige Probleme. Der einzige Grund, warum man so etwas noch verwendet, ist, wenn man mit veralteten Systeme arbeiten muss, die sie noch verwenden.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Do 2. Nov 2017, 07:44

Hallo 4tionov,
genau das ist mein Problem: ich bearbeite hier Daten die in den 1980'ziger Jahren angelegt wurden.
Ich wollte eigentlich Ursprünglich keine "sprechenden" Code vergeben, wurde aber überstimmt, nun habe ich das Problem noch immer.
Ich könnte zwar jetzt das ganze umgestalten, dies erfordert aber einen grossen Aufwand auch in der Datenbank und das will ich noch Vermeiden.
Zusätzlich müsste ich zu jeder Eingabe eine Liste der verfügbaren Code bereitstellen, da man sich diese Code sonst nicht merken kann.
Ansonsten danke für deine Anregung.

Benutzeravatar
4tionov
Site Admin
Beiträge: 251
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von 4tionov » Fr 3. Nov 2017, 07:45

Ja, so machen einem Designfehler noch sehr lange das Leben schwer. Ich würde in so einem Fall die Daten ändern, also die sprechenden Primarykeys durch numerische, aufsteigende ersetzen und die zusätzlich in den sprechenden Keys enthaltenen Informationen auf weitere Tabellen aufteilen. Das wäre dann eine saubere "normalisierte" Lösung, die dann weitere Softwareentwicklung in der Zukunft nicht behindert.

Dann braucht man auch keine "Liste der verfügbaren Code bereitstellen, da man sich diese Code sonst nicht merken kann". Sondern kann Möglichkeiten zur Kategorisierung in Comboboxen oder ListViews bereitstellen.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Fr 3. Nov 2017, 09:01

Hallo 4tionov,
wenn ich das richtig verstanden habe, soll der Primary-Key der Tabelle(Tabellen) numerisch werden (Auto-Increment) und die bisherigen Inhalte der sprechenden Teile als neue Tabellen erstellt werden.
Darin ist nur eine Zuordnung des neuen Keys zu einer Kategorie vorhanden.
Das ergibt zusammen Tabellen (alte Tabelle plus neue Tabellen) mit doppelt so vielen Zeilen wie bisher.
Liege ich da richtig?
Das gibt für eine der bisherigen Tabellendomänen (BRANCHE) fast 25 neue Tabellen, für eine andere Tabellendomäne (KLASSE) 9 weitere Tabellen.
Also eine Menge Arbeit!
Oder ist es besser, alle diese Domänen unter einen gemeinsamen Key zu stellen und die Aufteilung auf ein zusätzliche Tabelle zu legen, die alle diese Einteilungen enthält? Bisher:
Bildschirmfoto vom 2017-11-03 08-51-35.png
Bildschirmfoto vom 2017-11-03 08-51-35.png (19.79 KiB) 2874 mal betrachtet
Neu:
Bildschirmfoto vom 2017-11-03 08-57-24.png
Bildschirmfoto vom 2017-11-03 08-57-24.png (8.26 KiB) 2874 mal betrachtet
1 = ACODE, 2 = Anrede, 3 = Art, u.s.w.
Das gibt noch mehr Arbeit, würde aber zukünftige Arbeiten erleichtern.
Liebe Grüße

Benutzeravatar
4tionov
Site Admin
Beiträge: 251
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von 4tionov » Fr 3. Nov 2017, 10:08

Also da nicht nicht weiß, was du da machst, hier eine theoretisch Erklärung:

Wenn du eine Tabelle mit sprechendem Schlüssel hast, der so aussieht

ab0001

Position1 ist z.B. das Geschlecht (a = Frau oder b = Mann), Position 2 ist z.B. der Beruf (a= "Bauherr" und b = "Architekt", c="Dachdecker")
und eine Tabelle

sprechenderkey, vorname, nachname

Dann sehen Datensätze so aus:

aa001, Anette, Bauer
(Frau Bauherrin Bauer)

bc002, Helmut, Helf
(Herr, Dachdecker Helf)

Dann kann man daraus drei Tabellen machen:

Tabelle "person" mit diesen Spalten
pkperson, vorname, nachname, fkgeschlecht, fkberuf

Tabelle "beruf"
pkberuf, beruf

Beispieldatensätze:
1, Architekt
2, Bauherr
3, Statiker
4, Dachdecker

Tabelle "geschlecht"
pkgeschlecht, geschlecht

Beispieldatensätze:
1, Frau
2, Mann
3, Unbekannt

_____________________________________________________

In "person" kannst du dann die Datensätze so aufnehmen:

1, Anette, Bauer, 1, 2
2, Helmut, Helf, 2, 4

Und so weiter.

So hast du Struktur und Daten getrennt. Von Beginn an musst du dir allerdings gut überlegen, wie du deine Daten in Tabellen organisierst.
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Fr 3. Nov 2017, 13:56

Hallo 4tionov,
leider ist das nicht so einfach gestrickt:
Ich habe hier eine Tabelle ("code", eine von ca 40) mit folgender Strucktur:
"id" (Primary-Key), "dom" (weitere Unterteilung), "code" (sprechender Key), "text",.....,upd,uma.

Dom enthält Einträge wie "ACODE", "Anrede", "Art", ... ca 30 Unterscheidungen.
Manche dieser unterschiedlichen Dom's haben einen sprechenden Key in der Spalte code!
Diese Dinge (Key's) wurden zusammengefasst, um eine einheitliche/einfache Abfrage durchführen zu können (damals in C geschrieben).
Beispiel1: select text from code where dom = 'Anrede' and code = '1'. Ergibt "Herr". Feld code ist ein String!
Beispiel2: select text from code where dom = 'KLASSE' and code = 'a01'. Ergibt "Personenaufzüge"

Wenn ich nun diese Tabelle trennen soll, ergeben sich mindestens 30 zusätzliche Tabellen (je eine für jeden dom) und je eine für die sprechenden Code, das sind zusätzlich ca 30 Tabellen.
Das sind dann zusammen ca 90 bis 100 Tabellen insgesamt.

Wenn ich mir das so überlege, wird das eine Menge Arbeit.
Liebe Grüße

Benutzeravatar
4tionov
Site Admin
Beiträge: 251
Registriert: So 18. Mai 2014, 22:40
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von 4tionov » Fr 3. Nov 2017, 19:49

vb6oldie hat geschrieben:
Fr 3. Nov 2017, 13:56
Wenn ich nun diese Tabelle trennen soll, ergeben sich mindestens 30 zusätzliche Tabellen (je eine für jeden dom) und je eine für die sprechenden Code, das sind zusätzlich ca 30 Tabellen.
Das sind dann zusammen ca 90 bis 100 Tabellen insgesamt.

Wenn ich mir das so überlege, wird das eine Menge Arbeit.
Jesus! Wenn es so viel Arbeit ist, würde ich es wirklich so lassen wie es ist. Oder ganz einfach: Wenn Code und Wartung des Codes langfristig teurer kommen als der Umbau, ist eventuell (wenn man die Zeit hat) der Umbau angesagt.

Ich blicke das Datenmodell zwar jetzt immer noch nicht und kann nur ahnen, was "Personenaufzüge" mit Anreden zusammen in einer Tabelle zu suchen haben. Es sieht hier so aus, als sei das aus Geschwindigkeitsgründen so gemacht worden. Dafür gibt es heute in DBMS die Indizierung und dann sind auch komplexere Abfragen über mehrere Tabellen hinweg kein Problem mehr.

Ich habe auch noch ein paar so x-10-Jahre alte "Leichen" in meinen Programmen, bei mir war es noch viel dümmer, ich habe zu Beginn Daten kunterbunt und ziemlich sinnlos in Tabellen abgelegt und hatte später viel Arbeit mit den Umbauten. Bei Dir sieht es zumindest so aus, als ob da wenigstens eine sinnvolle Überlegung dahinter stand.

Wenn man mit alten Daten arbeiten muss, dann ist das halt manchmal so.

Ich habe das über die sprechenden Schlüssel auch nur deshalb angemerkt, weil hier ja auch Leute mitlesen, die vielleicht nicht so die Ahnung haben, wie man das besser organisieren kann und wollte einen Hinweis setzen, dass das heute eigentlich Käse ist und nicht mehr so gemacht wird. Es ist bei relationalen Datenbanken ein Designfehler, der später unter Umständen nur mit sehr, sehr viel Arbeit wieder korrigiert werden kann. Bei weitläufig vernetzen Systemen vielleicht nie wieder ...
Alles Gute,

4tionov

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: String in alpha- und nummer-Teil trennen

Beitrag von vb6oldie » Sa 4. Nov 2017, 07:35

Hallo 4tionov,
ich habe mir das ganze nochmals durch den Kopf gehen lassen und habe folgende Lösung gefunden:
Ich erstelle ein neues Feld (vielleicht "aux") und trenne den sprechenden Code in den alpha- und den numerischen-Teil.
Zusätzlich werde ich die drei Felder ("dom","aux" und ""code") als Unic-Key definieren, damit kann dann der bisherige Key "id" entfallen.
Das Umstellen der Daten ist dann nicht so aufwendig.
Liebe Grüße

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste