Переключение на Главную Страницу Страницы: 1 ... 32 33 [34] 35 36 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 532310 )
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #495 - 24. Марта 2009 :: 07:58
Печать  
Александр (Orefkov) а почему бы не использовать запрос вроде

Код
Выбрать все
SELECT
J.DATE AS Date,
J.TIME AS Time,
J.IDDOC AS IDDOC,
COALESCE(D1.Contr, D2.Contr) AS Contr
J.idx_IDDOC AS [КлючПорядка]
FROM
Журнал AS J
LEFT JOIN
Документ_Один AS D1
ON
D1.IDDOC = J.IDDOC
LEFT JOIN
Документ_Два AS D2
ON
D2.IDDOC = J.IDDOC
WHERE
J.IDDOCDEF = :ВидДокумента.Один
OR
J.IDDOCDEF = :ВидДокумента.Два 



Какие ты видишь минусы или проблемы?
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #496 - 24. Марта 2009 :: 08:09
Печать  
CaBaT писал(а) 24. Марта 2009 :: 07:25:
я не настолько силен в понимании, что из этого функционала используется при работе с DBF-таблицами 1С

ничего Улыбка
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #497 - 24. Марта 2009 :: 08:26
Печать  
vandalsvq писал(а) 24. Марта 2009 :: 07:58:
Александр (Orefkov) а почему бы не использовать запрос вроде

Код
Выбрать все
SELECT
J.DATE AS Date,
J.TIME AS Time,
J.IDDOC AS IDDOC,
COALESCE(D1.Contr, D2.Contr) AS Contr
J.idx_IDDOC AS [КлючПорядка]
FROM
Журнал AS J
LEFT JOIN
Документ_Один AS D1
ON
D1.IDDOC = J.IDDOC
LEFT JOIN
Документ_Два AS D2
ON
D2.IDDOC = J.IDDOC
WHERE
J.IDDOCDEF = :ВидДокумента.Один
OR
J.IDDOCDEF = :ВидДокумента.Два 



Какие ты видишь минусы или проблемы?


Минусы - то что независимо от вида документа, по каждому iddoc из общего журнала sqlite будет ломится в каждую из таблиц шапок документов в поисках iddoc в шапке. Ведь как будет выполнятся этот запрос:
сначала во внешнем цикле перебираются строки в журнале.
Если iddocdef не попадает в where, строка журнала пропускается, переходим на следующую строку.
Иначе - берется iddoc из журнала и выполняется поиск этого iddoc в каждой из таблиц шапок документов, с вытаскиванием из них поля Поставщик.
Когда получили всех Поставщиков (либо NULL) из всех шапок, вычисляем coalesce.
Кроме того, это мы знаем, что данные left join'ы не изменят количество строк в выборке, потому как iddoc в шапках не повторяется.
SQLite этого не знает, и строит план выполнения с учетом того, что из таблиц шапок может быть получено несколько записей с указанным iddoc, то есть накручивает вложенные циклы.
А в моем варианте - при переборе строк журнала взависимости от iddocdef выполняется один подзапрос только к нужной таблице шапок.
Из минусов - так можно извернутся, когда требуется только одно поле из шапки документов, если так получать несколько полей, на каждое поле будет свой подзапрос к таблице шапки документов.
Ща я думаю, как оптимальней реализовать такую ситуацию.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #498 - 24. Марта 2009 :: 08:29
Печать  
Было бы интересно выслушать твой пример  Подмигивание
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #499 - 24. Марта 2009 :: 09:28
Печать  
Долбил и мучал я ща SQLite, однако если несколько полей надо тянуть из шапки, оптимальнее, чем left join + coalesce не получится.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #500 - 24. Марта 2009 :: 14:32
Печать  
А возможно ли из одной базы sqlite выполнить запрос к другой с помощью этой компоненты (другими програмами - можно, пробывал)?
примерно так:
Код
Выбрать все
База1=СоздатьОбъект("SQLiteBase");
	База1.Открыть("d:\база1.sq3");
	База2=СоздатьОбъект("SQLiteBase");
	База2.Открыть("d:\база2.sq3");

	Запрос1=База1.НовыйЗапрос();
	Запрос1.ВыполнитьЗапрос("CREATE TABLE if not exists Табл1 (ИД)");
	Запрос2=База2.НовыйЗапрос();
	Запрос2.ВыполнитьЗапрос("CREATE TABLE if not exists Табл2 (ИД)");

	тз=Запрос1.выполнитьзапрос("select * from [База2].[Табл2]"); 

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #501 - 25. Марта 2009 :: 07:05
Печать  
ATTACH DATABASE / DETACH DATABASE тебе поможет.
Вообще не надо заводить два объекта для двух баз данных.
Открываешь одну базу (хоть :memory:), остальные просто аттачишь к ней по мере надобности.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #502 - 25. Марта 2009 :: 07:12
Печать  
Самое то! Спасибо.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #503 - 26. Марта 2009 :: 08:28
Печать  
Подскажите, пожалуйста, ещё такой момент.
Имеем запрос на поиск элемента справочника по его коду:
Код
Выбрать все
Запрос.Подставлять("ВнешКод", ВнешКод);
			Запрос.Отладка(1);
			итРезультат=Запрос.ВыполнитьЗапрос("
			|SELECT id [Объект :Справочник."+Вид+"]
			|	,code Код
			|	,descr Наименование
			|FROM Справочник_"+СтрЗаменить(Вид,"_","__")+"
			|Where code = :ВнешКод") 


Всё хорошо работает, если тип кода - текстовый.
Если же он числовой, то в базе он хранится всё равно как строка с недостающими пробелами в НАЧАЛЕ. Т.е. если у справочника длина кода=5 и тип кода=числовой, то в базе Элемент с кодом=1 хранится как '    1'.
Вижу только два выхода из этой ситуации:
1) Проверять длину и тип кода, потом добавлять пробелы слева и на основе этого строить запрос.
2) Сделать условие: "Where code like '%"+ВнешКод+"'". Так мы пролетаем с индексом по коду.
Можно ли как-нибудь выкрутиться простым путём?
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite
Ответ #504 - 26. Марта 2009 :: 08:53
Печать  
Код
Выбрать все
|Where code = RIGHT(('    '+STR(ВнешКод)),5)")  



Так попробуй
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #505 - 26. Марта 2009 :: 08:57
Печать  
leov-001 писал(а) 26. Марта 2009 :: 08:53:
Код
Выбрать все
|Where code = RIGHT(('    '+STR(ВнешКод)),5)")  



Так попробуй

Так всё равно надо узнавать дину и тип кода.
Я просто привел пример одного справочника.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite
Ответ #506 - 26. Марта 2009 :: 09:00
Печать  
Почму узнавать, добавляем 4 пробела '    '+ И отрезаем справа 5 символов. Это и будет твой код который хранится в таблице ИБ.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #507 - 26. Марта 2009 :: 09:02
Печать  
А если длина кода = 10?
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite
Ответ #508 - 26. Марта 2009 :: 09:06
Печать  
Цитата:
Я просто привел пример одного справочника.


Передавай через парамтр в форму обработки.
Длинна кода = N
Тип  если Тип Число тогда N-Пробелов
Иначе N-нулей
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #509 - 26. Марта 2009 :: 09:11
Печать  
leov-001 писал(а) 26. Марта 2009 :: 09:06:
Цитата:
Я просто привел пример одного справочника.


Передавай через парамтр в форму обработки.
Длинна кода = N
Тип  если Тип Число тогда N-Пробелов
Иначе N-нулей

Да это понятно. Поэтому и написал такое решение в первом пункте:
Цитата:
1) Проверять длину и тип кода, потом добавлять пробелы слева и на основе этого строить запрос.

Просто у меня код берётся из внешней базы. И я не хотел делать лишних телодвижений по проверке кода в справочнике. Но пока другого решения нет, так и сделал.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 32 33 [34] 35 36 ... 79
ОтправитьПечать