Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 ... 20 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 64568 )
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #30 - 25. Октября 2007 :: 10:12
Печать  
Читаем стартовый топик.
Хочу обратить внимание, что сравнивать скорость с OLE DB FoxPro без указания полей выборки (select * )
теперь нельзя, так как 1sqlite к таблицам 1С добавляет виртуальные поля, представляющие индексы, и при
select * from приходится еще вытаскивать и доп.поля.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #31 - 25. Октября 2007 :: 10:26
Печать  
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.

Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #32 - 25. Октября 2007 :: 10:28
Печать  
Или вместо ID или IDDoc тупо храним физический номер записи. Тогда все работает еще быстрее, чем с ID или IDDoc, потому что избегаем одного INDEX SEEK.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #33 - 25. Октября 2007 :: 10:31
Печать  
Uzhast писал(а) 25. Октября 2007 :: 10:26:
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.

Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.

Покажи как.
И как должны быть написаны условия where в SQL-запросе.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #34 - 25. Октября 2007 :: 10:35
Печать  
orefkov писал(а) 25. Октября 2007 :: 10:31:
Покажи как.
И как должны быть написаны условия where в SQL-запросе.

Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #35 - 25. Октября 2007 :: 10:37
Печать  
Если ты можешь использовать ТОЛЬКО SQL-запросы то в том "составном" поле для упорядочивания просто дополнительно введи физический номер записи. И все у тебя срастется, ИМХО Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #36 - 25. Октября 2007 :: 10:43
Печать  
Вообще, ИМХО, страсть использовать SQL-запросы для построения курсоров - пагубная.  Очень довольный Для курсоров лучше использовать XBase-подобные средства. А SQL-запросы в подобных задачах наоборот, вместо наглядности и простоты выборки данных, дают усложения и лишние тормоза на ровном месте.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #37 - 25. Октября 2007 :: 11:09
Печать  
Uzhast писал(а) 25. Октября 2007 :: 10:26:
Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.

Идеологию ТП для этого придется менять.
Там же ключ порядка - обязателен и уникален, а ИДПоле - необязателен и (допустимо) неуникален.
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #38 - 25. Октября 2007 :: 11:10
Печать  
kms писал(а) 25. Октября 2007 :: 11:09:
Идеологию ТП для этого придется менять.
Там же ключ порядка - обязателен и уникален, а ИДПоле - необязателен и (допустимо) неуникален.

Не придется. А вот идеологию провайдера - точно. У меня все работает именно по такому принципу, что я описал. ТП менялось только в одном месте - в получении CDataProvider * из объекта CBLContext *
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #39 - 25. Октября 2007 :: 11:30
Печать  
Ну, как бы если ты снимаешь ограничение на уникальность ключа порядка - это касается ТП вцелом Улыбка
Точнее, ты отдаешь право управления этим ограничением провайдеру, так?

Текущий провайдер ODBC не может работать с неуникальным ключом.
Как я понимаю, это не является необходимым требованием для DBF провайдеров, ибо там есть возможность расширения ключа номером записи.

А самому контролу что нужно от ключа порядка (почему он падает на неуникальных ключах)?
Достаточно ли корректно реализовать CompareRows, чтобы снять проблему?

Или еще что-то нужно? (не готов пока ответить)...
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #40 - 25. Октября 2007 :: 11:38
Печать  
kms писал(а) 25. Октября 2007 :: 11:30:
Ну, как бы если ты снимаешь ограничение на уникальностью ключа порядка - это касается ТП вцелом Улыбка
Точнее, ты отдаешь право управления этим ограничением провайдеру, так?

Текущий провайдер ODBC не может работать с неуникальным ключом.
Как я понимаю, это не является необходимым требованием для DBF провайдеров, ибо там есть возможность расширения ключа номером записи.

А самому контролу что нужно от ключа порядка (почему он падает на неуникальных ключах)?
Достаточно ли корректно реализовать CompareRows, чтобы снять проблему?

Или еще что-то нужно? (не готов пока ответить)...

Не надо упираться в организацию ODBC-провайдера. Она не является единственно верной и вообще этот провайдер лучше переделать под серверные курсоры (ИМХО).

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

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #41 - 25. Октября 2007 :: 11:41
Печать  
Под "ключом" я, естественно, имею в виду "внутренний" ключ провайдера. Для ТП ключ - такой, какой определяет юзер, т.е. это либо ID, либо IDDoc, приведенные к типу "Справочник.Тымтымтым" или "Документ.Трумпумпум".
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #42 - 25. Октября 2007 :: 11:49
Печать  
Ну и вообще, если взять провайдер для ODBC, то в нем есть два метода: УстКлючПорядка и УстИДПоле. Так что и там ключевое поле не имеет отношения к выражению упорядочивания Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #43 - 25. Октября 2007 :: 12:09
Печать  
Кстати, насчет номера записи.

Не стремно его использовать с целью идентификации строки?
Предположим, мы запомнили номер записи, а после этого удаление данной строки и вставку новой.
Есть вероятность, что мы получим на том же месте совершенно другую строку?
Некое уникальное поле типа ID/IDDOC надежнее?

Цитата:
Не надо упираться в организацию ODBC-провайдера. Она не является единственно верной и вообще этот провайдер лучше переделать под серверные курсоры (ИМХО).

Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

Uzhast писал(а) 25. Октября 2007 :: 11:49:
Ну и вообще, если взять провайдер для ODBC, то в нем есть два метода: УстКлючПорядка и УстИДПоле. Так что и там ключевое поле не имеет отношения к выражению упорядочивания Улыбка

Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #44 - 25. Октября 2007 :: 12:17
Печать  
kms писал(а) 25. Октября 2007 :: 12:09:
Кстати, насчет номера записи.

Не стремно его использовать с целью идентификации строки?
Предположим, мы запомнили номер записи, а после этого удаление данной строки и вставку новой.
Есть вероятность, что мы получим на том же месте совершенно другую строку?
Некое уникальное поле типа ID/IDDOC надежнее?

В работающей базе строку удалить нельзя. Это при удалении помеченных объектов может случиться Улыбка Во всяком случае это утверждение действительно для справочников и документов. А вот для таблиц, скажем, итогов регистра такое может произойти. Но их в ТП не отображают обычно.

kms писал(а) 25. Октября 2007 :: 12:09:
Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

А считаешь, что от запросов кряхтеть меньше должен? А если приделать в СКЛ нормальную прокрутку (с ползунком), то от чего, думаешь, больше будет кряхтеть? От нормального перемещения по таблице при помощи курсора или тормозного фетч-цикла при помощи запросов? Улыбка

kms писал(а) 25. Октября 2007 :: 12:09:
Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание

Не знаю Подмигивание ИМХО, название выглядит некрасиво Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 ... 20
ОтправитьПечать