2015-05-06 5 views
2

У меня возникла проблема проверки наличия определенного структурного ключа и данных с помощью structKeyExists().Каков правильный синтаксис для проверки наличия структурного ключа и данных?

Я хочу, чтобы мои результаты запроса будут сохранены в структурах, как это:

APPLICATION.MemQs.ProdCountQs[1].ExpirationDate; 
APPLICATION.MemQs.ProdCountQs[1].ProdCount; 
APPLICATION.MemQs.ProdCountQs[2].ExpirationDate; 
APPLICATION.MemQs.ProdCountQs[2].ProdCount; 
APPLICATION.MemQs.ProdCountQs[3].ExpirationDate; 
APPLICATION.MemQs.ProdCountQs[3].ProdCount; 

// CREATE MEMORY QUERIES ~ works great 
if (structKeyExists(APPLICATION, "MemQs") == false) { 
    APPLICATION.MemQs = structNew(); 
} 

// CREATE PRODUCT COUNT QUERIES ~ works great 
if (structKeyExists(APPLICATION.MemQs, "ProdCountQs") == false) { 
    APPLICATION.MemQs.ProdCountQs= structNew(); 
} 

// fails the test ~ always recreates variables 
if (structKeyExists(APPLICATION.MemQs, "ProdCountQs[SomeID]") == false) { 
    APPLICATION.MemQs.ProdCountQs[SomeID] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ProdCount = 0; 
} 

// fails the test ~ always recreates variables 
if (structKeyExists(APPLICATION.MemQs.ProdCountQs, "[SomeID]") == false) { 
    APPLICATION.MemQs.ProdCountQs[SomeID] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ProdCount = 0; 
} 

// fails the test ~ always recreates variables 
if (structKeyExists(APPLICATION.MemQs.ProdCountQs, "SomeID") == false) { 
    APPLICATION.MemQs.ProdCountQs[SomeID] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ProdCount = 0; 
} 

// throws error 
// APPLICATION.MemQs.ProdCountQs[SomeID], must be a syntactically valid variable name 
if (isDefined("APPLICATION.MemQs.ProdCountQs[SomeID]") == false) { 
    APPLICATION.MemQs.ProdCountQs[SomeID] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ProdCount = 0; 
} 

Итак, как же я использую structKeyExists() для проверки существования

APPLICATION.MemQs.ProdCountQs[SomeID] 

ответ

1

Вам необходимо поставить фунт ## знаков около SomeID, так как это переменная.

if (structKeyExists(APPLICATION.MemQs.ProdCountQs, "#SomeID#") == false) { 
    APPLICATION.MemQs.ProdCountQs[SomeID] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs[SomeID].ProdCount = 0; 
} 

SomeID Если не является переменным, то в этом случае вы должны окружить SomeID в квадратных скобках в двойных кавычках "" как этот APPLICATION.MemQs.ProdCountQs["SomeID"]. Таким образом, код будет выглядеть следующим образом:

if (structKeyExists(APPLICATION.MemQs.ProdCountQs, "SomeID") == false) { 
    APPLICATION.MemQs.ProdCountQs["SomeID"] = structNew(); 
    APPLICATION.MemQs.ProdCountQs["SomeID"].ExpirationDate = now(); 
    APPLICATION.MemQs.ProdCountQs["SomeID"].ProdCount = 0; 
} 

EDIT
Как Leigh предположил, что лучше использовать ! оператор вместо проверки false. Также, если ключ является переменной, тогда вы можете опустить кавычки удвоения и знак фунта, проверяя ключ. Таким образом, вы можете записать условие if следующим образом:

if (!structKeyExists(APPLICATION.MemQs.ProdCountQs, SomeID)) 
+7

* Вам нужно положить Фунт ## знаки вокруг SomeID так как это переменная. * Стоит отметить, что только потому, что имя переменной заключено в кавычки, поэтому она рассматривается как буквальная строка вместо имени переменной. Опустите кавычки, и CF обработает 'SomeID' как переменную. Кроме того, хотя использование «== false» работает, использование «!» Короче. т.е. 'if (! structKeyExists (APPLICATION.MemQs.ProdCountQs, SomeID)) {...}' – Leigh

+0

Я положил знаки фунта вокруг переменной, и он отлично работал. Благодаря! structKeyExists (APPLICATION.MemQs.ProdCountQs, "#IDID #") == false) –

+0

@Leigh. Правильно. Я изменяю свой код, чтобы отразить его. – Pankaj

0

Похоже, вы пытаетесь создать структуру из запроса. Сначала вы должны создать структуру, а затем заполнить ее из своего запроса. В приведенном ниже примере я предполагаю, что у вас есть объект запроса и что в этом объекте запроса есть столбцы «ExpirationDate» и «ProdCount».

// create query structure 
if(!structKeyExists(APPLICATION, "MemQs")){ 
    APPLICATION.MemQs = structNew(); 
    APPLICATION.MemQs.ProdCountQs = arrayNew(); 
} 
// loop through the query 
for(row=1;row<=originalQuery.recordcount;row++){ 
    APPLICATION.MemQs.ProdCountQs[row] = structNew(); 
    APPLICATION.MemQs.ProdCountQs[row].ExpirationDate = originalQuery.ExpirationDate[row]; 
    APPLICATION.MemQs.ProdCountQs[row].ProdCount = originalQuery.ProdCount[row]; 
} 

Однако, если то, что вы хотите, чтобы проверить наличие узлов, вы должны пройти через дерево постепенно так:

// create query structure 
if(!structKeyExists(APPLICATION, "MemQs")){ 
    APPLICATION.MemQs = structNew(); 
    if(!structKeyExists(APPLICATION.MemQs, "ProdCountQs")){ 
     APPLICATION.MemQs.ProdCountQs = arrayNew(); 
     if(!arrayIsDefined(APPLICATION.MemQs.ProdCountQs,someID)){ 
      APPLICATION.MemQs.ProdCountQs[someID] = structNew(); 
      if(!structKeyExists(APPLICATION.MemQs.ProdCountQs[someID], "ExpirationDate")){ 
       APPLICATION.MemQs.ProdCountQs[someID].ExpirationDate = now(); 
      } 
      if(!structKeyExists(APPLICATION.MemQs.ProdCountQs[someID], "ProdCount")){ 
       APPLICATION.MemQs.ProdCountQs[someID].ProdCount = 0; 
      } 
     } 
    } 
} 
Смежные вопросы