ColdFusion - переменная variableName не определена

В моем теге cfoutput я установил переменную, в которой хранится имя клиента, возвращенное по запросу. Затем я использую эту переменную в предложении WHERE в теге cfquery для получения информации о клиенте. Но при отправке формы я получаю сообщение об ошибке Variable CUSTOMER is undefined при определенных критериях поиска. Я думаю, что ошибка возникает, когда переменная CUSTOMER равна нулю. Я пробовал различные варианты в следующем предложении Where, например where Customers.CustomerName = #IIF(isDefined('Form.CUSTOMER'),de(Form.CUSTOMER),de(''))#, но все равно получаю ту же ошибку. Я использую SQL Server 2012 на сервере. Обратите внимание, что я не могу использовать cfparam внутри cfoutput:

<cfoutput query="qry_customers">
<cfset  CUSTOMER = #CUSTOMER#>
</cfoutput>
<cfquery name="get_customers" datasource="#request.dsn_name#">
         SELECT * from Customers
         where Customers.CustomerName = '#CUSTOMER#'
</cfquery>

ОБНОВЛЕНИЕ Ошибка возникает в предложении WHERE в теге cfquery ниже. И оказывается, only when оператор select в теге cfquery не возвращает никаких записей. Ошибка CF показывает, что номер строки ошибки совпадает с строкой, в которой находится предложение WHERE.


person nam    schedule 09.01.2016    source источник
comment
Почему вы все равно устанавливаете его для другой переменной? Просто используйте значение из запроса. Как сказал Генри, бросьте свой запрос и посмотрите на результаты.   -  person Matt Busche    schedule 09.01.2016
comment
Ваш оператор iif использует другую переменную, чем ваш оператор set, кстати   -  person Matt Busche    schedule 09.01.2016
comment
Поскольку у вас есть несколько переменных, все с именем Customer, очень сложно точно знать, где в коде возникает ошибка. Кроме того, наличие нескольких переменных без области действия с именами Customer - это в лучшем случае рецепт путаницы, в худшем - неправильных или неожиданных результатов. Особенно, когда задействован цикл запроса. 1) Пожалуйста, опубликуйте полное сообщение об ошибке с номерами контекстных строк, чтобы мы могли точно увидеть, какой код вызывает эту ошибку. 2) Какова цель qry_customers? т.е. почему бы просто не использовать JOIN? 3) Какой тип поля формы - это form.customer?   -  person Leigh    schedule 09.01.2016


Ответы (2)


Вы получите эту ошибку каждый раз, когда в qry_customers нет строк. Просто обратитесь напрямую к qry_customer.customer. (Если строк не было, это будет эквивалентно пустой строке. Вместо этого вы можете захотеть проверить qry_customers.RecordCount.)

person Tim Jasko    schedule 09.01.2016

Я бы порекомендовал попробовать несколько вещей:

  1. Я не думаю, что строка <cfset CUSTOMER = #CUSTOMER#> нужна. Если я правильно прочитал, вы просто устанавливаете имя переменной с таким же именем. Кроме того, похоже, что это текстовое поле (на основе вашего запроса, который сопоставляет его со столбцом с именем «CustomerName», а не с чем-то вроде «CustomerNumber»). Итак, как минимум, вам нужно включить кавычки: <cfset CUSTOMER = "#CUSTOMER#">.
  2. Я думаю, вам будет лучше ограничить свой вызов переменной: qry_customers.CUSTOMER, а не просто CUSTOMER.
  3. Я подозреваю, что проблема разрешится сама собой, если вы передадите свою переменную в теге <cfqueryparam> (например, <cfqueryparam value="#qry_customers.CUSTOMER#", CFSQLType="CF_SQL_VARCHAR">)
  4. Если нулевые значения в источнике продолжают создавать проблему, вы можете попробовать добавить пробел в строку (чтобы принудительно преобразовать ноль в строку), а затем обрезать это пространство (потому что оно вам действительно не нужно): value="#trim(qry_customers.CUSTOMER & ' ')#".
person Joe DeRose    schedule 09.01.2016
comment
№1 частично неверен. Добавление ничего не делает. Ни или #, ни # не нужны, даже если вы ожидаете строку. - person Matt Busche; 09.01.2016
comment
Кроме того, он не совсем ничего не делает. Предполагая, что Customer является столбцом в запросе, код фактически копирует это значение запроса в область variables. Это означает, что теперь в игре задействованы три переменные клиента: qry_customers.CUSTOMER, variables.customer и form.customer. Я подозреваю, что это не было намерением. @nam - Как упоминалось в комментариях выше, отсутствие области видимости делает код очень подверженным ошибкам и может быть связано с проблемой, с которой вы столкнулись. Если вы могли бы прояснить свою цель, я уверен, что кто-то может помочь в решении проблемы и улучшении прояснения кода. - person Leigh; 09.01.2016
comment
@Leigh Я добавил раздел обновлений в свой исходный пост. Я думаю, что основной момент в том, что в предложении WHERE как установить переменную CUSTOMER на пустую строку, если из qry_customers не возвращаются строки - person nam; 10.01.2016
comment
@nam - Вы все еще не опубликовали полное сообщение об ошибке и не ответили на вопросы №2 и №3 выше. Трудно сделать больше, чем предположить, без более полных деталей. То, что вы описываете, не должно происходить, если действительно была определена переменная form.customer, как предлагает ваш код IIF. Так что либо вы что-то нам не рассказываете, либо вы делаете что-то иное, чем то, что опубликовали ... Сделайте шаг назад и начните с создания небольшого, но полного репро-кейса, демонстрирующего проблема. Просто простая форма с полем «Клиент» и кодом для обоих запросов, в которых возникает ошибка. - person Leigh; 11.01.2016
comment
@Leigh Я думаю, по вашему предложению, мне нужно собрать небольшой, но полный репортаж, демонстрирующий проблему. Позвольте мне попробовать это и опубликовать как обновление. - person nam; 11.01.2016