Welcome to the LimeSurvey Community Forum

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

Mehrfachantworten und übergreifende Maximalpunkte

More
2 years 4 months ago - 2 years 4 months ago #242763 by moritz0903
Danke für die Erklärung! Ja, in dem ursprünglichen Beispiel hatte ich das nicht angegeben, weil ich es nicht noch komplizierter machen wollte. Wäre es einfacher, n Matrixfragen zu haben (quasi eine Pro Textilart) und dort einfach nur die existierenden Kombinationen anzulegen? Insgesamt gibt es bei mir 9 Textilien, das wird etwas viel manuelle Konfiguration von vorhandenen Kombinationen sonst.

Und noch eine kurze Frage: ich habe gerade mal testweise geantwortet, da steht dann aber in der Tabelle nicht der Wert, der gewählt wurde, sondern leider der ganze Fragentext. Kann ich das anpassen?

Nochmal Danke und VG
Last edit: 2 years 4 months ago by moritz0903.

Please Log in to join the conversation.

More
2 years 4 months ago - 2 years 4 months ago #242764 by Joffm

ich habe gerade mal testweise geantwortet, da steht dann aber in der Tabelle nicht der Wert, der gewählt wurde, sondern leider der ganze Fragentext. Kann ich das anpassen?

Sehe ich nicht.
 
Welche Einstellung hast Du denn "Kompakt" oder "Erweitert". Sollte "Kompakt"  sein.
Ist aber auch egal. Beim Datenexport wählst Du ja die Art der Darstellung.

Ja, in dem ursprünglichen Beispiel hatte ich das nicht angegeben, weil ich es nicht noch komplizierter machen wollte.

 Und damit führst Du die Leute auf die total falsche Fährte.
Gut, Du bist nicht der Einzige, der ein Beispiel bringt, und dann später sagt "Ätsch, es ist aber ganz anders"
Aber es ärgert mich kolossal. Ich habe mir sehr viel Mühe gegeben; und - für Nichts und wieder Nichts.

Dann überlege Dir einmal etwas anderes!
Da es ja eine Maximalzahl der zu wählenden Teile gibt (Punktkontingent / billigstes Teil) könnte man vielleicht so viele Sequenzen von "Auswahl des Teils" und "Matrix für den Rest (mit Teilfragenrelevanz je nach Art)" 

Aber "up to you".

Bis dann
Joffm
 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 2 years 4 months ago by Joffm.

Please Log in to join the conversation.

More
2 years 4 months ago #242765 by moritz0903
Sorry, ich wollte eigentlich Arbeit ersparen, nicht zusätzlich generieren. Jedenfalls weiß ich Deine Mühen sehr zu schätzen und das allermeiste kann ich ja auch 1:1 verwenden, dass das mit der Logik der Kombinationen so viel Ärger macht, war mir nicht klar.

Please Log in to join the conversation.

More
2 years 4 months ago - 2 years 4 months ago #242809 by moritz0903
Für die Nachwelt: Dank der Vorarbeit war es recht einfach, die Abhängigkeiten der Kombinationen mit ein paar Zeilen Javascript noch einzufügen. Sicher nicht perfekt, aber es geht. Hier mein Ansatz:

Zunächst werden die Felder X_001 (Textilart), X_003 (Farbe) und X_004 (Größe) initialisiert, wobei nur für X_001 Werte eingegeben werden, die anderen setze ich per JS:
Code:
// Insert selects
// X_001: Textilart
$('.answer-item.answer_cell_X001', thisQuestion).addClass('with-select').append(
'<select class="inserted-select form-control list-question-select">\
<option value="">Bitte auswählen</option>\
<option value="1">T-Shirt</option>\
<option value="2">Hoody</option>\
<option value="3">Fleecejacke Vintage</option>\
<option value="4">Fleecejacke</option>\
<option value="5">Polo</option>\
<option value="6">Softshelljacke</option>\
<option value="7">Softshellweste</option>\
<option value="8">Sweatshirt</option>\
<option value="9">Zip-Hoody</option>\
</select>');
 
// X_003: Farbe (abhängig von X_001)
$('.answer-item.answer_cell_X003', thisQuestion).addClass('with-select').append(
'<select class="inserted-select form-control list-question-select">\
<option value="">Bitte Textil wählen!</option>\
</select>');
 
// X_004: Größe (abhängig von X_001)
$('.answer-item.answer_cell_X004', thisQuestion).addClass('with-select').append(
'<select class="inserted-select form-control list-question-select">\
<option value="">Bitte Textil wählen!</option>\
</select>');

Anschließend habe ich mir noch ein Helfer definiert, ich wollte an der Logik für die Preise von Joffm festhalten, daher das Mapping von Größen zu Zahlen:
Code:
// Helpers, dicts set the right text, value combination
var thisQuestion = $('#question{QID}');
var sizes = {
    "XS": "1",
    "S": "2",
    "M": "3",
    "L": "4",
    "XL": "5",
    "XXL": "6",
    "3XL": "7",
    "4XL": "8",
    "5XL": "9",
};
var colors = {
    "Anthrazit": "1",
    "Anthrazit/Platin": "2",
    "Charcoal": "3",
    "Grau": "4",
    "Schwarz": "5",
    "Steel Grey": "6",
    "Weiß": "7",
    "Zinn": "8",
};


Schließlich dann mittels Listener die anderen beiden Dropouts befüllen. Um anzugeben, welches Textil es in welchen Farben und Größen gibt, habe ich ein simples array verwendet, das ich via switch definiere:
Code:
    // Listeners: Changing of textile type will populate the other select fields
    $('.answer-item.answer_cell_X001 .inserted-select', thisQuestion).on('change', function(i) {
      let textilCode = $('option:selected', this).val();
      let textilName = $('option:selected', this).text();
      let allowedColors;
      let allowedSizes;
 
      // Select fields for size and color
      let colorSelect = $(this).closest('tr').find('.answer-item.answer_cell_X003 .inserted-select');
      let sizeSelect = $(this).closest('tr').find('.answer-item.answer_cell_X004 .inserted-select');
 
      // Clear select fields and add dummy text
      colorSelect.find('option').remove().end().append('<option value="">Bitte auswählen</option>').val('');
      sizeSelect.find('option').remove().end().append('<option value="">Bitte auswählen</option>').val('');
   
      // Prepare population of other dropdowns
      switch (textilName) {
        case 'T-Shirt':
          allowedColors = ["Schwarz", "Steel Grey", "Weiß"];
          allowedSizes = ["XS", "S", "M", "L", "XL", "XXL", "3XL", "4XL", "5XL"];
          break;
        case 'Hoody':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
        break;
        case 'Fleecejacke Vintage':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
        break;
        case 'Fleecejacke':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        case 'Polo':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        case 'Softshelljacke':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        case 'Softshellweste':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        case 'Sweatshirt':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        case 'Zip-Hoody':
          // TODO: Update der Größen und Farben
          allowedColors = ["Weiß"];
          allowedSizes = ["5XL"];
          break;
        default:
          break;
      }
    
 
      // Populate select fields based on switch selection
      $.each(allowedColors, function(_, value) {
        colorSelect.append($("<option></option>").attr("value", colors[value]).text(value)); 
      });
      $.each(allowedSizes, function(_, value) {
        sizeSelect.append($("<option></option>").attr("value", sizes[value]).text(value)); 
      });
 
    });

Das wars auch schon, der Rest ist 1:1 die Implementierung von Joffm. Mittels Bootstrap cards und modals sieht der Einleitungstext jetzt auch nett aus.

VG
Moritz
Last edit: 2 years 4 months ago by moritz0903. Reason: Linting

Please Log in to join the conversation.

More
2 years 4 months ago #242821 by Joffm
Hallo,
das sieht wirklich gut aus.
Da solche Dinge ja sehr häufig angefragt werden, werde ich dies in mein Tutorial einbauen (mit Nennung Deiner Autorenschaft).
Die anderen scripte in den Tutorials stammen ja hauptsächlich von @tpartner.

Viel Erfolg

Joffm

 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
2 years 4 months ago #242824 by moritz0903
Sehr gerne, war dann Dank Deines Inputs nicht mehr viel Arbeit. Wenn es Dir hilft kann ich auch die ganze Datei posten, da sind auch die aktuellen Bootstrap Elemente enthalten.

VG

Please Log in to join the conversation.

More
2 years 4 months ago #242831 by Joffm
Dafür wäre ich sehr dankbar..
Wie ich schon schrieb "mit bootstrap 5 habe ich mich noch nicht angefreundet"

Joffm 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
2 years 4 months ago #242851 by moritz0903
Alles klar, ich hab die ganze Datei angehängt. Die Logik ist etwas kompliziert auf Grund der vielen Textilien, die zur Wahl stehen. Für das Beispiel habe ich jetzt kurzerhand die Besonderheit mit den Aufschlägen ab 3XL entfernt. Ansonsten funktioniert es aber wie bei Dir auch, das Bootstrap Grid System macht alle Bilder schön gleich hoch, natürlich wird er sich in dem Schnipsel über die nicht gefunden Bilder beschweren.

Hoffe es ist soweit verständlich.

Schönen Abend!

Please Log in to join the conversation.

More
2 years 4 months ago - 2 years 4 months ago #242860 by Joffm
Hallo, Moritz,
das ist echt gut geworden.

Aber jetzt ist mir eine Sache aufgefallen.
Wenn Du eine Zeile wieder entfernen willst, vielleicht, weil das Punkte kontingent überschritten wurde, wird nur die Zelle "Anzahl" gelöscht, die Drop-Downs aber nicht. Daraus resultiert dann auch, dass die Punktzahl nicht aktualisiert wird.

Da muss wohl in der Funktion  function removeRow(qID) { noch etwas ergänzt werden.

Du bist offensichtlich in javascript mehr bewandert als ich, also schau einmal.

Im schlimmsten Fall müssen wir hoffen, dass Tony (@tpartner) einen Tipp hat.
Ich werde diese "Unschönheit" einmal im englischen Teil ansprechen.

Joffm

P.S.
Tony hat ein Update geliefert.
In "removeRow" unter
          $(arrayRow + '[name="visible"]:last input[type="text"]').val('');
dies zusätzlich
          $(arrayRow + '[name="visible"]:last select').val('');

Damit ist der Eintrag zwar weg, aber die Bestellsumme wird trotzdem nicht aktualisiert.
Da müssen wir noch einmal ran.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 2 years 4 months ago by Joffm.

Please Log in to join the conversation.

More
2 years 4 months ago #242918 by Joffm
So, jetzt ist auch die Aktualisierung der Bestellsumme geklärt.
Einfach noch ein "trigger('keyup')" an das Löschen der Eingabe hängen

$(arrayRow + '[name="visible"]:last input[type="text"]').val('').trigger('keyup');

Ich glaube, die Farbe "zinn" hat keinen Code.

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
2 years 4 months ago - 2 years 4 months ago #242923 by moritz0903
Super, vielen Dank! Der Fix hat funktioniert, ich habe parallel auch was probiert, das ging auch aber so ist es eleganter. Danke auch für den Fehler bei Zinn, das ist mir durchgerutscht.

Noch eine Frage: Trotz Deines Matrix-Tutorials schaffe ich es bei Antworten nicht, mir statt des Codes den Wert des Dropdowns (also z.B. "T-Shirt" statt "1" bei X001) anzeigen zu lassen. Probiert habe ich diese Zeilen hier:

Code:
var selectval = $('select.inserted-select option', thisCell).filter(function () { return $(this).html() == inputText; }).val();
$('select.inserted-select', thisCell).val(selectval);

Allerdings ist mir nicht ganz klar, welchen Wert LimeSurvey dann in die Antwort Tabelle schreibt. Mache ich etwas falsch?

Danke und schönes verlängertes Wochenende!
Last edit: 2 years 4 months ago by moritz0903.

Please Log in to join the conversation.

More
2 years 3 months ago #242925 by Joffm
Nee, Du machst nichts falsch.

Vielmehr habe ich im Tutorial etwas übersehen: Der Listener muss auch angepasst werden.

Hiermit klappt es
Code:
    // Listeners on select elements
    $('.inserted-select', thisQuestion).on('change', function(i) {
      if($(this).val() != '') {
        $(this).closest('.answer-item').find('input:text').val($.trim($('option:selected', this).text())).trigger('keyup');
      }
      else {
        $(this).closest('.answer-item').find('input:text').val('').trigger('keyup');
      }
    });
 
    // Returning to page
    $('.with-select input:text', thisQuestion).each(function(i) {
      var thisCell = $(this).closest('.answer-item');
      var inputText = $.trim($(this).val());
      var selectval = $('select.inserted-select option', thisCell).filter(function () { return $(this).html() == inputText; }).val();
      $('select.inserted-select', thisCell).val(selectval);
    });

 

Joffm


 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
2 years 3 months ago #242940 by moritz0903
Super, vielen Dank! Damit geht es, allerdings hat es die Logik für die Validierung und Zwischenberechnung zerstört, weil die Werte nicht mehr mit den Nummern, sondern Text codiert sind. Man muss bei den Vergleichen folgende Änderung vornehmen:
Code:
if(Q1_Y001_X001.NAOK==1,Q1_Y001_X002.NAOK*10, 0)
wird zu:
Code:
if(strcmp(strtolower(Q1_Y001_X001.NAOK), "t-shirt")==0, Q1_Y001_X002.NAOK*10, 0)

Analog für die anderen Vergleiche, ich habe PHP strcmp  verwendet, evtl. geht es auch eleganter.

VG und nochmal Danke!

Please Log in to join the conversation.

More
2 years 3 months ago #242941 by Joffm
Ja, klar.
Man kann es sich unnötig kompliziert machen.
Mit Texten lassen sich eben nur wenige Operationen durchführen. (gerade einmal "gleich - ungleich")
Daher benutze ich immer numerische Codes; damit ist man einfach flexibler.
Z.B. wenn Du doch noch die Preiserhöhung bei großen Größen einbauen willst. Dann genügt "X004>...".
Hier ginge ja noch "X004<'A' ", da '3XL' und die anderen eben im alphanumerischen Vergleich kleiner sind.
Aber trotzdem.

Und wenn Du am Ende jedem Teilnehmer noch einen Ausdruck seiner Bestellung (mit pdfReport) anbieten willst, sind die Werte ja leicht in beliebige Texte umgestellt.
Ebenso nach Export der Daten nach Excel (lookup).

Das als Plädoyer für numerische Codes.
​​​​​
Schönes Wochenende
Joffm 

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

More
2 years 3 months ago #242946 by moritz0903
Um diesen Thread abzuschließen: anbei sind beide Versionen mit allen Korrekturen und funktionierender Berechnung. Einmal die Datei mit den Antworten und der Logik als Text und einmal mit Antworten + Logik als numerische Codes. In meinem Fall wurden es dann die Codes, weil es einfach einfacher ist. Vielleicht kann aber jemand die andere Variante brauchen :-) 

VG und schönen Feiertag!
Moritz
The following user(s) said Thank You: Joffm

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose