Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Typnummer Generator

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Typnummer Generator

    Hallo,

    Ich bin neu hier, in der Hoffnung Hilfe zu finden bei einem Problem an dem ich nun schon seit Tagen herum doktere.

    So siehts aus:
    Es gibt eine Mysql Tabelle in der Typnummern stehen, etwa so:
    150 3A5 E
    150 3A5 E A
    150 3A5 E B
    Die Nächste Nummer wird dann über ein HTML Formular automatisch generiert werden und sollte
    150 3A5 E C lauten. (bis auf das "C" wird alles über Auswahlfelder eingegeben)

    Da Problem:
    Es gibt noch andere Nummern die ähnlich lauten z.B.:
    150 3A8 E
    150 3B5 E
    150 7A53 E
    und so weiter. Bisher habe ich das durch umständliche if Abzweigungen quasi händisch erledigt(ich weiss : sehr unprofessionell)
    etwa so:
    PHP-Code:
    $resultx mysql_query(" Select `Typnummer` FROM tpnum WHERE Typnummer = '$Typnummer' order by ID desc ");
    $x mysql_fetch_array($resultx); 
    foreach (
    $x as $keyx => $valuex)if ($valuex == $Typnummer )      {$Typnummer "$STRADD C";}
    $resultx mysql_query(" Select `Typnummer` FROM tpnum WHERE Typnummer = '$Typnummer' order by ID desc "); 
    $x mysql_fetch_array($resultx);  
    foreach (
    $x as $keyx => $valuex)if ($valuex == $Typnummer )   {$Typnummer "$STRADD D";} 
    Wie man sehen kann wird der Buchstabe hinter "$STRADD",
    sozusagen als Index, hochgezählt.

    Bei einem andern Script wollte ich das etwas Profihafter lösen, weiss aber leider nicht wie das gehen soll. Im Prinzip muss die Typnummer immer nur einmal vorhanden sein und aufsteigend in die Mysql Tabelle geschrieben werden.
    Ich hoffe mich unverständlich ausgedrückt zu haben

    Wenn ich wenigstens einen Denkansatz hätte....

    Reißt mir bitte nicht sofort den Kopf ab - ich bin neu hier.
    Danke und Gruss A.


  • #2
    Ich weiß nicht genau, wie diese Nummern generiert werden und welches Format sie aufweisen (müssen)! Daher fällt eine direkte Hilfe auch nicht so leicht, aber wenn ich es richtig verstanden habe, dann gibst du eine Nummer ein: Für denn Fall dass diese Nummer noch nicht existiert, dann fügst du diese Nummer hinzu oder schaust, ob die "nächste Nummer" existiert und verfährst auf die selbe Art?!

    Ich würde dann in der MySQL Tabelle folgende Abfrage machen:
    PHP-Code:
    $sql "SELECT * FROM tabelle WHERE nummer LIKE '".$nummer."%';"
    Das % (Prozentzeichen) ist eine Wildcard, sodass die Abfrage alle Datensätze mit den Nummern mit dem selben Anfangszeichen liefert.
    Sofern nun diese Nummern ein festes Format haben, kannst die diese Liste sortieren und weißt dann ob die Nummer exisitert und wo die neue Nummer eingefügt werden muss!

    Ich würde wahrscheinlich nach diesem Ansatz vorgehen, aber feste Formate mit gewissen Definitionen können eine solche Suche durchaus vereinfachen...

    Kommentar


    • #3
      Danke erst mal für die Antwort!
      Das Format ist fest vorgegeben und wird durch ein HTML Formular erzeugt in dem der Nutzer Dropdownfelder und Radiobuttons anklickert.
      Durch den Vergleich:
      PHP-Code:
      $Typnummer "$STRADD D"
      finde ich heraus ob es die Typnummer schon in der DB gibt- falls ja wird ein Index (z.B. "E" ) hinten angestellt.
      Wenn der Index an der Typnummer hängt, wird wieder in der DB nachgesehen ob es diese Nummer schon gibt falls ja wird der index durch einen neueren, höheren ("F") überschrieben.
      Ich habe im Prinzip etwa 40 "IF"- Verzweigungen mit jedesmal einen neuen Index (A oder B oder AC und so weiter).Das wollte ich gerne automatisieren da ich ja sonst irgendwann einmal ein Klorollen langes Programm bekomme...
      Ich hoffe mich deutlich ausgedrückt zu haben?
      Ich bin bei verschachtelten schleifen und if verzweigungen am verzweifeln....

      Die Variable $STRADD beeinhaltet die rohe Typnummer (via Formular generiert und hat eine eigene Spalte in Mysql) und der Index "D" wird dann angehängt,
      das ganze wird dann als "Typnummer" gespeichert.

      Kommentar


      • #4
        Zitat von bratkartoffel
        Ich hoffe mich unverständlich ausgedrückt zu haben
        Das find' ich schonmal geil...

        Spaß beiseite:
        Wie sieht es denn mit der DB aus? Kannst daran noch was ändern?
        Ich würde sonst vorschlagen, die veränderlichen Einzelsegmente der Nummern in einzelne Spalten zu schreiben,
        dann kannst Du einiges an PHP-Code mit vernünftigen MySQL-Abfragen sparen.

        Beispiel:
        Code:
        // Deine Tabelle
        
        Spalte1   |   Spalte2   |   Spalte3   |   Spalte4
          150     |     3A5     |      E      |      A
        Competence-Center -> Enjoy the Informatrix
        PHProcks!Einsteiger freundliche Tutorials

        Kommentar


        • #5
          Und was macht man, wenn auch nur ein anderes Format dazukommt?
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Dann denkt man komplett um
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche Tutorials

            Kommentar


            • #7
              Zitat von Arne Drews Beitrag anzeigen
              Das find' ich schonmal geil...

              Spaß beiseite:
              Wie sieht es denn mit der DB aus? Kannst daran noch was ändern?
              Ich würde sonst vorschlagen, die veränderlichen Einzelsegmente der Nummern in einzelne Spalten zu schreiben,
              dann kannst Du einiges an PHP-Code mit vernünftigen MySQL-Abfragen sparen.

              Beispiel:
              Code:
              // Deine Tabelle
              
              Spalte1   |   Spalte2   |   Spalte3   |   Spalte4
                150     |     3A5     |      E      |      A
              Danke schon mal für die Antwort.
              In der Tat habe ich alle Segmente erst separat und am schluss noch mal als
              Summe, mit den dafür vorgesehenen Leerstellen gespeichert.
              Die DB sieht so aus:
              Spalte1 | Spalte2 | Spalte3 | Spalte4|Spalte 5 |Spalte 6|
              150 | 3A5 | E | A |STRADD |Typnummer

              Wobei STRADD quasi die "Stringaddition" und Typnummer die STRADD + Index darstellt.

              Mein Problem ist wie verleiche äh vergleiche ich die aktuelle Typnummer mit allen andern in der DB und wie würde ich dann automatisch den Index anpassen, sprich erhöhen?
              Den Aufbau dieser Schleife bzw. Verzeigweigung kapier ich einfach nicht.

              Kommentar


              • #8
                Bestehen deine Typnummern als IMMER aus vier Blöcken mit je drei Zeichen oder wie schaut das Format aus, dass du die so merkwürdig speichern kannst!

                Wenn du in der Datenbank nur eine Liste von Typnummern hast und mit LIKE und Wildcard nach Nummern suchst, bekommst du alle gleich beginnenden Typnummern im Ergebnis! Diese Typnummern kannst du dann sortieren oder nach der größten Nummer suchen. Der Code ist in etwa der selbe wie zuvor, nur dass du nun bereits in einem Array alle entsprechenden Typnummern vorliegen hast und nicht für jede eine neue Abfrage benötigst.

                Eine genauere Angabe des Formates der Typnummern würde sehr helfen, damit man weiß, wann wo wie und warum hochgezählt würde und was ein Index ist und so weiter...

                Kommentar


                • #9
                  also wenn ich dich richtig verstanden habe geht es dir darum dass wenn eine Zahl doppelt vorkommt diese ein A hinten dran gesetzt bekommen soll... falls diese doppelte zahl mit A auch schon vorhanden ist sollte B kommen usw

                  ist nur ein denkanstoss weiss jetzt nicht was die anderen davon halten... aber warum erstellt du nicht einen String mit dem Alphabet so wie du es haben möchtest. Dann wenn ermittelt wurde ob die Zahl schon vorhanden ist nimmst du den ersten buchstaben aus dem array... wenn A nun schon vorhanden ist suchst du im String nach A und nimmst den nächsten buchstaben aus dem String

                  Kommentar


                  • #10
                    Und wenn du mit Buchstaben rechnen wuerdest?

                    Ich bin mir nicht sicher, kann es auch nicht testen, aber erhaelst du mit folgender Ausgabe eine Dezimalzahl oder vielleicht sogar schon das B?
                    Code:
                    echo 'A' + 1;
                    Andernfalls kannst du dir mal die Funktionen PHP: chr - Manual und PHP: ord - Manual anschauen.

                    Dann liest du zunaechst alle Zeichenketten sortiert aus (s. Sirkes Vorschlag) und pickst dir die "groesste" Zeichenkette heraus und extrahierst das letzte Zeichen und addierst 1.

                    So ganz verstehe ich dein Vorgehen aber nicht, kann sein, dass ich gerade Unsinn erzaehle.

                    Gruss
                    http://hallophp.de

                    Kommentar


                    • #11
                      Zitat von robydog Beitrag anzeigen
                      also wenn ich dich richtig verstanden habe geht es dir darum dass wenn eine Zahl doppelt vorkommt diese ein A hinten dran gesetzt bekommen soll... falls diese doppelte zahl mit A auch schon vorhanden ist sollte B kommen usw

                      ist nur ein denkanstoss weiss jetzt nicht was die anderen davon halten... aber warum erstellt du nicht einen String mit dem Alphabet so wie du es haben möchtest. Dann wenn ermittelt wurde ob die Zahl schon vorhanden ist nimmst du den ersten buchstaben aus dem array... wenn A nun schon vorhanden ist suchst du im String nach A und nimmst den nächsten buchstaben aus dem String
                      Ja genauso dachte ich mir das auch.
                      Bei mir hackts nur mit den Verzweigungen, ich weiss nicht wie ich dieses automatische hochzählen hinbekomme, um dann wieder zu vergleichen.

                      PHP-Code:
                      $res mysql_query(" Select `Typnummer` FROM TP WHERE Typnummer = '$Typnummer' order by ID desc "); 
                      damit könnte ich schn mal sehen ob die Typnummer bereits vorhanden ist.

                      PHP-Code:
                      while($value mysql_fetch_array($res)){

                      if (
                      $value["kpl"] != $Typnummer )    {
                      Falls nicht vorhanden speichere so ab wie geschrieben... 
                      falls vorhanden dann etwas in der Art:
                      PHP-Code:
                      else{
                      $Typnummer "$Typnummer .$xxx -> hier Index anhängen";
                      }

                      Jetzt müsste doch wieder ein Vergleich mit der DB stattfinden ob die neu zusammengestellte Typnummer bereits existiert, oder?
                      Falls dem so wäre:
                      irgendwie den Index erhöhen und dann wieder anhängen und wieder prüfen...

                      Was eine Mühle!!!

                      Ich hoffe auf eure Hilfe...

                      Kommentar


                      • #12
                        Zitat von Sirke Beitrag anzeigen
                        Bestehen deine Typnummern als IMMER aus vier Blöcken mit je drei Zeichen oder wie schaut das Format aus, dass du die so merkwürdig speichern kannst!

                        Wenn du in der Datenbank nur eine Liste von Typnummern hast und mit LIKE und Wildcard nach Nummern suchst, bekommst du alle gleich beginnenden Typnummern im Ergebnis! Diese Typnummern kannst du dann sortieren oder nach der größten Nummer suchen. Der Code ist in etwa der selbe wie zuvor, nur dass du nun bereits in einem Array alle entsprechenden Typnummern vorliegen hast und nicht für jede eine neue Abfrage benötigst.

                        Eine genauere Angabe des Formates der Typnummern würde sehr helfen, damit man weiß, wann wo wie und warum hochgezählt würde und was ein Index ist und so weiter...
                        Anbei ein winziger Auszug:

                        150 44C5 E
                        150 44A5 E
                        150 44A3 E B
                        150 44A3 E C
                        150 44C3 E A
                        oder:
                        400 140 E A
                        400 34C E
                        400 34C E A
                        400 34C E B
                        400 14C E
                        150 44A3 E B
                        oder:
                        150 38B K36
                        150 38B K36 A
                        150 38B K36 B
                        150 38B K36 C
                        Vielleicht lässt sich daran erkennen wo mein Problem liegt.
                        Auch die Leerstellen sind wichtig.
                        In der vorherigen Antwort denke konnte das Problem besser beschreiben.
                        Danke für deine Antwort.

                        Kommentar


                        • #13
                          Ich bin mir nicht sicher, kann es auch nicht testen, aber erhaelst du mit folgender Ausgabe eine Dezimalzahl oder vielleicht sogar schon das B?
                          echo 'A' + 1;
                          Nein. Rechenop's mit einem INT-Typ erzeugen immer INT-Typen. Aber mit $char++; funktionierts.
                          --

                          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                          --

                          Kommentar


                          • #14
                            Zitat von nikosch Beitrag anzeigen
                            Nein. Rechenop's mit einem INT-Typ erzeugen immer INT-Typen. Aber mit $char++; funktionierts.
                            also bei mir funktioniert das nich

                            Kommentar


                            • #15
                              Ich nehme mir mal die Zeit auf dein Problem etwas genauer einzugehen und hoffe du möchtest keinen vorgekauten Code, sondern etwas lernen:

                              Gerade deine Beispiele zeigen kein festes Muster, weil sowohl Blöcke mit drei als auch vier Zeichen vorkommenund auch zwei oder drei aufeinander folgende größere Blöcke! Das macht das ganze auf jeden Fall wesentlich komplizierter... aber nicht unmöglich!

                              Nehmen wir an alle diese geposteten Typen sind in der Datenbank vorhanden:
                              Code:
                              150 44C5 E     150 44A5 E    150 44A3 E B     150 44A3 E C     150 44C3 E A
                              400 140 E A    400 34C E     400 34C E A      400 34C E B      400 14C E
                              150 44A3 E B   150 38B K36   150 38B K36 A    150 38B K36 B    150 38B K36 C
                              Nun wollen wir "400 34C E" hinzufügen und erstellen nach meinem Prinzip folgende MySQL Abfrage:
                              PHP-Code:
                              $sql "SELECT `typnummer` FROM tp WHERE typnummer LIKE '400 34C E%';"
                              Diese Abfrage liefert folgende Datensätze zurück: 400 34C E, 400 34C E A, 400 34C E B
                              An diesem Punkt kann men entweder die Datensortieren oder nach deinem Prinzip von Try-And-Error vorgehen, indem du schaust, ob die Typnummer im Array vorkommt, dann erstellst du die nächste Typnummer und schaust erneut und so weiter...
                              Anlternativ kann man den Array sortieren bzw den höchsten Eintrag finden und dann zu deinem die nächste Nummer bilden...
                              ...über die Bildungsvorschriften und damit auch die "Größenvergleiche" von Nummern musst du dir natürlich selbst im klaren drüber sein, weil du uns immernoch nicht sagen wolltest wie diese zustande kommen:
                              Was ich meine ist die Nummer "150 38B K36", wo ich als Folgenummer von "150 38B" eine "150 38B *" mit nur einem Buchstaben bilden würde und keinen Buchstaben gefolgt von einer Zahl...

                              Ich denke und hoffe meine beschreibene Lösung samt Beispiel sollte verständlich sein!

                              Kommentar

                              Lädt...
                              X