Я использую базу данных 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 В функции. После этого я использую стандартный метод saveas.
Это сработало отлично, пока я не выбрал больше строк, а затем можно взять: как только я перейду через борт, я получаю ORA 01795: max number of expressions in a list is 1000
. Это моя проблема: если пользователь выбирает слишком много клиентов, это терпит неудачу.
Я также пытался использовать функцию INSTR
, но это также не удалось сделать для большого количества выбранных строк - я получаю советы ORA 01460: unimplemented or unreasonable conversion requested
: кажется, что попытка передать строку в значение переменной привязки, превышающую 4000 байт заставляет его рухнуть.
Так что в основном у меня есть что-то работающее в некоторой степени, которое меня не удовлетворяет. И у меня нет идей, как сделать эту работу без кода SQL, который я написал в переменной ls_sql. Если бы я должен был дать только несколько строк DW_1
на листе excel, я бы пошел с объектами OLE, но я не вижу, как получить сумму сумм, сгруппированных по городу для такого большого количества указанных клиентов.
Любые идеи, предложения?
это пахнет плохую идею, но вы пытались заменить 'в (список)' построение с помощью последовательности 'или client = xx'? – Seki
Вы устали слышать, что Oracle 7 был деспопортирован 10 лет назад, я должен подумать. –
@Seki, не подумал об этом, попробует, когда найду время, просто чтобы посмотреть, куда это меня приведет. Сообщите об этом. –