UnterKnut: ASP / VBScript und Checkboxen in Datenbank (Access)

0 43

ASP / VBScript und Checkboxen in Datenbank (Access)

UnterKnut
  • vb-script
  1. 0
    Der Martin
    • formulare
    • html
    1. 0
      MudGuard
  2. 0
    MudGuard
    1. 0
      UnterKnut
      1. 0
        UnterKnut
        1. 0
          Der Martin
          1. 0
            UnterKnut
            1. 0
              Rolf B
              1. 0
                UnterKnut
                1. 0
                  Rolf B
                2. 0
                  Gunnar Bittersmann
                  • html
            2. 0
              Der Martin
            3. 0
              pl
              1. 0
                Rolf B
                1. 0
                  pl
            4. 0
              Gunnar Bittersmann
              • html
            5. 0
              Gunnar Bittersmann
              • design
              • ux
              1. 0
                Der Martin
                • rechtschreibung
                • sprache
                1. 0
                  Gunnar Bittersmann
                  1. 0
                    Der Martin
                    1. 0
                      Tabellenkalk
                      1. 0
                        Gunnar Bittersmann
                        • sprache
                    2. 0
                      Felix Riesterer
                      1. 0
                        Gunnar Bittersmann
                        • design
                        • ux
                      2. 0
                        Der Martin
                    3. 0
                      Gunnar Bittersmann
  3. 0
    Felix Riesterer
    • html
    • vb-script
    1. 0
      UNterKnut
      1. 0
        Rolf B
      2. -1
        Felix Riesterer
    2. 0
      Gunnar Bittersmann
      • formulare
    3. 0
      pl
      1. 0
        Gunnar Bittersmann
        • sonstiges
        1. 0
          pl
  4. 0
    UNterKNut
    1. 0
      Gunnar Bittersmann
      1. -1
        pl
        1. 0
          Gunnar Bittersmann
        2. 0
          dedlfix
          1. 0
            UnterKnut
            1. 0
              Tabellenkalk
              1. 0
                UnterKnut

Hi Ich arbeite an einer Übersichtsseite, geschrieben in HTML, VBSCRIPT ASP und mit Access DB Ich habe auf den Detailseiten einiges an Checkboxen zu verarbeiten, deren Zustand gespeichert werden soll. Beispielsweise gibt es dort eine Rubrik "Absagegründe". Hier soll ausgewählt werden, warum eine bestimmte Sache abgesagt worden ist, beispielsweise <input type="checkbox" name="Absage_Keine_Angabe" value="keine angabe"> So soll der user das Häkchen setzen können, um das Formular zu speichern und somit mitteilen zu können, dass es für die Absage der Sache keine Gründe gibt. Weitere checkboxen gibt es zuhauf

Nun habe ich den Datentyp der Datenbank für alle diese Einträge auf adbool gesetzt Request.Form("Absage_Keine_Angabe"), Request.Form("Absage_Keine_Angabe"), null)) ' adBoolean

Wenn ich nun das Formular abschicke, werden alle text inputs gespeichert und geändert, so wie das sein soll aber die Werte der Checkboxen werden nicht übernommen, weder TRUE noch FALSE Beim googlen werde ich irgendwie nicht fündig ...

Muss ich die Checkbox selbst noch irgendwie auswerten, oder sehe ich hier was ganz falsch ?

Grüße

  1. Moin,

    Beispielsweise gibt es dort eine Rubrik "Absagegründe". Hier soll ausgewählt werden, warum eine bestimmte Sache abgesagt worden ist, beispielsweise <input type="checkbox" name="Absage_Keine_Angabe" value="keine angabe"> So soll der user das Häkchen setzen können, um das Formular zu speichern und somit mitteilen zu können, dass es für die Absage der Sache keine Gründe gibt.

    wäre da nicht eine Gruppe Radio-Buttons passender?

    Wenn ich nun das Formular abschicke, werden alle text inputs gespeichert und geändert, so wie das sein soll aber die Werte der Checkboxen werden nicht übernommen, weder TRUE noch FALSE

    Beim Absenden eines Formulars übermittelt HTML nur die markierten (angekreuzten) Checkboxen, die anderen nicht.

    Beim googlen werde ich irgendwie nicht fündig ...

    Wonach hast du denn gesucht?

    Ciao,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
    1. Hi,

      So soll der user das Häkchen setzen können, um das Formular zu speichern und somit mitteilen zu können, dass es für die Absage der Sache keine Gründe gibt.

      wäre da nicht eine Gruppe Radio-Buttons passender?

      kommt drauf an, ob man nur eine Antwort auswählen darf.

      cu,
      Andreas a/k/a MudGuard

  2. Hi,

    Wenn ich nun das Formular abschicke, werden alle text inputs gespeichert und geändert, so wie das sein soll aber die Werte der Checkboxen werden nicht übernommen, weder TRUE noch FALSE

    ich kenn mich mit ASP nicht aus,kann Dir aber sagen, daß Checkboxen nur dann übermittelt werden, wenn sie angehakt sind. Das könnte zumindest den false-Fall erklären.

    cu,
    Andreas a/k/a MudGuard

    1. Wow ihr seit aber schon fleißig zur frühen Stunde

      hier seht ihr einen Screenshot der Seite. So kann man sich das sicher besser vorstellen es sollen etliche Checkboxen gespeichert werden. Jeweils TRUE oder FALSE.

      Es funktioniert aber weder TRUE noch False. Auch wenn ich händisch in der Datenbank den Wert auf TRUE setze (adbool), dann wird der über das inputfeld nicht gezogen, die checkbox bleibt also leer

      1. Die Felder sind im Access als Ja/Nein bzw. Wahr/Falsch gesetzt, und werden beim speichern im Request als adbool behandelt alle textfelder werden gespeichert, nur die boxen nicht.

        1. Hallo,

          Die Felder sind im Access als Ja/Nein bzw. Wahr/Falsch gesetzt, und werden beim speichern im Request als adbool behandelt

          lass uns das Problem bitte schrittweise angehen, nicht alles auf einmal.

          Schritt 1: Wie sieht das Formular in HTML aus (Quellcode)?
          Schritt 2: Werden die Formulardaten korrekt übermittelt?
          Schritt 3: Erst jetzt kommt überhaupt VBScript und Access ins Spiel (und da sind die meisten von uns vermutlich raus).

          alle textfelder werden gespeichert, nur die boxen nicht.

          Dann lass uns das Zeug mal anschauen.

          So long,
           Martin

          --
          Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
          1. okay, die Seite besteht aus einem Formular

            <form action="speichern.asp" method="post">
            

            welches 64 input Felder enthält, die in mehrere Tables gegliedert sind. einige davon sind vom type text

            <td><b>letzte &Auml;nderung</b></td><td><input type="text" name="Kern_letzte_Aenderung" value="<%=(rs_Ausschreibungsedit.Fields.Item("Kern_letzte_Aenderung").Value) %>"></td></tr>
            

            und einige vom type checkbox

            <tr>
              <td><b>keine Angabe</b></td><td><input type="Checkbox" name="Absage_Keine_Angabe" value="<%=(rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value) %>"></td>
              <td><b>Konzept erreicht keine 85% der Leistungspunkte</b></td>
              <td><input type="Checkbox" name="Absage_Konzept_N_85p" value="<%=(rs_Ausschreibungsedit.Fields.Item("Absage_Konzept_N_85p").Value) %>"></td>
            </tr>
            

            Beim absenden wird das formular an speichern.asp übergeben

            <%@LANGUAGE="VBSCRIPT"%>
            <!--#include file="../Connections/Ausschreibungskalender.asp" -->
            <% strID = Request.QueryString("ID") %>
            
            
            <%
            Dim MM_editAction
            MM_editAction = CStr(Request.ServerVariables("SCRIPT_NAME"))
            If (Request.QueryString <> "") Then
              MM_editAction = MM_editAction & "?" & Server.HTMLEncode(Request.QueryString)
            End If
            
            ' boolean to abort record edit
            Dim MM_abortEdit
            MM_abortEdit = false
            %>
            <%
            
            %>
            <%
            ' IIf implementation
            Function MM_IIf(condition, ifTrue, ifFalse)
              If condition = "" Then
                MM_IIf = ifFalse
              Else
                MM_IIf = ifTrue
              End If
            End Function
            %>
            <%
            
            
              If (Not MM_abortEdit) Then
                ' execute the update
                Dim MM_editCmd
            
                Set MM_editCmd = Server.CreateObject ("ADODB.Command")
                MM_editCmd.ActiveConnection = MM_Ausschreibungsliste_STRING 
            	
                MM_editCmd.CommandText = "UPDATE Ausschreibungsliste SET Kern_Status = ?, Kern_Akademie = ?, Kern_letzte_Aenderung = ?, Kern_Angebotsabgabe = ?, Kern_Vergabenummer = ?, Kern_Massnahmebeginn = ?, Kern_Massnahmeende = ?, Kern_Losnummer = ?, Kern_Beauftragungsart = ?, Kern_MassnahmeArt = ?, Kern_Durchfuehrungsort = ?, Kern_Auftraggeber = ?, Kern_Zuschlag_An = ?, Preise_Aufwandspauschale = ?, Preise_Integrationshonorar = ?, Preise_Angebotspreis_Stunde = ?, Preise_Angebotspreis_gesamt = ?, Preise_Mitbieter_Nicht_bekannt = ?, Preise_Mitbieterpreis_hoechste = ?, Preise_Mitbieterpreis_niedrigste = ?, TN_Anzahl_TN = ?, TN_Vermittlungsqoute = ?, TN_Gesamt_TN_Plaetze = ?, TN_Bietergemeinschaft = ?, TN_Laufzeit_Wochen = ?, TN_Bietergemeinschaft_Plaetze = ?, TN_Laufzeit_Monate = ?, Absage_ehemals = ?, Absage_Keine_Angabe = ?, Absage_Ausschreibung_Aufgehoben = ?, Absage_Konzept_N_85p = ?, Absage_Kennzahl_innerh_Korridor = ?, Absage_Formfehler = ?, Absage_Kennzahl_ausserh_Korridor = ?, Absage_fehlende_Formulare = ?, Absage_n_hoechste_Prio = ?, Absage_Unterschrift_fehlt = ?, Absage_n_wirtschaftlich = ?, Absage_verspaetet = ?, Absage_Preis_Leistung_nio = ?, Absage_fehlende_Preisangaben = ?, Absage_Preis_ueber_Zuschlag = ?, Absage_Vordrucke_nio_VU = ?, Absage_Punkte_identisch_aber_teurer = ?, Absage_Konzeptschluessigkeit = ?, Absage_freihaendige_Vergabe = ?, Absage_fehlende_Angaben = ?, Absage_NEU = ?, Absage_Fachkundezweifel = ?, Absage_n_Mindestanforderungen_VU = ?, Absage_Massnahmepreiss_n_eindeutig = ?, Absage_0_Punkte_T = ?, Absage_0_Punkte_B = ?, Absage_1_Punkt_T = ?, Absage_1_Punkt_B = ?, Modul_1_Beschreibung = ?, Modul_2_Beschreibung = ?, Modul_3_Beschreibung = ?, Modul_1_Preis = ?, Modul_2_Preis = ?, Modul_3_Preis = ?, Modul_1_Anzahl_MN = ?, Modul_2_Anzahl_MN = ?, Modul_3_Anzahl_MN = ? WHERE ID = " & Session("strID") & ""
            	
            	
            	MM_editCmd.Prepared = true
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param1", 202, 1, 50, MM_IIF(Request.Form("Kern_Status"), Request.Form("Kern_Status"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param2", 202, 1, 50, MM_IIF(Request.Form("Kern_Akademie"), Request.Form("Kern_Akademie"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param3", 202, 1, 50, MM_IIF(Request.Form("Kern_letzte_Aenderung"), Request.Form("Kern_letzte_Aenderung"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param4", 202, 1, 50, MM_IIF(Request.Form("Kern_Angebotsabgabe"), Request.Form("Kern_Angebotsabgabe"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param5", 202, 1, 50, MM_IIF(Request.Form("Kern_Vergabenummer"), Request.Form("Kern_Vergabenummer"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param6", 202, 1, 50, MM_IIF(Request.Form("Kern_Massnahmebeginn"), Request.Form("Kern_Massnahmebeginn"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param7", 202, 1, 50, MM_IIF(Request.Form("Kern_Massnahmeende"), Request.Form("Kern_Massnahmeende"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param8", 202, 1, 50, MM_IIF(Request.Form("Kern_Losnummer"), Request.Form("Kern_Losnummer"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param9", 202, 1, 50, MM_IIF(Request.Form("Kern_Beauftragungsart"), Request.Form("Kern_Beauftragungsart"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param10", 202, 1, 50, MM_IIF(Request.Form("Kern_MassnahmeArt"), Request.Form("Kern_MassnahmeArt"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param11", 202, 1, 50, MM_IIF(Request.Form("Kern_Durchfuehrungsort"), Request.Form("Kern_Durchfuehrungsort"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param12", 202, 1, 50, MM_IIF(Request.Form("Kern_Auftraggeber"), Request.Form("Kern_Auftraggeber"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param13", 202, 1, 50, MM_IIF(Request.Form("Kern_Zuschlag_An"), Request.Form("Kern_Zuschlag_An"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param14", 202, 1, 50, MM_IIF(Request.Form("Preise_Aufwandspauschale"), Request.Form("Preise_Aufwandspauschale"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param15", 202, 1, 50, MM_IIF(Request.Form("Preise_Integrationshonorar"), Request.Form("Preise_Integrationshonorar"), null)) ' adVarWChar
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param16", 202, 1, 50, MM_IIF(Request.Form("Preise_Angebotspreis_Stunde"), Request.Form("Preise_Angebotspreis_Stunde"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param17", 202, 1, 50, MM_IIF(Request.Form("Preise_Angebotspreis_gesamt"), Request.Form("Preise_Angebotspreis_gesamt"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param18", 202, 1, 50, MM_IIF(Request.Form("Preise_Mitbieter_Nicht_bekannt"), Request.Form("Preise_Mitbieter_Nicht_bekannt"), null)) ' adBoolean
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param19", 202, 1, 50, MM_IIF(Request.Form("Preise_Mitbieterpreis_hoechste"), Request.Form("Preise_Mitbieterpreis_hoechste"), null)) ' adDouble
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param20", 202, 1, 50, MM_IIF(Request.Form("Preise_Mitbieterpreis_niedrigste"), Request.Form("Preise_Mitbieterpreis_niedrigste"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param21", 202, 1, 50, MM_IIF(Request.Form("TN_Anzahl_TN"), Request.Form("TN_Anzahl_TN"), null)) ' adLongVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param22", 202, 1, 50, MM_IIF(Request.Form("TN_Vermittlungsqoute"), Request.Form("TN_Vermittlungsqoute"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param23", 202, 1, 50, MM_IIF(Request.Form("TN_Gesamt_TN_Plaetze"), Request.Form("TN_Gesamt_TN_Plaetze"), null)) ' adDouble
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param24", 202, 1, 50, MM_IIF(Request.Form("TN_Bietergemeinschaft"), Request.Form("TN_Bietergemeinschaft"), null)) ' adDouble
                MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param25", 202, 1, 50, MM_IIF(Request.Form("TN_Laufzeit_Wochen"), Request.Form("TN_Laufzeit_Wochen"), null)) ' adDouble
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param26", 202, 1, 50, MM_IIF(Request.Form("TN_Bietergemeinschaft_Plaetze"), Request.Form("TN_Bietergemeinschaft_Plaetze"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param27", 202, 1, 50, MM_IIF(Request.Form("TN_Laufzeit_Monate"), Request.Form("TN_Laufzeit_Monate"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param28", 202, 1, 50, MM_IIF(Request.Form("Absage_ehemals"), Request.Form("Absage_ehemals"), null)) ' adVarWChar
            	MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param29", 202, 1, 50, MM_IIF(Request.Form("Absage_Keine_Angabe"), Request.Form("Absage_Keine_Angabe"), null)) ' adBoolean
            .... usw
            

            Die Felder in der DB haben immer den selben Namen wie die Form selbst gearbeitet wird mit Session Variablen

            Session("Absage_Keine_Angabe") = Request.Form("Absage_Keine_Angabe")
            Session("Absage_Ausschreibung_Aufgehoben") = Request.Form("Absage_Ausschreibung_Aufgehoben")
            Session("Absage_Konzept_N_85p") = Request.Form("Absage_Konzept_N_85p")
            ...
            

            Nun werden alle text inputs beim absenden der Form gespeichert und aktualisiert Die Checkboxen aber bewegen sich überhaupt nicht, als würde da noch etwas fehlen

            1. Hallo UnterKnut,

              wie sind die booleschen Parameter in der Access Table deklariert?

              Dein CreateParameter Aufruf deklariert sie als 202, das ist adVarWChar. adBoolean ist 11 (Liste).

              Bei Checkboxen ist es auch so, dass das value-Attribut den Wert repräsentiert, mit dem die Checkbox sich beim POST meldet, wenn sie angehakt wurde.

              <input type="checkbox" name="foo" value="bar">
              

              postet foo=bar wenn das Häkchen gesetzt ist. Und NICHTS, wenn das Häkchen nicht gesetzt ist.

              Um eine Checkbox beim Aufbau der Seite vorzuselektieren, musst Du das checked-Attribut hinzufügen. Das ist aber „true when present“ Attribut, d.h. um eine Checkbox nicht vorzuselektieren, musst Du das checked-Attribut weglassen.

              Wenn Du also die Checkbox-Werte als Strings speicherst (weil die paramxx Felder einfach so sind), dann solltest Du ihnen value="1" geben. Und beim Erzeugen der Checkboxen das Checked-Attribut hinzufügen, wenn das param-Feld gesetzt ist.

              Und last, but really not least, den HTML ist falsch.

              1. Table-Layout ist bäh. Für sowas gibt es heutzutage display:grid (was etwas nervig ist falls auch im IE11 Grid-Layout unterstützen willst)
              2. Eingabefelder brauchen eine korrekte Beschriftung. Ein span reicht nicht, das muss <label> sein. Entweder über eine ID verknüpft
              <label for="eingabe17">Name:</label><input type="text" id="eingabe17">
              

              oder über Schachtelung, dann brauchst Du keine ID:

              <label><span>Name:<span><input type="text"></label>
              

              Fett machen kannst Du die Beschriftung dann über CSS (font-weight), dafür brauchst Du kein b Element.

              Eigentlich ist deine Table eine Liste ohne Listenmarkierungen, die als Grid dargestellt wird. Über media queries kannst Du erreichen, dass die Liste ein- oder zweispaltig angezeigt wird, je nach verfügbarer Bildschirmbreite.

              Rolf

              --
              sumpsi - posui - clusi
              1. Hi Rolf und auch Dir Dankeschön für deine Hilfestellungen

                lassen wir das Table-Design erstmal aussen vor, die baustelle wird sonst zu groß :-D

                Einen groben Schnitzer hast du schon aufgedeckt. Durch lauter copy&paste krams habe ich den parameter bei 202 (varchar) belassen und nicht auf 11 für bool gesetzt Das habe ich nun angepasst für alle checkbox formulare

                Übelst freudig habe ich meinen Kladderadatsch dann nochmal getestet, und es ist alles beim alten :/ Auch wenn ich's im access wieder setze (wahr/falsch), sehe ich's im html nicht. (ist es bei bool denn auch richtig, nach dem .Value zu fragen? <%=(rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value) %> )

                1. Hallo UnterKnut,

                  ich bin kein VBScript und ADO Experte - aber ich würde annehmen, dass Value ein Variant ist in dem sich bei adBoolean-Feldern auch ein boolescher Wert findet.

                  Meine und andere Ausführungen zum Umgang mit Checkboxen hast Du auch gelesen? Da sind noch einige Schnitzer mehr.

                  Rolf

                  --
                  sumpsi - posui - clusi
                2. @@UnterKnut

                  lassen wir das Table-Design erstmal aussen vor, die baustelle wird sonst zu groß :-D

                  Dann sag dem table-Element aber bitte, dass es nicht für eine Tabelle steht:

                  <table role="none presentation">
                  

                  Und verwende Labels und IDs:

                  <td><b><label for="Absage_Keine_Angabe">keine Angabe</label></b></td>
                  <td><input type="Checkbox" id="Absage_Keine_Angabe" name="Absage_Keine_Angabe"  %>"></td>
                  

                  Aber wie Rolf sagte, <b> weg, Label mit CSS fett machen:

                  label { font-weight: bold }
                  

                  LLAP 🖖

                  --
                  Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
            2. Moin,

              <td><b>letzte &Auml;nderung</b></td><td><input type="text" name="Kern_letzte_Aenderung" value="<%=(rs_Ausschreibungsedit.Fields.Item("Kern_letzte_Aenderung").Value) %>"></td></tr>
              

              nur so als Tipp: Das Verst&uuml;mmeln von Umlauten ist nicht nötig, es verschlechtert nur die Lesbarkeit.

              ' IIf implementation
              Function MM_IIf(condition, ifTrue, ifFalse)
                If condition = "" Then
                  MM_IIf = ifFalse
                Else
                  MM_IIf = ifTrue
                End If
              End Function
              %>
              

              Ich denke mal, hier liegt der Hase im Pfeffer: Du überprüfst, ob im Parameter condition ein Leerstring übergeben wurde. Beim Funktionsaufruf übergibst du aber immer den Namen einer Chackbox [EDIT: Nein, es sieht aus, als wäre es ein Formularelement-Objekt oder sowas], also keinen leeren String, so wie hier zum Beispiel:

                  MM_editCmd.Parameters.Append MM_editCmd.CreateParameter("param6", 202, 1, 50, MM_IIF(Request.Form("Kern_Massnahmebeginn"), Request.Form("Kern_Massnahmebeginn"), null)) ' adVarWChar
              

              Folglich gibt deine IIF-Funktion immer den false-Wert zurück.

              Die Checkboxen aber bewegen sich überhaupt nicht, als würde da noch etwas fehlen

              Ja, eine echte Auswertung derselben.

              So long,
               Martin

              --
              Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
            3. okay, die Seite besteht aus einem Formular

              <form action="speichern.asp" method="post">
              

              Tipp: Setze mal die method="GET" dann Siehst Du in der Adresszeile was da zum Server gesendet wird. Und damit weißt Du dann auch wo Du in ASP diese Parameter findest.

              Was das Speichern (Datenbankdesign) betrifft, wären da 2 Dinge festzuhalten:

              1. Der Name der Checkbox
              2. True // False

              Also guck Dir den Request an. MFG

              1. Hallo pl,

                das kann man umständlich über die Request Method machen, oder man guckt sich ganz einfach und übersichtlich auf der Netzwerkseite der Browser-Entwicklertools den POST Body an.

                Rolf

                --
                sumpsi - posui - clusi
                1. hi

                  das kann man umständlich über die Request Method machen, oder man guckt sich ganz einfach und übersichtlich auf der Netzwerkseite der Browser-Entwicklertools den POST Body an.

                  Kann man machen. Aber das eigentliche Problem liegt wahrscheinlich ganz woanders. MFG

            4. @@UnterKnut

              <input type="Checkbox" name="Absage_Keine_Angabe" value="<%=(rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value) %>">
              

              “Value […] This is never seen on the client-side” [MDN]

              Du willst vermutlich stattdessen in Abhängigkeit vom Wert in der DB das checked-Attribut setzen?

              LLAP 🖖

              --
              Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
            5. @@UnterKnut

              okay, die Seite besteht aus einem Formular [code] welches 64 input Felder enthält, die in mehrere Tables gegliedert sind.

              Hier wäre zu überlegen, ob es wirklich sinnvoll ist, den Nutzern alle 64 Felder auf einmal zu präsentieren und sie damit zu erschlagen; oder ob es nicht besser ist, das Formular in mehrere Formulare aufzuteilen (das, was deine „Tables“ sind?), die nacheinander durchlaufen werden.

              “In ‘The Psychology of Checklists,’ Lauren Marchese explains the importance of breaking down big tasks into smaller ones, which is proven to motivate people. When we experience even small amounts of success, our brains release a chemical called dopamine, which gives us feelings of pleasure, learning, and motivation.”
              —Adam Silver, Form Design Patterns, p. 375

              LLAP 🖖

              --
              Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
              1. Hallo Gunnar,

                “In ‘The Psychologie of Checklists,’ Lauren Marchese explains the importance of breaking down big tasks into smaller ones, which is proven to motivate people. When we experience even small amounts of success, our brains release a chemical called dopamine, which gives us fealings of pleasure, learning, and motivation.
                —Adam Silver, Form Design Patterns, p. 375

                sind die Rechtschreibfehler von dir ("Copy & Paste Error"), oder schon von Adam Silver?
                Ich habe jetzt keine Lust, mich durch sämtliche Kapitel zu klicken, um das selbst zu überprüfen, aber wenn ein mutmaßlicher Muttersprachler, zumal in einer Veröffentlichung ...

                So long,
                 Martin

                --
                Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                1. @@Der Martin

                  sind die Rechtschreibfehler von dir ("Copy & Paste Error"), oder schon von Adam Silver?

                  Meine. Wie peinlich. Berichtigt.

                  Ich hätte doch die Buchseite fotografieren sollen; dann wären die Rechtschreibfehler nur den Alt-Text-Lesern aufgefallen.

                  LLAP 🖖

                  --
                  Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
                  1. Hallo,

                    sind die Rechtschreibfehler von dir ("Copy & Paste Error"), oder schon von Adam Silver?

                    Meine. Wie peinlich. Berichtigt.

                    in deinem Posting, ja. In meinem Zitat nicht.

                    Ich hätte doch die Buchseite fotografieren sollen; dann wären die Rechtschreibfehler nur den Alt-Text-Lesern aufgefallen.

                    *g* Naja, macht ja nichts.

                    Übrigens stimme ich nur eingeschränkt mit Adam Silver bzw. Lauren Marchese[1] überein: Aufgaben in kleine, überschaubare Häppchen zu zerlegen, die man auch in absehbarer Zeit bewältigen kann, finde ich auch sehr gut.
                    Aber Informationen ebenso in kleine Häppchen zerlegen und portionsweise anzubieten, z.B. eine Liste auf mehrere Webseiten verteilt ("paginiert"), oder Einzelinformationen zu einem Thema in separate Container zu packen, von denen immer nur einer zu einer Zeit sichtbar ist, finde ich ätzend. Das ist kontraproduktiv, das hält auf, das nervt, das bringt zusätzliche Fehlerquellen ins Spiel.

                    Beispiel amazon: Dass die Suche bei amazon grottenschlecht ist und viele "Treffer" bringt, die keinen der Suchbegriffe überhaupt enthalten (manche auch doppelt und dreifach), ist ein Ärgernis. Das will ich hier aber gar nicht zerfleischen. Mysteriös ist aber, dass die Treffer mal dreispaltig mit 48 pro Seite angezeigt werden (das geht einigermaßen), manchmal aber auch einspaltig mit 16 pro Seite (und dann wird das Suchen zur Klick-Orgie). Woran amazon diese Unterscheidung festmacht, habe ich noch nicht herausgefunden.

                    Ciao,
                     Martin

                    --
                    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

                    1. Vorname klingt Englisch, Nachname Italienisch. Interessant. :-) ↩︎

                    1. Hallo,

                      Vorname klingt Englisch, Nachname Italienisch. Interessant. :-)

                      Migration ist kein Phänomen, das auf das aktuelle Jahrtausend beschränkt ist…

                      Gruß
                      Kalk

                      1. @@Tabellenkalk

                        Vorname klingt Englisch, Nachname Italienisch. Interessant. :-)

                        Migration ist kein Phänomen, das auf das aktuelle Jahrtausend beschränkt ist…

                        Und fremd klingende Vornamen ist nicht unbedingt ein Phänomen von Migration. Meiner klingt schwedisch.

                        LLAP 🖖

                        --
                        Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
                    2. Lieber Martin,

                      Aber Informationen ebenso in kleine Häppchen zerlegen und portionsweise anzubieten, z.B. eine Liste auf mehrere Webseiten verteilt ("paginiert"), oder Einzelinformationen zu einem Thema in separate Container zu packen, von denen immer nur einer zu einer Zeit sichtbar ist, finde ich ätzend. Das ist kontraproduktiv, das hält auf, das nervt, das bringt zusätzliche Fehlerquellen ins Spiel.

                      damit könnte ich mich anfreunden, wenn die Informationen dadurch inhaltlich gegliedert werden. Beispielsweise beim Auswählen des gewünschten Pizza-Belags:

                      [X] Käse
                      [X] Tomaten
                      ( ) Pepperoni
                      ( ) Salami
                      ( ) Knoblauch
                      ( ) Lachs
                      ( ) Rucola
                      ( ) Schinken
                      ( ) Zwiebeln
                      

                      Die Liste ist willkürlich. Alphabetisch sortiert ist sie auch nicht wirklich besser:

                      [X] Käse
                      [X] Tomaten
                      ( ) Knoblauch
                      ( ) Lachs
                      ( ) Pepperoni
                      ( ) Rucola
                      ( ) Salami
                      ( ) Schinken
                      ( ) Zwiebeln
                      

                      Wenn man nun nach Gemüse und Fleisch/Fisch sortiert, erhält man das:

                      Dieser Belag ist grundsätzlich auf allen Pizzen:
                      [X] Käse
                      [X] Tomaten
                      
                      Gemüse:
                      ( ) Knoblauch
                      ( ) Pepperoni
                      ( ) Rucola
                      ( ) Zwiebeln
                      
                      Fleischarten:
                      ( ) Lachs
                      ( ) Salami
                      ( ) Schinken
                      

                      Wenn mir die gruppierten Beläge jeweils als eigene Liste präsentiert werden, hat es einen Sinn, da die einzelnen Listen besser überschaubar sind.

                      Liebe Grüße

                      Felix Riesterer

                      1. @@Felix Riesterer

                        Wenn mir die gruppierten Beläge jeweils als eigene Liste präsentiert werden, hat es einen Sinn, da die einzelnen Listen besser überschaubar sind.

                        Ja. Aber hier ging’s darum, ob die einzelnen Gruppen auf einer Seite sind oder auf mehrere Seiten verteilt werden.

                        Die Pizzabeläge sollten sicher auf einer Seite sein.

                        Andere Gruppen wären Zahlungsart, Lieferadresse und Rechnungsadresse. Und das klatscht man wohl besser nicht alles in ein Formular, sondern teilt das auf: die Schritte Bestellung, Zahlung, Adresse(n) auf getrennten Seiten.

                        LLAP 🖖

                        --
                        Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
                      2. Hallo Felix,

                        Aber Informationen ebenso in kleine Häppchen zerlegen und portionsweise anzubieten, z.B. eine Liste auf mehrere Webseiten verteilt ("paginiert"), oder Einzelinformationen zu einem Thema in separate Container zu packen, von denen immer nur einer zu einer Zeit sichtbar ist, finde ich ätzend. Das ist kontraproduktiv, das hält auf, das nervt, das bringt zusätzliche Fehlerquellen ins Spiel.

                        damit könnte ich mich anfreunden, wenn die Informationen dadurch inhaltlich gegliedert werden.

                        ja, aber du hast mich missverstanden. Gunnar hat den Kern der Aussage erkannt, so wie ich ihn gemeint habe.

                        Beispielsweise beim Auswählen des gewünschten Pizza-Belags:

                        Das Beispiel ist schön. Aber - Gliederung hin oder her - ich möchte dann trotzdem gern alle Parameter, die die Pizza ausmachen, gleichzeitig im Blick haben: Größe, Belag, mit oder ohne Käserand.

                        Weitergehende Informationen wie Zahlungsart und Lieferadresse können dann, wie Gunnar schon vorschlägt, gern auf separaten Seiten sein. Aber semantisch zusammengehörende Informationen möchte ich auch visuell als Einheit haben.

                        Wenn mir die gruppierten Beläge jeweils als eigene Liste präsentiert werden, hat es einen Sinn, da die einzelnen Listen besser überschaubar sind.

                        Ja. Aber bitte nicht als Wizard:

                        1. Wählen Sie eine Größe aus. [Weiter]
                          ( ) Klein (26cm)
                          ( ) Groß (30cm)
                          (o) Family (30x45cm)
                        2. Wählen Sie bis zu fünf Toppings aus. [Weiter]
                          [ ] Salami
                          [X] Schinken
                          [X] Champignons
                          ...
                        3. Wählen Sie aus den zusätzlichen Optionen. [Weiter]
                          [ ] Käserand
                          [X] Extra scharf
                          [ ] angebrannt
                        4. Ihr Bestellwert überschreitet 25 EUR. Wählen Sie ein Gratis-Getränk:
                          ( ) Flasche Cola
                          ( ) Flasche Lambrusco

                        Sowas macht mich aggressiv.

                        Schönes WE,
                         Martin

                        --
                        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
                    3. @@Der Martin

                      sind die Rechtschreibfehler von dir ("Copy & Paste Error"), oder schon von Adam Silver?

                      Meine. Wie peinlich. Berichtigt.

                      in deinem Posting, ja. In meinem Zitat nicht.

                      Natürlich nicht. Das würde dein Posting ja entstellen.

                      Aber zumindest hatte ich die Anführungszeichen richtig gesetzt. 😉 (Vom fehlenden schließenden mal abgesehen.)

                      LLAP 🖖

                      --
                      Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
  3. Lieber UnterKnut,

    So soll der user das Häkchen setzen können, um das Formular zu speichern und somit mitteilen zu können, dass es für die Absage der Sache keine Gründe gibt.

    das finde ich eine falsche Design-Entscheidung. Üblicherweise hat man mehrere Möglichkeiten, warum man eine Absage erteilt. Für mehrere Möglichkeiten gibt es entweder Radio-Buttons oder ein Select-Feld. In Deinem Fall wäre die Idee mit den Radio-Buttons sinvoll:

    • Keine Angabe von Gründen
    • Ich habe keine Lust
    • Ich habe keine Ahnung
    • Ich habe keinen Bedarf mehr
    • Sonstiger Grund: [____________________]

    Das obige Beispiel müsste eine Gruppe von Radio-Buttons verwenden, die alle einen identischen name-Wert haben, damit sie als Alternativen verstanden werden:

    <label>
      <input type="radio" name="Absage_Grund" value="keine Angabe">
      Keine Angabe von Gründen
    </label>
    <label>
      <input type="radio" name="Absage_Grund" value="keine Lust">
      Ich habe keine Lust
    </label>
    <label>
      <input type="radio" name="Absage_Grund" value="keine Ahnung">
      Ich habe keine Ahnung
    </label>
    <label>
      <input type="radio" name="Absage_Grund" value="kein Bedarf mehr">
      Ich habe keinen Bedarf mehr
    </label>
    <label>
      <input type="radio" name="Absage_Grund" value="kein Bedarf mehr">
      Sonstiger Grund:
      <input type="text" name="Absage_Grund_Sonstiger">
    </label>
    

    Du bekommst bei dieser Vorgehensweise grundsätzlich zwei name/value-Paare: Absage_Grund und Absage_Grund_Sonstiger. Letzteres solltest Du nur verarbeiten, wenn ersteres den Wert "kein Bedarf mehr" hat (also den Wert des value-Attributs aus dem letzten Radio-Button hat).

    Jetzt sehe ich gerade einen Konflikt mit dem Eingabefeld und dem letzten Radio-Button. Wenn man auf "Sonstiger Grund:" klickt/tapt, dann soll dieses ja gleich zwei Eingabefelder bedeuten. Zum einen soll es den letzten Radio-Button betätigen, als auch den Cursor in das input-Feld für den selbst einzugebenden Grund setzen. Das umgebende label-Element kann aber nur mit einem der beiden Elemente logisch verknüpft werden. So zumindest ist mein Wissensstand.

    Liebe Grüße

    Felix Riesterer

    1. hi

      und erst einmal danke für deine Anregungen das Problem bei Radiobuttons ist aber, dass der Punkt nicht wieder entfernt werden kann du siehst ja am Screenshot, wie es gedacht ist. Die Gründe für eine eventuelle Absage sind alle aufgelistet, und sollen gewählt oder eben nicht gewählt werden können, da sich die Umstände im Laufe des Prozesses ändern können

      Es muss doch irgendwie machbar sein, den FALSE oder TRUE Wert einer Checkbox in eine Datenbank zu schreiben

      Oder habe ich hier einen groben Denkfehler? Radiobuttons aber finde ich unpassend, aus genannten Gründen

      Grüße

      1. Hallo UNterKnut,

        nein, das sieht man im Screenshot nicht. Das ist Fachlichkeit, und deine Argumentation könnte vom Fachbereich kommen, nicht von einem Programmierer. Sie ist unklar. Sie schwurbelt aus meiner Sicht um die Antwort auf die entscheidende Frage herum: Kann man mehr als einen Absagegrund nennen oder soll es nur einen geben.

        Sind mehrere Nennungen möglich: Checkboxen, jeweils mit eigenem Namen und value="1". Und ein DB-Feld pro Checkbox.

        (Wenn man maximal N Gründe nennen soll: Da kann man die DB-Felder optimieren, aber das führt jetzt zu weit.)

        Ist nur eine Nennung möglich: Radiobuttons, alle mit dem gleichen Namen und einem eigenen Value. Und genau ein DB-Feld mit dem ausgewählten Wert. Wenn es keinen Grund gibt (z.B. weil nicht abgesagt wird), dann wählt man "keine Angabe". Es gibt dann aber sicherlich auch andere Form-Elemente, die den Umstand "es liegt eine Absage vor" bezeichnen (es sei denn, das Form dient ausschließlich dem Eingeben von Absagen).

        Rolf

        --
        sumpsi - posui - clusi
      2. Lieber UNterKnut,

        Du willst also, dass man beliebig viele (also null bis alle) der Möglichkeiten aus einem festgelegten Set auswählen kann. Da ist die Verwendung von Checkboxen sinnvoll und richtig.

        Es muss doch irgendwie machbar sein, den FALSE oder TRUE Wert einer Checkbox in eine Datenbank zu schreiben

        Wie Du das in Access machst, ist mir herzlich schnuppe, weil keine freie Software. Ich kann Dir aber sagen, wie sich die Browser verhalten. Du kannst dann daraufhin Dein VBScript (auch keine freie Software) so schreiben, dass es mit der Reaktion der Browser zusammenpasst.

        • Eine Checkbox mit gesetztem Häkchen erzeugt eine Erwähnung des name/value-Paares auf der Serverseite. Der übermittelte Wert ist entweder das, was im value-Attribut als Wert hinterlegt wurde, oder die Zeichenfolge "on".
        • Eine Checkbox ohne gesetztes Häkchen erzeugt keine Erwähnung des name/value-Paares auf der Serverseite.

        Dein Script muss eine Liste aller möglichen Optionen haben und an ihr die Einsendung daran abarbeiten. Die Optionen, die der Browser in seiner Anfrage nennt, bekommen ein true, die anderen bleiben false. Dann kannst Du ans Speichern gehen.

        Liebe Grüße

        Felix Riesterer

    2. @@Felix Riesterer

      das finde ich eine falsche Design-Entscheidung. Üblicherweise hat man mehrere Möglichkeiten, warum man eine Absage erteilt. Für mehrere Möglichkeiten gibt es entweder Radio-Buttons oder ein Select-Feld.

      Für mehrere Möglichkeiten sind aber gerade Checkboxen das Richtige und Radio-Buttuns und auch Auswahllisten das Falsche.

      Oder hast du dich falsch ausgedrückt und meintest „genau eine aus mehreren“?

      • Sonstiger Grund: [____________________]

      Für „sonstigen Grund“ sollte der Nutzer aber nur das Eingabefeld ausfüllen müssen und nicht zusätzlich noch eine Checkbox bzw. einen Radiobutton auswählen müssen.

      LLAP 🖖

      --
      Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
    3. Ob man radio // checkbox anbietet bestimmt primär die darunterliegende Logik. Während es unter Ersterem nur eine Möglichkeit der Auswahl gibt, gibt es bei vielen Checkboxen eben sehr viele Möglichkeiten an Kombinationen.

      Bei 25 Checkboxen gibt es z.B. 33.554.432 Möglichkeiten (2 hoch 25) und dann kommt irgendwann einmal die Frage wie man sowas in einer Access'Datenbank speichern kann. Wobei das Speichern eher das kleinere Problem ist, das großere Problem ist die Frage was man damit macht 😉

      MFG

      1. @@pl

        Bei 25 Checkboxen gibt es z.B. 33.554.432 Möglichkeiten (2 hoch 25) und dann kommt irgendwann einmal die Frage wie man sowas in einer Access'Datenbank speichern kann.

        ?? Dafür reicht ein 32-Bit-Integer.

        LLAP 🖖

        --
        Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
        1. Bei 25 Checkboxen gibt es z.B. 33.554.432 Möglichkeiten (2 hoch 25) und dann kommt irgendwann einmal die Frage wie man sowas in einer Access'Datenbank speichern kann.

          ?? Dafür reicht ein 32-Bit-Integer.

          Korrekt! Aber das ist das kleinere Problem 😉

          MFG

  4. Moin,

    und danke nochmal an alle für eure Anregungen, Ideen und Hinweise. ich habe es jetzt wie folgt lösen können

    <input type="Checkbox" name="Absage_Keine_Angabe" <% IF rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value = true then %> checked="checked" <%else%>  <%end if%> value="1">
    

    Somit wird zunächst beim Absenden und positiven setzen der Checkbox die 1 mitgeschickt, sodass in der Datenbank ein true ankommt und gespeichert wird. Funktioniert so wie gewünscht. Da hatte Rolf am Ende den passenden Gedankenanstoss

    Da nun nicht wie erwartet beim request automatisch der Wert aus der DB gelesen und entsprechend die Checkbox gesetzt wird, habe ich dann ein IF gebaut um den Wert in der DB abzufragen um anschließend das attribut "checked" zu setzen

    Das für mich große Verständigungsproblem war, dass der "value" beim darstellen der checkbox gar keine Rolle spielt, sondern nur "checked", und das muss eben abgefragt werden

    Ich danke euch allen vielmals :)

    1. @@UNterKNut

      <input type="Checkbox" name="Absage_Keine_Angabe" <% IF rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value = true then %> checked="checked" <%else%>  <%end if%> value="1">
      

      Wenn es keinen ELSE-Zweig gibt, brauchst du kein <%else%>.

      LLAP 🖖

      --
      Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
      1. Moin

        <input type="Checkbox" name="Absage_Keine_Angabe" <% IF rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value = true then %> checked="checked" <%else%>  <%end if%> value="1">
        

        Wenn es keinen ELSE-Zweig gibt, brauchst du kein <%else%>.

        Das gehört als Platzhalter im Template notiert, sonst rendert die Template'Engine die Bedingung nicht.

        MFG

        1. @@pl

          <input type="Checkbox" name="Absage_Keine_Angabe" <% IF rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value = true then %> checked="checked" <%else%>  <%end if%> value="1">
          

          Wenn es keinen ELSE-Zweig gibt, brauchst du kein <%else%>.

          Das gehört als Platzhalter im Template notiert, sonst rendert die Template'Engine die Bedingung nicht.

          Welche Template-Engine ist das, wo man else notieren muss, auch wenn es nichts zu elsen gibt?

          (In allen mir bekannten muss man das nicht tun.)

          LLAP 🖖

          --
          Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
        2. Tach!

          <input type="Checkbox" name="Absage_Keine_Angabe" <% IF rs_Ausschreibungsedit.Fields.Item("Absage_Keine_Angabe").Value = true then %> checked="checked" <%else%>  <%end if%> value="1">
          

          Wenn es keinen ELSE-Zweig gibt, brauchst du kein <%else%>.

          Das gehört als Platzhalter im Template notiert, sonst rendert die Template'Engine die Bedingung nicht.

          Deine vielleicht. Da es sich beim OP aber um VBScript handelt, sagt das Internet, dass if-then ohne else gültig ist.

          dedlfix.

          1. ... es ist tatsächlich so, dass ich ohne abschliessendes ELSE einen Scriptfehler erhalte

            1. Hallo,

              es ist tatsächlich so, dass ich ohne abschliessendes ELSE einen Scriptfehler erhalte

              Das ELSE ist aber nicht abschließend, sondern das END IF.

              Gruß
              Kalk

              1. damit hast du natürlich recht. Was gemeint war, ist aber sicher ersichtlich