-1

我有一个简单的 CFC 文件,其中包含用于不同查询的不同函数和一个单独的函数,该函数根据查询动态显示报告。

除了返回大约的查询之外,所有查询都有效。50k 行。它只是一个空白屏幕,我没有收到任何错误。当我转储查询结果时,它们确实被转储在屏幕上,但在表格报告中显示时,它什么也没提供。

我有另一个 CFM 文件,它返回 100k 行并且工作正常。

以下是不起作用的 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 工作并且不希望它转换为 CFM ......

更新:我在上面的代码中添加了一条注释(“这是给出错误”),这是导致错误的原因。无论 CFC/CFM 是什么,这都不起作用。

我使用隐藏字段将数据传递到另一个将数据导出到 Excel 的文件。任何替代建议?

非常感谢任何帮助。

谢谢

4

3 回答 3

3

你仍然需要阅读我在评论中关于如何清楚地提问的文档。

但是,您将记录集放入变量qry1中,但试图转储变量rptQry。但这只会出错,除非有一些你没有向我们展示的代码填充rptQry.

此外,从编码实践 POV 来看,您实际上不应该在函数中输出内容:最好在 CFM 页面中完成。使用 CFC 方法获取数据;用 CFM 显示它。

我还建议您阅读如何使用 CFML(或一般而言)进行 OO。或许可以看看 Matt Gifford 的《ColdFusion 中的面向对象编程》一书

于 2013-10-11T10:24:07.723 回答
0

关于评论,“这是因为我需要在单击我需要 cfform 的按钮时导出到 excel。你能建议一些替代这个功能的方法吗?”,我会给你一些思考的事情。

首先,您谈论包含数千行的记录集,并且您有代码尝试在浏览器中显示它。很简单,这将花费大量时间来渲染。所以,这是个坏主意。

接下来,您的代码具有用于各种查询的功能,但只有一个显示功能。除非这是一个巧妙编写的函数来计算列名,否则它只有在所有查询都具有相同的列时才有效。如果是这种情况,也许您只需要一个查询和一些变量。

我的建议是从用户发送适当信息的表单开始,该信息确定写入的 sql 内容。此表单还应包括一种让他们选择是否希望以 excel 或 html 呈现结果的方法。如果他们选择 html,请采取措施确保返回的数据不会淹没他们的浏览器。

顺便说一句,用于显示查询结果的可重用代码是一个好主意。但是,自定义标签可能是一种更传统的方法。

于 2013-10-11T12:57:11.680 回答
0

您的 Display 函数具有带有表格数据的 cfsavecontent,并且您将其放入 cfc 中的 cfform 中。我不知道你为什么这样做。Insted,只需执行一个 ajax 调用,返回该 cfsavecontent,然后在 cfm 中显示它。

否则,我猜您可能必须在 Display 函数中输出 cfform。我可能错了,但我认为您不能简单地将 cfform 放在 cfc 中并期望它显示在浏览器上。CFC 不适用于浏览器渲染,它应该在 cfm 中。

于 2013-10-11T10:23:20.057 回答