【发布时间】:2018-07-26 15:59:17
【问题描述】:
我想循环查询并比较列值。以下是 CFML 代码示例:
<cfquery name="qryUserPerm" datasource="#Application.dsn#">
SELECT AccessType, AccessLevel, State, City, Building
FROM Permissions
WHERE AccountID = <cfqueryparam cfsqltype="cf_sql_integer" value="#trim(session.AccountID)#">
</cfquery>
<cfset local.permissionType = "">
<cfset local.permissionLevel = "">
<cfset local.permissionList = "">
<cfif qryUserPerm.AccessLevel EQ "S">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = qryUserPerm.State>
<cfelseif qryUserPerm.AccessLevel EQ "C">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = ListRemoveDuplicates(ValueList(permissionList,qryUserPerm.City))>
<cfelseif qryUserPerm.AccessLevel EQ "B">
<cfset local.permissionType = qryUserPerm.AccessType>
<cfset local.permissionLevel = qryUserPerm.AccessLevel>
<cfset local.permissionList = ListRemoveDuplicates(ValueList(permissionList,qryUserPerm.Building))>
</cfif>
上面的代码应该被翻译成cfscript,我已经做到了,但不知道如何访问列值。
<cfscript>
public string function permissionList(required string AccountID) {
local.fnResults = "";
local.permissionList = "";
try{
local.qryPermissions = new Query();
local.qryPermissions.setDatasource("#Application.dsn#");
local.qryPermissions.setSQL("SELECT AccessType, AccessLevel, State, City, Building FROM Permissions WHERE AccountID = :AccountID");
local.qryPermissions.addParam(name="AccountID",value="#trim(arguments.AccountID)#",cfsqltype="cf_sql_idstamp");
local.qryRes = qryPermissions.execute();
for ( i = 1 ; i <= qryRes.getResult().recordCount ; i++ ) {
if(qryRes["AccessLevel"][i] EQ "S"){
local.permissionList = "";
}else if(qryRes["AccessLevel"][i] EQ "S"){
local.permissionList = ListRemoveDuplicates(ValueList(qryRes.Agency,","));
}else if(qryRes["AccessLevel"][i] EQ "C"){
local.permissionList = ListRemoveDuplicates(ValueList(qryRes.District,","));
}else if(qryRes["AccessLevel"][i] EQ "B"){
local.permissionList = ListRemoveDuplicates(ValueList(qryRes.Building,","));
}
}
local.fnResults = permissionList;
}catch(any e){
local.fnResults = e.message;
//writeOutput(e.message);
}
return fnResults;
}
writeOutput(permissionList(AccountID));
</cfscript>
如果有人可以帮忙,请告诉我。
【问题讨论】:
-
如果您的意思是分配或访问值,您的代码已经在此处访问列值:
qryRes["AccessLevel"][i],使用语法queryName["ColumnName"][RowNumber]。只需在需要的地方使用相同的语法即可。 -
我必须比较
accessLevel列值并检查它是S州、C城市还是B建筑物。基于该值将分配给 permissionList 变量。那有意义吗?代码不起作用,我很困惑,因为这是 CFML 中的正确语法。 -
是的,逻辑是有道理的,但我不知道哪条线不起作用。 (顺便说一句,我在你的另一个线程上提出的关于 SQL 中的 CASE 的建议将使所有这些都没有实际意义......)
-
@Ageax 这是我在 catch 块
Element AccessLevel is undefined in a Java object of type class coldfusion.runtime.TemplateProxy.中遇到的错误。 -
(更新)哦!我认为问题在于
local.qryRes不包含查询。混淆地调用execute()不会返回查询,但execute().getResult()会。尝试将分配更改为local.qryRes = qryPermissions.execute().getResult()。不要忘记从for循环中删除 getResult()。
标签: coldfusion cfml cfquery cfloop