2009-09-20 9 views
0

J'utilise CF8 et MySQL 5.affichage champ de date dans la valeur d'une forme de datefield

je un formulaire avec plusieurs champs de date (un pour chaque jour et le formulaire peut avoir 10+ jours de données sur elle) que l'utilisateur peut sélectionner des dates différentes et qu'ils ont tous des noms var différents dans une boucle.

Les valeurs par défaut pour ces champs de date sont null dans le DB. Je peux insérer une date dans une colonne DATE dans MySQL sans problèmes et j'ai vérifié que les données sont insérées correctement (en utilisant également cfqueryparam DATE). J'ai la «valeur» de la forme datefield définie sur le nom de la variable et ne peut pas obtenir la valeur à afficher. La date est mise à jour à la base de données chaque fois qu'elle est entrée, mais lorsque le formulaire est retourné sur lui-même, les champs de date sont vides (les autres champs non datés fonctionnent correctement et les modifications s'affichent).

Ensuite, lorsque je l'envoie avec les champs de date vides, la valeur est redéfinie à zéro dans le DB (chaîne vide dans le formulaire) puisque le champ de formulaire ne tire pas la valeur de la base de données.

Le nom du champ (ses # i # Date) s'affiche correctement (ses1Date, ses2Date, etc ...) dans le formulaire avec la bonne valeur lorsque je le vider.

<cfloop from="1" to="#form.days#" index="i"> <cfinput type="datefield" name="ses#i#Date" value="#DateFormat(qGetUWHeader["ses#i#Date"],"yyyy-mm-dd")#" /> .... 

Merci de votre temps et de votre aide.

+0

Eh .. Alors quelle est la question? – Sergii

+0

Avez-vous vérifié la source HTML pour vous assurer que les champs reçoivent les bons noms? – ale

+0

Veuillez confirmer: Le formulaire est de nouveau affiché. Si vous entrez une date et que vous la soumettez, elle écrira les données dans la base de données, mais lors de la réaffichage du formulaire, la date est à nouveau vide. On dirait que les données sont manquantes dans votre requête. – ale

Répondre

1

Pour référencer les noms de colonnes dynamiques, vous pouvez utiliser la notation de tableau. Mais comme je l'ai mentionné, vous devez fournir un numéro de ligne.

#queryName["columnName"][rowNumber]# 

Si vous connaissez la requête contient un (1) enregistrement, seulement, vous pouvez utiliser comme le numéro de ligne de la propriété « recordCount » de l'objet de la requête. Vous pouvez également coder en dur le numéro de ligne "1". (Personnellement, je n'aime pas coder en dur). Mais l'un d'entre eux devrait fonctionner.

<!--- pick ONE option ---> 
<cfloop from="1" to="#form.days#" index="i"> 
    <!--- syntax option 1 ---> 
    <cfinput type="datefield" name="ses#i#Date" value="#DateFormat(qGetUWHeader['ses#i#Date'][qGetUWHeader.recordCount], 'yyyy-mm-dd')#" /> 
    <!--- syntax option 2 ---> 
    <cfinput type="datefield" name="ses#i#Date" value="#DateFormat(qGetUWHeader['ses'& i &'Date'][qGetUWHeader.recordCount],'yyyy-mm-dd')#" /> 
    <!--- syntax option 3 ---> 
    <cfinput type="datefield" name="ses#i#Date" value="#DateFormat(qGetUWHeader['ses#i#Date'][1], 'yyyy-mm-dd')#" /> 
</cfloop> 

Si toutefois, vous Boucler dans plusieurs enregistrements dans la requête qGetUWHeader, vous pouvez utiliser comme numéro de ligne de propriété « currentRow » de l'objet de la requête. Mais selon la convention de nommage des champs, je suppose que la requête ne contient qu'un (1) enregistrement.

EDIT: J'ai oublié les valeurs initiales nulles. Vous pouvez appliquer une condition simple si et appeler uniquement DateFormat() si la valeur de la requête est une date valide.

<cfloop from="1" to="#form.days#" index="i"> 
    <cfset dateValue = qGetUWHeader["ses#i#Date"][qGetUWHeader.recordCount]> 
    <!--- if this is a valid date, format the value ---> 
    <cfif IsDate(dateValue)> 
     <cfset dateValue = dateFormat(dateValue, "yyyy-mm-dd")> 
    </cfif> 
    <cfinput type="datefield" name="ses#i#Date" value="#dateValue#" /><hr> 
</cfloop> 

Une autre option consiste à mettre en forme les dates dans votre SQL. Vous n'avez alors pas besoin d'utiliser la fonction DateFormat() CF. Sachez simplement que le nouveau résultat sera une chaîne, et non un objet datetime.

SELECT DATE_FORMAT(ses1Date, '%Y-%m-%d') AS ses1Date, .... 
+0

@Leigh: c'est une aide énorme, merci. Je vais tester cela à la première chose ce soir. –

+0

Fonctionne comme un champion! Je suis allé avec l'option # 3 que j'aurais dû prendre après votre post précédent - excuses. Merci beaucoup pour l'explication approfondie et les options. –

1

Où est défini "qGetUWHeader"?

Lorsqu'un formulaire est publié, toutes les valeurs seront publiées dans la portée du formulaire. Par conséquent, pour afficher une valeur à partir d'une publication, vous devez référencer la portée du formulaire, sauf si vous copiez la valeur dans 'qGetUWHeader'. Même si la date correcte du formulaire est stockée dans la portée du formulaire, vous affichez la valeur par défaut de qGetUWHeader à la publication, à moins que vous ne fassiez quelque chose dont je ne suis pas conscient.Ensuite, la prochaine fois que vous postez votre formulaire, la valeur par défaut remplace la valeur entrée précédemment.

<!--- In order to reference FORM values, you must CFPARAM them first to define the default value. ---> 
<cfparam name="form.days" default="10"> 
<cfloop from="1" to="#form.days#" index="i"> 
    <cfparam name="form['ses#i#Date']" default=""> 
</cfloop> 

<!--- Display the Form ---> 
<cfform action="#cgi.SCRIPT_NAME#" method="post"> 
    <cfloop from="1" to="#form.days#" index="i"> 
     <cfset thisFieldName = "ses" & i & "Date"> 
     <cfset thisFieldValue = form["ses#i#Date"]> 
     <cfoutput>#thisFieldName#</cfoutput> <!--- For Debugging ---> 
     <cfinput type="datefield" name="#thisFieldName#" value="#thisFieldValue#" /><br /><br /> 
    </cfloop> 
    <input type="submit" name="submit" value="submit" /> 
</cfform> 

<!--- Debug ---> 
<cfdump var="#form#"> 
+0

Dan, merci beaucoup pour les commentaires et le temps. Le formulaire se soumet à lui-même, mais appelle également une fonction qui insère ou met à jour la base de données. qGetUWHeader est la requête pour pré-remplir plusieurs champs s'ils existent quand l'utilisateur ouvre le formulaire. Je dois l'utiliser par rapport à l'objet formulaire car j'ai besoin que le champ soit pré-rempli si les données ont été entrées auparavant (ce n'est pas un nouveau formulaire à chaque fois). Je suis assez sûr que 2 des options de Leigh fonctionneront et je les testerai ce soir et enverrai une mise à jour –

+0

Dans ce cas, la seule manière pour nous d'aider plus loin est de voir le code source de qGetUWHeader. –

Questions connexes