Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Аррей больше трёхсот / 25 сообщений из 25, страница 1 из 1
17.06.2005, 00:50
    #33120703
Endymion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
Насколько мне известно, то передать просто через параметр numeric-array в размере больше трехсот в dw нельзя.

Как вы решаете для себя эту проблему ?

1) Через Динамический скл. Вставить строку IN (тут аррай )
2) Разбить аррай на арреи по 300 мест и сделать ретрив
3) Вставить аррей в базу данных и уже делать джоин с этой таблицей

,,,,

Есть какие нибудь нестандарные решения ?
...
Рейтинг: 0 / 0
17.06.2005, 01:21
    #33120719
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
EndymionНасколько мне известно, то передать просто через параметр numeric-array в размере больше трехсот в dw нельзя.

Как вы решаете для себя эту проблему ?

1) Через Динамический скл. Вставить строку IN (тут аррай )
2) Разбить аррай на арреи по 300 мест и сделать ретрив
3) Вставить аррей в базу данных и уже делать джоин с этой таблицей

,,,,

Есть какие нибудь нестандарные решения ?

1) А откуда это известно (насчёт 300) ?
2) Мы, когда надо, делаем динамический WHERE clause, а поскольку Oracle раньше не поддерживал больше 255 элементов в IN, то вокруг этого числа и крутили...
3) Можно разбивать массив на куски, dw говорить, чтобы оно append rows (то бишь в RetrieveStart eventе возвращать 2) и т.п.
...
Рейтинг: 0 / 0
17.06.2005, 10:33
    #33121123
Endymion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
Откуда известно на счёт 300 ? Я работаю с сайбес и он точно не поддерживает .

Значит всё таки второй вариант ?
...
Рейтинг: 0 / 0
17.06.2005, 11:12
    #33121245
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
А может быть все таки изменить логику? Более 300 аргументов для запроса это на мой взгляд не самое удачное решение. За 8 лет работы с PB мне ни разу не потребовалось передать массив в качестве аргумента запроса.
...
Рейтинг: 0 / 0
17.06.2005, 11:41
    #33121327
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
а мне недавно протребовалось:
есть список изделий выбираемый из БД с помощью ХП
список изделий связан с классификатором как многие ко многим
пользователь может выбрать в виде условия отбора изделий неограниченное количество записей из классификатора.
Мое решение:
формируется строка в виде списка ID (через запятую) выбранных записей классификатора и передается как параметр в ХП. ХП превращает строку в рекордсет и присоединяет к списку изделий.
Процедура превращения списка в рекордест есть на codexchange для ASA
...
Рейтинг: 0 / 0
17.06.2005, 12:11
    #33121442
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
rcryoа мне недавно протребовалось:
есть список изделий выбираемый из БД с помощью ХП
список изделий связан с классификатором как многие ко многим
пользователь может выбрать в виде условия отбора изделий неограниченное количество записей из классификатора.
Мое решение:
формируется строка в виде списка ID (через запятую) выбранных записей классификатора и передается как параметр в ХП. ХП превращает строку в рекордсет и присоединяет к списку изделий.
Процедура превращения списка в рекордест есть на codexchange для ASA
Я бы для ASA сделал глобальную временную таблицу (а начиная с 9.0.2.3131 может даже сессионную локальную времянку, которая создавалась бы при входе в режим и дропалась при выходе). В нее писал все то, что пометил пользователь (через тот же DW с CheckBox, в котором выводится весь список товаров и можно пометить нужные), а потом просто в запросах использовал обычный INNER JOIN к этой таблице. Дешево, красиво, удобно, никакого кода в клиенте и никаких IN :)
...
Рейтинг: 0 / 0
17.06.2005, 13:06
    #33121679
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
автордаже сессионную локальную времянку, которая создавалась бы при входе в режим и дропалась при выходепо сути у меня и создается локальная времянка, только в момент запроса в скрипте ХП
как я вас понял вы предлагаете в момент запроса создать временную таблицу (из клиента?) затем заполнить её данными из DW (код клиента?) а потом сделать запрос данных с объединением таблиц. Мне показалось что с этим больше возни и это не согласуется с этим автор никакого кода в клиентевариант с глобальной таблицей тоже показался не очень, так как клиент может открыть несколько одинаковых форм с запросом (у меня это можно) тогда надо передавать еще какой-нибудь ID запроса, и если есть другие подобные запросы для каждого вида запроса своя глобальная таблица, или в таблице учитывать тип запроса, вобщем морока.
...
Рейтинг: 0 / 0
17.06.2005, 17:09
    #33122433
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
Имея ввиду "никакого кода в клиенте" я имею ввиду "никакого кода бизнес-логики" в клиенте. Раз у Вас может открываться более одной формы данного режима одновременно, то делаем глобальную временную таблицу с доп. полем WindowHandle и везде работаем по фильтру в разрезе Handle окна. По моему надежней и как раз менее гемморней, чем пытаться PB генерить сотни параметров в IN, а потом использовать динамический SQL или вызывать UDF для разбора переданной строки и заполнению их в таблицу.
...
Рейтинг: 0 / 0
17.06.2005, 18:08
    #33122567
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
rcryoвариант с глобальной таблицей тоже показался не очень, так как клиент может открыть несколько одинаковых форм с запросом (у меня это можно) тогда надо передавать еще какой-нибудь ID запроса, и если есть другие подобные запросы для каждого вида запроса своя глобальная таблица, или в таблице учитывать тип запроса, вобщем морока.
Я обошелся всего одной глобальной времянкой. Таблица определена с несколькими полями разных типов (char (20), integer, datetime) и в зависимости от задачи заполняются соответствующие поля. А ХП уже сама знает какое поле читать.
...
Рейтинг: 0 / 0
17.06.2005, 18:26
    #33122609
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
У нас ВСЕ поисковые экраны делают динамический WHERE clause с IN - НИКАКИХ временных таблиц, SPs и т.п. безобразия :-)
...
Рейтинг: 0 / 0
17.06.2005, 18:28
    #33122612
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
EndymionОткуда известно на счёт 300 ? Я работаю с сайбес и он точно не поддерживает
То бишь семантически, фраза "передать просто через параметр numeric-array в размере больше трехсот в dw нельзя" - бессмысленна? :-)
...
Рейтинг: 0 / 0
17.06.2005, 18:37
    #33122637
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
хочу все-таки понять, оставим только это:
автор По моему надежней и как раз менее гемморней, чем пытаться PB генерить сотни параметров... вызывать UDF для разбора переданной строки и заполнению их в таблицу так как другого я не предлагал. Просьба разъяснить где здесь снижение надежности или гемморой. Возможно в этом решении и есть какой-то недостаток и я его не вижу?
Это скрипт в PB формирует строку и передает в ХП
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
ls_search = "checked = 1"
ls_class_list = ""
ll_count = dw_class.RowCount()
ll_row = dw_class.Find(ls_search,  1 , ll_count)
DO WHILE ll_row >  0 
  IF Len(ls_class_list) >  0  THEN ls_class_list += ","
  ls_class_list += string(dw_class.Object.class_id[ll_row])
  ll_row = dw_class.Find(ls_search, ll_row +  1 , ll_count +  1 )
LOOP
dw_items.Retrieve(ls_class_list)
Вот запрос в ХП который выводит список изделий:
Код: plaintext
1.
select * from im_item i key join im_item_class ic, sp_am_getelement(as_class_list) e
where e.element = ic.class_id;
Вот текст процедуры sp_am_getelement (написана не мной, поэтому и гемморой тоже не мой =)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
ALTER PROCEDURE "DBA"."sp_am_getelement"( in as_list long varchar, in as_delimiter char( 1 ) default ',')
RESULT( element varchar( 100 ))
BEGIN
    declare ll_DelLen integer;
    declare ll_Pos integer;
    declare ll_Start integer;
    declare ll_Length integer;
    declare ls_holder varchar( 100 );
    
    //Check for NULL
    IF isnull(trim(as_list), '') = '' or isnull(as_delimiter, '') = '' Then
    	return;
    End If;
    
    //Get the length of the delimeter
    set ll_DelLen = Length(as_delimiter);
    
    set ll_Pos = Locate(as_list, as_Delimiter);
    
    //Only one entry was found
    if ll_Pos =  0  then
    	select trim(as_list);
    	return;
    end if;
    
    //More than one entry was found - loop to get all of them
    set ll_Start =  1 ;
    create table #tmp ( element varchar( 50 ) );
    While ll_Pos >  0  loop
    	
    	//Set current entry
    	set ll_Length = ll_Pos - ll_Start;
        insert into #tmp values( trim(Substr(as_list, ll_start, ll_length)));
    
    	//Set the new starting position
    	set ll_Start = ll_Pos + ll_DelLen;
    
    	set ll_Pos =  Locate(as_list, as_delimiter, ll_Start);
    End Loop;
    
    //Set last entry
    set ls_holder = trim(Substr(as_list, ll_start));
    if Length (ls_holder) >  0  then
         insert into #tmp values( ls_holder );
    end if;
    
    select element from #tmp;
    Return;
END
Пока писал увидел это
авторУ нас ВСЕ поисковые экраны делают динамический WHEREмне не подходит, запрос должен быть в ХП
...
Рейтинг: 0 / 0
17.06.2005, 19:12
    #33122685
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ФилиппУ нас ВСЕ поисковые экраны делают динамический WHERE clause с IN - НИКАКИХ временных таблиц, SPs и т.п. безобразия :-)Остается порадоваться за вас.
База какая? И что ни разу не сталкивались с ограничениями на количество элементов в IN(...) ? И что ни разу не сталкивались с ограничением на размер SQL оператора? Нет? Ну значит повезло.
А мы знаете вот как то не привыкли на удачу рассчитывать.
...
Рейтинг: 0 / 0
17.06.2005, 19:15
    #33122690
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
White OwlЯ обошелся всего одной глобальной времянкой. Таблица определена с несколькими полями разных типов (char (20), integer, datetime) и в зависимости от задачи заполняются соответствующие поля. А ХП уже сама знает какое поле читать.
УЖОСНАХ!!!
Нет печальнее картины чем человечек на суппорте, который в чужом коде тупо пялится на обращения к загадочным column1 varchar(255) и column2 datetime в некой загадочной глобальной времянке.
...
Рейтинг: 0 / 0
17.06.2005, 19:38
    #33122730
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ЗоринАндрей ФилиппУ нас ВСЕ поисковые экраны делают динамический WHERE clause с IN - НИКАКИХ временных таблиц, SPs и т.п. безобразия :-)Остается порадоваться за вас.
База какая? И что ни разу не сталкивались с ограничениями на количество элементов в IN(...) ? И что ни разу не сталкивались с ограничением на размер SQL оператора? Нет? Ну значит повезло.
А мы знаете вот как то не привыкли на удачу рассчитывать.
Читать тщательнее надо, г-н Зорин.
Oracle у нас, так что вокруг 255 крутились, и если надо, разбивали на куски, кратные 255, вот так примерно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
long ll_rows, kount
string ls_claims[]
integer ORACLE_IN_CLAUSE_LIMIT =  254 
ll_rows = gnv_app.inv_ft_trans.nvf_get_ft_claims(as_location, ls_claims)
//ls_claims теперь содержит очччень большой массив

IF ll_rows >  0  THEN	
	as_claim_list =" AND ( claim_no IN ( "
	FOR kount =  1  to ll_rows
		IF Mod(kount, ORACLE_IN_CLAUSE_LIMIT) =  0  THEN
			as_claim_list += ") OR claim_no IN ( " + "~~~'" + ls_claims[kount] + "~~~'"
		ELSE			
			IF kount =  1  THEN 
				as_claim_list += "~~~'" + ls_claims[kount]+ "~~~'"
			ELSE
				as_claim_list += ", " + "~~~'" + ls_claims[kount]+ "~~~'"
			END IF
		END IF
		
	NEXT
	as_claim_list += ") ) "
	RETURN TRUE
END IF
Всё это делалось для Oracle 7. Начиная с Oracle 8i, лимит = 1000
...
Рейтинг: 0 / 0
17.06.2005, 20:10
    #33122764
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
rcryo
Вместо всего кода можно просто раз сделать глобальную временную таблицу в БД, заполнять ее через тот же DW и пользоваться в SELECT-ах, как предустановленным пользователем фильтром. В итоге помимо того, что у нас кода на клиенте нет, мы не тратим время на сбор строки в клиенте и ее разбор на сервере, мы имеем проиндексированную времянку, что учитывается при выполнении запросов оптимизатором. Ваша же ХП будет всегда идти через scan ее записей с другими в запросе.

Филипп
Какая у Вас интересная система на Оракле - запросы и изменения таблиц прямо с клиентского приложения, логика там же. Наверное весело права доступа расписывать и после какого то изменения/доработки структуры БД клиента всего перелопачивать ? :) Мне как то легче все на ХП держать - и с правами на таблички и представления заморачиваться не надо и клиенту все равно, что там в БД происходит, он знает что ХП ему возвращают и этого ему хватает. Правда беру свои слова обратно ... если Оракл не поддерживает "SELECT * FROM StoredProcedure()", как например MSSQL - тогда остается только посочувствовать.

P.S. А вообще раз в качестве сервера используется ASA 9, давайте и рекомендовать с точки зрения ASA 9, а не писать, что ХП это бред, времянки плохо и т.д. Для кого то может и плохо. Для ASA я считаю просто прекрасно.
...
Рейтинг: 0 / 0
17.06.2005, 20:38
    #33122783
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ASCRUS
Филипп
Какая у Вас интересная система на Оракле - запросы и изменения таблиц прямо с клиентского приложения, логика там же. Наверное весело права доступа расписывать и после какого то изменения/доработки структуры БД клиента всего перелопачивать ? :)
Не понял, причём здесь права доступа?
О каких "изменениях таблиц" вы спрашиваете? Об изменениях ДАННЫХ в них - ну тогда естественно прямо с клиентского приложения, а откуда они ещё возьмутся?
И не надо думать, что мы не используем ХП и т.п. - при том что у нас почти 160 пибблов клиентского приложения, я думаю объём PL/SQL кода всё равно превышает объём РВшного кода...
Просто в привидённом мной примере (поисковые экраны), гибкость РВ значительно превышает возможности всяческие попытки предусмотреть юзерские извраты в stored procedure...
...
Рейтинг: 0 / 0
17.06.2005, 21:48
    #33122828
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ЗоринАндрей White OwlЯ обошелся всего одной глобальной времянкой. Таблица определена с несколькими полями разных типов (char (20), integer, datetime) и в зависимости от задачи заполняются соответствующие поля. А ХП уже сама знает какое поле читать.
УЖОСНАХ!!!
Нет печальнее картины чем человечек на суппорте, который в чужом коде тупо пялится на обращения к загадочным column1 varchar(255) и column2 datetime в некой загадочной глобальной времянке.
Что может быть ужасного в коде типа:
select t1.* from RequestedCodes, t1 where t1.pk=RequestedCodes.CharKey;
или
select t2.* from RequestedCodes, t2 where t2.somedatefield=RequestedCodes.DateKey;
Если в этом сложно разобраться - нафиг такой человечек в суппорте? :)

Но если заполнение клиентом таблицы RequestedCodes вам кажется слишком сложным... можете заниматься формированием макроподстановок для IN(). Не смею настаивать.
...
Рейтинг: 0 / 0
17.06.2005, 23:16
    #33122888
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
Угу. Был у нас когда то давно такой умелец. Для передачи параметров использовал структурку типа string1, string2, string3,... , datetime1, datetime2, datetime3,...
и как-то опечатался - типа засунул в datetime5 а вытаскивал из datetime6.
и коллеги все время бегали спрашивать - а что за херня такая str_1.string3 и кто ее туда положил?
зато гордился - вот там у вас каких-то объектов до фига - а я обошелся одной структурой!
к счастью вовремя спохватились и выгребли это дерьмо из приложения.
...
Рейтинг: 0 / 0
17.06.2005, 23:29
    #33122895
Endymion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
У нас в фирме дела обстоят так: начальство не любит временные таблицы и storeprocedure. Я конечно попробую уломать начальство, но к сожалению надежды мало, потому как мне кажется что временные таблицы это красивое решение. Пока что я пользуюсь решением, наподобие решения Филлипа (его красивее).

А каково точно максимальное ограничение масива я в ближайшем будущем (когда найду время) проверю. У нас тоже пользуются АСА9.
...
Рейтинг: 0 / 0
17.06.2005, 23:31
    #33122896
Endymion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
У нас десятки структур по любому поводу. Не понимаю зачем нужно создавать структуры если можно пользоваться объектами :)
...
Рейтинг: 0 / 0
18.06.2005, 01:04
    #33122950
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ЗоринАндрейУгу. Был у нас когда то давно такой умелец. Для передачи параметров использовал структурку типа string1, string2, string3,... , datetime1, datetime2, datetime3,...
А вот это действительно ужасный код :) Теперь сравни его с моим. Увидишь разницу.
...
Рейтинг: 0 / 0
18.06.2005, 01:39
    #33122961
rcryo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
продолжаем разговор
авторВ итоге помимо того, что у нас кода на клиенте нет,какой опять код на клиенте, у вас вообще нет кода на клиенте или если вы его не привели, то его и нет.
автор мы не тратим время на сбор строки в клиенте и ее разбор на сервере,согласен, но против этого мы имеем: заполнение DW (на клиенте), формирование PB SQL запроса, обращение к серверу БД, разбор запроса сервером и добавление записей в таблицу с индексом, и, чуть не забыл, перед этим удаление старых записей от предыдущего запроса (т.е два обращения к серверу)
автор мы имеем проиндексированную времянку, что учитывается при выполнении запросов оптимизатором. как специалист по оптимизации запросов и использованию индексов, разъясните пожалуйста, какой будет выигрыш от использования индекса на таблице с 1-20 записями(в моем случае) (не считая затрат на поддержку индекса при вставке и удалении записей)?
авторВаша же ХП будет всегда идти через scan ее записей с другими в запросе.не понял. будет scan результата разбора строки или scan всех таблиц при соединении с этим результатом? Привожу план запроса в файле.

По поводу характера дискуссии. Часто наблюдаю, что вместо того чтобы привести свое решение, надо сначала обос*ать чужое, неважно какое это решение, не мое - поэтому фигня, аргументы приходится клещами вытаскивать. ничего не имею против ни хп, ни времянок с индексами, кода на сервере и ваше решение мне тоже нравится, но нелюблю безапеляционные выпады. или это на всех форумах так принято, или вы весь в пылу борьбы за размещение кода в СУБД, что вообще происходит?
...
Рейтинг: 0 / 0
19.06.2005, 11:28
    #33123441
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
ЗоринАндрейУгу. Был у нас когда то давно такой умелец. Для передачи параметров использовал структурку типа string1, string2, string3,... , datetime1, datetime2, datetime3,...
и как-то опечатался - типа засунул в datetime5 а вытаскивал из datetime6.
и коллеги все время бегали спрашивать - а что за херня такая str_1.string3 и кто ее туда положил?
зато гордился - вот там у вас каких-то объектов до фига - а я обошелся одной структурой!
к счастью вовремя спохватились и выгребли это дерьмо из приложения.
А что такого плохого в одной структуре? Вот я использую одну структуру. Содержит переменные описывающие период, массивы с названиями, соответствующими аналитикам учета и несколько переменных, через которых передается режим работы. Хватает практически на все случаи жизни. А называя переменные типа RemoveOrganizationsOlderThanOneMonth через два года все равно, когда она встретится полезешь смотреть дальше в код - а что это такое по данному режиму делается?
...
Рейтинг: 0 / 0
19.06.2005, 21:44
    #33123725
Oleg1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аррей больше трёхсот
EndymionНасколько мне известно, то передать просто через параметр numeric-array в размере больше трехсот в dw нельзя.

Откуда известно? В доках не встречал, впрочем, может быть...

EndymionКак вы решаете для себя эту проблему ?
2) Разбить аррай на арреи по 300 мест и сделать ретрив
Есть какие нибудь нестандарные решения ?
Здесь применение нестандартных решений не нужно. Выборку делаем пачками по 100 значений. Размер пачки был определен наблюдением за планом запроса на SAW5. На больших значениях оптимизатор клал на индексы и шел "секвенсом". Впрочем, в некоторых случаях это значение делается еще меньше, опять же исходя из поведения оптимизатора.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Аррей больше трёхсот / 25 сообщений из 25, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]