v7: Что за проблема в Sqlite с укладкой отрицательных чисел, методом УложитьТЗ? #774403


#0 by FobusVGrunt
Всем привет, а что за беда в Sqlite с выборкой отрицательных чисел, Улаживаю ТЗ-ку в базу Sqlite, с типизированными колонками как число. В самой базе хранится нормально с минусом. Делаю запрос на выборку вместо (-2226062580) получаю (2068904716). Дальше еще интересно, в БД  в ручную убрал минус, выдал запрос нормально  получил правильно(2226062580). Потом опять поставил минус в ручную, начало выбирать правильно (-2226062580). Потом повторно уложил методом УложитьТЗ, опять неправильно. При  укладки колонка в ТЗ (тип Число, 19,2), пробовал. Просто «Число», ничего не помогает
#1 by FobusVGrunt
При выборке тоже перепробовал [... $Число.19.2] и так  [... $Число]. Зашел опять в ручную убрал, поставил минус, выбирает правильно. Дело походу в методе УложитТЗ
#2 by FobusVGrunt
Если при укладки ТЗ, делать тип колонки не число, а строка, а при выборке делать типизацию $Число, тогда нормуль
#3 by Djelf
Дело не совсем в методе уложить тз... Читай тут Сравни SELECT -2226062580 SELECT '-2226062580' SELECT cast(-2226062580 AS double) Это не баг, это фича ;)
#4 by FobusVGrunt
Что-то не совсем понял, физически в таблице лежит правильно (-2226062580), не с 1С в запросе выбирает правильно. Если в ручную пересохранить значение и в 1С начинает правильно выбирать.
#5 by FobusVGrunt
Попробовал в 1С: "SELECT -2147483648 as Сумм,2147483648 as Сумм2,-2147483647 as Сумм3,'-2147483648' as Сумм4,cast(-2147483648 AS double) as Сумм5 ": не в 1С:
#6 by FobusVGrunt
В   видно, что дело в выборке, но по чему если перезаписать значение в таблице БД, начинает работать нормально.
#7 by FobusVGrunt
Djelf, скажи как лучше поступать, когда улаживаешь ТЗ в БД, вместо типа колонки "Число", указывать "Строка". Или преобразовывать при выборке с помощью cast? И я так понимаю с числами <-2 147 483 648 и > 2 147 483 647 (с типом больше long int), в Sqlite надо работать осторожней
#8 by Djelf
Физически оно как целое число должно хранится. Ты же сам заметил что когда оно строка или дробное ничего странного не происходит. Тебе же для перетаскивания данных оно надо? Значит  компактность не сильно то и нужна. Кидай строками - не придется голову ломать почему что-то не так.
#9 by FobusVGrunt
Да для переноса, ок буду улаживать как строки, спасибо
#10 by Gary417
разлаживать, улаживать... блин пытаюсь объективно вникнуть в обсуждение...немогу... "укладывать", "раскладывать"...и применимо к ИТ эти слова вообще неуместны imho
#11 by Gary417
+простите несдержался :)
#12 by FobusVGrunt
метод УложитТЗ(загружает таблицу значений в базу данных, как таблицу базы данных), объекта SQLiteBase, не знаю этот метод укладывает ИТ, если укладывает, то можно проверить в ИТ добавить числовое целое значение   больше 2 147 483 647 или меньше (-2 147 483 648), а потом запросом, достать данные и посмотреть вернет обратно правильные значения. В ИТ, колонки по-моему без типов задаются, но думаю получится также как и с ТЗ. Пробовал просто INSERT добавлять, назад тоже не правильно выдает.
#13 by Ёпрст
Ну не делай уложить тз, делай тупо инсерт, делов-то
#14 by FobusVGrunt
Если в самой таблице БД SQLite, явно не указан тип поля(колонки), то целые меньше -2 147 483 648 и больше 2 147 483 647, при выборке дадут неверный результат. Попробую просто выполнить запрос в 1С "SELECT -2147483648 as сумма" и посмотри что получится
#15 by FobusVGrunt
Если в поле БД не указан явно тип, то и добавление INSERT не помогает. и инсертом одним запросом, можно добавить только одну строку для сборки sqllite по 1С, обсуждалась эта тема: а отдельно инсертом добавить даже 1000 строк, времени потянет просто космос
#16 by Djelf
Медленно! Самое большое что грузил в sqlite это реестр лицензий, удалось выжать 3.5к записей в секунду, это пакетами по 10000 из тз, построчно даже обернув пакета в транзакцию получается медленнее раза в 2. А почему нельзя сразу в sqlite запихивать данные из запроса к 1С минуя тз?
#17 by FobusVGrunt
С одной БД Выгружаю, в другую загружаю. Локальная БД SQLite в роли файла обмена с таблицами соответсвий по внутр ID объектов
#18 by FobusVGrunt
Запросы идут к базе в :memory:, а потом укладываются с помощью ТЗ в локальную БД SQLite
#19 by FobusVGrunt
между :memory: и локальной можно замутить между собой запросы?
#20 by FobusVGrunt
Я как то тестировал цикл построчно Insert с УложитьТЗ, там разница была в раз 100 быстрей по скорости по этому и поднял вопрос на форуме:
#21 by Djelf
Можно вот так выкрутится
#22 by FobusVGrunt
не в моем случаи мне кажется, лучше при укладки тип задавать "Строка", меньше изменений делать. У меня такое применяется, когда нужно периодически добавлять в постоянную таблицу новые строки из другой ТЗ. Удобно когда в транзакции записываешь док или спр, во временную таблицу кидаешь соотвествия ID старой и в новой БД и если успешно завершилась транзакция, то копируются в основную.
#23 by Djelf
Можно и не с одной файловой базой...
#24 by FobusVGrunt
так тут две локальные БД, а запросы на выборку идут к БД в :memory:, а укладываются в локальноную (через ТЗ). Вторая 1С подключается к локальной и берет данные.
#25 by Djelf
Ну а тз то зачем? Напрямую в файл из таблицы 1с или из таблицы в memory (main первая открытая база).
#26 by FobusVGrunt
Не знал, что так можно. Надо будет попробовать.Спасибо за совет!
#27 by FobusVGrunt
Djelf а подключаемые виртуальные таблицы 1С,  у них поля указаны тип или как? не может такой ситуации возникнуть с целым числами -2 147 483 648 и > 2 147 483 647, как описано выше?
#28 by Djelf
Ага, печаль... По быстрому установил тип курс валюты 19.0 и твой магический минус total тот же sum но резльтат гарантийно число
#29 by FobusVGrunt
Да блин беда, тут дело не только в минусе, числа больше 2 147 483 647, тоже получается будет не правильно выдавать.... Если в реквизите указанна точность > 0, то не будет такой ситуации, даже если само число будет целое правильно?
#30 by Djelf
+ C 19.2 проблем нету, все ок.
#31 by FobusVGrunt
Получается для постраховки, нужно через метаданные проверить точность для длинных чисел реквизита и если = 0, то нужно в запросе cast(Реквизит as real) или cast(Реквизит as DOUBLE). Что кстати лучше real или double приводить к типу
#32 by FobusVGrunt
Вроде SQlite юзают не первых год, неужели ни у кого такой проблемы не возникло?
#33 by FobusVGrunt
Djelf, а чего если виртуальных таблицах 1С, точность > 0 спасает от этой ситуации, а в ТЗ (ТЗ.НоваяКолонка("Значение","Число",19,2)) не спасает?
#34 by Djelf
Не спасает потому что так уж там число хранится
#35 by FobusVGrunt
А понятно
#36 by Djelf
+ корректно выдает в 1с целые числа в диапазоне от -9223372036854775808 до 9223372036854775807 + скорость не упала - при выходе за диапазон sqlite все равно будет преобразовывать их в тип float, т.е. ~15 знаков в числе
#37 by FobusVGrunt
О большое спасибо  Djelf!
#38 by FobusVGrunt
Это относится только к подключаемым таблицам 1С? Т.к. "SELECT -2147483648", все равно не работает
#39 by Djelf
Должно работать. Ты точно новую 1sqlite загрузил? SELECT sqlite_version что выдает? p.s. проверил выложенный файл - все ок
#40 by FobusVGrunt
3.7.10
#41 by Djelf
А должно быть 3.8.11.1 т.е. загружаешь старую.
#42 by FobusVGrunt
Спасибо, ошибся ни туда кинул, все ОК, работает. Так это версия самой Sqlite или именно сборки под 1С
#43 by Djelf
Это версия движка sqlite. Файл отличить можно по его свойствам "Версия продукта" - "1.0.2.6/3.8.11.1"
#44 by FobusVGrunt
так может 3.8, уже и Insert поддерживает несколько в одном запросе?
#45 by Djelf
Правильно думаешь. Изменений в движке со времен 3.7.10 огромное количество.
#46 by FobusVGrunt
Отлично, спасибо!
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С