Тема: Динамические выборки TDMSApplication.CreateQuery

Есть пара вопросов по работе с выборками создаваемыми с помощью TDMSApplication.CreateQuery.

1. У такой выборки есть свойство Sheet, но в нем всегда 0 колонок. Можно ли сделать так, чтобы он заполнялся как при выполнении обычной выборки?

2. Как использовать условие tdmQueryConditionParent в AddCondition. У меня его добавление никак не влияет на результат, поиск все равно идет по всем объектам в базе.

Re: Динамические выборки TDMSApplication.CreateQuery

1. Чтобы инициировать Sheet для динамической выборки к условиям которые нужно вывести в Sheet необходимо добавить tdmQueryConditionVisible
Например: nQuery.AddCondition tdmQueryConditionAttribute + tdmQueryConditionVisible, attrValue, "ATTR_DEFNAME"
2. К сожалению условия входит в состав и имеет в составе для третьей версии не работают. Это наследие двойки =(

Re: Динамические выборки TDMSApplication.CreateQuery

Списибо.

Вот только tdmQueryConditionVisible включает вывод ВСЕХ колонок сразу даже если приплюсовать его только к условию одной колонки, т.е. выбрать колонки для отображения нельзя - всё или ничего.

А вообще как-то можно сделать выборку только по составу одного объекта (из скрипта я имею в виду)?

(изменено: Edhunter, 16 февраля 2009г. 12:01:02)

Re: Динамические выборки TDMSApplication.CreateQuery

По поводу включения всех колонок при одном tdmQueryConditionVisible - это известная и уже поправленная ошибка. У вас всё ещё 146 стоит ?
При помощи условий в динамической выборке никак к сожалению =(
Как вариант (но очень кривой и медленный) самому обрабатывать аплинки и удалять лишние записи.
Второй вариант (не менее кривой =( ) продублировать связи состава ссылками на объекты и уже их использовать в выборке.
Подумаем ещё, может найдётся вариант получше

Re: Динамические выборки TDMSApplication.CreateQuery

В данный момент вопрос возник в связи с попыткой сделать сортировку(упорядочивание) состава при добавлении в него нового объекта, поэтому ни одно из двух предложений не прокатит... Перебирать объекты скриптом неприемлемо долго, атрибуты со ссылками работают только для случая одного родителя. Вообще без выборки упорядочить тоже невозможно, т.к. даже просто зачитать в массив(для сортировки) нужные атрибуты 300 объектов из состава занимает 5-10 сек., а для сортировки "не лету" это явно перебор.

Получается, что возможность сортировки состава в событии ContentAdd для упорядоченного отображения в дереве  - миф?

(изменено: Slava.Coder.Vrn, 17 февраля 2009г. 15:20:37)

Re: Динамические выборки TDMSApplication.CreateQuery

А можно в студию кусок кода, сортирующий перебором?
Если предположить, что состав уже упорядочен, то код будет очень простой и не очень тормозной.

Re: Динамические выборки TDMSApplication.CreateQuery

Можно же использовать и не динамические выборки с примерно таким вот кодом в общесистемном скрипте

'____________________________________________________________________________
_________________________
' Сортировка состава по имени
Sub Object_ContentAdded(Obj, AddCollection)
  Set tQuery = ThisApplication.Queries("QUERY_CONTENT_SORT")
  tQuery.Parameter("ObjParent") = Obj.GUID
  tQuery.Permissions = SysAdminPermissions
  For Each addObj In AddCollection
    tQuery.Parameter("ObjDef") = addObj.ObjectDefName
    i = 0
    For Each tObj In tQuery.Objects
      Obj.Objects(tObj).SortValue = i
      i = i + 1
    Next
  Next
End Sub
'____________________________________________________________________________
_________________________

Единственная проблема с невидимыми объектами. Их нельзя получить через коллецию родителей, т.е. строчка Obj.Objects(tObj) для невидимого объекта генерит ошибку

Re: Динамические выборки TDMSApplication.CreateQuery

Slava.Coder.Vrn пишет:

А можно в студию кусок кода, сортирующий перебором?
Если предположить, что состав уже упорядочен, то код будет очень простой и не очень тормозной.

Тормозит не сама сортировка, а получение атрибутов из объектов состава, для того, чтобы их сравнивать. А в моем случае вообще нужна сортировка по атрибутам связанного объекта, на который переходим по атрибуту-ссылке первого объекта.

А сортировка уже вытащенного таким образом массива значений дело, понятно, относительно быстрое...

Re: Динамические выборки TDMSApplication.CreateQuery

Edhunter пишет:

...
Единственная проблема с невидимыми объектами. Их нельзя получить через коллецию родителей, т.е. строчка Obj.Objects(tObj) для невидимого объекта генерит ошибку

Действительно, я не подумал об этой проблеме... тогда все отменяется, ибо добавивший в состав новый объект пользователь вполне может не иметь прав на видимость других объектов состава и никакие SysadminPermissions не помогут осуществить сортировку вообще... точнее отсортируется только то, что может видеть данный пользователь, а это совсем не то что нужно...

А как в этой выборке использовать параматр "ObjParent"? Пытался поставить его как условие в колонке "Идентификатор" но ничего не получилось.

Есть еще вопрос, уже не совсем по теме. Меня всегда смущало подобное использование глобальных выборок:

Set tQuery = ThisApplication.Queries("QUERY_CONTENT_SORT")
tQuery.Parameter("ObjParent") = Obj.GUID

(Это кстати не работает без присваивания SysadminPermisisons ПЕРЕД изменением параметров), а главное - это ведь изменение глобального параметра глобальной выборки, где гарантия что это корректно будет работать в многопользовательской среде?

Re: Динамические выборки TDMSApplication.CreateQuery

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