Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Как использовать UNION в Табличном поле? (число прочтений - 2728 )
Лунтик
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 11. Июля 2010
Как использовать UNION в Табличном поле?
21. Июля 2010 :: 11:13
Печать  
В качестве поставщика данных для табличного поля используется ПоставщикДанныхODBC.VFP.  Можно ли использовать UNION  в тексте запроса?

Что вообще нужно сделать, чтобы в табличном поле в реальном времени видеть консолидацию двух файлов (DBF)

Это попытка переформулировать вопрос, обсуждаемый в теме

http://www.1cpp.ru/forum/YaBB.pl?num=1279472443
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как использовать UNION в Табличном поле?
Ответ #1 - 21. Июля 2010 :: 11:18
Печать  
Я тебе давал совет в той же теме.
+ http://www.1cpp.ru/forum/YaBB.pl?num=1279576893 . Каждый день по новой теме?
  
Наверх
 
IP записан
 
Лунтик
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 11. Июля 2010
Re: Как использовать UNION в Табличном поле?
Ответ #2 - 22. Июля 2010 :: 09:12
Печать  
Может и ответил, только ответ меня не удовлетворил.
Что значит "врядли получится..."

Мудрецы говорят, что правильно сформулированный вопрос - это уже половина решения. Может если сформулирую подругому - кто-то ответит внятно... Что делать-то?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как использовать UNION в Табличном поле?
Ответ #3 - 22. Июля 2010 :: 10:39
Печать  
Отвечаю внятно.
Во-первых,
Такой запрос для ТП - есть нехороший запрос. Суть работы ТП знаешь? если нет, то могу примерно объяснить.
Ты делаешь запрос:
Код
Выбрать все
SELECT
 Код, Наименование
FROM (
  SELECT Код, Наименование FROM Таблица1
  UNION ALL
  SELECT Код, Наименование FROM Таблица2
) as ВсеТаблицы 


Табличное поле отображает данные "порциями", т.е. фактически добавляется TOP 10 и на экран выводятся эти 10 записей. Т.е. будет выполнятся запрос
Код
Выбрать все
SELECT TOP 10
 Код, Наименование
FROM (
  SELECT Код, Наименование FROM Таблица1
  UNION ALL
  SELECT Код, Наименование FROM Таблица2
) as ВсеТаблицы 


Аналогично со следующими порциями данных (доп. условие во внимание не берем, т.к. в данном случае не принципиально)
Теперь вопрос. Будет ли какой-нибудь выигрыш?

Во-вторых,
Этим поставщиком данных вообще не рекомендую пользоваться (это же касается и прямых запросов под DBF на ODBC).
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как использовать UNION в Табличном поле?
Ответ #4 - 22. Июля 2010 :: 11:53
Печать  
JohnyDeath писал(а) 22. Июля 2010 :: 10:39:
Во-вторых,
Этим поставщиком данных вообще не рекомендую пользоваться (это же касается и прямых запросов под DBF на ODBC).

Подтверждаю - ОДБЦ на ДБФ не живет Печаль
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Лунтик
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 11. Июля 2010
Re: Как использовать UNION в Табличном поле?
Ответ #5 - 22. Июля 2010 :: 14:07
Печать  
Мне казалось, что раз он ПОСТАВЩИК, он должен где-то в тайничке собрать результаты запроса и потом просто отлеживать изменения. Вы хотите сказать, что каждый раз при обновлении будут подниматься обе таблицы, для того, чтобы решить что должно попасть в Top 10? Все остальные поставщики тоже так работают?

Неужели нет никаких даже искусственных способов видеть все в динамике (например, View из Foxpro, зеркальная таблица и поставщик SQLite, что-нубудь из ADO)?
Неужели все сливают иформацю в ТЗ и смотрят на нее?

То, что ОДБЦ не живет на ДБФ, это правда. Так может где-то есть ПоставщикДанныхOLE.VFP? А что с классом ПоставщикДанных, он тоже не умеет выборку как надо?



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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Как использовать UNION в Табличном поле?
Ответ #6 - 22. Июля 2010 :: 14:10
Печать  
У тебя в дбф нет таких больших табличек, чтоб тормоза были бы, от запроса, выгрузки его в ТЗ и в качестве поставщика его в ТП..
+ выполнение запроса через пару сек..
  
Наверх
 
IP записан
 
Лунтик
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 11. Июля 2010
Re: Как использовать UNION в Табличном поле?
Ответ #7 - 23. Июля 2010 :: 05:56
Печать  
Уговорили, пусть будет ТЗ

во-первых, может и не такие уж тормоза будут (только обновлять через пару сек... это уж слишком. Надо будет искать другое решение)

во-вторых, в ТЗ преобразование к типу делается при каждом проходе через строку (SELECT Спр.ID [ID :Справочник.Номенклатура] .. будет показывать каждый раз подправленное кем-то наименование - для некоторых задач очень нужно)

А насчет TOP 10 (JohnyDeath, не обижайся - я не в твоих словах сомневаюсь, а в своих догадках), мне кажется что таблица каждый раз не считывается. Осмелюсь предположить, что внутри у Поставщика есть что-то типа курсора по локальному тайничку, может быть даже слепок индекса на момент обновления (при попадании в индекс).
Хотя какая теперь разница мне, раз Постащики не видят несколько таблиц разом.

Правда, что Select блокирует работу других пользователей (в 1С)?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как использовать UNION в Табличном поле?
Ответ #8 - 23. Июля 2010 :: 09:56
Печать  
Цитата:
А что с классом ПоставщикДанных, он тоже не умеет выборку как надо?


Объясню "на пальцах".
Для начала про поставщика данных для табличного поля.
Кратко работа его выглядит так:
1. Ты указываешь запрос
2. Ты указываешь ключ (совокупность полей)
Поставщик разбирает запрос (+ выполняет ряд преобразований). Но никакого "тайничка" как ты пишешь не делает. Просто напросто подготавливает данные для себя.
Далее ты устанавливаешь поставщика в ТП. И он по запросу от ТП читает первые n-строк, ну или последние, в зависимости от признака в ТП. Но в том и в другом случае происходит запрос к базе данных который практически идентичен оригинальному (твоему) только вот написан с указаниаем "top k" где k - это количество равное n отображаемых строк + немного сверху (чтобы было на всякий пожарный). А в конце запроса указвается порядок сортировки согласно уставленном ключу (asc или desc).
Для получения 2-й и далее "страницы" данных происходит выборка с указанием "top k", сортировкой согласно ключу, но при этом добавляется секция where (кроме той что ты сам в запросе написал), и в этой секции указывается условие на > по установленному ключу.
Как иллюстрация: вот запрос: "select row_id from sc13", ключ "id".
Так вот:
- первая страница "select top 20 row_id from sc13 order by id asc"
- вторая страница "select top 20 row_id from sc13 where id > '     9   ' order by id asc"
- третья страница "select top 20 row_id from sc13 where id > '    18   ' order by id asc"
и т.д.

Как видишь тут нет никакого "тайничка" и сканирования индекса и что ты там еще написал (открыл бы профайлер в SQL и все сам бы увидел). Просто идет ограниченная выборка, и оптимизация в том что читаются данные ровно те которые нужны для отображения, а не те которые есть. И естественно предполагается что ты не будешь указывать поля которые не покрыты тем или иным индексом, иначе тут не оптимизация, а какая то вредоностность уже будет.

А теперь в приложении к твоему запросу получается чтобы получить top 20 по упорядоченной выборке, SQL надо считать обе таблицы, и упорядочив их взять первые 20 штук. Где тут оптимизация то? Только в том что ты в результат ТП получается 20 штук, а не "120". Дык выгрузи в ТЗ ее в качестве поставщика для ТП поставь и будет счастье.

Что же касается класса "ПоставщикДанных" он является всего лишь надстройкой над реальными поставщиками данных для ТП и самостоятельно никакой другой логики не реализует. Его задача (класса) работа с метаданными, составление запросов, фильтрация, отборы, поиски, редактирование и пр. обработка действий пользователя и программы. А работает он либо на ODBC , либо на SQLite (dbf), либо на ИТЗ - поставщиках данных.

Ну и напоследок. "Как надо" в твоем случае это как раз то как не надо в принципе.  Подмигивание
  

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


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Как использовать UNION в Табличном поле?
Ответ #9 - 23. Июля 2010 :: 10:03
Печать  
Лунтик писал(а) 23. Июля 2010 :: 05:56:
Правда, что Select блокирует работу других пользователей (в 1С)?

Не правда. Ну если только ты еще что-то кроме select-а туда не написал.

И это, прекращай издеваться своими "ядовитыми" цветами. Уважай право других не напрягать свое зрение и руки для того чтобы увидеть то что ты пишешь. Если конечно хочешь чтобы тебе отвечали на вопросы.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Лунтик
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 11. Июля 2010
Re: Как использовать UNION в Табличном поле?
Ответ #10 - 23. Июля 2010 :: 19:08
Печать  
vandalsvq, у тебя такие понятные пальцы. Внятно объяснил, даже не знаю чтоб еще спросить. СПАСИБО.

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