отображение поля даты в значении формы поля даты

Я использую CF8 и MySQL 5.

У меня есть форма с несколькими полями даты (по одному на каждый день, и в форме могут быть данные за 10+ дней), для которых пользователь может выбрать разные даты, и все они имеют разные имена переменных в цикле.

Значения по умолчанию для этих полей даты в БД равны нулю. Я могу без проблем вставить дату в столбец DATE в MySQL и убедиться, что данные вставлены правильно (также используя cfqueryparam DATE).

У меня есть «значение» поля даты формы, установленное на имя переменной, и я не могу получить значение для отображения.

Дата обновляется в БД каждый раз, когда она вводится, но когда форма отправляет обратно себе, поля даты пусты (другие поля без даты работают нормально, и изменения отображаются).

Затем, когда я отправляю его с пустыми полями даты, значение возвращается в значение null в БД (пустая строка в форме), поскольку поле формы не извлекает значение из БД.

Имя поля (ses # i # Date) отображается правильно (ses1Date, ses2Date и т. Д.) В форме с правильным значением, когда я его сбрасываю.

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

Спасибо за ваше время и помощь.


person JS.    schedule 20.09.2009    source источник
comment
Эх .. Так в чем вопрос?   -  person Sergey Galashyn    schedule 21.09.2009
comment
Вы проверяли исходный код HTML, чтобы убедиться, что поля получают правильные имена?   -  person ale    schedule 21.09.2009
comment
Подтвердите: форма отправляется сама себе. Если вы введете дату и отправите ее, данные будут записаны в базу данных, но при повторном отображении формы дата снова станет пустой. Похоже, в вашем запросе отсутствуют данные.   -  person ale    schedule 21.09.2009
comment
@Al: Да, проверил html, и он правильно заполняет форму, когда я ее выгружаю. При отправке форма отправляется обратно в саму себя и правильно записывает данные в БД. Я просматривал этот запрос снова и снова, и он работает вне CF. Просто не заполняет поля «значение».   -  person JS.    schedule 21.09.2009
comment
@Sergii: Вопрос в том, что, черт возьми, я делаю неправильно, если не могу заполнить атрибут value, чтобы прочитать дату в приведенном выше коде?   -  person JS.    schedule 21.09.2009
comment
просто в целях отладки попробуйте ‹cfinput type = text›. Если это сработает, значит, что-то не так с полем даты.   -  person Henry    schedule 21.09.2009
comment
@ Генри: спасибо, я сделал это вчера вечером, но до сих пор не могу заставить его заполнить.   -  person JS.    schedule 21.09.2009
comment
cfdump область формы, отладьте оттуда. :)   -  person Henry    schedule 21.09.2009
comment
@ Генри: тоже так и не повезло. Форма var заполнена правильно, поэтому я почти уверен, что недостающая часть относится к запросу - DB - для заполнения атрибута value. Я благодарен всем за помощь и буду обновлять, когда добьюсь некоторых успехов.   -  person JS.    schedule 21.09.2009
comment
Я думал, у тебя уже работает БД .... хорошо, удачи в отладке   -  person Henry    schedule 21.09.2009
comment
Возможно, вы сможете поделиться другим кодом?   -  person Terry Ryan    schedule 21.09.2009
comment
@JS - Является ли qGetUWHeader запросом? Потому что обычно вы указываете номер строки при использовании нотации массива с запросами. т.е. qGetUWHeader [ses # i # Date] [rowNumberHere].   -  person Leigh    schedule 21.09.2009
comment
@JS - +1 к комментарию Терри. Публикация немного большего количества кода поможет.   -  person Leigh    schedule 21.09.2009
comment
Еще раз спасибо всем за помощь. @Leigh, ваш комментарий привел меня к моей ошибке. Я почти уверен, что подтвердил, что моя проблема связана с моим именем var. если я использую value = # DateFormat (qGetUWHeader.ses1Date, mm / dd / yyyy) #, тогда он работает. Моя проблема в том, что поскольку он находится в цикле, мне нужно ses # i # Date, и когда я ввожу value = # DateFormat (qGetUWHeader [ses # i # Date], mm / dd / yyyy) # я получаю сообщение об ошибке: Класс значений coldfusion.sql.QueryColumn не может быть преобразован в дату. ' Поэтому я не могу использовать обозначение массива. Итак, я пробовал много других вариантов и все еще сталкиваюсь с простой проблемой именования переменных.   -  person JS.    schedule 22.09.2009
comment
Итак, теперь проблема кажется довольно простой, и я не могу ее понять. Если я поставлю #DateFormat (qGetUWHeader.ses1Date, mm / dd / yyyy) # в качестве значения, это будет работать. Как мне написать это, чтобы переменная была ses # i # Date для моего цикла, не изменяя ее на недопустимую строку даты или времени? Я пробовал точечную, индексированную и смешанную нотацию и получаю разные ошибки, в которых говорится, что либо она не может быть преобразована в дату, либо недействительна.   -  person JS.    schedule 22.09.2009


Ответы (2)


Чтобы ссылаться на имена динамических столбцов, вы можете использовать нотацию массива. Но, как я уже упоминал, вы должны указать номер строки.

 #queryName["columnName"][rowNumber]#

Если вы знаете, что запрос содержит только одну (1) запись, вы можете использовать свойство «recordCount» объекта запроса в качестве номера строки. В качестве альтернативы вы можете жестко закодировать номер строки «1». (Лично мне не нравится жесткое кодирование). Но любой из них должен работать.

<!--- 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>

Однако, если вы просматриваете несколько записей в запросе qGetUWHeader, вы можете использовать свойство "currentRow" объекта запроса в качестве номера строки. Но, исходя из соглашения об именах полей, я предполагаю, что запрос содержит только одну (1) запись.

РЕДАКТИРОВАТЬ: я забыл о начальных нулях. Вы можете применить простое условие if и вызывать DateFormat () только в том случае, если значение запроса является допустимой датой.

<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>

Другой вариант - отформатировать даты в вашем SQL. Тогда вам не нужно будет использовать функцию CF DateFormat (). Просто имейте в виду, что новым результатом будет строка, не объект datetime.

SELECT DATE_FORMAT(ses1Date, '%Y-%m-%d') AS ses1Date, ....
person Leigh    schedule 22.09.2009
comment
@Leigh: это огромная помощь, спасибо. Сегодня вечером я первым делом это опробую. - person JS.; 22.09.2009
comment
Работает как чемпион! Я выбрал вариант №3, который должен был уловить после вашего предыдущего поста - извинения. Большое спасибо за подробное объяснение и варианты. - person JS.; 23.09.2009

Где определяется "qGetUWHeader"?

Когда форма отправляется, все значения будут отправлены в область формы. Следовательно, чтобы отобразить значение из обратной передачи, вы должны ссылаться на область формы, если вы не копируете значение в qGetUWHeader. Несмотря на то, что правильная дата из формы сохраняется в области формы, вы показываете значение по умолчанию из qGetUWHeader при обратной отправке, если вы не делаете там что-то, о чем я не знаю. Затем, когда вы в следующий раз опубликуете форму, значение по умолчанию переопределит ранее введенное значение.

<!--- 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#">
person Dan Sorensen    schedule 22.09.2009
comment
Дэн, большое спасибо за отзыв и время. Форма отправляется сама себе, но также вызывает функцию, которая вставляет или обновляет базу данных. qGetUWHeader - это запрос для предварительного заполнения нескольких полей, если они существуют, когда пользователь открывает форму. Я должен использовать это вместо объекта формы, так как мне нужно, чтобы поле было предварительно заполнено, если данные были введены раньше (не новая форма каждый раз). Я почти уверен, что 2 варианта Ли сработают, и я протестирую их сегодня вечером и пришлю обновление. - person JS.; 22.09.2009
comment
В этом случае единственный способ помочь нам - это посмотреть исходный код qGetUWHeader. - person Dan Sorensen; 23.09.2009