Переключение на Главную Страницу Страницы: 1 ... 11 12 [13] 14 15 16 ОтправитьПечать
Очень популярная тема (более 25 ответов) Провайдер OLE DB для ТП (число прочтений - 69171 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #180 - 28. Октября 2007 :: 13:21
Печать  
JohnyDeath писал(а) 28. Октября 2007 :: 12:21:
У меня есть несколько непонятных моментов:
Текст запроса:
Код
Выбрать все
SELECT
IDDoc AS [Документ $Документ.ДоговораОСАГО]
,$Док.Застрахованный as [Страхователь $Справочник.Страхователи]
,$Док.Лицо as [Агент $Справочник.Сотрудники]
,$Док.НомерПолиса as НомерПолиса
FROM $Документ.ДоговораОСАГО as Док
WHERE IDDoc IN (%СписокИД%)
order by iddoc 


Поле-ключ= "IDDoc", Тэг индекса = ID (единственный индекс для таблицы документа).
В ТП выводятся нормально, за исключением имён колонок ТП. У меня выводится в лед. порядке: агент, документ, номерПолиса, страхователь. Хотя содержимое этих колонок то, которое я указывал в запросе: документ, страхователь, агент, номерПолиса.
Обязательно ли инструкция ORDER BY ...?
Почему спрашиваю: не ставлю ORDER BY, таймаут обновления = 0. Результат:
Док 9
Док 1
Док 2
...
ставлю таймаут обновления = 1. Результат до первого автообновления такой же как показано выше. После первого автообновления:
Док 9
Док 9
Док 2
...
Да и вообще список ведёт себя странно: при скролинге вверх/вниз вне первой странице - всё пучком. Как только поднимаемся опять вверх до самого начала, ждём автообновление и видим как меняются строки, причём каждый раз по-разному.

Обычно, когда используют ТП, колонками управляют вручную: задают состав и параметры. Там у тебя есть полный контроль над ними. Поэтому, когда ты будешь делать реальное решение с использованием провайдера, с колонками у тебя проблем никаких не будет (потому что в каком порядке укажешь, в таком и выведутся). Поэтому порядок колонок в тестовой обработке сильно тебя напрягать не должен. Хотя, согласен, пока получается не удобно Улыбка Похоже, колонки выводятся по алфавиту.

Таблица документов (dh*.*) не предназначена для отображения в табличных полях. У этой таблицы только упорядочивание по ИД, а, значит, документы будут выводиться, скорее всего, в порядке их ввода, что вряд ли когда-нибудь может быть полезным. Подожди лучше, пока в провайдере не появится возможность использовать фильтры (по журналу, по виду документов, по группе справочника, по общим реквизитам и т.д.)

ORDER BY пока обязателен. Если его не использовать, то могут возникать спецэффекты: дикое упорядочивание, самопроизвольное изменение упорядочивания при автообновлении, дублирование строк в ТП и т.д. А в будущем его, скорее всего, можно будет не использовать - будет достаточно только указать тег индекса.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #181 - 28. Октября 2007 :: 17:38
Печать  
Uzhast
Цитата:
Обычно, когда используют ТП, колонками управляют вручную: задают состав и параметры. Там у тебя есть полный контроль над ними. Поэтому, когда ты будешь делать реальное решение с использованием провайдера, с колонками у тебя проблем никаких не будет (потому что в каком порядке укажешь, в таком и выведутся).

Я думаю, что врядли кто-то, кто использует ТП, переопределяет названия колонок вручную. Т.е. ИМХО лучше один раз определить названия колонок в тексте запроса и больше не париться с настройкой соответствия между номером колонки и её названием.

Ещё вопрос:
Я так понимая, что конструкция вида:
Код
Выбрать все
WHERE _Поле-Ключ_ IN (%СписокИД%) 

обязательна всегда (или это тожк только "пока"?), так почему бы не сделать её невидимой для пользователя этого провайдера. Т.е. чтобы эта строка автоматом добавлялась при выполнении запроса. Поправьте меня, если я не прав или чего-то не понимаю.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #182 - 28. Октября 2007 :: 18:47
Печать  
JohnyDeath писал(а) 28. Октября 2007 :: 17:38:
Я думаю, что врядли кто-то, кто использует ТП, переопределяет названия колонок вручную. Т.е. ИМХО лучше один раз определить названия колонок в тексте запроса и больше не париться с настройкой соответствия между номером колонки и её названием.

Дык, там возвращается результат, где все имена колонок идут со строчной буквы Улыбка Т.е. все равно приходится париться, переопределять. Плюс регулировать ширину (а иногда шрифт и прочие свойства). Плюс отнюдь не все колонки должны быть видимы - например, хорошо не отображать колонку с объектами агрегатного типа, чтобы одинэсина не лазила в БД, чтобы получить для них представление. Но с другой стороны эти колонки должны быть, чтобы программист мог работать с этими самыми агрегатными объектами. Так что получается, гемора с настройкой колонок в ТП и так до хрена. И на этом фоне необходимость вручную управлять составом колонок - проблема вообще мелкая Улыбка Хотя, конечно, переделать все равно надо будет...

JohnyDeath писал(а) 28. Октября 2007 :: 17:38:
Я так понимая, что конструкция вида:
Код
Выбрать все
WHERE _Поле-Ключ_ IN (%СписокИД%) 

обязательна всегда (или это тожк только "пока"?), так почему бы не сделать её невидимой для пользователя этого провайдера. Т.е. чтобы эта строка автоматом добавлялась при выполнении запроса. Поправьте меня, если я не прав или чего-то не понимаю.

Вообще, надо подумать. А вдруг это приведет к уменьшению количества потенциальных запросов, которые можно использовать?... Например, в запросе есть некий LEFT JOIN, который приводит к появлению строк с одинаковыми ИД. Далее в запросе применяется GROUP BY ID с суммированием некоторых полей.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #183 - 28. Октября 2007 :: 19:45
Печать  
По-моему GROUP BY не сильно рекомендуется (а точнее сильно не рекомендуется) в запросах провайдера ТП под ODBC. Тогда может и здесь тоже сделать такое жёсткое ограничение. Или ты хочешь создать вообще что-то уневерсальное и оч. сладкое?  Очень довольный
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #184 - 28. Октября 2007 :: 19:52
Печать  
JohnyDeath писал(а) 28. Октября 2007 :: 19:45:
По-моему GROUP BY не сильно рекомендуется (а точнее сильно не рекомендуется) в запросах провайдера ТП под ODBC. Тогда может и здесь тоже сделать такое жёсткое ограничение. Или ты хочешь создать вообще что-то уневерсальное и оч. сладкое?  Очень довольный

Так ODBC-провайдер по другому принципу сделан. Там, условно говоря, отображение по частям одного большого запроса. Поэтому, если там приделать GROUP BY, то, скорее всего, хрень получится.

А у нас здесь отображение множества мелких запросиков Улыбка Одна страница ТП - один мелкий запросик. Там с GROUP BY все в порядке. Главное, чтобы в результате количество строк соответствовало количеству ИДшников и на каждый ИДшник была соответствующая строка. А в этих рамках можно извращаться ну сколько угодно Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #185 - 29. Октября 2007 :: 08:35
Печать  
spock писал(а) 26. Октября 2007 :: 18:07:
Олег, посмотри advantage провайдер.
У него и с блокировками лучше.

Хм. Чуда не случилось. Похоже, этот провайдер так же тупит с TOP. Такой запрос:
Код
Выбрать все
SELECT TOP 1
 IDDocDef + IDDoc AS [Документ $Документ]
FROM
 [1sjourn]
ORDER BY IDDoc 



выполняется отнюдь не мгновенно - с большим количеством дисковых операций Печаль А xBase оно, похоже, не поддерживает. Значит, изврат с TOP не исправим...
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #186 - 29. Октября 2007 :: 09:07
Печать  
На SQlLite
Код
Выбрать все
Select
СпрНом.*

from Номенклатура  as СпрНом

order by Артикул

LIMIT 1 



выполнился практически мгновенно (0.001 сек) , т.е. был задействован индекс (Артикул+Наименование).
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #187 - 29. Октября 2007 :: 09:09
Печать  
kiruha писал(а) 29. Октября 2007 :: 09:07:
На SQlLite
Код
Выбрать все
Select
СпрНом.*

from Номенклатура  as СпрНом

order by Артикул

LIMIT 1 



выполнился практически мгновенно (0.001 сек) , т.е. был задействован индекс (Артикул+Наименование).

Поздравляю Улыбка

PS. Но, вообще, VFP и Advantage на справочниках тоже довольно быстро работают. Лучше тестить на журналах документов.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #188 - 30. Октября 2007 :: 07:18
Печать  
Uzhast писал(а) 28. Октября 2007 :: 19:52:
JohnyDeath писал(а) 28. Октября 2007 :: 19:45:
По-моему GROUP BY не сильно рекомендуется (а точнее сильно не рекомендуется) в запросах провайдера ТП под ODBC. Тогда может и здесь тоже сделать такое жёсткое ограничение. Или ты хочешь создать вообще что-то уневерсальное и оч. сладкое?  Очень довольный

Так ODBC-провайдер по другому принципу сделан. Там, условно говоря, отображение по частям одного большого запроса. Поэтому, если там приделать GROUP BY, то, скорее всего, хрень получится.

А у нас здесь отображение множества мелких запросиков Улыбка Одна страница ТП - один мелкий запросик. Там с GROUP BY все в порядке. Главное, чтобы в результате количество строк соответствовало количеству ИДшников и на каждый ИДшник была соответствующая строка. А в этих рамках можно извращаться ну сколько угодно Улыбка

Я вот всё равно не пойму как в динамическом провайдере можно использовать GROUP BY.
Допустим есть таблица tbl с колонками "Наименование", "Сумма" следующего содержания:
Шоколадка 100
Пиво      20
Капуста   30
Пиво      40
Шоколодка 15

Допустим у нас ТП отображает всего ТРИ строки. Делаем такой запрос:
Код
Выбрать все
Select Наименование, SUM(Сумма)
 from tbl
GROUP BY Наименование 


Выполняем и видим:
Шоколадка 100
Пиво      20
Капуста   30

опускаемся на одну строку ниже. видим вот это: ?
Пиво      60
Капуста   30
Шоколодка 15

я думаю, что смысл понятен.
Олег, поясни, я правильно понимаю?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #189 - 30. Октября 2007 :: 07:27
Печать  
С GROUP BY извращаться можно, но не до такой степени Улыбка Тут есть рамки: "Главное, чтобы в результате количество строк соответствовало количеству ИДшников и на каждый ИДшник была соответствующая ему строка."

Пример корректного использования GROUP BY. Допустим, у нас есть нечто вроде регистра "Остатки товаров" с измерениями: "Товар", "Статус". "Статус" принимает два значения: "На складе" и "В пути". Есть также ресурс "Количество". Допустим, нужно отобразить справочник "Номенклатура" и по каждой позиции вывести остаток на складе+в пути. Для этого можно использовать примерно такой запрос:
Код
Выбрать все
SELECT
 Товары.ID AS [Товар $Справочник.Номенклатура],
 SUM ($Остатки.Количество) AS Остаток
FROM
 $Справочник.Номенклатура AS Товары
LEFT JOIN $РегистрИтоги.ОстаткиТоваров AS Остатки ON ФильтрПоПериоду AND $Остатки.Товар = Товары.ID
WHERE
 Товары.ID IN (%СписокИД%)
GROUP BY
 Товары.ID
 



Примерно так. Запускать не пробовал. Понятно, что в данном случае можно обойтись джойном с вложенным запросом, но вдруг это можно сделать не всегда?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #190 - 30. Октября 2007 :: 07:35
Печать  
Ясно, спасиб. Короче использовать можно, но осторожно...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #191 - 04. Ноября 2007 :: 03:40
Печать  
Небольшое обновление провайдера:

- Добавлена возможность устанавливать фильтры. Например, по виду документов, по журналу документов, по периоду журнала, по группе справочников.

- Убрана необходимость указывать ORDER BY. Более того, он теперь даже вреден. Ибо его включение никак не влияет на порядок отображения записей, но время на сортировку затрачивается.

- Теперь у нас два ключевых поля: "КлючевоеПолеОпорнойТаблицы" - это ID или IDDoc. И "КлючевоеПолеЗапроса" - это название колонки, которая будет содержать значение, идентифицирующее строку запроса (например "Документ", "Клиент" и т.д.). Оно должно получаться с участием поля ID или IDDoc - чтобы была возможность из ключевого поля получить сырой ID или IDDoc.

- Переделана тестовая обработка: добавлены "наборы настроек". Набор настроек позволяет быстро заполнить поля "Текст запроса", "Опорная таблица", "Тег индекса", фильтры. Наборы настроек бывают следующих видов:

 - "Журнал.Полный" - все документы в системе
 - "Журнал.ВидЖурнала" - документы указанного журнала
 - "Документ.ВидДокумента" - документы данного вида
 - "Справочник.ВидСправочника" - отобразить справочник с отключенной иерархией
 - "Справочник.ВидСправочника - фильтр по группе" - отобразить только те элементы справочника, которые принадлежат выбранной группе.

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

- Изменен файл "QueryRows.prg". Убран цикл перебора полей, что заметно ускорило работу провайдера. Также внесены некоторые упрощения и добавлены фильтры. ВНИМАНИЕ! Если вы уже тестировали провайдер и у вас в базе уже есть "QueryRows.prg", то этот файл не только нужно заменить на новый, но и еще требуется удалить файл "QueryRows.fxp". Это скомпилированный вариант "QueryRows.prg". Фокс будет использовать его, даже если prg-файл был изменен. Если в базе также есть "QueryRows.err", то его тоже желательно удалить.

- Исправлен глюк: провайдер путался в колонках - изменялся порядок следования колонок, по клику по значению в колонке могло открываться значение другой колонки.

Брать провайдер можно там же:
http://uzhast.fatal.ru/vfp.oledb.provider/
http://uzhast.fromru.su/vfp.oledb.provider/
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #192 - 04. Ноября 2007 :: 03:46
Печать  
kiruha писал(а) 26. Октября 2007 :: 12:09:
Еще интересует вопрос. При длинной транзакции другого пользователя как поведет себя провайдер?
Зависшее окно, или ситуация будет разрулена ?

Сделал тест. Вставил в проведение документа "Предупреждение". Открыл провайдер с автообновлением. Запустил проведение документа. На исходном vfpoledb.dll выдается ругань на невозможность получения доступа к таблице. Далее происходит довольно забавный спецэффект: предупреждение из модуля документа выводится в окно сообщений, потом вылазит сообщение, что документ не проведен. Далее вылет 1С.

С патченным vfpoledb.dll все работает корректно. Кстати, пропатчил провайдер из 2-го сервис-пака. Взять можно здесь:
http://uzhast.fatal.ru/vfpoledb/
http://uzhast.fromru.su/vfpoledb/
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #193 - 04. Ноября 2007 :: 04:09
Печать  
Думаю, от необходимости использовать WHERE ID IN (%СписокИД%) уйти не удасться. В запросе ведь можно использовать джойны с подзапросами. Например:
SELECT
ID AS [Товар $Справочник.Номенклатура]
LEFT JOIN (
... запрос по остаткам
) AS Остатки ON Остатки.Товар = ID

А я очень сомневаюсь, что фокс догадается применить фильтр по ID ко вложенному запросу. Поэтому, скорее всего, и во вложенном запросе понадобится указывать WHERE $Остатки.Товар IN (%СписокИД%).

Теперь по поводу фильтров. Фильтр должен задаваться в том виде, какой получается после вычисления индексного выражения. Например, вот так выглядит фильтр для некоторого журнала документов, начиная с даты 1 ноября 2007 г.: "  1S20071101". Т.е. сначала 4 символа - ИД журнала, затем дата в виде ГГГГММДД. Аналогично для видов документов, только вместо ИД журнала идет ИД вида документов.

Думаю, что в дальнейшем для значений фильтров можно будет использовать метапарсер. Например, в таком виде: "$ЖурналДокументов.Банковские:ДатаНачала". Правда, пока не проверял, корректно ли он будет отрабатывать подобные выражения: без пробелов... Хотя, по идее, можно будет и дострогать, если что...

Для справочников, если мы, например, хотим поставить фильтр по первым буквам наименования, то нужно использовать строку с прописными буквами. Потому что, индексное выражение для тега Descr выглядит как UPPER (Descr). Кстати, штатные гриды фильтровать по первым буквам наименования не умеют Подмигивание Примеры фильтров:
- для тега "Descr" (упорядочивание по наименованию): "БАНК". Выбрать все элементы, которые начинаются на "банк".
- для тега "PDescr" (фильтр по группе справочника + упорядочивание по наименованию): "   1LO   2ЗАО": 9 символов ИД группы, затем значение поля IsFolder (2), затем первые буквы наименования ("ЗАО"). Таким образом мы отбираем все элементы одной группы, которые начинаются на "ЗАО".
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #194 - 04. Ноября 2007 :: 04:22
Печать  
Uzhast писал(а) 04. Ноября 2007 :: 04:09:
Думаю, что в дальнейшем для значений фильтров можно будет использовать метапарсер. Например, в таком виде: "$ЖурналДокументов.Банковские:ДатаНачала". Правда, пока не проверял, корректно ли он будет отрабатывать подобные выражения: без пробелов... Хотя, по идее, можно будет и дострогать, если что...

Строгать придется, похоже, все равно... Потому что $ЖурналДокументов.Банковские он мне будет разворачивать во что-то вроде '  56'. Т.е. ИД журнала с кавычками. А мне нужно без кавычек Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 11 12 [13] 14 15 16
ОтправитьПечать