我有一个简单的CFC文件,其中包含针对不同查询的不同功能。一个单独的函数,可根据查询动态显示报告。
所有查询都有效,除了返回约1的查询。 50k行。它只是一个空白屏幕&我没有错。当我转储查询结果时,它们会被转储到屏幕上,但在表格报告中显示它时却什么都没有。
我还有另一个返回100k行的CFM文件。工作正常。
以下是无效的CFC代码。
<cfcomponent>
<cfparam name="qry1" default="">
<cffunction name="showqry1" access="remote">
<cfquery name="qry1" dataSource="myds" cachedwithin="#CreateTimeSpan(0, 2, 0, 0)#">
<!--- myquery --->
</cfquery>
<cfset Display()>
</cffunction>
<cffunction name="showqry2" access="remote">
<cfquery name="qry1" dataSource="myds" cachedwithin="#CreateTimeSpan(0, 2, 0, 0)#">
<!--- myquery --->
</cfquery>
<cfset Display()>
</cffunction>
<cffunction name="Display" access="private">
<cfdump var="#rptQry#" top="20">
<cfsavecontent variable="myrpt">
<table>
<!--- make a tabular report here using cfloop over the query--->
</table>
</cfsavecontent>
<cfform action="test.cfm" method="post" name="ExcelData">
<cfoutput>#myrpt#</cfoutput>
<cfinput type="hidden" name="excel_data" value="#myrpt#"/><!---This is giving the error. --->
<cfinput type="submit" name="test" value="Export" />
</cfform>
</cffunction>
</cfcomponent>
任何想法为什么CFM工作正常但CFC没有?我需要我的CFC工作&amp;不希望它将它转换为CFM ......
更新: 我在上面的代码中添加了一条注释(“这是错误”),这是导致错误的原因。无论CFC / CFM如何,这都不起作用。
我使用隐藏字段将数据传递到另一个将数据导出到excel的文件。任何替代建议??
非常感谢任何帮助。
由于
答案 0 :(得分:3)
你仍然需要阅读我在评论中提出的关于如何清楚地提问的文件。
但是,您将记录集放入变量qry1
,但尝试转储变量rptQry
。但这只是错误,除非有一些代码你没有向我们展示填充rptQry
。
另外,从编码练习POV开始,你不应该在函数中输出东西:最好在CFM页面中完成。使用CFC方法获取数据;用CFM显示它。
我还建议您阅读如何使用CFML(或一般)进行OO。也许得到马特吉福德的书“Object-Oriented Programming in ColdFusion”
答案 1 :(得分:0)
您的显示功能具有表格数据的cfsavecontent,您将其放入cfc内的cfform中。我不知道你为什么这样做。 Insted,只需执行ajax调用,返回cfsavecontent,然后在cfm中显示它。
否则,我猜您可能必须在Display功能中输出cfform。我可能错了,但我认为你不能简单地在cfc中放置一个cfform并期望它出现在浏览器上。 CFC不适用于浏览器渲染,它应该是cfm。
答案 2 :(得分:0)
关于评论,“这是因为我需要在点击我需要cfform的按钮时导出到excel。你能建议一些替代这个功能吗?”,我会给你一些思考的东西
首先,您谈论包含数千行的记录集,并且您有代码,您尝试在浏览器中显示该行。很简单,这需要花费大量的时间来渲染。所以,这是一个坏主意。
接下来,您的代码具有各种查询的功能,但只有一个显示功能。除非这是一个巧妙编写的函数,用于确定列名称,否则只有在所有查询具有相同列时才会起作用。如果是这种情况,也许你只需要一个查询和一些变量。
我的建议是从一个表单开始,用户发送相应的信息来确定sql写入的内容。此表单还应包含一种方式,供他们选择是否要在excel或html中呈现结果。如果他们选择html,请做一些事情以确保返回的数据不会压倒他们的浏览器。
顺便说一句,用于显示查询结果的可重用代码是个好主意。但是,自定义标记可能是更常规的标记方式。