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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Свертка файловой ПУБ с использованием 1sqlite
27. Декабря 2011 :: 09:04
Печать  
Приступаю к свертке конфы на основе ПУБ.
С регистрами все просто. Итоги запросом + Ввод остатков.
А как поступать с бухгалтерскими итогами и расчетом?
Чем получить итоги на момент свертки и чем их ввести в качестве начальных остатков?

Мне кажется, что быстрее всего свертку сделать переносом данных в пустую базу. Сначала вводятся остатки на момент свертки, а затем скопировать доки за тот период, который не сворачивается, создавая их в календарном порядке с одновременным проведением, что позволит избежать удаления и перепроведения. Я прав?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #1 - 27. Декабря 2011 :: 10:22
Печать  
а 1sqlite к этому какое отношение имеет ?
Улыбка
разве что итоги поиметь не на дату ТА..

А так, ввел ручные операции - в них загнал сальдо и привет.
Как режется расчет - хз, никогда не интересовался.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #2 - 27. Декабря 2011 :: 10:23
Печать  
а ты уверен, что у тебя не было критичных изменений в логике проведения документов?

Если доки переносить - то переносить прямо вместе с движениями.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #3 - 27. Декабря 2011 :: 10:27
Печать  
могу дать струмент для переноса..создание клона объекта в сторонней базе для файлового варианта
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #4 - 28. Декабря 2011 :: 01:19
Печать  
Satans Claws писал(а) 27. Декабря 2011 :: 10:23:
а ты уверен, что у тебя не было критичных изменений в логике проведения документов?
Если доки переносить - то переносить прямо вместе с движениями.
Точно знаю, что были, однако перепроведение документов после момента свертки уже проверялось. Вывод: все проблемы остались до момента свертки.
Однако, возможна накладка, т.к. есть доки, где движения зависят от структуры документов, которая перенесена полностью не будет. Отсюда вопрос: как перенести и движения документа? Пока в голову приходит только создание универсального документа, который способен делать любые движения. Есть путь проще?
Eprst писал(а) 27. Декабря 2011 :: 10:22:
а 1sqlite к этому какое отношение имеет ?
Улыбка
разве что итоги поиметь не на дату ТА..
Вот в этом и вопрос: как получить ВСЕ итоги запросом?
Eprst писал(а) 27. Декабря 2011 :: 10:27:
могу дать струмент для переноса..создание клона объекта в сторонней базе для файлового варианта
Буду сказать большую спасибу!
« Последняя редакция: 28. Декабря 2011 :: 02:53 - Dmitry The Wing »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #5 - 28. Декабря 2011 :: 05:38
Печать  
Итоги чего получить то надо ? Регистров ? Или сальдо по счетам ?
  

Cloning_of_objects.ert ( 272 KB | Загрузки )
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #6 - 28. Декабря 2011 :: 05:41
Печать  
Eprst писал(а) 28. Декабря 2011 :: 05:38:
Итоги чего получить то надо ? Регистров ? Или сальдо по счетам ?
Для регистров я функцию написал, которая по метаданным строит запрос для получения остатков на любую дату. А вот как получить сразу сальдо по ВСЕМ счетам?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #7 - 28. Декабря 2011 :: 05:47
Печать  
Ну, самое примитивное - сделать штатным способом: тупо вырезать создание операций по счетам из wrap.ert
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #8 - 28. Декабря 2011 :: 06:03
Печать  
Я надеялся, что есть способ прямее  Плачущий
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #9 - 28. Декабря 2011 :: 07:06
Печать  
Обработка супер!
Возник только один вопрос: она же не будет двигать границу последовательности? Если так, то потом все равно придется перепроводить...
Или можно сначала создать последний документ, привести к нему границу, а потом заклонировать предыдущие? Насколько это грамотно?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #10 - 28. Декабря 2011 :: 17:40
Печать  
там итоги только пересчитать надо будет.. и..всё вроде, это ежели с движениями клонировать.
Можно и без них - так быстрее, и без периодики.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #11 - 10. Января 2012 :: 04:45
Печать  
Движения, операции и периодику доков копировать мне просто необходимо. Вопрос вызывают только ссылки на некопируемые доки (обрезаемые), но это надо еще обдумывать.
Для себя добавил возможность выбора всех документов за период
Код
Выбрать все
Процедура ДобавитьДокументы()
 	  Сз = СоздатьОбъект("СписокЗначений");
	Для ы = 1 по Метаданные.Документ() Цикл
		Сз.ДобавитьЗначение(Метаданные.Документ(ы).Идентификатор, Метаданные.Документ(ы).Синоним);
	КонецЦикла;
	ВидДок = "";
	Выбор = Сз.ВыбратьЗначение(ВидДок, "Выберите вид документа",,, 0);
	Если Выбор = 1 Тогда
		Запрос = глОлеДБ.СоздатьКоманду();
		ТекстЗапроса = "
		|select
		|    Жур.iddoc as [Док $Документ." + ВидДок + "]
		|from 1sjourn Жур
		|where Жур.iddocdef = $ВидДокумента." + ВидДок + "
		|and (dtos(Жур.date)+Жур.time+Жур.iddoc between dtos(:НачДата~~)+'	'+'	   ' and dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ')
		|";
		Если ВклПроведенныеВсе > 1 Тогда
			ТекстЗапроса = ТекстЗапроса + "
			|and " + ?(ВклПроведенныеВсе = 2, "Жур.Closed>0", "Жур.Closed=0");
		КонецЕсли;
		Если ВклПомеч > 1 Тогда
			ТекстЗапроса = ТекстЗапроса + "
			|and " + ?(ВклПомеч = 2, "Жур.ismark=''", "Жур.ismark='*'");
		КонецЕсли;
		ТекстЗапроса = ТекстЗапроса + " order by Жур.date, Жур.time, Жур.iddoc";
		Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
		Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
		Счетчик = 100;
		Т = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
		Т.ВыбратьСтроки();
		Пока Т.ПолучитьСтроку() = 1 Цикл
			Если Счетчик = 0 Тогда
				Обновить = 1;
				Счетчик = 100;
			Иначе
				Счетчик = Счетчик - 1;
				Обновить = 0;
			КонецЕсли;
			Если ДобавлятьСсылки = 1 Тогда
				ДобавитьОбъектСВложеннымиДанными(Т.Док, 12, Обновить);
			Иначе
				ДобавитьОбъектСПроверкой(Т.Док, 12, Обновить);
			КонецЕсли;
		КонецЦикла;
		ТабПоле.ОбновитьСтроки();
	Иначе
		//Переспросить о выгрузке всех доков
		Если Вопрос("Отказаться от добавления документов?
		|Нет = Выбрать все", 4, 180) = 7
		Тогда
			Запрос = глОлеДБ.СоздатьКоманду();
			ТекстЗапроса = "
			|select
			|    Жур.iddocdef + Жур.iddoc as [Док $Документ]
			|from 1sjourn Жур
			|where (dtos(Жур.date)+Жур.time+Жур.iddoc between dtos(:НачДата~~)+'	'+'	   ' and dtos(:КонДата~~)+'ZZZZZZ'+'ZZZZZZZZZ')
			|";
			Если ВклПроведенныеВсе > 1 Тогда
				ТекстЗапроса = ТекстЗапроса + "
				|and " + ?(ВклПроведенныеВсе = 2, "Жур.Closed>0", "Жур.Closed=0");
			КонецЕсли;
			Если ВклПомеч > 1 Тогда
				ТекстЗапроса = ТекстЗапроса + "
				|and " + ?(ВклПомеч = 2, "Жур.ismark=''", "Жур.ismark='*'");
			КонецЕсли;
			ТекстЗапроса = ТекстЗапроса + " order by Жур.date, Жур.time, Жур.iddoc";
			Запрос.УстановитьТекстовыйПараметр("НачДата", НачДата);
			Запрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
			Счетчик = 100;
			Т = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
			Т.ВыбратьСтроки();
			Пока Т.ПолучитьСтроку() = 1 Цикл
			Если Счетчик = 0 Тогда
				Обновить = 1;
				Счетчик = 100;
			Иначе
				Счетчик = Счетчик - 1;
				Обновить = 0;
			КонецЕсли;
				Если ДобавлятьСсылки = 1 Тогда
					ДобавитьОбъектСВложеннымиДанными(Т.Док, 12, Обновить);
				Иначе
					ДобавитьОбъектСПроверкой(Т.Док, 12, Обновить);
				КонецЕсли;
			КонецЦикла;
			ТабПоле.ОбновитьСтроки();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры // ДобавитьДокументы 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Групповая обработка в 1sqlite
Ответ #12 - 13. Января 2012 :: 01:58
Печать  
Предыдущее сообщение можно игнорировать. Анализ логики показал, что ее можно сильно упросить, совсем уйдя от переборов.
Точнее не так: переборы будут нужны только для формирования sql-запросов, которые уже будут проводить и анализ зависимостей и сам перенос.

Но возникает вопрос: Как в 1sqlite выполнить несколько insert'ов для одной строки select'а?

Вопрос звучит не совсем понятно. Хочу сделать что-то аналогичное FireBird'ному "for select", т.е. что-то типа
Код
Выбрать все
declare variable f1 varchar(9);
declare variable f2 varchar(9);
for select f1, f2 from t0 into f1, f2 do begin
insert into t1 values(f1);
insert into t1 values(f2);
end 

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

P.S.: Думаю, не надо пояснять, почему именно 1sqlite, а не OLEDBData с VFPOLEDB: индексы 1С такие "умные", что задача построения запроса с попаданием на них с учетом наличия пустых полей и полей с нефильтруемыми значениями для меня оказалась слишком сложной.
Самый простой пример: запрос переноса непериодических констант выполняется 2 минуты, а запрос переноса всей периодики, включая константы, - чуть более 10 секунд, а причина в том, что в первом случае нет условия на дату (пробовал ставить < и is null, но это не повлияло), и дополнительно есть условие IN, которого нет во втором случае.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
1С выпадает в осадок при попытке выполнения запроса 1sqlite
Ответ #13 - 13. Января 2012 :: 03:55
Печать  
Очередная проблема: 1С выпадает в осадок при попытке выполнения запроса
Код
Выбрать все
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 < :ДатаСвертки)) 

Предварительно был выполнен запрос: "CREATE TEMP TABLE tmp_docs(dt varchar(4), dc varchar(9))".
Выборка без вставки проходит на ура. Проблема именно при вставке ... помогите вылечить!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #14 - 13. Января 2012 :: 04:41
Печать  
Не ясно только, как тебе вообще 1sqlite для этой цели поможет - он ведь умеет инсертить только в свои таблички, созданные в sqllite базе.

http://www.sqlite.org/lang_insert.html
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #15 - 13. Января 2012 :: 05:01
Печать  
Таким способом я хотел только получить список документов, на которые есть ссылки. Потом список уже использовать при переносе с помощью VFPOLEDB.

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #16 - 13. Января 2012 :: 06:11
Печать  
Всё равно не ясно..
Ну получишь ты некоторую табличку в sqllite - базе.
Дальше то что с ней что делать ?!
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #17 - 13. Января 2012 :: 06:17
Печать  
Через список перегружу в запросы по переносу данных.
Сейчас сделал простым селектом и заплонением списка, но это всяко медленнее, чем если бы работал вариант с INSERT FROM или SELECT INTO...

Я честно украл твою логику и развиваю ее дальше. Как закончу - покажу, что получилось. У тебя не все предусмотрено, в частности блобы. И проверка зависимостей перебором - это очень долго. Но идея гениальная!
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #18 - 13. Января 2012 :: 06:29
Печать  
На вот, пример на селект..
Один хрен не догоняю, зачем тебе временная табличка в sqllite базе.
Как ты её потом в дбф файлик запихнешь ?
Код
Выбрать все
//======================================================================
Процедура Сформировать()
	Попытка
		база = СоздатьОбъект("SQLiteBase");
	Исключение
		ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
		база = СоздатьОбъект("SQLiteBase");
	КонецПопытки;
    Если ФС.СуществуетФайл(КаталогИБ()+"ExtForms\")=0 Тогда
	  ФС.СоздатьКаталог(КаталогИБ()+"ExtForms\");
    КонецЕсли;
    Если ФС.СуществуетФайл(КаталогИБ()+"ExtForms\DB_SQLite\")=0 Тогда
	  ФС.СоздатьКаталог(КаталогИБ()+"ExtForms\DB_SQLite\");
    КонецЕсли;
    ИмяБД = КаталогИБ()+"ExtForms\DB_SQLite\baza.db3";
    база.Открыть(ИмяБД);
    запросSQLLite = база.НовыйЗапрос();
    запросSQLLite.ВыполнитьЗапрос("PRAGMA journal_mode=WAL");
    //запросSQLLite.ВыполнитьЗапрос("PRAGMA journal_mode=OFF");
    ТекстЗапроса ="
    |Create  table if not EXISTS
    |Тест (
    |   ИД varchar(13) primary key not null,
    |   Объект  TEXT
    |)";
    запросSQLLite.ВыполнитьЗапрос(ТекстЗапроса);

	ТЗ = СоздатьОбъект("ТаблицаЗначений");
	ТЗ.НоваяКолонка("ИД");
	ТЗ.НоваяКолонка("Объект");
	Для к=1 По 10 Цикл
		ТЗ.НоваяСтрока();
		ТЗ.ИД = к;
		ТЗ.Объект = "Вася"+к;
	КонецЦикла;
	база.уложитьТЗ(ТЗ,"Табличка",0);

	ТекстЗапроса = "
	|insert or replace INTO Тест
	|select * from Табличка
    | ";

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

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

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

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

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



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #19 - 13. Января 2012 :: 06:31
Печать  
Dmitry The Wing писал(а) 13. Января 2012 :: 06:17:
Через список перегружу в запросы по переносу данных.
Но идея гениальная!


Идея не совсем моя, я её скоммуниздил у МОД-а, слегка модифицировав.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #20 - 13. Января 2012 :: 07:15
Печать  
я так и не понял, почему у меня не работает такой запрос ... может что-то в самой реализации движка или его версии?

селект работает, а селект с инсертом - нет  Плачущий

Eprst писал(а) 13. Января 2012 :: 06:29:
Как ты её потом в дбф файлик запихнешь ?
Получу запросом и уложу список объектов. подразумевалось, что заполнение таблички запросом будет быстрее, чем перебором результатов нескольких запросов и заполнение в цикле.
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #21 - 13. Января 2012 :: 07:24
Печать  
почитай как делается команда INSERT в sqlite для нескольких строк. она в значительное степени отличается от sql.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #22 - 13. Января 2012 :: 07:28
Печать  
ziflex писал(а) 13. Января 2012 :: 07:24:
почитай как делается команда INSERT в sqlite для нескольких строк. она в значительное степени отличается от sql.

Да ничем она там не отличается..
Единственное, в скуле нет insert or replace, а так, синтаксис почти один в один.

Да и.. выше я пример привел инсерта в табличку из запроса к другой табличке
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #23 - 13. Января 2012 :: 07:31
Печать  
не буду говорить о том варианте, какой он делает. но если заносить запросом построчно - то там нужно делать через UNION каждую следующую строку...

Пример:
Код
Выбрать все
 INSERT INTO 'tablename'
SELECT
'data1' AS 'column1',
'data2' AS 'column2'
UNION SELECT 'data3', 'data4'
UNION SELECT 'data5', 'data6'
UNION SELECT 'data7', 'data8'

 



http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #24 - 13. Января 2012 :: 07:36
Печать  
Dmitry The Wing писал(а) 13. Января 2012 :: 07:15:
я так и не понял, почему у меня не работает такой запрос ... может что-то в самой реализации движка или его версии?

селект работает, а селект с инсертом - нет  Плачущий



Я ж тебе дал пример inserta c select :

Код
Выбрать все
insert or replace INTO Тест select * from Табличка 




ЗЫ: а в твоём запросе второй иннер джоин к журналу - вообще лишний.
+ воткнуть либо галку быстрая обработка движений, либо установить отбор на измерении, и тогда присоединять журнал вообще не надо будет.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #25 - 13. Января 2012 :: 07:39
Печать  
ziflex писал(а) 13. Января 2012 :: 07:31:
не буду говорить о том варианте, какой он делает. но если заносить запросом построчно - то там нужно делать через UNION каждую следующую строку...



А зачем такие сложности ?
И нафига там select в этом запросе?, кода всё и так можно перечислить в values ?
  
Наверх
 
IP записан
 
ziflex
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 76
Местоположение: Владивосток
Зарегистрирован: 05. Мая 2011
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #26 - 13. Января 2012 :: 07:46
Печать  
Этот вопрос не ко мне а к разработчикам sqlite. Как в MS SQL оно не работает.
Я уже сталкивался с подобной ситуацией, когда необходимо было одним запросом занести несколько строк.  
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #27 - 13. Января 2012 :: 07:53
Печать  
ziflex писал(а) 13. Января 2012 :: 07:46:
Этот вопрос не ко мне а к разработчикам sqlite. Как в MS SQL оно не работает.
Я уже сталкивался с подобной ситуацией, когда необходимо было одним запросом занести несколько строк.  


Дык в скуле аналогично, там тока с 2005 появилась возможность сразу пихать несколько строк в 1 запросе сразу в values

Тока автору это не нужно, ему тупо select из другой таблички и привет, все строки сразу..ну мот фильтр наложит.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #28 - 13. Января 2012 :: 07:57
Печать  
Если нужны конкретные поля, то так:
Код
Выбрать все
	|insert or replace INTO Тест ('ИД','Объект')
	|  select ИД,Объект from Табличка 

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #29 - 13. Января 2012 :: 08:00
Печать  
Eprst писал(а) 13. Января 2012 :: 07:36:
Dmitry The Wing писал(а) 13. Января 2012 :: 07:15:
я так и не понял, почему у меня не работает такой запрос ... может что-то в самой реализации движка или его версии?
селект работает, а селект с инсертом - нет  Плачущий
Я ж тебе дал пример inserta c select :
Код
Выбрать все
insert or replace INTO Тест select * from Табличка 

В том-то и непонятки, что мой запрос построен по тому же принципу, но не работает, точнее 1С крашится... причем в 100% случаев. А без инсерта ровно в 0%!

Eprst писал(а) 13. Января 2012 :: 07:36:
ЗЫ: а в твоём запросе второй иннер джоин к журналу - вообще лишний.
Первый журнал джойнится для проверки, что док новый.
Второй журнал джойнится по реквизиту и проверка идет на то, чтобы док по ссылке был старый.
Т.е. он никак не может быть лишним...

Суть в том, что для старых доков переносится только запись журнала, а для новых все реквизиты,  движения, проводки и периодика.
  
Наверх
 
IP записан
 
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 записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Свертка файловой ПУБ с использованием 1sqlite
Ответ #45 - 16. Января 2012 :: 07:37
Печать  
Eprst писал(а) 16. Января 2012 :: 06:14:
Всё работает, проверяй свой синтаксис, особенно типизацию, типа [d]
Нашел я причину: крашится перестает, если из условий убрать id2str.
Походу, решение есть: получить отдельно значение id2str, а потом подставлять его параметром.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #46 - 16. Января 2012 :: 07:46
Печать  
Dmitry The Wing писал(а) 16. Января 2012 :: 07:37:
Eprst писал(а) 16. Января 2012 :: 06:14:
Всё работает, проверяй свой синтаксис, особенно типизацию, типа [d]
Нашел я причину: крашится перестает, если из условий убрать id2str.
Походу, решение есть: получить отдельно значение id2str, а потом подставлять его параметром.


Проверил, ничего не падает и всё так же работает и с функцией
id2str

ЗЫ: у тебя версия 1sqlite какая хоть ?
ЗЫЫ: у меня 1.0.2.4, если что

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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Свертка файловой ПУБ с использованием 1sqlite
Ответ #47 - 16. Января 2012 :: 08:13
Печать  
Eprst писал(а) 16. Января 2012 :: 07:46:
Проверил, ничего не падает и всё так же работает и с функцией
id2str

ЗЫ: у тебя версия 1sqlite какая хоть ?
ЗЫЫ: у меня 1.0.2.4, если что
Версия та же. Замена функции на значение не помогла. В общем, оно падает только при полном условии на (дата и время или дата). Если я убираю одну из скобок, то падать перестает.... буду экспериментировать ... сначлаа попробую скобками поиграться...

Проблема выяснена методом научного тыка: В этом запросе все работает в двух случаях:
  • Запрос без инсерта
  • Запрос без OR в условиях джойнов
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #48 - 16. Января 2012 :: 09:08
Печать  
У меня работает во всех перечисленных способах.

Единственное, OR в условиях джойнов - это полный ПЭ ( запрос долго, но выполняется).
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Свертка файловой 1С: общий вопрос
Ответ #49 - 17. Января 2012 :: 04:42
Печать  
По свертке: переношу записи журнала, шапки, строки, движения, операции, проводки, блобы.
А надо ли переносить записи из таблицы 1SCRDOC?
Или 1С сама заполнит при проверке?
Без проверки и пересчета же все равно не обойтись...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #50 - 17. Января 2012 :: 06:12
Печать  
Если будешь делать ТиИ, то не нужно - оно само слепит эту табличку.
А так, если грамотно слепишь перенос, то в ТиИ нет необходимости.
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #51 - 18. Января 2012 :: 02:58
Печать  
1sqlite не справилась с тем запросом... запрос должен был вернуть примерно 5 тысяч строк. За сутки он так и не выполнился...
Пришлось сильно упростить логику (разбить на 2 запроса) и оно стало быстро шуршать:
  • Сначала получаю только реквизиты новых документов
  • Затем проверяю что эти реквизиты ссылаются именно на старые документы.
С такими упрощениями запросы успешно выполнились менее, чем за секунду.
Т.е. теперь у меня две временные таблицы. Первая для ссылок из реквизитов новых, которая чистится перед каждым новым реквизитом, а вторая - для итоговых документов, утовлетворяющих требованиям "старости".
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Свертка файловой ПУБ с использованием 1sqlite - общий принцип.
Ответ #53 - 19. Января 2012 :: 03:14
Печать  
Eprst писал(а) 18. Января 2012 :: 05:10:
Я всё равно не понимаю, зачем тебе всё это. И как ты это будешь использовать для переноса.
Закончу, выложу, но в двух словах порядок следующий:
  • Копируется папка базы.
  • В копии очищаются все dbf.
  • В оригинале формируются двойные бух.итоги (сначала все в ноль на 23:59:50, а потом восстановление на 23:59:59). - около 45 сек.
  • По тому же принципу формируются остатки. - около двух часов.
  • Копирование всех справочников методом INSERT INTO '" + ПутьКБазе2 + идСправ + "' SELECT * FROM '" + КаталогИБ() + идСправ + "'
    Также копируются и блобы для всех реквизитов - все вместе у меня заняло меньше 15 сек.
  • Копирование непериодических констант по списку (почти 2 минуты для 114 констант - не попадаю в индекс)
  • Периодика:
    • Фиксация периодических констант методом "Константа." + ИмяКонстанты + ".Установить(ЗначениеИзСтрокиВнутр(""" + ЗначениеДаты + """), Константа." + ИмяКонстанты + ".Получить(ЗначениеИзСтрокиВнутр(""" + ЗначениеДаты + """)));"
    • Аналогичная фиксация периодики, у которой ИзменяетсяДокументами = 0.
    • Формирование документов фиксации периодики с ИзменяетсяДокументами = 1.
    (11,5 часов)
  • Копирование значений периодических констант и ручной периодики для нового периода по условию date >= :ДатаСвертки~~ AND docid = $ПустойИД (операция занимает чуть больше 10 сек.)
  • Выявление старых документов, ссылки на которые имеются в переносимом периоде - 2 часа. (у меня получилось около 50 тысяч доков - с ними потом еще разобраться надо, т.к. ссылки то есть, но многие из них нафик никому не надо...)
  • Перенос старых документов - только записи журнала с последующим обнулением флага closed - 2 минуты.
  • Перенос новых документов со всеми реквизитами, проводками, движениями и периодикой - 24 минуты.
  • Тестирование и исправление ИБ - выполнялось ночью, потому не знаю длительность, но максимально могло занять только 12 часов...
Для выполнения выделенного и требовался тот жуткий зарпос, который так и не получилось выполнить...
Последний пункт еще не выполнялся, потому время не назову, но думаю, что весь процесс должен уложиться в сутки или чуть дольше.
« Последняя редакция: 24. Января 2012 :: 09:29 - Dmitry The Wing »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #55 - 20. Января 2012 :: 06:06
Печать  
Eprst писал(а) 20. Января 2012 :: 05:42:
Имхо, в разы быстрее вырезать в базе лишнее, чем заниматься переносом нужного.
Эта фраза не верна, когда лишнего в базе больше, чем переносимого... мой предшественник не смог свернуть предыдущие пару лет + только в переносимом периоде я запретитл использовать документы с количеством строк > 9999, а это огроменные проблемы с индексами ...
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



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


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Свертка файловой ПУБ с использованием 1sqlite
Ответ #57 - 20. Января 2012 :: 06:45
Печать  
Eprst писал(а) 20. Января 2012 :: 06:37:
Не верю..
Базу в 20гигов на дбф свернул за 2 часа всю.
с отрезанием лишнего прямым запросом.
В том числе, с оставлением всей нужной аналитики, а не просто, кастрацией всего и вся.
Объем базы - не показатель (пояснять?) ... и если вспомнить, что у меня 11 часов длится только фиксация периодики ... а от этого уж никак нельзя отказаться хоть при переносе, хоть при свертке ...
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать