1

Wie Bundesland automatisch aus PLZ generieren

Moin,

wir legen für unsere Kund*innen Profilseiten bei Ninox an die unter anderem so aussehen:

 Wir haben in unserem Kontaktformular jedoch nur die Frage nach der PLZ und nicht nach dem Bundesland, weshalb dieses Feld in 99% der Fällen nicht ausgefüllt ist.
PLZ ist in ca 50% der Profile befüllt.

 

Wie kann ich jetzt für alle Kund*innen die eine PLZ eingetragen haben automatisch das Bundesland ergänzen lassen?
Mir wurde bereits vom Ninox Team zugesichert, dass das geht, und dass ich am besten hier im Forum nachfrage wie am besten.

 

Vielen Dank im Vorraus

Beste Grüße
Lucas

17 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 3 Wochen
    • Gemeldet - anzeigen

    Hallo Lucas, ich habe dir mal eine CSV-Tabelle mit PLZ-Bereichen und zugeordneten Bundesländern angehängt,  die du komplett in deine Datenbank importieren und dort umbenennen kannst (zumindest das ".csv" entfernen). Mit einem Änderungstrigger im Feld PLZ lässt sich dann automatisch das Bundesland (BL) zuweisen:

    BL := if PLZ then
       let myPLZ := PLZ;
       first(select 'PLZ-Bereiche' where VonPLZ <= myPLZ and BisPLZ >= myPLZ).Bundesland
    else
       null
    end
    
    
    • Ninox-Professional
    • planoxpro
    • vor 3 Wochen
    • Gemeldet - anzeigen

    Ach so, um die bereits vorhandenen Datensätze zuzuordnen, die eine PLZ, aber noch kein Bundesland enthalten, kannst du einfach irgendwo einen Button mit bspw. folgendem Code erstellen:

    for i in select Kunden where not Bundesland do
        i.(Bundesland := if i.PLZ then
                first(select 'PLZ-Bereiche' where VonPLZ <= i.PLZ and BisPLZ >= i.PLZ).Bundesland
            else
                null
            end)
    end
      • lucas_kruell
      • vor 12 Tagen
      • Gemeldet - anzeigen

      Das mit dem alle alten aktualisieren versuche ich gerade mit diesem Skript hier

      for r in select DeineTabelle do
          if r.PLZ and r.Bundesland = null then
              let response := http("GET", "https://openplzapi.org/de/Localities?postalCode=" + r.PLZ);
              r.Bundesland := if response.error then
                  "!!ERROR!!"
              else
                  let data := parseJSON(text(response.result));
                  text(item(data, 0).federalState.name)
              end;
      
              r.Ort := if response.error then
                  "!!ERROR!!"
              else
                  let data := parseJSON(text(response.result));
                  text(item(data, 0).name)
              end;
          end
      end
      

      Ich finde allerdings weder den Skripteditor.. noch bekomme ich einen Button platziert.
      Es hilft sicherlich nicht, dass mein Rechner sehr langsam ist und ich sorge habe etwas kaputt zu machen.. deswegen bin ich gerade vermutlich eher zu zögerlich.

      • Ninox-Professional
      • planoxpro
      • vor 12 Tagen
      • Gemeldet - anzeigen

      Die Frage war vermutlich eher an Johannes gerichtet ... (?)

      • lucas_kruell
      • vor 12 Tagen
      • Gemeldet - anzeigen

      nein tatsächlich nicht
      Johannes ist ja gar nicht auf das aktualisieren der alten datensätze eingegangen, deshalb hatte ich dich gefragt

      ich habe bisher nur die möglichkeit gefunden einen Button in einen Datensatz zu setzen
      Allerdings nicht in die Tabelle
      Und mit einem Knopf in einem Datensatz kann ich ja vermutlich nicht vollautomatisiert alle Datensätze auf einen schlag anpassen, oder?

      An dem Skript muss ich darüber hinaus auch noch schrauben
      Da scheint ChatGPT fehler reingehauen zu haben

      • Ninox-Professional
      • planoxpro
      • vor 12 Tagen
      • Gemeldet - anzeigen

       

      Ok, aber Johannes hatte die API-Variante vorgeschlagen ... ;)

      Ich sehe aber, dass deine if-else-end-Struktur falsch ist. Da ist ein "end" zu viel. Davon abgesehen würde ich aber auch gleich auf alle Datensätze filtern, bei denen eine PLZ, aber kein Bundesland eingetragen wurde. So rein von der Logik her würde ich's mal auf diese Weise versuchen (nicht im Detail geprüft):

      for r in select DeineTabelle where PLZ and not Bundesland do
          let response := http("GET", "https://openplzapi.org/de/Localities?postalCode=" + r.PLZ);
          r.Bundesland := if response.error then
                  "!!ERROR!!"
              else
                  let data := parseJSON(text(response.result));
                  text(item(data, 0).federalState.name)
              end
      end

       

      • lucas_kruell
      • vor 12 Tagen
      • Gemeldet - anzeigen

       

       said:
      k, aber Johannes hatte die API-Variante vorgeschlagen ... ;)

       Ja das ist wahr, aber ich hatte die Hoffnung du kannst vlt trotzdem helfen.

      hat jetzt auch perfekt geklappt!
      Es läuft gerade durch.

      Und dann wenn das Aktualisierungsskript durch ist, kann ich ja den Button einfach wieder rausnehmen, weil es ja in Zukunft eh automatisch passiert, richtig?

    • john_eans
    • vor 3 Wochen
    • Gemeldet - anzeigen

    Ich hab vor einiger Zeit mal folgenden Code bei mir eingebaut. Sollte das tun, was du brauchst:

    let response := http("GET", "https://openplzapi.org/de/Localities?postalCode=" + PLZ);
    if response.error then    "!!ERROR!!"
    else    let data := parseJSON(text(response.result));
    text(item(data, 0).federalState.name)
    end

    ...vielleicht kann da noch optimiert werden, aber grundsätzlich tut es das was es soll :-)

      • john_eans
      • vor 2 Wochen
      • Gemeldet - anzeigen

      Ich pack das Vorgehen mal hier drunter:

      Du hast bei dir in der Vorlage bereits das Feld "PLZ", "Ort" und "Bundesland".

      Wie bei  öffnest du die Optionen beim Textfeld PLZ und fügst bei "Trigger nach Änderung" folgenden Code ein:

      let response := http("GET", "https://openplzapi.org/de/Localities?postalCode=" + PLZ);
      Bundesland := if response.error then
              "!!ERROR!!"
          else
              let data := parseJSON(text(response.result));
              text(item(data, 0).federalState.name)
          end;
      Ort := if response.error then
              "!!ERROR!!"
          else
              let data := parseJSON(text(response.result));
              text(item(data, 0).name)
          end
      

      Was macht der Code?
      Eigentlich das selbe wie auch aus dem anderen Beispiel.
      Vereinfacht: Er zieht sich aus eine Datenbank die entsprechenden Werte.
      Kompliziert: Er sendet eine Anfrage an openplzapi.org und bittet um Mitteilung, welche Daten für die eingegebene Postleitzahl hinterlegt sind. Diese Rückmeldung wird in der Variablen "response" gespeichert. (erste Zeile)
      Wenn keine Werte gefunden werden, dann wird "!!ERROR!!" ausgegeben. (Zeile 2+3 sowie 8+9).
      Wenn Werte gefunden wurden, dann werden in deine Textfelder "Bundesland" und "Ort" die Ergebnisse eingetragen. Dazu wird die Rückmeldung entsprechend aufbereitet und ausgewertet.

      Wichtig dabei: theoretisch kann es für eine PLZ mehrere Werte geben. Es wird aber immer nur der erste Wert eingetragen.
       

      • lucas_kruell
      • vor 12 Tagen
      • Gemeldet - anzeigen

      Das hat super geklappt
      Kannst du mir noch helfen, das Rückwirkend für alle Kunden zu machen?

    • lucas_kruell
    • vor 3 Wochen
    • Gemeldet - anzeigen

    mega cool!
    Danke schonmal für die beiden Antworten.

    könntet ihr ein bisschen vorher ansetzen und erklären wie ich das dann implementiere?
    Ich mache sowas zum 1. mal.

    Ein Link zum nachlesen würde auch funktionieren.

      • Ninox-Professional
      • planoxpro
      • vor 3 Wochen
      • Gemeldet - anzeigen

       

      Wenn du die CSV-Datei auf deinen Rechner heruntergeladen hast, kannst du in deine Tabelle importieren, indem du auf die Startseite deiner Datenbank mit der Tabellenübersicht gehst und auf "Datei importieren" klickst, dann auf "CSV-Datei importieren". Nun erscheint ein Dateiauswahl-Dialog, mit dem du die zu importierende Datei auf deinem Computer auswählen kannst. Mit "Öffnen" bestätigen.

       

      Den folgenden Dialog zu "Datenquelle" und "Import-Einstellungen" solltest du ohne Änderungen mit "Weiter" bestätigen können.

      Als nächstes erscheint ein Dialog, der links die zu importierenden Felder und rechts die entsprechenden Feldtypen auflistet. Oben unter "Tabellenname" kannst du das ".csv" entfernen. Falls rechts die Feldtypen zu "VonPLZ" und "BisPLZ" auf "Zahl" stehen, dann solltest du sie unbedingt auf "Text" ändern.

       

      Nach Klick auf "Weiter" erhälst du eine tabellarische Übersicht der Daten. Wenn alles okay ist, kannst du die Date mit "Importieren" als eigenständige Tabelle in deine Datenbank übernehmen.

      Als nächstes öffnest du deine Kunden-Tabelle, aktivierst ggf. den Admin-Modus und rufst die Optionen zum Textfeld(!) PLZ auf.

       

      Dort gibst du unter "Trigger nach Änderung" folgenden Code ein:

      Bundesland := if PLZ then
         let myPLZ := PLZ;
         first(select 'PLZ-Bereiche' where VonPLZ <= myPLZ and BisPLZ >= myPLZ).Bundesland
      else
         null
      end

      Wenn du nun eine beliebige PLZ eingibst, sollte im gleichnamigen Feld automatisch das Bundesland eingetragen werden.
       

    • lucas_kruell
    • vor 13 Tagen
    • Gemeldet - anzeigen

    Danke schonmal an alle für die ganzen Antworten!
    Ich war bis heute krankgeschrieben und gucke jetzt mal ob ich das mit dem geschriebenen Umsetzen kann! :)

    • lucas_kruell
    • vor 12 Tagen
    • Gemeldet - anzeigen

    Habs getestet und gehe jetzt den Weg mit der API von
    Das ist zukunftssicherer.

    Deine Anleitung war aber auch super.. die hat mir nämlich sehr dabei geholfen die andere Lösung umzusetzen!

    • Ninox-Professional
    • planoxpro
    • vor 12 Tagen
    • Gemeldet - anzeigen
     said:
    Und dann wenn das Aktualisierungsskript durch ist, kann ich ja den Button einfach wieder rausnehmen, weil es ja in Zukunft eh automatisch passiert, richtig?

    Genau, wobei ich mir den Button bzw. den Code irgendwo aufbewahren würde. Vielleicht braucht man ihn doch irgendwann noch mal. Oder etws ähnliches.

    • Jurgen_Wagner
    • vor 12 Tagen
    • Gemeldet - anzeigen
     said:
    Genau, wobei ich mir den Button bzw. den Code irgendwo aufbewahren würde. Vielleicht braucht man ihn doch irgendwann noch mal.

     Würde ich als versteckte Seite oder versteckte Tabelle anlegen, dann sieht das nur der Admin im Adminmodus. Die Rechte kann man bei Bedarf noch weiter auf Rollenenbene einschränken.

      • Ninox-Professional
      • planoxpro
      • vor 12 Tagen
      • Gemeldet - anzeigen

      Oder als versteckte Registerkarte mit der Sichtbarkeitseinstellung isAdminMode(). 😉