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


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Провайдер OLE DB для ТП
Ответ #150 - 25. Октября 2007 :: 21:52
Печать  
Моя идея ограничивалась внесением в обязательный интерфейс строки метода, предоставляющего информацию о провайдере.
Примерно так, как это сделано для CSQLRow::GetProvider.
Иначе получив строку откуда-то я понятия не имею, что с ней делать - интерфейс неполный.

Ну а дальше - раз в строка знает о своем провайдере, общую часть интерфейса строки можно и перенести в провайдер.
Я не думаю, что реально ТП когда-либо дойдет до отображения строк переменной длины.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #151 - 25. Октября 2007 :: 21:58
Печать  
kms писал(а) 25. Октября 2007 :: 21:52:
Моя идея ограничивалась внесением в обязательный интерфейс строки метода, предоставляющего информацию о провайдере.
Примерно так, как это сделано для CSQLRow::GetProvider.
Иначе получив строку откуда-то я понятия не имею, что с ней делать - интерфейс неполный.

Что значит, "получив строку откуда-то"? Разве может быть ситуация, когда ТП не знает, откуда взялась строка? Ведь оно само прямо из провайдера эту строку получает?

kms писал(а) 25. Октября 2007 :: 21:52:
Ну а дальше - раз в строка знает о своем провайдере, общую часть интерфейса строки можно и перенести в провайдер.
Я не думаю, что реально ТП когда-либо дойдет до отображения строк переменной длины.

ИМХО, строка вообще не должна ничего знать о провайдере. "Для уменьшения связности кода". Ну в самом деле, зачем ей знать о провайдере? Только лишний геморрой, особенно, с временем жизни объектов (провайдер сдох, а строка почему-то осталась). ИМХО, если развязать строки и провайдер, многое можно упростить и увеличить безопасность кода.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #152 - 26. Октября 2007 :: 02:28
Печать  
Выкладываю зародыш динамического провайдера. Местами он даже иногда бывает частично работает Улыбка
Ссылки:
http://uzhast.fatal.ru/vfp.oledb.provider/
http://uzhast.fromru.su/vfp.oledb.provider/

Установка как обычно: скопировать dll (1cpp.dll и CursorGrid.Provider.OleDb.VFP.dll) в BIN. Для проверки использовать обработку "Тест провайдера (динамика).ert". В каталог базы надо положить файл QueryRows.prg (в будущем этот файл будет создаваться сам).

Заполнение полей тестовой обработки:
Опорная таблица
Название таблицы, по которой провайдер ходит методами XBase. Например, "$Справочник.Номенклатура", "1sjourn".

Поле-ключ
Поле, идентифицирующее запись опорной таблицы. Для справочников - ID. Для журнала IDDoc.

Тег индекса
Тег, используемый для упорядочивания опорной таблицы. Названия индекса можно посмотреть в 1cv7.dd.

Текст запроса
Текст запроса Улыбка Должен иметь вид SELECT ... FROM ОпорнаяТаблица WHERE IDПоле IN (%СписокИД%) ORDER BY ВыражениеУпорядочивания. Можно делать джойны (например, к остаткам товаров/взаиморасчетов) и т.п. При передаче в OLE DB строка %СписокИД% заменяется на полученный методами XBase список ИДшников.

Запрос обязан вернуть столько строк, сколько было ИД в строке "СписокИД". Поэтому всякие INNER JOIN, скорее всего, не желательны - в этом случае нормальная работа провайдера не гарантируется.

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

Таймаут обновления
Таймаут, он и в Африке таймаут. Работает, проверял.

Отладка
При включенном флажке злобно матерится в окно сообщений запросами, которые направляет в OLE DB, а также другой бесполезной информацией.


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

Изменения в 1С++
Вытащил наружу метапарсер. Перенес изменения spock'а для параметризованных запросов (но мне они (пока) не понадобились). Сырки 1С++ и провайдера обновлены и лежат рядом с компонентами.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #153 - 26. Октября 2007 :: 09:03
Печать  
Запустил тест провайдера динамика.
Отражаются документы с номерами.
Зашел в документ , изменил номер, отображение не изменилось.
В чем разница по сравнению с ТЗ, как источник данных - не понял -
что там не менялось, что здесь.

Ввел новый документ - опять никаких изменений. Новый документ в списке не отражен.

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #154 - 26. Октября 2007 :: 09:05
Печать  
kiruha писал(а) 26. Октября 2007 :: 09:03:
Запустил тест провайдера динамика.
Отражаются документы с номерами.
Зашел в документ , изменил номер, отображение не изменилось.
В чем разница по сравнению с ТЗ, как источник данных - не понял -
что там не менялось, что здесь.

Ввел новый документ - опять никаких изменений. Новый документ в списке не отражен.

Я действительно не понимаю, ничего больше.

А ты поставил таймаут обновления? Тут ведь какая вещь... Если его не поставить сначала (он равен 0), то, если ставить потом, то он никак на ТП влиять не будет. Т.е. алгоритм такой: ставим таймаут, жмем кнопку "Выполнить".
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #155 - 26. Октября 2007 :: 09:28
Печать  
Uzhast писал(а) 26. Октября 2007 :: 09:05:
А ты поставил таймаут обновления? Тут ведь какая вещь... Если его не поставить сначала (он равен 0), то, если ставить потом, то он никак на ТП влиять не будет. Т.е. алгоритм такой: ставим таймаут, жмем кнопку "Выполнить".


Да, после постановки таймаута в 1 данные обновились.
Означает ли это, что каждую сек происходит запрос к базе? Если да - то только по Id видимым на экране?
Пока выглядит все очень симпатично Улыбка (только надо по умолчанию 1 сразу ставить)

Второй вопрос.
В хранимой процедуре стоит "CLOSE TABLES ALL".
Предположим у меня открыт журнал документов с провайдером и я запускаю отчет с промежуточным
сохранением в курсор. Отчет вылетит с ошибкой?

Третий.
Не удалось открыть 2 теста. По 2 журнала нельзя открывать? С именами в процедуре не будет совпадений?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #156 - 26. Октября 2007 :: 09:37
Печать  
kiruha писал(а) 26. Октября 2007 :: 09:28:
Означает ли это, что каждую сек происходит запрос к базе? Если да - то только по Id видимым на экране?
Пока выглядит все очень симпатично Улыбка (только надо по умолчанию 1 сразу ставить)

Включи флажок "Отладка" - сам увидишь, какие запросы выполняются.

kiruha писал(а) 26. Октября 2007 :: 09:28:
Второй вопрос.
В хранимой процедуре стоит "CLOSE TABLES ALL".
Предположим у меня открыт журнал документов с провайдером и я запускаю отчет с промежуточным
сохранением в курсор. Отчет вылетит с ошибкой?

Это смотря, насколько промежуточным было сохранение в курсор. Если до получения данных провайдером, то курсор закроется. Если получение курсора и формирование отчета происходит одновременно, то все будет нормально. Ну и на крайний случай, соединение провайдеру можно подсовывать другое, чем используется в отчете.

kiruha писал(а) 26. Октября 2007 :: 09:28:
Третий.
Не удалось открыть 2 теста. По 2 журнала нельзя открывать? С именами в процедуре не будет совпадений?

Вроде бы проблем не должно быть, но не проверял еще.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #157 - 26. Октября 2007 :: 10:40
Печать  
Uzhast писал(а) 26. Октября 2007 :: 09:37:
Включи флажок "Отладка" - сам увидишь, какие запросы выполняются.

ОК. Жаль, что не мгновенно(на собственные изменения - может нужно перехватывать все события "после записи",
"после проведения" и проводить обновление, а таймаут выставить на максимум?), как в 1С, но при таймауте в 10 сек вполне приемлимо Улыбка
Не понял зачем тогда тэг индекса "ACDateTim" . Вроде в запросе по обновлению экрана он не используется.
Тогда зачем себя ограничивать?
Или это связано с получением "новых" документов?

Uzhast писал(а) 26. Октября 2007 :: 09:37:
Это смотря, насколько промежуточным было сохранение в курсор. Если до получения данных провайдером, то курсор закроется. Если получение курсора и формирование отчета происходит одновременно, то все будет нормально. Ну и на крайний случай, соединение провайдеру можно подсовывать другое, чем используется в отчете.


Т.е. при разных соединениях - контекст разный? Это гууд Улыбка

Uzhast писал(а) 26. Октября 2007 :: 09:37:
"Третий.
Не удалось открыть 2 теста. По 2 журнала нельзя открывать? С именами в процедуре не будет совпадений?"
....
Вроде бы проблем не должно быть, но не проверял еще.


Да, вставил в конфигурацию сделал
ОткрытьФорму("Отчет."+ИмяОтчета+"#") - работает Улыбка

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #158 - 26. Октября 2007 :: 11:12
Печать  
Заявленных скачков в работе процессора не наблюдаю.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Провайдер OLE DB для ТП
Ответ #159 - 26. Октября 2007 :: 12:09
Печать  
Еще интересует вопрос. При длинной транзакции другого пользователя как поведет себя провайдер?
Зависшее окно, или ситуация будет разрулена ?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #160 - 26. Октября 2007 :: 17:59
Печать  
kiruha писал(а) 26. Октября 2007 :: 10:40:
ОК. Жаль, что не мгновенно(на собственные изменения - может нужно перехватывать все события "после записи",
"после проведения" и проводить обновление, а таймаут выставить на максимум?), как в 1С, но при таймауте в 10 сек вполне приемлимо Улыбка

Я не совсем в курсе, как ловить такие события (вернее, совсем не в курсе) Улыбка

kiruha писал(а) 26. Октября 2007 :: 10:40:
Не понял зачем тогда тэг индекса "ACDateTim" . Вроде в запросе по обновлению экрана он не используется.
Тогда зачем себя ограничивать?
Или это связано с получением "новых" документов?

Это связано с передвижением по журналу. Индекс определяет, как будут упорядочены записи. Он используется в QueryRows.prg для XBase-методов.

kiruha писал(а) 26. Октября 2007 :: 10:40:
Т.е. при разных соединениях - контекст разный? Это гууд Улыбка

Ну, вообще-то я не проверял, но, скорее всего, разный. Улыбка

kiruha писал(а) 26. Октября 2007 :: 10:40:
Да, вставил в конфигурацию сделал
ОткрытьФорму("Отчет."+ИмяОтчета+"#") - работает Улыбка

Правда?! Вот здорово! (Я ведь действительно не проверял Улыбка) Улыбка

kiruha писал(а) 26. Октября 2007 :: 10:40:
Если в запросе используется реквизит реквизита (например в документе "номер"  банковского счета "клиента")
- данные по реквизиту Id будут обновляться? Т.е. если менеджер выписал  документ,
исправил номер банковского счета, отразиться ли это в журнале?

При обновлении просто повторно выполнится запрос, который передали в провайдер. Так что все должно обновиться. Однако, как-то я наступал на грабли, что в некоторых случаях в OLE DB провайдере для Фокса может происходить своего рода кеширование запроса. Т.е. на совершенно одинаковые запросы может выдаваться совершенно одинаковый ответ, хотя данные поменялись (внешним для Фокса образом - из 1С). Если ты столкнешься с таким поведением, то пиши сюда. Это вроде побеждается. Хотя наличие CLOSE TABLES вроде это должно лечить и так...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #161 - 26. Октября 2007 :: 18:00
Печать  
kiruha писал(а) 26. Октября 2007 :: 11:12:
Заявленных скачков в работе процессора не наблюдаю.

В смысле? А что наблюдаешь?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



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

Ну, пропатченный провайдер для OLE DB позволяет выбирать данные из заблокированных 1С таблиц. Вот, правда, не проверял, насколько это действительно в случае XBase-методов. Надо будет проверить...
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Провайдер OLE DB для ТП
Ответ #163 - 26. Октября 2007 :: 18:07
Печать  
Олег, посмотри advantage провайдер.
У него и с блокировками лучше.
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



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

А вроде же кто-то говорил, что он медленнее? Улыбка Или это не так? А с XBase у него как? Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 9 10 [11] 12 13 ... 16
ОтправитьПечать