Переключение на Главную Страницу Страницы: 1 ... 75 76 [77] 78 79  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 466975 )
zelenprog
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 42
Зарегистрирован: 03. Июня 2022
Пол: Мужской
Re: 1sqlite
Ответ #1140 - 28. Июня 2023 :: 14:30
Печать  
Arbuz писал(а) 28. Июня 2023 :: 14:21:
Не задавай длину строки в НоваяКолонка(), например.

Если не задавать длину строки, то при записи в sqlite-базу все строки обрезаются.

Как я понял, если явно в ТЗ не указать длину строки, sqlite-база не знает какой длины надо делать поле, и устанавливает какую-то стандартную ширину поля. И некоторые строки в это поле не помещаются.
Поэтому мне пришлось явно в ТЗ указывать длину.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1141 - 29. Июня 2023 :: 10:58
Печать  
zelenprog писал(а) 28. Июня 2023 :: 14:30:
Если не задавать длину строки, то при записи в sqlite-базу все строки обрезаются.

Как я понял, если явно в ТЗ не указать длину строки, sqlite-база не знает какой длины надо делать поле, и устанавливает какую-то стандартную ширину поля. И некоторые строки в это поле не помещаются.
Поэтому мне пришлось явно в ТЗ указывать длину.

Странновато... не должно резать.
Разумеется проверял на своей сборке.
Не режутся, но надо типизировать колонку как "Строка", можно без указания длины строки, тогда
Запихивать в эту колонку нужно именно строку, а не что-то еще.
Если вообще не типизировать, то выгрузится как "S"+Строка это типизация :Неопределенный (неудобно потом работать будет, но можно).

А зачем тз пихать? Не проще ли insert from select использовать?
Или у тебя сборщик зависимостей, типа как в КД?
Тогда это разумно, но я в сборщик зависимостей добавлял бы только id/ТекущийЭлемент, а потом запросом все остальное вытягивал.
Вариантов работы еще много можно придумать разных...
  
Наверх
www  
IP записан
 
zelenprog
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 42
Зарегистрирован: 03. Июня 2022
Пол: Мужской
Re: 1sqlite
Ответ #1142 - 29. Июня 2023 :: 13:54
Печать  
Djelf писал(а) 29. Июня 2023 :: 10:58:
Странновато... не должно резать.
Разумеется проверял на своей сборке.
Не режутся, но надо типизировать колонку как "Строка", можно без указания длины строки

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

Djelf писал(а) 29. Июня 2023 :: 10:58:
А зачем тз пихать? Не проще ли insert from select использовать?

Привык с ИТ работать. Получаю запросом данные, затем выгружаю результат в ИТ.
Обрабатываю ИТ как мне надо, некоторые колонки добавляются, их значения формируются.
А затем записываю в файл выгрузки.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1143 - 04. Июля 2023 :: 12:05
Печать  
Не помню такого решения в наших темах по sqlite.
Тэг: "Как соединить один справочник к нескольким типам документов"
Джойнить например справочник контрагенты несколько раз, к разным типам документов замутняет и раздувает код, через case не работает (за один шаг, без вложенных запросов), это напрягает, нашел решение через IIF.
Оставлю рабочий пример здесь, для дальнейших идей и поисковиковых роботов.
Код (SQL)
Выбрать все
SELECT
	ОстаткиТМЦ.Номенклатура	 [Номенклатура $Справочник.Номенклатура]
	,ОстаткиТМЦ.Количество	 [Количество $Число.12.3]
	,Контрагенты.ID [Контрагент :Справочник.Контрагенты]
	,ОстаткиТМЦ.IDDOCDEF||ОстаткиТМЦ.IDDOC [Документ :Документ]
FROM Регистр_ОстаткиТМЦ AS ОстаткиТМЦ
LEFT JOIN Документ_Реализация AS Реализация
	ON ОстаткиТМЦ.IDDOCDEF=:ВидДокумента.Реализация AND Реализация.IDDOC=ОстаткиТМЦ.IDDOC
LEFT JOIN Документ_ПоступлениеТМЦ AS Поступление
	ON ОстаткиТМЦ.IDDOCDEF=:ВидДокумента.ПоступлениеТМЦ AND Поступление.IDDOC=ОстаткиТМЦ.IDDOC
LEFT JOIN Справочник_Контрагенты AS Контрагенты
	ON Контрагенты.ID =
	IIF(ОстаткиТМЦ.IDDOCDEF=:ВидДокумента.Реализация,Реализация.Контрагент,
	IIF(ОстаткиТМЦ.IDDOCDEF=:ВидДокумента.ПоступлениеТМЦ,Поступление.Контрагент,
	NULL))
WHERE ОстаткиТМЦ.DATE BETWEEN :НачДата AND :КонДата 


P.S. Не забывайте null в конце, либо что-то типа 'НеНашелся', или что-то предопределенное. И про количество скобок в конце iif тоже забывать не стоит.
« Последняя редакция: 05. Июля 2023 :: 12:01 - Djelf »  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 06. Февраля 2019
Re: 1sqlite
Ответ #1144 - 04. Июля 2023 :: 13:03
Печать  
Djelf писал(а) 04. Июля 2023 :: 12:05:
Не помню такого решения в наших темах по sqlite.
Тэг: "Как соединить один справочник к нескольким типам документов"
Джойнить например справочник контрагенты несколько раз, к разным типам документов замутняет и раздувает код, через case не работает, решение через IIF нашлось.
Оставлю рабочее решение здесь, для дальнейших идей и поисковиковых роботов.

Я бы не догадался и джойнил контрагентов к подзапросу  в котором поля контрагентов собирал бы через case, так-то оно гораздо оптимальней Очень довольный

И да, чем отличается draft4?
  
Наверх
 
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 06. Февраля 2019
Re: 1sqlite
Ответ #1145 - 04. Июля 2023 :: 13:26
Печать  
Вот, немного не то, но я столкнувшись с похожей задачей соединения к нескольким таблицам документов решал задачу перевода чорного запроса из документа списание типовой ТиС.

оригинал:
Код (SQL)
Выбрать все
//	ТекстЗапроса = "//{{ЗАПРОС(ПредСписание)
//	|Период с '01.01.1980' по ДатаДок;
//	|Без итогов;
//	|Основание = Документ.СписаниеТМЦ.ДокОснование, Документ.Реализация.ДокОснование, Документ.ОтчетККМ.ДокОснование, Документ.РеализацияРозница.ДокОснование;
//	|Товар = Документ.СписаниеТМЦ.Номенклатура, Документ.Реализация.Номенклатура, Документ.ОтчетККМ.Номенклатура, Документ.РеализацияРозница.Номенклатура;
//	|Колво = Документ.СписаниеТМЦ.Количество, Документ.Реализация.Количество, Документ.ОтчетККМ.Количество, Документ.РеализацияРозница.Количество;
//	|Коэфф = Документ.СписаниеТМЦ.Коэффициент, Документ.Реализация.Коэффициент, Документ.ОтчетККМ.Коэффициент, Документ.РеализацияРозница.Коэффициент;
//	|Функция ВсегоКолво = Сумма(Колво);
//	|Группировка Товар без групп;
//	|Группировка Коэфф;
//	|Условие(Основание = ДокОснование);
//	|"//}}ЗАПРОС
 



прямой:
Код (SQL)
Выбрать все
	--EXPLAIN QUERY PLAN
	SELECT
	--	Товары.Документ [Основание :Документ]
		Товары.Товар [Товар :Справочник.Номенклатура]
		,Товары.Коэфф
		,SUM(Товары.Колво) ВсегоКолво
	FROM (
		SELECT
	--		Документы.Документ_вид||Документы.Документ Документ
			CASE
				WHEN СписаниеТМЦ.Номенклатура NOTNULL THEN СписаниеТМЦ.Номенклатура
				WHEN Реализация.Номенклатура NOTNULL THEN Реализация.Номенклатура
				WHEN ОтчетККМ.Номенклатура NOTNULL THEN ОтчетККМ.Номенклатура
				WHEN РеализацияРозница.Номенклатура NOTNULL THEN РеализацияРозница.Номенклатура
			END Товар
			,CASE
				WHEN СписаниеТМЦ.Номенклатура NOTNULL THEN СписаниеТМЦ.Количество
				WHEN Реализация.Номенклатура NOTNULL THEN Реализация.Количество
				WHEN ОтчетККМ.Номенклатура NOTNULL THEN ОтчетККМ.Количество
				WHEN РеализацияРозница.Номенклатура NOTNULL THEN РеализацияРозница.Количество
			END Колво
			,CASE
				WHEN СписаниеТМЦ.Номенклатура NOTNULL THEN СписаниеТМЦ.Коэффициент
				WHEN Реализация.Номенклатура NOTNULL THEN Реализация.Коэффициент
				WHEN ОтчетККМ.Номенклатура NOTNULL THEN ОтчетККМ.Коэффициент
				WHEN РеализацияРозница.Номенклатура NOTNULL THEN РеализацияРозница.Коэффициент
			END Коэфф
		FROM (
			SELECT
				Ссылки.CHILDID Документ
	--			,Журнал.IDDOCDEF Документ_вид
			FROM [__1S_crdoc] Ссылки
			INNER JOIN [Журнал] Журнал ON Ссылки.CHILDID = Журнал.IDDOC
			WHERE TRUE
				AND Ссылки.PARENTVAL = :ДокОснование*
				AND Ссылки.MDID = '   0'
				AND Журнал.IDDOCDEF IN окумента.РеализацияРозница)
				AND Журнал.CLOSED=1
				AND Журнал.DATE <= :ДатаДок
		) Документы
		LEFT JOIN [ДокументСтроки.СписаниеТМЦ] СписаниеТМЦ ON Документы.Документ = СписаниеТМЦ.IDDOC
		LEFT JOIN [ДокументСтроки.Реализация] Реализация ON Документы.Документ = Реализация.IDDOC
		LEFT JOIN [ДокументСтроки.ОтчетККМ] ОтчетККМ ON Документы.Документ = ОтчетККМ.IDDOC
		LEFT JOIN [ДокументСтроки.РеализацияРозница] РеализацияРозница ON Документы.Документ = РеализацияРозница.IDDOC
	) Товары
	GROUP BY Товар, Коэфф
 



В моём случае, правда, первый подзапрос максимально сужает выборку и дальнейшие манипуляции практически не сказываются на объёме и скорости.

Ускорение, кстати, получилось где-то в 8000 раз! Четыре, мать его, порядка.

ЗЫ: в IN там :ВидДокумента.СписаниеТМЦ,
:ВидДокумента.Реализация,
:ВидДокумента.ОтчетККМ,
:ВидДокумента.РеализацияРозница
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1146 - 04. Июля 2023 :: 20:21
Печать  
Arbuz писал(а) 04. Июля 2023 :: 13:03:
Djelf писал(а) 04. Июля 2023 :: 12:05:
Не помню такого решения в наших темах по sqlite.
Тэг: "Как соединить один справочник к нескольким типам документов"
Джойнить например справочник контрагенты несколько раз, к разным типам документов замутняет и раздувает код, через case не работает, решение через IIF нашлось.
Оставлю рабочее решение здесь, для дальнейших идей и поисковиковых роботов.

Я бы не догадался и джойнил контрагентов к подзапросу  в котором поля контрагентов собирал бы через case, так-то оно гораздо оптимальней Очень довольный

И да, чем отличается draft4?


Так и я так джойнил, но мне в where нужно было их отфильтровать, а заворачивать в подзапрос внезапно стало влом  Смех

draft4 с фиксом для глюка sqlite odbc: https://forum.mista.ru/topic.php?id=888068 это безопасно, это ничего не испортит в обычной работе sqlite.

+При укладке ТаблицыЗначений в том случае, если типизация колонки Строка и указана ее Длина, колонка таблицы в sqlite будет типироваться как varchar(длина), что позволяет sqlite odbc http://www.ch-werner.de/sqliteodbc/ корректно обрабатывать строки длиной более, или менее 255 символов.

P.S. могу и остальное так типизировать (даты, числа), но ВК от Орефкова для 8ки https://github.com/orefkov/v8sqlite таких ограничений не имеет, а с vbs и т.п. нам уже не по пути (через sqlite odbc драйвер)  Круглые глаза
« Последняя редакция: 05. Июля 2023 :: 20:19 - Djelf »  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 06. Февраля 2019
Re: 1sqlite
Ответ #1147 - 06. Июля 2023 :: 09:12
Печать  
Djelf писал(а) 04. Июля 2023 :: 20:21:
P.S. могу и остальное так типизировать (даты, числа), но ВК от Орефкова для 8ки https://github.com/orefkov/v8sqlite таких ограничений не имеет, а с vbs и т.п. нам уже не по пути (через sqlite odbc драйвер)  Круглые глаза


Ну, я так понял, что в крайнем случае такой необходимости можно через ALTER TABLE добавить колонку с нужной типизацией и UPDATE'ом присвоить значения из нетипизированной (неверно типизированной) колонки?
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1148 - 06. Июля 2023 :: 09:33
Печать  
Arbuz писал(а) 06. Июля 2023 :: 09:12:
Djelf писал(а) 04. Июля 2023 :: 20:21:
P.S. могу и остальное так типизировать (даты, числа), но ВК от Орефкова для 8ки https://github.com/orefkov/v8sqlite таких ограничений не имеет, а с vbs и т.п. нам уже не по пути (через sqlite odbc драйвер)  Круглые глаза


Ну, я так понял, что в крайнем случае такой необходимости можно через ALTER TABLE добавить колонку с нужной типизацией и UPDATE'ом присвоить значения из нетипизированной (неверно типизированной) колонки?

Да, конечно, но это некоторое замедление работы, в зависимости от объема данных. Еще и формат даты внутри колонки надо менять...
В ALTER TABLE RENAME (пока) отсутствует возможность изменить тип колонки.
Но можно применить хирургию, типа как то так:
Код (SQL)
Выбрать все
PRAGMA writable_schema=ON; /* разрешаем хирургию */
UPDATE sqlite_master set sql  = 'TABLE [t]([Name] VARCHAR(1000) NOT NULL)';
PRAGMA [database.]schema_version =  [database.]schema_version+1; /* обязательно, иначе база будет восприниматья испорченой */
PRAGMA writable_schema=OFF; /* запрещаем хирургию */ 


Возможно потом ANALYZE потребуется... не уверен, возможно что пациент не выживет  Нерешительный
« Последняя редакция: 06. Июля 2023 :: 12:34 - Djelf »  
Наверх
www  
IP записан
 
zelenprog
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 42
Зарегистрирован: 03. Июня 2022
Пол: Мужской
Re: 1sqlite
Ответ #1149 - 31. Июля 2023 :: 09:20
Печать  
Случайно при записи в sqlite-базу неправильно указал имя файла: вернее вообще не указал имя файла, только имя каталога:

Код
Выбрать все
пИмяФайлаВыгрузки = "C:\Выгрузка\";
База = СоздатьОбъект("SQLiteBase");
База.Открыть(пИмяФайлаВыгрузки); 



При выполнении этого кода 1С-ка просто закрывается. Исключение не перехватывается.
Можно ли сделать какой-то код возврата или сообщение об ошибке в этой ситуации? Или выбрасывать исключение?
  
Наверх
 
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 06. Февраля 2019
Re: 1sqlite
Ответ #1150 - 31. Июля 2023 :: 11:20
Печать  
И гуарддог бы по переполнению памяти  Круглые глаза хотя у меня этого давно не случалось
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1151 - 01. Августа 2023 :: 11:27
Печать  
zelenprog писал(а) 31. Июля 2023 :: 09:20:
Случайно при записи в sqlite-базу неправильно указал имя файла: вернее вообще не указал имя файла, только имя каталога:

Код
Выбрать все
пИмяФайлаВыгрузки = "C:\Выгрузка\";
База = СоздатьОбъект("SQLiteBase");
База.Открыть(пИмяФайлаВыгрузки); 



При выполнении этого кода 1С-ка просто закрывается. Исключение не перехватывается.
Можно ли сделать какой-то код возврата или сообщение об ошибке в этой ситуации? Или выбрасывать исключение?


Это легко, будет исключение, забирай/проверяй: https://cloud.mail.ru/public/YMuG/2Vi29qxxV
  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1152 - 01. Августа 2023 :: 11:44
Печать  
Arbuz писал(а) 31. Июля 2023 :: 11:20:
И гуарддог бы по переполнению памяти  Круглые глаза хотя у меня этого давно не случалось


И еще гуарддог по времени выполнения! Да!
Но чуть позже.

Я начинал работать в этом направлении, каллбэк в sqlite есть.
Начинал с вызова процедуры 1С при выполнении запроса для вывода непонятно чего.
Но непонятно зачем замедлять sqlite выводом сообщений процедуры 1с?
Можно же в формате printf выдавать сообщения...
1С может быть пропатчена на 4гига, лимиты разные, не уверен что смогу изнутри ВК получить лимиты и сама 1С что-то сжирает, но можно сделать ОграничениеПотребленияПамяти(ВБайтах) и ОграничениеВремениЗапроса(ВСекундах).
Гарантировано оно работать не будет, т.к. каллбэк в sqlite сейчас вроде не работает с определенным тиком процессора, но все лучше чем ничего.
Так подойдет?
« Последняя редакция: 01. Августа 2023 :: 13:03 - Djelf »  
Наверх
www  
IP записан
 
Arbuz
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 58
Зарегистрирован: 06. Февраля 2019
Re: 1sqlite
Ответ #1153 - 01. Августа 2023 :: 14:31
Печать  
Djelf писал(а) 01. Августа 2023 :: 11:44:
1С может быть пропатчена на 4гига,

Да, у меня пропатчена.
Djelf писал(а) 01. Августа 2023 :: 11:44:
ОграничениеПотребленияПамяти(ВБайтах) и ОграничениеВремениЗапроса(ВСекундах).
Гарантировано оно работать не будет, т.к. каллбэк в sqlite сейчас вроде не работает с определенным тиком процессора, но все лучше чем ничего.
Так подойдет?

Конечно да!
Работать не будет, в смысле ограничение не точное?
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #1154 - 02. Августа 2023 :: 04:47
Печать  
Arbuz писал(а) 01. Августа 2023 :: 14:31:
Конечно да!
Работать не будет, в смысле ограничение не точное?

Вот оно: https://www.sqlite.org/c3ref/progress_handler.html
Но там написано что он будет вызываться при приблизительном количестве (это мы указываем) инструкций виртуальной машины.
Сильно не исследовал этот вопрос, но предполагаю что некоторые инструкции типа автоматической индексации внутренних таблиц или еще чего-то могут сожрать слишком много памяти или времени, поэтому это не всегда сработает с достаточной точностью.

И видимо не сработает, проверил с опцией компиляции  SQLITE_MAX_MEMORY на CROSS JOIN - фигушки, сжирает все 3.5гига и вылетает.
Уж если оно внутри себя так не все контроллирует, то и в progress_handler не попадет.
p.s. возможно из-за виртуальных таблиц это не контролирруется.

upd: проверил, не попадает и в момент всяких джойнов (внутри себя) замерзает (это одна инструкция видимо), т.е. сделать то можно, но это довольно бысмысленно, особенно при замерзаниях.
« Последняя редакция: 02. Августа 2023 :: 11:51 - Djelf »  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 75 76 [77] 78 79 
ОтправитьПечать