Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Postleitzahl eintippen, Name der Stadt in Fragen anzeigen

  • fraluhil
  • fraluhil's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
4 years 1 month ago #194582 by fraluhil
Hallo zusammen,
ich möchte einen Fragebogen erstellen, bei dem an verschiedenen Stellen der Wohnort der Befragten im Fragentext eingeblendet werden soll.

Der Teilnehmende soll seine Postleitzahl in ein kurzes Textfeld (das habe ich schon von Joffm gelernt) eintippen.
Mit diesem Eintrag soll dann in einer Postleitzahlentabelle (liegt mir vor mit rund 13.000 Einträgen für ganz Deutschland) in der ersten Spalte "PLZ" gesucht und der Name der Stadt aus Spalte 2 später weiterverwendet werden.

Gibt es hierzu Erfahrungen und kann mir jemand weiterhelfen?


Besten Dank und schöne Grüße

Frank



Version 3.22.7
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 1 month ago #194587 by Joffm
Hallo,
da gibt es natürlich vieles.
Aber da ich mich nicht besonders mit javascript auskenne, hier
a. eine Lösung, die mit eingebauten Funktionen funktioniert.
1. Zunächst nimm eine Frage vom Typ ausführlicher Text (Q0) und kopiere Deine Liste als Vorgabeantwort dort hinein.

Wie Du siehst, endet jeder Ortsname mit einer Raute "#".
2. Dann kommt Deine Frage nach der Postleitzahl (Q1).
3. Mit einer Frage vom Typ Gleichung bestimmst Du nun den Ortsnamen. (eqOrt)
{substr(substr(Q0, strpos(Q0,Q1) ,strpos(Q0,'#', strpos(Q0,Q1) +1)- strpos(Q0,Q1) ) ,5)}
Das sind ganz schön viele Funktionen ineinandergeschachtelt, aber im Grunde machen sie Folgendes:
- aufgrund der PLZ wird die Stelle gesucht, die übereinstimmt.
- dann wird bis zum nächsten "#" geguckt
- zuletzt wird von der Stelle 6 (die ersten 5 sind ja die PLZ) bis zum Ende herauskopiert.

Das ist alles.

b. Etwas mehr sophisticated.
Nach der Frage nach der PLZ mache einen ajax call.
In einem von Dir erstellten php-script durchsuchst Du deine Liste (diese kann als array, als csv-file, oder in einer Datenbank vorliegen) nach dem Ort und gibst diesen zurück.

Joffm




File Attachment:

File Name: limesurvey...1211.lss
File Size:54 KB

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 1 month ago - 4 years 1 month ago #194591 by Joffm
Und noch eine dritte Lösung, sie im Anspruch zwischen diesen beiden liegt.

Plugin "autocomplete"
gitlab.com/SondagesPro/QuestionSettingsType

Dann genügt eine csv-Datei, z.B.
10001 Stadt 10001
10002 Stadt 10002
10003 Stadt 10003
10004 Stadt 10004
10005 Stadt 10005

Frage "short text" nach PLZ mit autocomplete.
Nach Eingabe von 5 Zeichen werden die Zeilen angezeigt, die damit beginnen (bei uns ist es ja immer nur eine Zeile)


Und mit einer kleinen Gleichung nehmen wir davon dann den letzten Teil, den Ortsnamen.
{trim(substr(Q2,6))}
Die ersten 5 Zeichen sind ja die PLZ und dann noch das Leerzeichen.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 years 1 month ago by Joffm.
The topic has been locked.
  • fraluhil
  • fraluhil's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
4 years 1 month ago #194613 by fraluhil
Hallo Joffm,
besten Dank für die Tipps. Leider bekomme ich es nicht hin.

Zuerst habe ich Variante a probiert. Grundsätzlich habe ich die auch hinbekommen. Das Problem ist aber scheinbar, dass die Anzahl der Postleitzahlen mit den Ortsnahmen einfach zu groß ist. Ich bekomme alle Einträge in das Vorgabenfeld importiert, nach dem Abspeichern der Frage wird aber ein beträchtlicher Teil der Einträge "abgeschnitten". Es sind scheinbar zu viele.

Dann habe ich die zuletzt genannte Variante probiert, das Plugin installiert, aktiviert und die csv hochgeladen. Das funktioniert bei mir aber nicht. Die entsprechende Umfragedatei habe ich angehängt. Kannst Du mir hier weiterhelfen?

Besten Dank und schöne Grüße
Frank

File Attachment:

File Name: limesurvey..._ort.lss
File Size:14 KB

File Attachment:

File Name: limesurvey..._ort.lss
File Size:14 KB
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 1 month ago - 4 years 1 month ago #194614 by Joffm
Dann häng die csv-Datei auch an.
Du solltest sie allerdings zippen.


Gut, die erste Lösung geht nicht. Ein Textfeld - auch bei ausführlichem Text - ist nämlich 65000 Zeichen groß.
Und die Daten von 13000 Orten benötigen über 300000 Zeichen.

Aber die "autocomplete"-Lösung geht.

Ich habe jetzt eine Datei mit 13000 Orten angelegt.
Allerdings dauert es etwas länger, bis der Name erscheint. Das steht aber auch in der Doku.



Joffm

Hier ist übrigens ein workaround mit javascript und csv bzw. MySQL
manual.limesurvey.org/Workarounds:_Manip...wers_for_text_inputs
Herunterscrollen bis Update for LimeSurvey 2.05+

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 years 1 month ago by Joffm.
The topic has been locked.
  • fraluhil
  • fraluhil's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
4 years 1 month ago #194622 by fraluhil
Hier die Postleitzahlen-Datei.
Ich habe sie mit Notepad++ im utf-8-Format als csv abgespeichert und hoffe, dass es geklappt hat.
Attachments:
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 1 month ago #194654 by Joffm
Hallo,
ist mir gerade eingefallen:
Gut, die Gesamtdatei ist zu groß.
Na, dann splitten wir sie eben auf in mehrere, für jede Anfangsziffer eine, z,B, Q0a, Q0b, Q0c,...
Und die Gleichung bekommt dann noch eine IF-Struktur übergestülpt, ganz unrein:

{if(substr(Q1,0,1=="1",
substr(substr(Q0a, strpos(Q0a,Q1) ,strpos(Q0a,'#', strpos(Q0a,Q1) +1)- strpos(Q0a,Q1) ) ,5),
if(substr(Q1,0,1=="2",
substr(substr(Q0b, strpos(Q0b,Q1) ,strpos(Q0b,'#', strpos(Q0b,Q1) +1)- strpos(Q0b,Q1) ) ,5),
if(substr(Q1,0,1=="3",
substr(substr(Q0c, strpos(Q0c,Q1) ,strpos(Q0c,'#', strpos(Q0c,Q1) +1)- strpos(Q0c,Q1) ) ,5),
...

Also je nach Anfangsziffer greift man auf einen anderen Pool zu.

Schaue ich mir dann noch genauer an.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 1 month ago - 4 years 1 month ago #194660 by Joffm
Okay,
also es läuft sehr gut, wenn Du Deine PLZ-Datei in 10 einzelne splittest.
Q00: alle die mit "0" beginnen,
Q01: alle, die mit "1" beginnen,
usw.

Ich habe dann eine Gleichung vorgezogen, um die erste Ziffer zu bestimmen; sie heißt dann auch "EZ" mit einfach {substr(Q1,0,1)}

Dann sieht die Hauptgleichung "Ort" so aus:
{if(EZ=="0",substr(substr(Q00, strpos(Q00,Q1) ,strpos(Q00,'#', strpos(Q00,Q1) +1)- strpos(Q00,Q1) ) ,5), if(EZ=="1",substr(substr(Q01, strpos(Q01,Q1) ,strpos(Q01,'#', strpos(Q01,Q1) +1)- strpos(Q01,Q1) ) ,5), if(EZ=="2",substr(substr(Q02, strpos(Q02,Q1) ,strpos(Q02,'#', strpos(Q02,Q1) +1)- strpos(Q02,Q1) ) ,5), if(EZ=="3",substr(substr(Q03, strpos(Q03,Q1) ,strpos(Q03,'#', strpos(Q03,Q1) +1)- strpos(Q03,Q1) ) ,5), if(EZ=="4",substr(substr(Q04, strpos(Q04,Q1) ,strpos(Q04,'#', strpos(Q04,Q1) +1)- strpos(Q04,Q1) ) ,5), if(EZ=="5",substr(substr(Q05, strpos(Q05,Q1) ,strpos(Q05,'#', strpos(Q05,Q1) +1)- strpos(Q05,Q1) ) ,5), if(EZ=="6",substr(substr(Q06, strpos(Q06,Q1) ,strpos(Q06,'#', strpos(Q06,Q1) +1)- strpos(Q06,Q1) ) ,5), if(EZ=="7",substr(substr(Q07, strpos(Q07,Q1) ,strpos(Q07,'#', strpos(Q07,Q1) +1)- strpos(Q07,Q1) ) ,5), if(EZ=="8",substr(substr(Q08, strpos(Q08,Q1) ,strpos(Q08,'#', strpos(Q08,Q1) +1)- strpos(Q08,Q1) ) ,5), if(EZ=="9",substr(substr(Q09, strpos(Q09,Q1) ,strpos(Q09,'#', strpos(Q09,Q1) +1)- strpos(Q09,Q1) ) ,5), ""))))))))))}


Also eine zwar lange, aber einfache, verschachtelte IF-Struktur.

Und jetzt kommt das Problem, welches bei der "autocomplete"-Lösung keines ist:


Mehrere Orte zu einer PLZ.
Hier findet die erste Lösung immer nur den ersten Ort.

Ich habe einmal gestoppt.
"autocomplete" benötigt um die 12 Sekunden, um den Ort / die Orte zu finden. Und es hängt nicht von der Position der PLZ ab.

Ich habe übrigens die Struktur der PLZ-Datei angepasst.
Für den ersten Fall:
01067Dresden#
01069Dresden#
01097Dresden#
01099Dresden#
01108Dresden#

also ohne Abstand und mit letztem "#" Zeichen.

Für autocomplete:
01067 Dresden
01069 Dresden
01097 Dresden
01099 Dresden

also ohne Komma, aber Leerstelle.

So, jetzt kommt die Frage:
Hast Du LS auf einem eigenen, also wohl gemieteten Server wie 1&1, Strato, usw. installiert?
Hast Du ein bisschen Ahnung von MySQL und php?

Dann können wir es weiter treiben.

Auf der anderen Seite kannst Du natürlich die Anzeige des Ortes einfach weglassen, oder Du lässt den Respondenten seinen Ort einfach selbst eintippen; dann kannst Du ihn während der Studie anzeigen, aber ernstlich brauchst Du ihn nicht (falls sich da Tippfehler einschleichen, da Du ja die PLZ hast.

Überlege es Dir.

Morgen kommt dann auch ein Beispiel, falls Du es überhaupt benötigst.
Im Grunde habe ich alles bereits beschrieben.

Joffm

Aber da ich sie schon hier habe,

File Attachment:

File Name: limesurvey...2-27.lss
File Size:256 KB

Die csv-Datei für autocomplete habe ich ja beschrieben.
Da musst Du nur das Komma in eine Leerstelle umwandeln.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 years 1 month ago by Joffm.
The following user(s) said Thank You: fraluhil
The topic has been locked.
  • fraluhil
  • fraluhil's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
4 years 1 month ago #194665 by fraluhil
Hallo Joffm,
ich bin sprachlos vor Ehrfurcht!
Ich hätte nicht gedacht, dass sich das Ganze so aufwändig gestaltet. Umso größer mein Dank, dass Du dich der Sache so intensiv angenommen hast.
Vielleicht probiere ich tatsächlich die zuletzt von Dir angesprochene Variante und lasse die PLZ und die Stadt händisch eingeben.

Ich habe Limesurvey auf meinem Webspace bei strato installiert und nur wenig Ahnung von MySQL und php. Da werde ich ohne tiefe Einarbeitung kaum die autocomplete-Variante hinbekommen und v.a. später bei weiteren Befragungen replizieren können. Mach Dir also nicht noch mehr Arbeit damit.

Besten Dank und schöne Grüße

Frank
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 4 weeks ago - 4 years 4 weeks ago #194696 by Joffm
Hallo,
es hat mir natürllich keine Ruhe gelassen, und habe in den Tiefen meiner Studien noch dieses Script gefunden:
Code:
<script type="text/javascript" src="/survey/upload/surveys/831211/files/jquery.csv.js">
 
</script><script type="text/javascript" charset="utf-8">
  $(document).on('ready pjax:complete',function() {
    var url = "/survey/upload/surveys/831211/files/plzort.csv";
 
    var Names = new Array();
 
    $.get(url,function(data){
      fullArray = $.csv.toArrays(data);
      $(fullArray).each(function(i, item){
        Names.push(item[0]);
      });
      $("#question{QID} input[type=text]").autocomplete({
                minLength: 5,
        source: Names
      });
    });
 
  });
 
</script>

Wie Du siehst, wird hier noch die javascript-Datei "jquery.csv.js" benötigt.





Läuft superschnell, aber irgendwie bei mir nur in einem erweiterten "fruity" theme (und in einem erweiterten "bootswatch").
Ich habe noch nicht gefunden, was da anders ist.

Nur so nebenbei.
Wenn dies überall liefe, wäre das eine wirklich tolle Lösung.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 4 years 4 weeks ago by Joffm.
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Away
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
4 years 4 weeks ago #194699 by Joffm
Jetzt weiß ich woran es liegt.

In diesen erweiterten Themes ist im Folder "scripts" noch die "jquery-ui.min.js" enthalten.
Daran hatte ich doch (Alzheimer-geschädigt) überhaupt nicht mehr gedacht.

Wenn man dort auch die "jquery.csv.js" hinkopiert, muss sie nicht im script selbst sein.

Wenn Du also noch Interesse daran hast, schicke ich Dir den ganzen Kram zu.

Bis dann
Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: fraluhil
The topic has been locked.
  • fraluhil
  • fraluhil's Avatar Topic Author
  • Offline
  • Junior Member
  • Junior Member
More
4 years 4 weeks ago #194710 by fraluhil
... das wäre wunderbar!
Besten Dank und schöne Grüße

Frank
The topic has been locked.
Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose