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

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

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

,,,,

Есть какие нибудь нестандарные решения ?
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #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
Аррей больше трёхсот
    #33121123
Endymion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Откуда известно на счёт 300 ? Я работаю с сайбес и он точно не поддерживает .

Значит всё таки второй вариант ?
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33121245
Estets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может быть все таки изменить логику? Более 300 аргументов для запроса это на мой взгляд не самое удачное решение. За 8 лет работы с PB мне ни разу не потребовалось передать массив в качестве аргумента запроса.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33121327
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне недавно протребовалось:
есть список изделий выбираемый из БД с помощью ХП
список изделий связан с классификатором как многие ко многим
пользователь может выбрать в виде условия отбора изделий неограниченное количество записей из классификатора.
Мое решение:
формируется строка в виде списка ID (через запятую) выбранных записей классификатора и передается как параметр в ХП. ХП превращает строку в рекордсет и присоединяет к списку изделий.
Процедура превращения списка в рекордест есть на codexchange для ASA
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33121442
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoа мне недавно протребовалось:
есть список изделий выбираемый из БД с помощью ХП
список изделий связан с классификатором как многие ко многим
пользователь может выбрать в виде условия отбора изделий неограниченное количество записей из классификатора.
Мое решение:
формируется строка в виде списка ID (через запятую) выбранных записей классификатора и передается как параметр в ХП. ХП превращает строку в рекордсет и присоединяет к списку изделий.
Процедура превращения списка в рекордест есть на codexchange для ASA
Я бы для ASA сделал глобальную временную таблицу (а начиная с 9.0.2.3131 может даже сессионную локальную времянку, которая создавалась бы при входе в режим и дропалась при выходе). В нее писал все то, что пометил пользователь (через тот же DW с CheckBox, в котором выводится весь список товаров и можно пометить нужные), а потом просто в запросах использовал обычный INNER JOIN к этой таблице. Дешево, красиво, удобно, никакого кода в клиенте и никаких IN :)
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33121679
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автордаже сессионную локальную времянку, которая создавалась бы при входе в режим и дропалась при выходепо сути у меня и создается локальная времянка, только в момент запроса в скрипте ХП
как я вас понял вы предлагаете в момент запроса создать временную таблицу (из клиента?) затем заполнить её данными из DW (код клиента?) а потом сделать запрос данных с объединением таблиц. Мне показалось что с этим больше возни и это не согласуется с этим автор никакого кода в клиентевариант с глобальной таблицей тоже показался не очень, так как клиент может открыть несколько одинаковых форм с запросом (у меня это можно) тогда надо передавать еще какой-нибудь ID запроса, и если есть другие подобные запросы для каждого вида запроса своя глобальная таблица, или в таблице учитывать тип запроса, вобщем морока.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122433
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имея ввиду "никакого кода в клиенте" я имею ввиду "никакого кода бизнес-логики" в клиенте. Раз у Вас может открываться более одной формы данного режима одновременно, то делаем глобальную временную таблицу с доп. полем WindowHandle и везде работаем по фильтру в разрезе Handle окна. По моему надежней и как раз менее гемморней, чем пытаться PB генерить сотни параметров в IN, а потом использовать динамический SQL или вызывать UDF для разбора переданной строки и заполнению их в таблицу.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122567
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoвариант с глобальной таблицей тоже показался не очень, так как клиент может открыть несколько одинаковых форм с запросом (у меня это можно) тогда надо передавать еще какой-нибудь ID запроса, и если есть другие подобные запросы для каждого вида запроса своя глобальная таблица, или в таблице учитывать тип запроса, вобщем морока.
Я обошелся всего одной глобальной времянкой. Таблица определена с несколькими полями разных типов (char (20), integer, datetime) и в зависимости от задачи заполняются соответствующие поля. А ХП уже сама знает какое поле читать.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122609
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас ВСЕ поисковые экраны делают динамический WHERE clause с IN - НИКАКИХ временных таблиц, SPs и т.п. безобразия :-)
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122612
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EndymionОткуда известно на счёт 300 ? Я работаю с сайбес и он точно не поддерживает
То бишь семантически, фраза "передать просто через параметр numeric-array в размере больше трехсот в dw нельзя" - бессмысленна? :-)
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #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
Аррей больше трёхсот
    #33122685
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппУ нас ВСЕ поисковые экраны делают динамический WHERE clause с IN - НИКАКИХ временных таблиц, SPs и т.п. безобразия :-)Остается порадоваться за вас.
База какая? И что ни разу не сталкивались с ограничениями на количество элементов в IN(...) ? И что ни разу не сталкивались с ограничением на размер SQL оператора? Нет? Ну значит повезло.
А мы знаете вот как то не привыкли на удачу рассчитывать.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122690
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЯ обошелся всего одной глобальной времянкой. Таблица определена с несколькими полями разных типов (char (20), integer, datetime) и в зависимости от задачи заполняются соответствующие поля. А ХП уже сама знает какое поле читать.
УЖОСНАХ!!!
Нет печальнее картины чем человечек на суппорте, который в чужом коде тупо пялится на обращения к загадочным column1 varchar(255) и column2 datetime в некой загадочной глобальной времянке.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #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
Аррей больше трёхсот
    #33122764
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryo
Вместо всего кода можно просто раз сделать глобальную временную таблицу в БД, заполнять ее через тот же DW и пользоваться в SELECT-ах, как предустановленным пользователем фильтром. В итоге помимо того, что у нас кода на клиенте нет, мы не тратим время на сбор строки в клиенте и ее разбор на сервере, мы имеем проиндексированную времянку, что учитывается при выполнении запросов оптимизатором. Ваша же ХП будет всегда идти через scan ее записей с другими в запросе.

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

P.S. А вообще раз в качестве сервера используется ASA 9, давайте и рекомендовать с точки зрения ASA 9, а не писать, что ХП это бред, времянки плохо и т.д. Для кого то может и плохо. Для ASA я считаю просто прекрасно.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122783
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUS
Филипп
Какая у Вас интересная система на Оракле - запросы и изменения таблиц прямо с клиентского приложения, логика там же. Наверное весело права доступа расписывать и после какого то изменения/доработки структуры БД клиента всего перелопачивать ? :)
Не понял, причём здесь права доступа?
О каких "изменениях таблиц" вы спрашиваете? Об изменениях ДАННЫХ в них - ну тогда естественно прямо с клиентского приложения, а откуда они ещё возьмутся?
И не надо думать, что мы не используем ХП и т.п. - при том что у нас почти 160 пибблов клиентского приложения, я думаю объём PL/SQL кода всё равно превышает объём РВшного кода...
Просто в привидённом мной примере (поисковые экраны), гибкость РВ значительно превышает возможности всяческие попытки предусмотреть юзерские извраты в stored procedure...
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #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
Аррей больше трёхсот
    #33122888
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Угу. Был у нас когда то давно такой умелец. Для передачи параметров использовал структурку типа string1, string2, string3,... , datetime1, datetime2, datetime3,...
и как-то опечатался - типа засунул в datetime5 а вытаскивал из datetime6.
и коллеги все время бегали спрашивать - а что за херня такая str_1.string3 и кто ее туда положил?
зато гордился - вот там у вас каких-то объектов до фига - а я обошелся одной структурой!
к счастью вовремя спохватились и выгребли это дерьмо из приложения.
...
Рейтинг: 0 / 0
Аррей больше трёхсот
    #33122895
Endymion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У нас в фирме дела обстоят так: начальство не любит временные таблицы и storeprocedure. Я конечно попробую уломать начальство, но к сожалению надежды мало, потому как мне кажется что временные таблицы это красивое решение. Пока что я пользуюсь решением, наподобие решения Филлипа (его красивее).

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

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

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

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


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