Попытка работы с автономными формами

Автор st.inna, 8 декабря 2023, 11:19

0 Пользователи и 1 гость просматривают эту тему.

economist

#45
JDBC даёт править таблицы нескольким пользователям. У них должны быть RW-права на файл в Linux. Пока один пишет - остальные в тайм-ауте, или одновременно читает 1-4, а 5-й в тайм-ауте. Писать может любой.

В таблицах д.б. первичный ключ.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

st.inna

Целый день бьюсь над одновременным пользованием с JDBC - ничего не выходит.

Еще раз: в сетевой папке лежит файл *.sqlite. К нему подсоединены два разных файла *.odb, которые сохранены в папках home/data на двух компьютерах, которые в свою очередь имеют доступ к сетевой папке, в которой хранится файл *.sqlite. RW-права есть у каждого пользователя. Тесты загрузки драйвера и подключения к базе успешные. На этом этапе правильно? Больше ничего не нужно устанавливать? Вроде самого SQLite, например...

Когда открываю файл *.odb только на одном компьютере и ввожу новую запись в таблицу, то файл *.odb обновляется (изменяется размер и дата сохранения), а файл *.sqlite изменяется только когда закрываю файл *.odb. Т.е. пока не закрою BASE, файл самой БД не обновляется. На двух компах та же история - сохраняются новые данные того пользователя, который первым закрыл BASE.

Вы пишете про "тайм-ауты": это где-то должно настраиваться? Не понятна Ваша фраза "Пока один пишет - остальные в тайм-ауте, или одновременно читает 1-4, а 5-й в тайм-ауте. Писать может любой."  Как тот, кто хочет сохранить свою запись должен понять, что он в этом "тайм-ауте" и ничего не сохранится...

Чайнику ничего не понятно. Данные видят оба пользователя на своих компах - значит соединение с базой есть. Делать операцию внесения новой записи могут оба. Но реальное сохранение внесенных данных в базу только от одного... Никак не могу понять в чем же "многопользовательность"?

economist

Если оба вносят записи - это уже многопольз. режим. Блокировки в JDBC не настраиваются.

Пора опробовать ODBC. Возможно получится  с ограниченной учеткой настроить.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

#48
Что-то тихо в ветке, может сложиться впечатления что исследователи устали.
Похоже, в JDBC-драйвере от Xerial нужно просто смириться с датой вида 20240401

Для вывода дат настоящих и с точками в "нашем" и "ихнем" стиле можно так:
SELECT
strftime('%d%m%Y','now'),
-- as date смысла не имеет, в SQLite только  INTEGER, REAL, TEXT, BLOB
cast(strftime('%Y%m%d','now') as date) as 'true date',
cast(strftime('%Y-%m-%d','now') as text),
cast(strftime('%Y.%m.%d','now') as text),
cast(strftime('%d.%m.%Y','now') as text)
FROM sqlite_master

sqlite_master - это служебная таблица в базах SQLite с именами всех таблиц и их CREATE- определениями. Она тут указана просто потому что она точно есть.

@st.inna, посмотрите на вот этот проект https://prrvchr.github.io/jdbcDriverOOo/ или https://github.com/prrvchr/jdbcDriverOOo/ - с несколькими драйверами к разным БД и совместимостью с Linux. Читайте требования к Java, на свежую не ставится, на требуемую - ок. Дальше не смотрел. Многообещающая штучка.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Тут и расширение подоспело с этим набором jdbc-драйверов, интегрируется в интерфейс LO Base: https://extensions.libreoffice.org/en/extensions/show/27493
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

st.inna

Всем здравствуйте!

Да нет, попытки не прекратились. Я отслеживала выход новой версии драйвера, и как только она вышла, я ее установила. Ровным счетом, НИЧЕГО не изменилось. Как не было многопользовательского режима, так он и не появился. "Один сохраняет, а другие только смотрят" (причем никто не в курсе чьи же данные по итогу сохранятся), для меня не вариант.

Более того, в запросах также ничего не изменилось:

SELECT CASE WHEN "Час" >= 0 AND "Час" < 6
                THEN 'Доброй ночи'
 
         WHEN "Час" >= 6 AND "Час" < 12
          THEN 'Доброе утро'
 
         WHEN "Час" >= 12 AND "Час" < 18
          THEN 'Добрый день'
 
          ELSE 'Добрый вечер' END AS "Часть_суток"
 
    FROM
(SELECT DISTINCT CAST(Strftime('%H', time('now', 'localtime')) AS INTEGER) As "Час"
FROM sqlite_master)

всё также выдает "0", хотя через SQL выполняет правильно.

Так что у меня полное разочарование в SQLite... Возможно, всё дело в том, что у нас не просто Linux, а Astra Linux. Не знаю, но биться с ветряными мельницами уже поднадоело.

economist

#51
На днях сдам проект и потестю сетевой доступ на Linux с JDBC.

Что я понял по датам:
1) Даже с безсерверной SQLite мы имеем два исполнителя запросов
- "сервер" ("прямой" режим с флажком в новых 24+ версиях LO, раньше было классное слово Direct или что-то такое);
- "клиент", когда выполняет запрос Base (кн. [SQL] тоже влияет, но меньше чем "прямой").
Дальше про клиент, то есть редактор Запросов Base c нажатой кн. [SQL]

2) Проблемы именно в "клиенте" с датами. В доке к SQLite написано что типа DATE в ней нет, вместо него TEXT и рекомендация хранить даты в виде псевдо-числа YYYYMMDD или в ISO-формате YYYY-MM-DD (а для форматирования в русские даты работает strftime()). При этом в доках OpenOffice (аж 2003 г. и новее ничего нет), указано что Base сам решает что выводить (YYYYMMDD или YYYY-MM-DD), в зависимости от "контекста вывода" (предположу что это тип столбца целиком строка/число). Контекст оказался в однострочных результатах неуправляем, даже если дописывать буквы через ||"ля" - все равно выводится YYYYMMDD или YYYY (все что после - Base рубит).

Короче, виноват брошенный Base и, немного, JDBC-драйвер от Xerial, который не дает однозначный контекст.

Что делать? Для начала убедимся что всё работает в Конструкторе/редакторе запросов Base, любые части даты и врмени извлекаются как числа, к ним можно прибавлять и сравнивать:
SELECT TIME('now', 'localtime')+1.5 As Час+1.5   # -> 10,5 (9 часов сейчас)

Помимо TIME, время можно взять из кучи похожих функций.

Однако почему-то не заработал CASE WHEN THEN END c этим вполне себе числом 10.5 (и даже просто с 9)

При этом 15 лет у меня на десятках Win-рабочих мест SQLite+LO не вызывала проблем при использовании старого JDBC c SQLite 3.7 по сети на 3-5 чел (сейчас SQLite 3.45 и есть много вкусных функций). Реально не было никаких жалоб (сам я 5 лет как ушел в DS на Python и другие БД). И вот что я вспомнил:

Поначалу были непонятки с датами в ISO (с дефисами), а с YYYYMMDD - все было сразу ОК (целые числа, легко считать сдвиги, скользящие интервалы итд). Во всех странных случаях с SQL в Base можно сделать любое преобразование внутри SQLite (на "сервере"), путем однократного создания Представления/View. Костыль? - нет, штатное использование, немного неудобно, но привыкнуть можно.  Через Direct SQL можно полностью управлять БД, создавать таблицы, добавлять колонки, пересобирать строки, создавать Вычисляемые столбцы итд.

То есть если неймется сделать учебный "Добрый дзень" на CASE - надо его сделать в виде Представления/View, один раз выполнив CREATE VIEW в "прямом" режиме. И в базе появится табличка говорящая вам приветствие при открытии. Пока подтверждаю, в Конструкторе запросов Base - CASE WHEN c SQLite JDBC от Xerial возвращает 0, причем не только с датами, но и при других элементарных сравнениях.

UPD:
CASE WHEN Час=10 THEN 1 ELSE 0 END as Ветвление - работает, верно выводит 1 и 0 (True/False) т.е. в проблемы именно с выводом строк, а с выводом чисел все ОК до первой встреченной буквы или -, что и объясняет котовасии с датами в ISO. Перепробовал все три вида кавычек, не помогло:
THEN 1 -- Ок
THEN "1" -- Ок
THEN "Да" -- Fail 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...