PowerBuilder 10.5 と Oracle 7 データベースを使用しています。
私の問題は次のとおりです。ユーザーはプログラムに入り、データを取得して、クライアントが持っている金額、住んでいる都市、およびその他のデータを示す多数の行(1000としましょう)を含むデータウィンドウを取得します. 次に、ユーザーは関心のあるすべての行 (約 500 行) をクリックし、2 番目のデータウィンドウでそれらをフィルタリングします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")
ご覧のとおり、フラグを設定したすべてのクライアントを取得し、それらのクライアント コードを 1 つの変数に入れています。これを 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 オブジェクトを使用しますが、指定された多数のクライアントについて、都市ごとにグループ化された金額の合計を取得する方法がわかりません。
アイデア、提案はありますか?