2016-08-04 2 views
2

Я хочу получить счетчик записей запроса, который имеет переменную в имени.ColdFusion: Получить RecordCount с переменной в имени

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#teamstaffid#" datasource="#dataSource#" > 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#teamstaffid#' AND 
       hist_req_assign.requestid = request.requestid AND 
       hist_req_status.requestid = request.requestid AND 
       hist_req_status.statusid = '3' 
    </cfquery> 
</cfloop> 

GetTeam выплескивает идентификатор каждого сотрудника в моей команде.
И GetJob#teamstaffid# получает всю свою работу.

МОЯ первый инстинкт должен сделать: <cfoutput>#GetJobs#teamstaffid#.RecordCount#</cfoutput>

Это, очевидно, не будет работать, хотя. Как я могу получить количество записей каждого члена команды? Благодаря

+4

Проведите поиск динамической переменной coldfusion (или запроса). Есть * тонна примеров. Сказав это, этот тип агрегации лучше сделать с помощью одного запроса к базе данных. Запрос в цикле очень неэффективен. Боковое примечание - всегда используйте cfqueryparam для переменных параметров запроса. Это помогает улучшить производительность запросов и защищает от SQL-инъекций. – Leigh

ответ

-1

я бы, вероятно, сделать что-то вдоль этих линий:

<cfscript> 
try { 
    sql = "select * from Request, Hist_Req_Assign, Hist_Req_status where hist_req_assign.requestid = request.requestid and hist_req_status.requestid = request.requestid and hist_req_status.statusid = '3'"; 
    principalQuery = new query(); 
    principalQuery.setDatasource(dataSource); 
    result = principalQuery.execute(sql=preserveSinglequotes(sql)); 
    getJobs = result.getResult(); 

    for(i=1;i<=listLen(teamstaffid);i++){ 
     sql = "select request, Hist_Req_Assign, Hist_Req_status from sourceQuery where hist_req_assign=#teamstaffid[i]#"; 
     local.queryService = new query(); 
     local.queryService.setName("employee"); 
     local.queryService.setDBType("query"); 
     local.queryService.setAttributes(sourceQuery=getJobs); 
     local.objQueryResult = local.queryService.execute(sql=sql); 
     local.queryResult = local.objQueryResult.getResult(); 
     writeOutput("Employee " & teamstaffid[i] & " has " & local.queryResult.recordcount & " records."); 
    } 
    } catch (any e){ 
     //whatever 
    } 
</cfscript> 
+2

Извините, но это не очень хороший подход по нескольким причинам. A) Запрос в цикле очень неэффективен. Обычно этого можно избежать, построив правильный запрос.Это означает, что * single * db call - вместо одного для * каждой записи * во внешнем запросе (50, 100 и т. Д.). B) Не используйте 'preserveSinglequotes()'. Он отменяет минимальную защиту CF автоматически и предоставляет базу данных SQL-I. Вместо этого используйте '' или 'addParam'. Использование переменных привязки не только защищает от SQL-I, но и повышает производительность для запросов, выполняемых несколько раз. – Leigh

+0

Это только один вызов БД. Второй запрос - это не вызов БД. Это запрос структуры, созданной в результатах первого запроса. Я бы склонен согласиться с параметром, но в этом случае риск будет минимальным, так как не используются никакие пользовательские переменные. Список, используемый для указания частей структуры, является частью кода, это не вход. –

+0

Это не имеет особого значения. По-прежнему существуют затраты, связанные с разбором и построением результатов запроса, [какие базы данных предприятия имеют тенденцию оптимизировать лучше, чем QoQ] (http://stackoverflow.com/questions/13632246/cf-qoq-vs-query). При одном запросе db стоимость возникает * только один раз *. При циклизации эти затраты умножаются много раз: один раз за запись - за запрос. Обычно получается гораздо больше времени и ресурсов, чем на самом деле необходимо. Следовательно, почему цикл часто является наименее эффективным и самым медленным методом и имеет тенденцию плохо масштабироваться. – Leigh

4

Атрибут name в вашей cfquery тега является выходной переменной вашего запроса. Если не указано, значение по умолчанию переменной, например GetJobs#teamstaffid#, равно VARIABLES. Области переменных в ColdFusion - это структуры.

Чтобы получить доступ к динамическим переменным, используйте кронштейн для обозначения структур:

<cfoutput>#VARIABLES["GetJobs#teamstaffid#"].RecordCount#</cfoutput>

Примечания: Если ваш код является частью функции, используйте LOCAL сферу вместо VARIABLES сферы.

+1

Почему это было приостановлено? –

-1

Тег cfquery возвращает некоторые переменные результата в структуре. Таким образом, мы используем атрибут result в теге cfquery, который может получить некоторые детали запроса.

Например: 1. resultname.sql 2. resultname.recordcount

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#teamstaffid#" datasource="#dataSource#" result="resultname"> 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#teamstaffid#' AND 
       hist_req_assign.requestid = request.requestid AND 
       hist_req_status.requestid = request.requestid AND 
       hist_req_status.statusid = '3' 
    </cfquery> 
</cfloop> 

<cfoutput>#resultname.recordcount#</cfoutput> 
-1

Просто используйте функцию Coldfusion Оценка

<cfoutput>#Evaluate("GetJobs#teamstaffid#").RecordCount#</cfoutput> 
<cfoutput>#Evaluate("GetJobs#teamstaffid#").column1#</cfoutput> 
<cfoutput>#Evaluate("GetJobs#teamstaffid#").column2#</cfoutput> 
..... 

В то время как вы можете получить доступ к любой столбец или поле из записи, используя Evaluate, лучше сохранить возвращенный объект запроса сначала в переменной (внутри цикла) как короткий доступ к руке, чтобы вы могли легко достичь других столбцов/полей из t он запросит набор записей.

<cfloop query="Getteam"> 
    <cfquery name="GetJobs#Getteam.teamstaffid#" datasource="#dataSource#" > 
     SELECT * 
     FROM Request, Hist_Req_Assign, Hist_Req_status 
     WHERE hist_req_assign.teamstaffid = '#Getteam.teamstaffid#' AND 
      hist_req_assign.requestid = request.requestid AND 
      hist_req_status.requestid = request.requestid AND 
      hist_req_status.statusid = '3' 
    </cfquery> 

    <cfset QGetJob = #Evaluate("GetJobs#Getteam.teamstaffid#")# /> 

    <cfoutput>#QGetJob.RecordCount#</cfoutput> 
    <cfoutput>#QGetJob.column1#</cfoutput> 
    <cfoutput>#QGetJob.column2#</cfoutput> 
</cfloop> 
+0

Почему проголосовали? – KAR

0

В прямой ответ на вопрос; вы можете извлечь имя данных в контексте (GetJobs # teamstaffid #) в каждой итерации и сохранить его в глобальном списке/массиве/структуре, который будет использоваться позже, но, как уже обсуждалось, было бы лучше структурировать запрос, чтобы получить все на один раз.

Было бы сложно предоставить конкретную информацию на SQL без знания вашей схемы.

Смежные вопросы