Coldfusion: простая проверка cfgridupdate

Я пытаюсь использовать очень простой CFGRID (с CFGRIDUPDATE), но не допускаю NULLS.

<cfset strWarning= "">  

<cfif IsDefined("FORM.gridEntered")> 
    <cfif FORM.myName EQ '' OR FORM.myURL EQ ''>
        <cfset strWarning= "Error: Form fields cannot be blank">
    <cfelse>
        <cfgridupdate grid="gridSomething" 
          dataSource="qryTSQL" tableName="tblName" keyOnly="Yes"> 
    </cfif> 
</cfif> 

<cfoutput>#strWarning#</cfoutput><br />

<cfform> 
<cfgrid name="gridSomething" query="qryTSQL" 
       selectMode="Edit" format="HTML">  
    <cfgridcolumn name = "myID" display="No"> 
    <cfgridcolumn name = "myName">
    <cfgridcolumn name = "myURL"> 
</cfgrid> 

<cfinput type="submit" name="gridEntered"> 

Я получаю сообщение об ошибке: Диагностика ошибок: сложные типы объектов не могут быть преобразованы в простые значения. Выражение запросило переменную или промежуточный результат выражения в качестве простого значения. Однако результат не может быть преобразован в простое значение. Простыми значениями являются строки, числа, логические значения и значения даты / времени. Запросы, массивы и COM-объекты являются примерами сложных значений. Наиболее вероятной причиной ошибки является то, что вы пытались использовать комплексное значение как простое. Например, вы пытались использовать переменную запроса в теге cfif.

Я думаю, что я думаю об этом желаемом решении.

Благодарю.

РЕДАКТИРОВАТЬ: обновленное сообщение об ошибке

Диагностика ошибок: Элемент MYURL не определен в ОТ.

Form scope - struct

FIELDNAMES  GRIDENTERED,__CFGRID__CFFORM_1__GRIDSOMETHING
GRIDENTERED Submit Query
GRIDSOMETHING.MYID  Form scope - array 
1   1001 

GRIDSOMETHING.MYURL Form scope - array 
1   /test_d.cfm 

GRIDSOMETHING.ORIGINAL.MYID Form scope - array 
1   1001 

GRIDSOMETHING.ORIGINAL.MYURL    Form scope - array 
1   /changed.cfm 

GRIDSOMETHING.ROWSTATUS.ACTION  Form scope - array 
1   U 

__CFGRID__CFFORM_1__GRIDSOMETHING   __CFGRID__EDIT__=2 MYID Y MYURL Y 1 U 1001 1001 /test_d.cfm /changed.cfm 

1 ответ

Решение

Сетки работают не так, как стандартные FORM поля. Поскольку сетки содержат несколько строк данных, CF создает массивы новых / измененных значений. Один для каждого столбца сетки, т.е.

     FORM.gridname.columnName

Чтобы определить, являются ли какие-либо значения для определенного столбца пустыми, вам нужно пройтись по массиву для этого столбца и проверить каждое значение:

    <cfset updateCount = arrayLen(FORM.gridSomething.myName) />
    <cfloop from="1" to="#updateCount#" index="x">
         <cfset nameValue = trim( FORM.gridSomething.myName[x] ) />
         <cfset urlValue  = trim( FORM.gridSomething.myURL[x]) ) />

         <!--- one or both of the values is empty --->
         <cfif not len( nameValue ) OR not len( urlValue )>
             ... empty value found. do something here ....

         </cfif>
    </cfloop>

Добавьте эту функцию в свой код и назовите ее, передавая область видимости FORM следующим образом; На странице или CFC работает так же! Устраняет ошибки с некоторыми версиями CF, которые заглушают пустые столбцы в простом обновлении сетки

    <cffunction name="cleanGridUpdate" >
        <cfargument name="FORM" >
        <cfloop collection="#FORM#" item="thisOne">
        <cftry>
            <cfset thisDeep = arrayLen(FORM[thisOne])>
                <cfloop index="x" from="1" to="#thisDeep#">
                    <cfif len(FORM[thisOne][x])lt 1>
                        <cfset FORM[thisOne][x] = javaCast( "null", 0 )>
                    </cfif>
                </cfloop>               
            <cfcatch>
                <cfset cat=1>   
            </cfcatch>
          </cftry>
          </cfloop>
         <cfreturn form>
     </cffunction>

    <cfif isDefined('URL.action') AND URL.action eq 'gridUpdate'>
       <cfset cleanGridUpdate(FORM)>
       <cfgridupdate grid="#URL.table#" table="#URL.table#" datasource="your_DS" 
        keyonly="yes" > 
    </cfif>


    <cfform action="##?action=gridUpdate&table=cheesePuffs" method="post">
       <cfgrid name='cheesePuffs' format='HTML'/>
       <cfinput name="submit" type="submit" value>
    </cfform>
Другие вопросы по тегам