ASP / VBScript und Checkboxen in Datenbank (Access)
UnterKnut
- vb-script
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
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
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
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
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
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.
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
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 Ä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
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.
<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
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) %>
)
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
@@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 🖖
Moin,
<td><b>letzte Ä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ü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
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:
Also guck Dir den Request an. MFG
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
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
@@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 🖖
@@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 🖖
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
@@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 🖖
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
Vorname klingt Englisch, Nachname Italienisch. Interessant. :-) ↩︎
Hallo,
Vorname klingt Englisch, Nachname Italienisch. Interessant. :-)
Migration ist kein Phänomen, das auf das aktuelle Jahrtausend beschränkt ist…
Gruß
Kalk
@@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 🖖
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
@@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 🖖
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:
Sowas macht mich aggressiv.
Schönes WE,
Martin
@@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 🖖
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:
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
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
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
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.
value
-Attribut als Wert hinterlegt wurde, oder die Zeichenfolge "on".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
@@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 🖖
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
@@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 🖖
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
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 :)
@@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 🖖
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
@@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 🖖
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.
... es ist tatsächlich so, dass ich ohne abschliessendes ELSE einen Scriptfehler erhalte
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
damit hast du natürlich recht. Was gemeint war, ist aber sicher ersichtlich