0 votes
in SoSci Survey (dt.) by s179256 (140 points)

Liebes Sosci Survey Team,

wir würden gerne Termine im Institut über Sosci vereinbaren. An einem Termin sollen immer zwei Personen teilnehmen. Die Personen können aus einer Reihe von Terminen auswählen, die konsequenterweise immer nur zwei Mal angezeigt werden und dann für die weiteren TN nicht mehr zur Verfügung stehen sollen.
Die TN sollen etwa gleichen Alters sein (mithilfe einer Filterfrage werden unterschiedliche Termine angeboten für unterschiedliche Altersgruppen, hier der Einfachheit noch nicht aufgeführt) und wir würden die Mail-Adresse speichern, falls sich am Termin was ändert.

Zur Info:
Seite 1: Einführungstext
Seite 2: Altersgruppe (Filterfrage) & Mail
Seite 3: Terminvereinbarung (PHP-Code s.u.)
Seite 4: dbSet Befehl (s.u.)/ hier soll noch/wird eine Bestätigungsmail mit mailSchedule() getriggert.
Seite 5: Ende

Wir haben nun folgenden Code, mit dem wir die Terminauswahl in die interne Datenbank speichern (hier beispielsweise mit 6 Terminen):

$key = 'TN-'.caseSerial();
    $data =  array(
      value('AL01'), //speichert Altersgruppe
      value('EM02'), //speichert Seriennummer/Mail (Opt In auf "Personenbezogen")
      value('TA01'), //speichert Wunschtermin
      statistic('count', 'TA01', 1), //speichert, wie häufig welche Terminoption angeklickt wurde
      statistic('count', 'TA01', 2),
      statistic('count', 'TA01', 3),
      statistic('count', 'TA01', 4),
      statistic('count', 'TA01', 5),
      statistic('count', 'TA01', 6),
);
dbSet($key, $data);

Erste Frage(n):
In der Theorie und beim Ausprobieren funktioniert die Speicherung. Ich weiß aber bereits, dass der "key" (zumind. bei der ersten Person) keine Werte abrufen kann und daher der ganze Code (noch) nicht funktioniert. Vermutlich ist hier die caseSerial() als key nicht das richtige, oder? Was würde man stattdessen nehmen? Alles was ich ausprobiere, wird als "ungültiger Schlüssel" deklariert.

Ich bin mir nicht sicher, ob das damit zusammenhängt, aber der Eintrag wird auch immer überschrieben. Liegt dies ebenfalls am Code oder ggf. einfach am debug-Modus?

Außerdem erhalte ich die Meldung, dass man mit dem Befehl statistic() sparsam umgehen soll. Warum und wie kann ich diesen Befehl für unser Vorhaben ggf. umgehen/ gegen was austauschen?

Zweite Frage:
Wie kann man diese Information jetzt bei den folgenden Teilnehmenden abrufen?
Der Befehl dafür liegt vor dbSet auf der Terminvereinbarungsseite (statt die Frage auf die Seite zu ziehen, ist nur der Code auf der Seite). Diese wird aber derzeit nicht angezeigt, weil wie gesagt der key so nicht funktioniert. Der dbSet Befehl folgt auf einer leeren Seite direkt danach.
Bisher sieht dies so aus:

$key = 'TN-'.caseSerial();
$data = dbGet($key);

if ($data[3] >= 2) {
    question('TA01', ('2-6'));
} else if ($data[4] >= 2) {
    question('TA01',('1,3-6'));   
} else if ($data[5] >= 2) {
    question('TA01',('1-2,4-6')); 
} else if ($data[6] >= 2) {
    question('TA01',('1-3,5-6')); 
} else if ($data[7] >= 2) {
    question('TA01',('1-4, 6')); 
} else if ($data[8] >= 2) {
    question('TA01',('1-5')); 
}

Diese Lösung führt zwar zu dem Ziel, dass, wenn die erste Option zwei Mal angeklickt wurde, diese nicht mehr angezeigt wird. Die anderen Optionen werden aber weiterhin angezeigt, auch wenn diese mehr als zwei Mal angeklickt wurden. Vermutlich stimmt also etwas an den "else if" Befehlen nicht?

Bitte entschuldigen Sie die komplexe Frage. Ich hoffe, dass Sie mir helfen können.

Vielen herzlichen Dank im Voraus und freundliche Grüße!

1 Answer

0 votes
by SoSci Survey (308k points)

wir würden gerne Termine im Institut über Sosci vereinbaren.

Ganz ehrlich ... Terminplaner-Lösungen wie der DFN Terminplaner sind dafür womöglich die bessere Wahl. Weniger Overhead. Aber klar, so etwas wie ein Filter nach dem Alter lässt sich damit nicht realisieren.

Wir haben nun folgenden Code, mit dem wir die Terminauswahl in die interne Datenbank speichern

Das geht in die richtige Richtung ... aber es bringt Ihnen nichts, wenn Sie für jeden Teilnehmer einenm eigenen Datenbank-Eintrag anlegen. Die Idee wäre eigentlich, dass Sie einen Eintrag für das gesamte Projekt nutzen. Also einen fixen Datenbankschlüssel verwenden.

Dort würden Sie auch nicht mit statistic() zählen, sondern den alten Eintrag auslesen, eins hochzählen, und wieder schreiben.

Wenn Sie aber ohnehin schonmal statistic() eingebaut haben: Das wäre eine mögliche Alternative, bei der Sie dann keine "Datenbank für Inhalte" brauchen.

Außerdem erhalte ich die Meldung, dass man mit dem Befehl statistic() sparsam umgehen soll.

Genau, deshalb hatte ich auf die Datenbank verwiesen. Da könnte das so aussehen:

$data = dbGet('counts');
// Beim ersten Eintrag müssen wir das initialisieren
if (!$data) {
  $data = [0,0,0,0,0,0,0];  // Der erste hat den Index 0, den brauchen wir nicht
}
// Jetzt eins hochzählen
$termin = value('TA01');
if ($data[$termin] > 1) {
  // Meldung anzeigen, dass der Termin inzwischen nicht mehr frei ist
  repeatPage('TX01');
}
$data[$termin]++;
// Und wieder speichern
dbSet('counts', $data);

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...