#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
Физически оно как целое число должно хранится. Ты же сам заметил что когда оно строка или дробное ничего странного не происходит. Тебе же для перетаскивания данных оно надо? Значит компактность не сильно то и нужна. Кидай строками - не придется голову ломать почему что-то не так.
#10
by Gary417
разлаживать, улаживать... блин пытаюсь объективно вникнуть в обсуждение...немогу... "укладывать", "раскладывать"...и применимо к ИТ эти слова вообще неуместны imho
#12
by FobusVGrunt
метод УложитТЗ(загружает таблицу значений в базу данных, как таблицу базы данных), объекта SQLiteBase, не знаю этот метод укладывает ИТ, если укладывает, то можно проверить в ИТ добавить числовое целое значение больше 2 147 483 647 или меньше (-2 147 483 648), а потом запросом, достать данные и посмотреть вернет обратно правильные значения. В ИТ, колонки по-моему без типов задаются, но думаю получится также как и с ТЗ. Пробовал просто INSERT добавлять, назад тоже не правильно выдает.
#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
#20
by FobusVGrunt
Я как то тестировал цикл построчно Insert с УложитьТЗ, там разница была в раз 100 быстрей по скорости по этому и поднял вопрос на форуме:
#22
by FobusVGrunt
не в моем случаи мне кажется, лучше при укладки тип задавать "Строка", меньше изменений делать. У меня такое применяется, когда нужно периодически добавлять в постоянную таблицу новые строки из другой ТЗ. Удобно когда в транзакции записываешь док или спр, во временную таблицу кидаешь соотвествия ID старой и в новой БД и если успешно завершилась транзакция, то копируются в основную.
#24
by FobusVGrunt
так тут две локальные БД, а запросы на выборку идут к БД в :memory:, а укладываются в локальноную (через ТЗ). Вторая 1С подключается к локальной и берет данные.
#25
by Djelf
Ну а тз то зачем? Напрямую в файл из таблицы 1с или из таблицы в memory (main первая открытая база).
#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, то не будет такой ситуации, даже если само число будет целое правильно?
#31
by FobusVGrunt
Получается для постраховки, нужно через метаданные проверить точность для длинных чисел реквизита и если = 0, то нужно в запросе cast(Реквизит as real) или cast(Реквизит as DOUBLE). Что кстати лучше real или double приводить к типу
#33
by FobusVGrunt
Djelf, а чего если виртуальных таблицах 1С, точность > 0 спасает от этой ситуации, а в ТЗ (ТЗ.НоваяКолонка("Значение","Число",19,2)) не спасает?
#36
by Djelf
+ корректно выдает в 1с целые числа в диапазоне от -9223372036854775808 до 9223372036854775807 + скорость не упала - при выходе за диапазон sqlite все равно будет преобразовывать их в тип float, т.е. ~15 знаков в числе
#38
by FobusVGrunt
Это относится только к подключаемым таблицам 1С? Т.к. "SELECT -2147483648", все равно не работает
#39
by Djelf
Должно работать. Ты точно новую 1sqlite загрузил? SELECT sqlite_version что выдает? p.s. проверил выложенный файл - все ок
#42
by FobusVGrunt
Спасибо, ошибся ни туда кинул, все ОК, работает. Так это версия самой Sqlite или именно сборки под 1С
#43
by Djelf
Это версия движка sqlite. Файл отличить можно по его свойствам "Версия продукта" - "1.0.2.6/3.8.11.1"
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям
Похожие вопросы 1С
- Проблема с методом "ЗначениеУпорядочивания" v7.7
- v7: налоговый учет кассовым методом и методом начисления в Бухгалтерии 8.0
- v7: v7 : НДС при возврате
- v7: Что нужно чтоб подключить ККМ Меркурий 112F к 1с V7 Торговля + склад
- v7: v7.7 премещение элемента справочника
- v7: v8: v7: Кто-нибудь сумел скачать комплект отчетности за I квартал 2007 года
- 1sqlite Проблема с методом УложитьТЗ
- v7: 1С V7.7 в сети
- v7: 1C:V7 starter program (for SQL) - обнаружена ошибка
- v7: Перенос данных Бухгалтерия из v7 в v8
- v7: v7 Перехват глобального события ПриЗаписи() или ОбработкаПроведения()
В этой группе 1С
- Не активна галка Использовать плановую себестоимость
- Вернуть ссылку из формы
- Выгрузить колонку ТЧ и загрузить в ТЗ Кто подскажет, что не так?
- Вывод состояния при изменении варианта отчета
- 1С8.3. Запись данных в Excel файл
- Ошибка сетевого доступа к серверу (10054)
- 1С Документооборот - прикрепленные файлы
- Конвертация .С чего начать изучение?
- Как открыть (выполнить) внешнюю обработку программно ?
- Ошибка SDBL Server 2008
- Настройка двух СКД в одном отчете
- Выгрузка и загрузка данных XML (2.1.8)
- Есть теория, что сервер 1с 8.3 использует только 1 ядро процессора. Так ли это?
- Нужно узнавать долг по Реализации и счет-фактуре в бухгалтерия 8.3 КОРП
- Запретить пользователям 1с вход в базу с чужого компьютера
- Поле объекта недоступно для записи (начдата ) БП 3.0
- Получить число из строки в запросе.
- Печать Qr кода в чеке Fprint55ПТК 1с Розница 1.0
- Структура предприятия в УНФ
- Как сделать чтобы ФабрикаXDTO.ЗаписатьJSON выводил норм. JSON а не в стиле 1с?