我正在使用 PowerBuilder 10.5 和 Oracle 7 数据库。
接下来是我的问题:用户进入程序,检索数据并获取一个 DataWindow,其中包含大量行(比如说 1000 行),显示客户拥有的金额、他居住的城市以及其他一些数据. 然后,用户单击他感兴趣的所有行(大约 500 个)并在第二个 DataWindow 中过滤它们,称为它DW_1
。现在他想要一个 Excel 表格,其中给出了按客户居住的城市分组的所有金额的总和。需要记住的重要一点是,我只想要用户之前标记的客户端的总和。所以这就是我在代码中所做的:
String ls_s,ls_client,ls_clicked_client, ls_sql
Long ll_i
ls_s='';ls_client='';ls_clicked_client='';
FOR ll_i= 1 TO DW_1.RowCount()
ls_s=DW_1.GetItemString(ll_i, "client")
IF ll_i<DW_1.RowCount() THEN
ls_client+="'"+ls_s+"',"
ELSEIF ll_i=DW_1.RowCount() THEN
ls_clicked_client+=ls_client+"'"+ls_s+"'"
END IF
NEXT
ls_sql="SELECT city, SUM(amount) sum_amount"&
+"FROM("&
+"SELECT city, amount"&
+"FROM table1 T1 WHERE amount+0>0 AND client IN ( "+ls_clicked_client+"))"&
+"GROUP BY city"
DW_1.SetSqlSelect(ls_sql)
DW_1.Retrieve()
w_window.SetMicrohelp(String(DW_1.RowCount()))
DW_1.saveas("excel.xls")
如您所见,我将所有已标记的客户端放入一个变量中,然后将其用作 SQL IN 函数中的参数。之后,我使用标准的 saveas 方法。
这很有效,直到我选择了更多的行,然后一个人可以采取:一旦我越过董事会,我得到ORA 01795: max number of expressions in a list is 1000
. 那是我的问题:如果用户选择了太多的客户端,这会失败。
我也尝试过使用INSTR
函数,但这对大量选定的行也失败了——我得到ORA 01460: unimplemented or unreasonable conversion requested
提示:似乎试图将字符串传递给超过 4000 字节的绑定变量值会导致它崩溃。
所以基本上我有一些工作在某种程度上不满足我。如果没有我在 ls_sql 变量中编写的 SQL 代码,我不知道如何完成这项工作。如果我应该在 Excel 表中只给出几行,DW_1
我会使用 OLE 对象,但我不知道如何为如此大量的指定客户获取按城市分组的金额总和。
有什么想法、建议吗?