Переключение на Главную Страницу Страницы: 1 2 [3] 4  ОтправитьПечать
Очень популярная тема (более 25 ответов) Свертка файловой ПУБ с использованием 1sqlite (число прочтений - 12834 )
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #30 - 13. Января 2012 :: 08:09
Печать  
INSERT INTO tmp_docs('dt','dc')

Это раз,
а во-вторых... дальше у тбя брэээд ..не пит, просто брэд

выбрал запись из регистра, имеешь iddoc документа , толкнувшего его и iddoc измерения - Заказ.

Ну а дальше, ты пытаешься фильтрануть его своим условием в иннер джоин, 2 раза - первый раз на документ движения и второй раз на свой заказ.

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


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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #31 - 13. Января 2012 :: 08:26
Печать  
Eprst писал(а) 13. Января 2012 :: 08:09:
INSERT INTO tmp_docs('dt','dc')
Так я тоже пробовал - результат один - краш.

Eprst писал(а) 13. Января 2012 :: 08:09:
Это раз,
а во-вторых... дальше у тбя брэээд ..не пит, просто брэд

выбрал запись из регистра, имеешь iddoc документа , толкнувшего его и iddoc измерения - Заказ.

Ну а дальше, ты пытаешься фильтрануть его своим условием в иннер джоин, 2 раза - первый раз на документ движения и второй раз на свой заказ.

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


Давай еще рвз
Код
Выбрать все
INSERT INTO tmp_docs(dt,dc)
SELECT SUBSTR(о.Заказ,1,4), SUBSTR(о.Заказ,5,9)
FROM [Регистр.ВозвратныеОтходы] о
INNER JOIN [Журнал] ж ON ж.iddoc = о.iddoc
AND ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(о.Заказ,5,9)
AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки)) 

Первый джойн, который ж, проверяет, что дата и время дока удоалетворяют условию новый документ, а второй джойн, который жж, - проверяет обратное условие, но по значению реквизита, а не документа.
Может, конечно, стоит уйти от иннеров в сторону лефтов? но мне казалось, что накладывая условие в соединении, я уменьшу количество обрабатываемых строк.... нет?

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

P.S.: На самом деле запрос уже несколько мутировал
Код
Выбрать все
SELECT жж.iddocdef || жж.iddoc [Док :Документ]
FROM [Регистр.ВозвратныеОтходы] о
INNER JOIN [Журнал] ж ON ж.iddoc = о.iddoc
AND ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(о.Заказ,5,9)
AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки))
GROUP BY жж.iddocdef, жж.iddoc 

Сейчас в нем нет инсерта, коль тот крашит 1С, но там стало лучше видно, что я хочу получить.
Вместо GROUP BY пробовал DISTINCT, но так и не смог понять, что быстрее...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #32 - 13. Января 2012 :: 08:52
Печать  
второй джоин там не нужен, можешь and воткнуть вместо него.
это равносильно.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #33 - 13. Января 2012 :: 08:59
Печать  
Ну и с инсертом, там всё работает:
Код
Выбрать все
Процедура Сформировать()
	Попытка
		база = СоздатьОбъект("SQLiteBase");
	Исключение
		ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
		база = СоздатьОбъект("SQLiteBase");
	КонецПопытки;
	база.Открыть(":memory:");
    запросSQLLite = база.НовыйЗапрос();
	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("ИД");
	ТЗ.НоваяКолонка("Объект");
	Для к=1 По 10 Цикл
		ТЗ.НоваяСтрока();
		ТЗ.ИД = к;
		ТЗ.Объект = "Вася"+к;
	КонецЦикла;
	база.уложитьТЗ(ТЗ,"Табличка",0);

	ТекстЗапроса="
	|CREATE TEMP TABLE tmp_docs(dt varchar(4), dc varchar(9))
	|";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);

	ТекстЗапроса = "
	|insert or replace INTO tmp_docs ('dt','dc')
	| -- select ИД,Объект from Табличка
	|  select * from Табличка
	| ";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);

	ТекстЗапроса = "
	|select * from tmp_docs
	|";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку();

КонецПроцедуры 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #34 - 13. Января 2012 :: 09:05
Печать  
Ты что-то гонишь ... как можно одним джойном соединить три таблицы?
1. Таблица регистра/документа/строки_дока
2. Журнал нового дока (только при отстуствии быстрой обработки движений - это проверяется) привязан к первой по полю iddoc
3. Журнал старого дока привязан к первой по реквизиту
Вот пример:
Есть некая строка дока - это запись из первой таблицы. (iddoc = 1, рекв = 5)
К строке джойнится строка журнала для фильтра по дате и времени. (ключевое поле iddoc = 1)
К строке же джойнится другая строка журнала для фильтра по дате и времени по дначению реквизита. (ключевое поле iddoc = 5)
И как здесь отказаться от второго джойна?

Eprst писал(а) 13. Января 2012 :: 08:59:
Ну и с инсертом, там всё работает
Если бы оно хоть ошибку сообщило, а то просто крашится и все тут ...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #35 - 13. Января 2012 :: 09:12
Печать  
Что значит журнал старого дока и журнал нового дока ?
У тебя иннер к 1 табличке всегда - к 1sjourn...

у тебя основное условие присоединения, это iddoc регистра = iddoc журнала, далее, ты к полученной выборке еще раз делаешь иннер джоин, где iddoc журнала = iddoc измерения (Заказ)..

Только заместо этого мог бы смело второй иннер выкинуть и оставить and в месте присоединения .

В результате, у тебя в выборке будут только те строки, где iddoc документа движения регистра  = iddoc Заказа.
Ну и еще условия на даты из обоих соединений одновременно.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #36 - 13. Января 2012 :: 09:23
Печать  
Eprst писал(а) 13. Января 2012 :: 09:12:
Только заместо этого мог бы смело второй иннер выкинуть и оставить and в месте присоединения .
Тогда почему в запросе
Код
Выбрать все
SELECT
ж.iddocdef || ж.iddoc [dd :Документ]
, жж.iddocdef || жж.iddoc [d :Документ]
FROM [Регистр.ДвижениеПродукции] ж
INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(ж.ДокументДвижения,5,9)
AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки))
WHERE ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
LIMIT 10 

я получаю 10 строк с РАЗНЫМИ значениями в двух колонках? хотя они обе берутся из журнала, но из РАЗНЫХ его строк в соответствии с условиями джойнов!
В первой колонке я вижу документ, а во второй документ, на который ссылается реквизит.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #37 - 13. Января 2012 :: 09:28
Печать  
Блин, если ты пишешь, что у тебя в регистре есть iddocdef - то у тебя в нём есть и date и time, журнал там вообще джойнить не надо.

ЗЫ:
ж.ДокументДвижения - это че ?! измерение ?
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #38 - 13. Января 2012 :: 09:30
Печать  
Вижу уже, что пример неудачный, но вот удачный
Код
Выбрать все
SELECT
ж.iddocdef || ж.iddoc [dd :Документ]
, жж.iddocdef || жж.iddoc [d :Документ]
FROM [Регистр.НДСпоПриобретеннымЦенностям] о
INNER JOIN [Журнал] ж ON ж.iddoc = о.iddoc
AND ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(о.СчетФактура,5,9)
AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки))
LIMIT 10 

В первой колонке возвраты поставщику, а во второй - поступления МПЗ!

Eprst писал(а) 13. Января 2012 :: 09:28:
ж.ДокументДвижения - это че ?! измерение ?
Угу. Измерение. Тут много экзотики, от которой еще предстоит долго избавляться...

В общем, проблема не в джойнах, а в чем-то другом ... а вот в чем, - я не понимаю ...  Смущённый
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #39 - 13. Января 2012 :: 09:37
Печать  
я ж тебе написал в чем - в инсерте не хватает кавычек - смотри выше.
ну и давай код, который не работает сюда
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Странные падения 1С при попытке выполнения запроса 1sqlite типа INSERT FROM
Ответ #40 - 16. Января 2012 :: 01:39
Печать  
Eprst писал(а) 13. Января 2012 :: 09:28:
Блин, если ты пишешь, что у тебя в регистре есть iddocdef
Это ошибка копирования. Реально я значения из первой таблицы не смотрю, а вывел их только тут для примера. В отладке там было не ж.iddocdef || ж.iddoc [dd :Документ], а ж.ДокументДвижения [dd :Документ].
Запрос строится функцией в зависимости от типа реквизита, потому я это здесь опустил.

Eprst писал(а) 13. Января 2012 :: 09:37:
я ж тебе написал в чем - в инсерте не хватает кавычек - смотри выше.
ну и давай код, который не работает сюда
Кавычки я тоже пробовал. Вот все строки инсерта, которые я пробовал
Код
Выбрать все
//Когда таблица была такой: CREATE TEMP TABLE tmp_docs(dt varchar(4), dc varchar(9))
INSERT INTO tmp_docs
INSERT INTO tmp_docs(dt,dc)
INSERT INTO tmp_docs('dt','dc')
//Когда таблица стала такой: CREATE TEMP TABLE tmp_docs(d varchar(13) primary key not null)
INSERT INTO tmp_docs
INSERT INTO tmp_docs(d)
INSERT INTO tmp_docs('d')
INSERT OR REPLACE INTO tmp_docs ('d') 

Но 1С упорно отказывалась сообщать ошибку и тупо крашилась.
А логи краша я читать не умею Печаль
Ниже шел обычный селект без типизации и без запроса поля dd из тех, что я приводил раньше.

Вот сейчас для проверки запустил следующий запрос
Код
Выбрать все
INSERT OR REPLACE INTO tmp_docs ('d')
SELECT DISTINCT жж.iddocdef || жж.iddoc [d]
FROM [Регистр.Заявки] о
INNER JOIN [Журнал] ж ON ж.iddoc = о.iddoc
AND ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(о.Заявка,5,9)
AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки)) 

Результат тот же - краш. Селект же выполняется успешно.
К слову: твой пример у меня отработал замечательно, но чем наши запросы отличаются - не понимаю ...
Без дистинкта результат тот же...
  
Наверх
 
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #41 - 16. Января 2012 :: 04:50
Печать  
То что крашится - это вполне логично. Ты же работаешь через "виртуальную" базу, которая вызывает функции из dbeng-a и проч. и проч. Короче говоря, ИМХО, Александр Орефков не рассчитывал, что в созданную таким образом базу кто-то что-то захочет писать. Пример же Eprst отличается тем, что пишет в SQLite-ную базу.
  
Наверх
ICQ  
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #42 - 16. Января 2012 :: 05:06
Печать  
Salimbek писал(а) 16. Января 2012 :: 04:50:
Пример же Eprst отличается тем, что пишет в SQLite-ную базу.
У него 2 примера. В первом он создавал базу в файле, а во втором в памяти, как и у меня ... кроме того, раньше я уже пользовал временные таблицы ... но заполнял я их обычными инсертами ... видимо, Саша не предусмотрел что-то особенное, что проявилдось именно в моей конструкции запроса... в более простых случаях все работает, но оптимизация и должна заключаться в том, чтобы основную логику убрать из 1С, передав ее движку СУБД ... сейчас же я парсю результат серекта и заполняю СЗ, что делается очень медленно 1Ской...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #43 - 16. Января 2012 :: 05:44
Печать  
Salimbek писал(а) 16. Января 2012 :: 04:50:
То что крашится - это вполне логично. Ты же работаешь через "виртуальную" базу, которая вызывает функции из dbeng-a и проч. и проч. Короче говоря, ИМХО, Александр Орефков не рассчитывал, что в созданную таким образом базу кто-то что-то захочет писать. Пример же Eprst отличается тем, что пишет в SQLite-ную базу.


Не, я позже заметил, что у него табличка в памяти создается и переделал пример - он тоже заработал..
Ща проверю на табличке регистра.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #44 - 16. Января 2012 :: 06:14
Печать  
Всё работает, проверяй свой синтаксис, особенно типизацию, типа [d]

Код
Выбрать все
	ТекстЗапроса="
	|CREATE TEMP TABLE tmp_docs(d varchar(13) primary key not null)
	|";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);

	ТекстЗапроса = "

	|INSERT OR REPLACE INTO tmp_docs ('d')
	|SELECT DISTINCT жж.iddocdef || жж.iddoc
	|FROM [Регистр.Покупатели] о
	|INNER JOIN [Журнал] ж ON ж.iddoc = о.iddoc
	|--AND ((ж.date = :ДатаСвертки0 AND ж.time >= id2str(863990000, 6)) OR (ж.date >= :ДатаСвертки))
	|INNER JOIN [Журнал] жж ON жж.iddoc = SUBSTR(о.КредДокумент,5,9)
	|--AND ((жж.date = :ДатаСвертки0 AND жж.time < id2str(863990000, 6)) OR (жж.date < :ДатаСвертки))
	|";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);

	ТекстЗапроса = "
	|select * from tmp_docs
	|";

	запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса).ВыбратьСтроку(); 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 [3] 4 
ОтправитьПечать