2013-11-06 2 views
0

Я использую базу данных 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, но я не вижу, как получить сумму сумм, сгруппированных по городу для такого большого количества указанных клиентов.

Любые идеи, предложения?

+0

это пахнет плохую идею, но вы пытались заменить 'в (список)' построение с помощью последовательности 'или client = xx'? – Seki

+1

Вы устали слышать, что Oracle 7 был деспопортирован 10 лет назад, я должен подумать. –

+0

@Seki, не подумал об этом, попробует, когда найду время, просто чтобы посмотреть, куда это меня приведет. Сообщите об этом. –

ответ

0

Подсказка

Производительность и оптимизация в сторону, вы можете создать несколько ЗЕЬЕСТ, как тот, который вы имеете, но каждый оператор использует строку, которая имеет меньший размер, чем 1000. Вы могли бы затем:

- выдавать выписки в цикле или

B- использование SELECT ..... UNION SELECT .... и т.п. Это должно решить проблему размера. Опять же, если у вас есть огромная строка SQL, у вас может возникнуть проблема с подходом UNION.

+0

Была эта идея, но позже я решил использовать datastore: у меня возникла проблема с некоторыми нулевыми значениями, входящими туда, когда я пошел на вариант Union. –

0

Вы можете вставить выбранный пользователь-запись в другую таблицу, а затем выдать избранный, как этот:

SELECT T1.city, SUM(T1.amount) sum_amount 
FROM  table1 T1 
WHERE T1.amount > 0 
AND  T1.client IN (select T2.id from your_new_table T2) 
GROUP BY T1.city 
+0

Это несколько линия, в которой я пошел в конце: я создал хранилище данных, где я сначала ставил свои строки. Затем я просто использовал синтаксис powerbuilders: datastore.SetSort (ciy), datastore.Sort(), после чего я установил цикл, в который я вставляю города, и суммируя их. Я положу код, когда найду время, чтобы вы могли видеть. Спасибо за ответ. –

Смежные вопросы