Weergave van bedrag uit Access database niet altijd correct

Status
Niet open voor verdere reacties.

leifoet

Gebruiker
Lid geworden
7 okt 2007
Berichten
326
Database wordt o.a. gevoed met deze HTML-code
Code:
<INPUT TYPE="nummer" step="0.01" max="9999.99" [B]value[/B]="<%=rs("bedrag")%>" NAME="bedrag">

De decimale scheiding in de database is ","
Daarom wordt vóór de opslag de initiële decimale input-scheiding "." vervangen door een ","

Bij de start van de toepassing zou 'value' altijd het reeds opgeslagen bedrag uit de Access database moeten tonen (in het begin is dit nog blanco).

Probleem :
een opgeslagen decimaal bedrag, bijvoorbeeld 1234,56 wordt niet getoond (input-vak blijft leeg)
een opgeslagen decimaal bedrag, bijvoorbeeld 1234,00 wordt weergegeven als 1234 - idem voor een opgeslagen geheel getal van 1234

Wanneer ik een evenwel een decimaal bedrag als test 'opvraag' met <%response.write rs("Bedrag")%>, los van de input-regel, wordt het perfect weergegeven.

Dank voor suggesties.
 
Laatst bewerkt door een moderator:
Probeer eens type="number" :d
Code:
<input type="number" step="0.01" max="9999.99" value="<%=rs("bedrag")%>" name="bedrag">

Een waarde in een html <input> is altijd een string (tekstwaarde), ook bij type="number".

Van <input> (tekstwaarde) naar DB (getalwaarde): eerst decimaal punt omzetten naar decimaal komma en dan converteren naar getal. Van DB naar input: hetzelfde maar dan in omgekeerde richting. Als je m.b.v. haakjes dit in 1 regel doet dan werkt dit goed.


Update: je andere vraag.
In DB staat bedrag (getal) 1234,00

a) getal x 100 ==> 123400
b) getal delen door 100 en tegelijk omzetten naar tekst ==> "1234.00"
c) Als laatste zet je de tekst in de input.
 
Laatst bewerkt:
Volgde al die 'omgekeerde' redenering om de database-bedragen te converteren naar Input-bedragen; evenwel met (beide) onderstaande codes lukt het niet.

<%Input_Bedrag = cstr(replace(rs("Bedrag"),",","."))%>

<%Input_Bedrag = replace(cstr(rs("Bedrag")),",",".")%>

Waar mis ik het juiste spoor ?
 
Ik werk o.a. met JavaScript en daar kwam mijn oplossing vandaan.
De tekstwaarde (het resultaat) heeft nog een format nodig.

Kan je wat met number.ToString("#.##0,00") of iets wat daar op lijkt.
 
Bij nader toezicht geven de 2 conversie-codes sub 3 een numerieke waarde - isnumeric() : true - en werken dus niet in het input-verhaal
Ik gebruik(te) de functie Cstr() eveneens om direct een bedrag uit de database te converteren : <%N_Bedrag = cstr((rs("Bedrag")*100)/100)%> geen resultaat.

Ingevolge suggestie bron sub 4 - dit javascript gevonden op W3Schools - voorbeeld werkt met num = 213 maar niet getest in de Input
Probeer num te veralgemenen naar het/een bedrag uit de database (geconverteerd naar integer) => <%N_Bedrag = rs("Bedrag")*100%> lukt niet
Code:
<script> 
let num= N_Bedrag;
let text = num.toString();
document.getElementById("demo").innerHTML = text;
</script>

Ik hoop op het juiste spoor te geraken.
Dank voor tips.
 
Laatst bewerkt door een moderator:
De value van elke input is altijd een string, ook bij type="number".

In de value van type="number" mogen alleen tekens [0-9eE.-+] worden gebruikt. Een value met een komma is voor type="number" geen geldig getal.

De getoonde waarde staat los van de input value. Het getoonde getal heeft een komma, ik vermoed dat de render engine naar de browsertaal kijkt of er een punt of komma wordt getoond.

Met een workaround type="hidden" kan je wel de type="number" vullen, dit werkt ook met 0,00 of 0,10 of -0,10
Code:
<input type="hidden" id="hiddenBedrag" value="0,10">
<input type="number" step="0.01" max="9999.99" value="" name="bedrag">

<script> 
let strHidden = document.getElementById("hiddenBedrag").value;
let strBedrag = parseFloat(strHidden.replace(',', '.')).toFixed(2);
document.getElementsByName("bedrag")[0].value = strBedrag;
</script>

De .toFixed(2) geeft een getal een format (hier 2 decimalen) en geeft het resultaat als string.


In jouw code zou de type="hidden" er denk ik zo uit kunnen zien
Code:
<input type="hidden" id="hiddenBedrag" value="<%=cStr(rs("bedrag"))%>">

Update. Een punt voor duizendtallen kan niet bij type="number".

Update. Kijk nog even op CanIuse bij de mobile browsers.
 
Laatst bewerkt:
bron, heb mijn input-code (voor 'Bedrag') volledig vervangen door jouw voorstel sub #6
In deze test wil(de) ik het bedrag 1234,88 zien verschijnen in het Input-vakje.
(Dit testbedrag is opgeslagen in de database als 1234,88 (=decimale komma + 2 decimalen)

Dit is nog niet gelukt met onderstaand - Input-vakje blijft blank - input van nieuw bedrag lukt wel en wordt ook opgeslagen.
Heb ik mogelijks iets over het hoofd gezien ?

(Ik stelde na dit bericht vast dat ik de input van een nieuw bedrag (cfr. hierboven) getest had 'bovenop' een bestaand bedrag.
Als er nog geen bedrag ingevuld is dacht ik om dit op te lossen met 'if isnull then'-code maar kreeg een error)
Opgelost met deze lege vakjes in de database te vervangen door de standaardwaarde 0,00)

Code:
<input type="hidden" id="hiddenBedrag" value="<%=cStr(rs("bedrag"))%>">

<script> 
let strHidden = document.getElementById("hiddenBedrag").value;
let strBedrag = parseFloat(strHidden.replace(',', '.')).toFixed(2);
document.getElementsByName("bedrag")[0].value = strBedrag;
</script>

<INPUT TYPE="number" step="0.01" max="9999.99" value="" NAME="Bedrag"
 
Laatst bewerkt:
Dit testbedrag is opgeslagen in de database als 1234,88 (=decimale punt + 2 decimalen
De draad ben ik even kwijt, is het bedrag in de DB met een komma of punt opgeslagen?

Controleer hoofd/kleine letters. Dit is vaak een "burg" oorzaak.
getElementsByName("Bedrag") is iets anders dan getElementsByName("bedrag")

Met console.log kan je fouten of tussentijdse resultaten zien.
Bijvoorbeeld console.log(strHidden);

Zet een "script zonder functies" altijd onderaan ( vlak boven </body> ) want dan zijn alle html elementen bekend. Sowieso kan je het beste alle scripts onderaan zetten, dan is de pagina eerder zichtbaar.

Als ik het bovenstaande in de code verwerk dan werkt het ;)

Code:
<input type="hidden" id="hiddenBedrag" value="1234,88">
<input type="number" step="0.01" max="9999.99" value="" name="Bedrag">

<script> 
let strHidden = document.getElementById("hiddenBedrag").value;
let strBedrag = parseFloat(strHidden.replace(',', '.')).toFixed(2);
document.getElementsByName("Bedrag")[0].value = strBedrag;
</script>
 
Opslag is onveranderd met komma en 2 decimalen - excuses bron, typefout pas later vastgesteld en gecorrigeerd

Aanpassingen :
Opslag in Access DB - formaat gewijzigd van standaard naar vast.
Gebruik van hoofd- en kleine letter nagezien en bijgestuurd.

Resultaat : de test met 1234,88 en nadien met ad random inputBedragen is ... (finaal) gelukt !

Dank bron voor de juiste code om decimaal punt en komma met elkaar te verzoenen.
 
Leuke vraag geweest. Succes met de verdere bouw :thumb:
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan