cfscript中调用Valuelist获取单条记录字段值报错问题求助
问题解决方法
错误原因
ValueList() 函数的入参要求是查询对象的整列,你传入getEvents.room[i]实际返回的是第i行的room字段字符串值,CF会尝试把这个字符串当做变量名去解析,自然就报变量不存在的错误。而不加下标[i]时返回全表所有地点,是因为ValueList默认返回指定列的所有行值拼接结果,不符合单活动取对应地点的需求。
推荐解决方案(优先选这个,性能更高)
直接在SQL查询层面按活动ID分组,直接聚合生成单活动的地点列表:
修改查询代码
如果是MySQL数据库,使用GROUP_CONCAT函数:
<cfquery datasource="#application.dsn#" name="getEvents"> select project.project_id, omschrijving, project.naam, project.start, project.eind, GROUP_CONCAT(DISTINCT room ORDER BY room SEPARATOR ', ') as room_list, meeting_url from project, lp_booking, lp_locaties where export = <cfqueryparam value="1" cfsqltype="cf_sql_bit"> and keuren is null and project.datum >= <cfqueryparam value="#createODBCDate(Now())#" cfsqltype="cf_sql_date"> and lp_locaties.room_id = lp_booking.room_id and lp_booking.project_id = project.project_id group by project.project_id, omschrijving, project.naam, project.start, project.eind, meeting_url order by project.datum </cfquery>
如果是SQL Server/PostgreSQL数据库,把GROUP_CONCAT替换为STRING_AGG(DISTINCT room, ', ')即可。
修改LOCATION行代码
直接取聚合后的地点字段即可:
vCal = vCal & 'LOCATION:'&getEvents.room_list[i]& CRLF;
备选解决方案(无需改SQL,适合小数据量场景)
如果不想修改SQL,可以在循环中先筛选当前活动对应的所有行,再生成地点列表:
把原LOCATION行替换为如下代码:
// 筛选当前活动ID对应的所有查询记录 var currentProjectRows = QueryFilter(getEvents, function(row) { return row.project_id == getEvents.project_id[i]; }); // 拼接当前活动的所有地点 vCal = vCal & 'LOCATION:'&ValueList(currentProjectRows.room)& CRLF;
额外代码优化提示
你原代码中vCal = vCal & writeoutput('xxx'& CRLF)写法有误,writeoutput是直接向响应流输出内容,没有返回值,不需要拼接,直接把字符串内容赋值给vCal即可,避免输出内容重复。
内容的提问来源于stack exchange,提问作者Samall
相关产品推荐
相关产品推荐

