Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос к разным видам документов (число прочтений - 7009 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Запрос к разным видам документов
09. Декабря 2010 :: 15:56
Печать  
Задача. Отобрать конкретные виды документов для пользователя с ограничениями по произвольным реквизитам. причем не факт, что документы будут принадлежать одному журналу.

База DBF, используется 1SQLite.

Решение.
На форме обработки Табличное поле, поставщик данных SQLiteDataProvider.

Запрос постащику собирается через UNION

Все работает, однако очень медленно. Особенно это проявляется при листании табличного поля, когда поставщик пытается получить следующую порцию данных.

Есть ли способ ускорить выборку документов при подобной задаче?

  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #1 - 09. Декабря 2010 :: 16:24
Печать  
Попобровать использовать Поставщик данных. А вот по реквизитам тут смотреть надо.
Если есть графы отбора или общие реквизиты с отбором то без проблем. А вот если нет - то делать все таки разные журналы.
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #2 - 09. Декабря 2010 :: 19:50
Печать  
Принадлежность к одному журналу на самом деле в 7.7 ничего не значит. Потому что никаких отдельных таблиц кроме общей JOURN нет.
Через UNION строить запросы (если честно) бессмысленно и беспощадно. Эффективнее построить запрос к JOURN с соединением с таблицами документов. ПоставщикДанных насколько я помню достаточно эффективен. В принципе наличие журнала в метаданных нужно только для того чтобы пользователь класса не описывал все реквизиты которые необходимо отображать.
В твоем случае есть вариант создать журнал например с одним видом документа который либо вероятнее всего будет отображаться, либо там меньше всего документов. Первый способ эффективен, второй эффектен  Смех.
Далее просто по необходимости добавлять соединения данных + добавлять колонки данных.

Итого: добавляем журнал по виду документа который либо точно будет, либо их очень мало. По просьбе пользователя добавляем ровно столько соединений данных сколько видов документов надо выводить, соответственно столько колонок сколько реквизитов хочется видеть. Не советовал бы выводить их очень много. Соответственно при отключении колонок удалять их, при удалении вида документа, убирать и соединение.
Насколько это будет быстро... да почти так же как работает сам класс "ПоставщикДанных". Если он работает "сносно/хорошо/отлично" то станет "пойдет/сносно/хорошо", а может быть и "великолепно"  Смех. Если же не работает, то пишем мне "твоя идея фуфло, ты плохой втюхиватель" и кидаем какашками  Круглые глаза
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #3 - 09. Декабря 2010 :: 20:08
Печать  
vandalsvq писал(а) 09. Декабря 2010 :: 19:50:
Принадлежность к одному журналу на самом деле в 7.7 ничего не значит. Потому что никаких отдельных таблиц кроме общей JOURN нет.

зато есть специальный индекс
  

1&&2&&3
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #4 - 09. Декабря 2010 :: 23:52
Печать  
trad писал(а) 09. Декабря 2010 :: 20:08:
зато есть специальный индекс

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

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Через UNION
Ответ #5 - 10. Декабря 2010 :: 02:07
Печать  
vandalsvq писал(а) 09. Декабря 2010 :: 19:50:
Через UNION строить запросы (если честно) бессмысленно и беспощадно.

Не согласен. Все зависит от ситуации... У меня таких запросов хватает, хоть их и небольшой процент, но иначе в тех ситуациях просто нельзя...
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос к разным видам документов
Ответ #6 - 10. Декабря 2010 :: 06:33
Печать  
trad писал(а) 09. Декабря 2010 :: 20:08:
vandalsvq писал(а) 09. Декабря 2010 :: 19:50:
Принадлежность к одному журналу на самом деле в 7.7 ничего не значит. Потому что никаких отдельных таблиц кроме общей JOURN нет.

зато есть специальный индекс


А что это за индекс и как его использовать?
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос к разным видам документов
Ответ #7 - 10. Декабря 2010 :: 06:41
Печать  
vandalsvq писал(а) 09. Декабря 2010 :: 19:50:
Принадлежность к одному журналу на самом деле в 7.7 ничего не значит. Потому что никаких отдельных таблиц кроме общей JOURN нет.
Через UNION строить запросы (если честно) бессмысленно и беспощадно. Эффективнее построить запрос к JOURN с соединением с таблицами документов. ПоставщикДанных насколько я помню достаточно эффективен. В принципе наличие журнала в метаданных нужно только для того чтобы пользователь класса не описывал все реквизиты которые необходимо отображать.
В твоем случае есть вариант создать журнал например с одним видом документа который либо вероятнее всего будет отображаться, либо там меньше всего документов. Первый способ эффективен, второй эффектен  Смех.
Далее просто по необходимости добавлять соединения данных + добавлять колонки данных.

Итого: добавляем журнал по виду документа который либо точно будет, либо их очень мало. По просьбе пользователя добавляем ровно столько соединений данных сколько видов документов надо выводить, соответственно столько колонок сколько реквизитов хочется видеть. Не советовал бы выводить их очень много. Соответственно при отключении колонок удалять их, при удалении вида документа, убирать и соединение.
Насколько это будет быстро... да почти так же как работает сам класс "ПоставщикДанных". Если он работает "сносно/хорошо/отлично" то станет "пойдет/сносно/хорошо", а может быть и "великолепно"  Смех. Если же не работает, то пишем мне "твоя идея фуфло, ты плохой втюхиватель" и кидаем какашками  Круглые глаза


Речь идет не о классе ПоставщикДанных. Посмотрел и его. Да с журналами он работает достаточно эффктивно. Но как применить его в моем случае не представляю.

К моей задаче. Виды документов и реквизиты по которым пользователь может работать с данными видами документов указываются в настройках полномочий пользователь.  С доступом к документам по этим настройкам все в порядке (Запись, просмотр и пр..). Так вот и хотелось бы, чтобы пользователь еще мог и видеть тольео эти документы.

Например: Документ ПКО, пользовательвидит и работает только с Фирма1, Фирма2 и Касса1, а вот по Фирма1, Фирма2, Касса2 - нет.

Да, конфигурация ТИС. Фирма - общий реквизит, Касса нет.

Так, что не представляю как тут помогут джойны, а юнионы - медленно. Что делать? Забить, или все же есть выход?








  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #8 - 10. Декабря 2010 :: 06:56
Печать  
Kondarat писал(а) 10. Декабря 2010 :: 06:41:
vandalsvq писал(а) 09. Декабря 2010 :: 19:50:
Принадлежность к одному журналу на самом деле в 7.7 ничего не значит. Потому что никаких отдельных таблиц кроме общей JOURN нет.
Через UNION строить запросы (если честно) бессмысленно и беспощадно. Эффективнее построить запрос к JOURN с соединением с таблицами документов. ПоставщикДанных насколько я помню достаточно эффективен. В принципе наличие журнала в метаданных нужно только для того чтобы пользователь класса не описывал все реквизиты которые необходимо отображать.
В твоем случае есть вариант создать журнал например с одним видом документа который либо вероятнее всего будет отображаться, либо там меньше всего документов. Первый способ эффективен, второй эффектен  Смех.
Далее просто по необходимости добавлять соединения данных + добавлять колонки данных.

Итого: добавляем журнал по виду документа который либо точно будет, либо их очень мало. По просьбе пользователя добавляем ровно столько соединений данных сколько видов документов надо выводить, соответственно столько колонок сколько реквизитов хочется видеть. Не советовал бы выводить их очень много. Соответственно при отключении колонок удалять их, при удалении вида документа, убирать и соединение.
Насколько это будет быстро... да почти так же как работает сам класс "ПоставщикДанных". Если он работает "сносно/хорошо/отлично" то станет "пойдет/сносно/хорошо", а может быть и "великолепно"  Смех. Если же не работает, то пишем мне "твоя идея фуфло, ты плохой втюхиватель" и кидаем какашками  Круглые глаза


Речь идет не о классе ПоставщикДанных. Посмотрел и его. Да с журналами он работает достаточно эффктивно. Но как применить его в моем случае не представляю.

К моей задаче. Виды документов и реквизиты по которым пользователь может работать с данными видами документов указываются в настройках полномочий пользователь.  С доступом к документам по этим настройкам все в порядке (Запись, просмотр и пр..). Так вот и хотелось бы, чтобы пользователь еще мог и видеть тольео эти документы.

Например: Документ ПКО, пользовательвидит и работает только с Фирма1, Фирма2 и Касса1, а вот по Фирма1, Фирма2, Касса2 - нет.

Да, конфигурация ТИС. Фирма - общий реквизит, Касса нет.

Так, что не представляю как тут помогут джойны, а юнионы - медленно. Что делать? Забить, или все же есть выход?

Журнал доукментов общий убрать совсем.
С каждым журналом разбираться отдельно и по скорости и по правам доступа.
Журнал ПКО
добавить условие
и существует( Фирма в таблицаХорошихФирм )
и существует (Касса в таблицаХорошихКасс )

таблицаХорошихФирм таблица хороших фирм для каждого пользователя своя или в ней есть id пользователя
таблицаХорошихКасс аналогично

если в таблицаХорошихКасс для конкретного пользователя один элемент то существует можно заменить на inner join к таблицаХорошихКасс.  ( таблицаХорошихФирм аналогично)
  
Наверх
 
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #9 - 10. Декабря 2010 :: 07:12
Печать  
Ну и соответственно таблицы Хороших как видимо с индексами Подмигивание
То есть либо справочники с признаком сортировки по реквизиту либо свои таблицы.
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #10 - 10. Декабря 2010 :: 07:29
Печать  
leshik писал(а) 10. Декабря 2010 :: 07:12:
Ну и соответственно таблицы Хороших как видимо с индексами Подмигивание
То есть либо справочники с признаком сортировки по реквизиту либо свои таблицы.

Ну да это как бы подрузомевалось( про индексы ).
Я бы делал своими таблицами не обращаясь к справочникам 1с

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

  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #11 - 10. Декабря 2010 :: 16:13
Печать  
Kondarat писал(а) 10. Декабря 2010 :: 06:41:
Речь идет не о классе ПоставщикДанных. Посмотрел и его. Да с журналами он работает достаточно эффктивно. Но как применить его в моем случае не представляю.

К моей задаче. Виды документов и реквизиты по которым пользователь может работать с данными видами документов указываются в настройках полномочий пользователь.  С доступом к документам по этим настройкам все в порядке (Запись, просмотр и пр..). Так вот и хотелось бы, чтобы пользователь еще мог и видеть тольео эти документы.

Например: Документ ПКО, пользовательвидит и работает только с Фирма1, Фирма2 и Касса1, а вот по Фирма1, Фирма2, Касса2 - нет.

Да, конфигурация ТИС. Фирма - общий реквизит, Касса нет.

Так, что не представляю как тут помогут джойны, а юнионы - медленно. Что делать? Забить, или все же есть выход?


Если все условия строятся по "И" тогда никаких проблем, если есть "ИЛИ/И" в разных комбинациях тогда видимо не подойдет.
А то что ты не представляешь как это сделать, что ж, видимо плохо читал. Жаль что я счас не обладаю ни времением, ни возможностями, как скажем 3-4 месяца назад, я бы вникся подробнее и попробовал помочь решить.
Извините что влез.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос к разным видам документов
Ответ #12 - 12. Декабря 2010 :: 21:42
Печать  
Никаких union'ов в не должно быть !
Запрос должен быть прост, как три рубля, типа такого
Код
Выбрать все
select
...
from [Журнал] Ж
left join [Документ.Первый] Д1 on (Ж.iddoc=Д1.iddoc and Ж.iddocdef=:ВидДокумента.Первый)
left join [Документ.Второй] Д2 on (Ж.iddoc=Д2.iddoc and Ж.iddocdef=:ВидДокумента.Второй)
left join [Документ.Третий] Д3 on (Ж.iddoc=Д3.iddoc and Ж.iddocdef=:ВидДокумента.Третий)

where Ж.iddocdef in (:ВидДокумента.Первый, :ВидДокумента.Второй, :ВидДокумента.Третий)
and (
case Ж.iddocdef
when :ВидДокумента.Первый then Д1.Фирма = выбФирма
when :ВидДокумента.Втрой then Д2.Клиент = выбКлиент
when :ВидДокумента.Третий then Д1.Поставщик = выбПоставщик
end
) = 1
 



Ну и естественно, ключ порядка idx_date_time_iddoc
« Последняя редакция: 13. Декабря 2010 :: 06:02 - orefkov »  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос к разным видам документов
Ответ #13 - 13. Декабря 2010 :: 06:12
Печать  
Хотя из джойнов условие по iddocdef лучше убрать, для sqlite это только лишние вычисления будут.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Запрос к разным видам документов
Ответ #14 - 13. Декабря 2010 :: 06:46
Печать  
А разве не проще будет сделать так:
Код
Выбрать все
select
...
from [Журнал] Ж
left join [Документ.Первый] Д on Ж.iddoc=Д.iddoc
where Ж.iddocdef in (:ВидДокумента.Первый, :ВидДокумента.Второй, :ВидДокумента.Третий)
and (
case Ж.iddocdef
when :ВидДокумента.Первый then Д.Фирма = выбФирма
when :ВидДокумента.Втрой then Д.Клиент = выбКлиент
when :ВидДокумента.Третий then Д.Поставщик = выбПоставщик
end
) = 1
 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать