Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2018
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : décembre 2018
    Messages : 66
    Points : 55
    Points
    55
    Par défaut Valeur numérique se modifie lors de l'ajout dans la bdd
    Hello,

    Vu que je suis mauvais pour expliquer, je vais remettre en contexte pour essayer d'être le plus compréhensible possible.

    Nous avons un intranet où les membres du personnel encodent des événements. Ils encodent aussi la durée qu'ils ont mis pour préparer cet événement et la durée de l'événement en lui-même.
    Pour une question de statistiques, on a besoin de calculer automatiquement ces valeurs, pour ce faire, le typage des champs de durées sont au format numérique dans la base de données.
    Les membres du personnel modifient directement les durées dans le formulaire (par exemple si un événement dure 2h30, l'agent va indiquer 2,5 dans le formulaire), dans le formulaire, les champs pour les durées sont de simples input type="text"

    On arrive enfin au problème, parfois (et j'appuie bien sur le parfois, car d'autres fois il n'y a pas ce soucis), la virgule ou le point indiqué dans le champ de la durée n'est pas pris en compte, ce qui veut dire qu'un "0,25" dans le formulaire se transforme en "25" dans la base de données, mais ça foire complètement nos données et l'agent ne s'en rend même pas forcément compte directement.
    Je ne sais absolument pas d'où pourrait provenir ce problème, surtout que ce n'est pas moi qui aie créé la bdd et le code, tout était déjà fait quand je suis arrivé.
    Je n'ai pas la moindre notion en ASP

    Au niveau de la structure des pages, le formulaire est envoyé vers une page "formulaire_enregistrement", je mets ce code ici (j'essaye de supprimer au maximum ce qui n'est pas en rapport avec les durées, pour rendre cela plus digeste):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    <%
    
    response.buffer = true
    
    dim jdat,mdat,adat
    
    dim fhdebanim, fdureeanim, fdureeprepa
    
    
    fhdebanim = request.form("hdebanim")
    
    fdureeanim = csng(replace(request.form("dureeanim"),".",","))
    
    fdureeprepa = csng(replace(request.form("dureeprepa"),".",","))
    
    
    
    set conn=server.CreateObject("ADODB.Connection")
    
    conn.open "evalanim"
    
    
    '------enregistrement dans table temporaire pour les test---------------------------------------
    
    dim refid '--détermination d'un numéro pour l'enregistrement temporaire, au cas où il y a plusieurs enregistrement en même temps--
    refid = 0
    
    if request.querystring("ref")<>"" then
    
    	refid = request.querystring("ref")
    	'si retour avec un code erreur, sql = mise à jour
    	sqltemp = "UPDATE ttemp SET hdebanim='"&fhdebanim&"',dureeanim2='"&fdureeanim&"',dureeprepa2='"&fdureeprepa&"' WHERE id="&refid
    
    else
    
    	set rsverifid = conn.execute("SELECT id FROM ttemp") '--determination de l'id dans la table temp--
    	if not rsverifid.eof then
    		do while not rsverifid.eof
    			refid = refid + 1
    			rsverifid.movenext
    		loop
    		rsverifid.movefirst
    	end if
    	'si pas de retour avec un code erreur, sql = nouvelle entrée
    	sqltemp = "INSERT INTO ttemp (id,hdebanim,dureeanim2,dureeprepa2) VALUES ('"&cint(refid)&"','"&fhdebanim&"','"&fdureeanim&"','"&fdureeprepa&"')" 
    	
    end if
    
    'response.write "sqltemp : "&sqltemp&"<BR>"
    
    set rstemp = conn.execute(sqltemp)
    
    
    
    '------vérification du contenu des champs---------------------------------------------------------
    dim touschamps
    touschamps = 0
    
    
    '4 : heure début animation --> pas obligatoire
    
    '5 : duree animation --> pas obligatoire
    if fdureeanim=0 then
    	response.redirect("rpprtanim.asp?err=5&ref="&refid&"&dat="&fdat)
    	touschamps=1
    end if
    
    '6 : duree préparation --> pas obligatoire
    if fdureeprepa=0 then
    	response.redirect("rpprtanim.asp?err=6&ref="&refid&"&dat="&fdat)
    	touschamps=1
    end if
    
    '17 : nombre biblio/anim interne
    'if fnbbibanimint=0 then
    	'response.redirect("rpprtanim.asp?err=17&ref="&refid&"&dat="&fdat)
    	'touschamps=1
    'end if
    
    
    
    'if touschamps = 0 then response.write "AUCUNE ERREUR !!<BR>"
    
    
    
    
    
    set rsEvalAnim = server.CreateObject("ADODB.Recordset")
    
    sqlEvalAnim = "SELECT * FROM tevalanim"
    
    rsEvalAnim.Open sqlEvalAnim,Conn,1,3
    
    rsEvalAnim.AddNew
    
    	
    	rsEvalAnim("hdebanim") = fhdebanim
    
    	rsEvalAnim("dureeanim2") = fdureeanim
    
    	rsEvalAnim("dureeprepa2") = fdureeprepa
    	
    	
    rsEvalAnim.update
    
    
    
    rsEvalAnim.close
    
    set rsEvalAnim = nothing
    
    %>
    
    <HTML>
    <HEAD>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
    <TITLE>Bibliothèque Publique de Mouscron | Intranet</TITLE>
    <META HTTP-EQUIV="imagetoolbar" CONTENT="no">
    <LINK REL=stylesheet TYPE="text/css" HREF="fsbiblio.css">
    </HEAD>
    <BODY>
    
    <H1>Fiche d’évaluation des animations</H1>
    <BR><BR>
    
    
    <P ALIGN=center>L'animation ci-dessous a bien été enregistrée !</P><BR>
    
    <TABLE ALIGN=center CELLSPACCING=0 CELLPADDING=2>
    	<TR>
    		<TD>Nom de l’animation</TD>
    		<TD><B><%=fnomanim%></B></TD>
    	</TR>
    	<TR>
    		<TD>Titre de l’animation</TD>
    		<TD><B><%=fttranim%></B></TD>
    	</TR>
    	<TR>
    		<TD>Date</TD>
    		<TD><B><%=fdat%></B></TD>
    	</TR>
    </TABLE>
    <BR><BR>
    
    <P ALIGN=center>Voir la liste des animations encodées<P></P><A HREF="rpprtanim.asp" CLASS=lien>retour encodage animation</A></P>
    
    <BR>
    </BODY>
    </HTML>
    
    <%
    
    set rsVidTemp = conn.execute("DELETE * FROM ttemp WHERE id="&refid)
    
    set rsVidTemp = nothing
    
    set rsverifid = nothing
    
    conn.close
    
    set conn=nothing
    
    
    %>

    Je vous remercie d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    15 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 15 861
    Points : 32 470
    Points
    32 470
    Par défaut
    Bonjour,

    1- La colonne en BDD doit être de type FLOAT ou DECIMAL (avec nombre de décimales fixé)

    2- Modifie les input des durées en <input type="number"> :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="number" min="0" max="24" step="0.01" name="..." value="0" />
    Ainsi, les valeurs reçues seront au bon format.

    3- Il faut savoir que la décimale est représentée par un POINT (pas une virgule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fdureeanim = csng(replace(request.form("dureeanim"),".",","))
    fdureeprepa = csng(replace(request.form("dureeprepa"),".",","))
    A moins que je ne me trompe sur l'ordre des paramètres, ça ne va pas -> il faut remplacer la virgule par le point, mais pas le contraire.

    Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fdureeanim = csng(replace(request.form("dureeanim"),",","."))
    fdureeprepa = csng(replace(request.form("dureeprepa"),",","."))
    A VÉRIFIER ! *


    * (je n'ai plus codé en ASP depuis au moins 15 ans...)
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Pose ta question, tu seras idiot une seconde. Ne la pose pas, tu seras idiot toute ta vie."
    Albert Einstein (1879-1955).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    décembre 2018
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : décembre 2018
    Messages : 66
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Bonjour,

    1- La colonne en BDD doit être de type FLOAT ou DECIMAL (avec nombre de décimales fixé)
    Nous travaillons avec Access/ODBC, j'ai vérifié le typage et il est sur "Numérique", qui correspond à "Décimal" d'après ce que j'ai pu voir ici

    Citation Envoyé par jreaux62 Voir le message
    2- Modifie les input des durées en <input type="number"> :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="number" min="0" max="24" step="0.01" name="..." value="0" />
    Ainsi, les valeurs reçues seront au bon format.
    Ça a été modifié, effectivement, dans le code le type était type=text

    Citation Envoyé par jreaux62 Voir le message
    3- Il faut savoir que la décimale est représentée par un POINT (pas une virgule)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fdureeanim = csng(replace(request.form("dureeanim"),".",","))
    fdureeprepa = csng(replace(request.form("dureeprepa"),".",","))
    A moins que je ne me trompe sur l'ordre des paramètres, ça ne va pas -> il faut remplacer la virgule par le point, mais pas le contraire.

    Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fdureeanim = csng(replace(request.form("dureeanim"),",","."))
    fdureeprepa = csng(replace(request.form("dureeprepa"),",","."))
    A VÉRIFIER ! *
    Lorsque j'inverse le point et la virgule dans la fonction replace, j'ai une erreur 500, ressource indisponible qui apparaît lors de l'envoi du formulaire mais sans explications supplémentaires. Je suppose que la valeur introduite dans la BDD n'est pas correcte et il me retourne une erreur.

    Tout ce que j'ai pu modifier du coup c'est le type de données en HTML.

    J'ai aussi tenté, dans la BDD Access, de modifier les valeurs numériques. Il faut bien que j'utilise des virgules pour les valeurs décimales. Si j'utilise un point (2.5), la valeur se transforme en "25".
    J'ai l'impression que le code ne convertit par toujours le . en , avant d'envoyer dans la base de données, est-ce possible?

    Là comme il est noté dans le code, cela convertit les points du champ en virgules, c'est bien ça?
    Pourtant, dans le formulaire, j'ai mis une petite note à côté de ce champ pour dire aux utilisateurs de mettre un point pour séparer les heures et les minutes, ce n'est donc pas logique... Je vais leur demander de mettre une virgule par la suite, et voir si cela résout les problèmes.

    Merci pour l'aide apportée en tout cas!

Discussions similaires

  1. [AC-2016] Définir valeur d'un champs lors d'un ajout d'enregistrement
    Par citadelle33 dans le forum IHM
    Réponses: 6
    Dernier message: 26/05/2019, 14h11
  2. [UserControl] Error lors de l'ajout dans un projet
    Par Kropernic dans le forum VB.NET
    Réponses: 21
    Dernier message: 18/09/2013, 22h30
  3. Exécuter script lors de l'ajout dans un dossier
    Par Zandes dans le forum Windows
    Réponses: 2
    Dernier message: 29/09/2009, 12h09
  4. Réponses: 2
    Dernier message: 02/04/2008, 19h54
  5. Erreur lors de l'ajout dans une table
    Par k_boy dans le forum Bases de données
    Réponses: 14
    Dernier message: 31/03/2008, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo