Проблема с представлением из сторонней базы данных

Автор meat_12237, 13 июля 2025, 11:39

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

sokol92

Попробовал выбор данные в Calc.
Даже такой sqlQuery выбирает число 0 вместо текстовой константы.

Sub TestSQLite()
  Dim fileURL As String, sqlQuery As String
  Dim oDoc As Object, oRange As Object
  Dim props(3) As New com.sun.star.beans.PropertyValue
 
  fileURL=ConvertToURL("C:\Temp\БД.odb")
  sqlQuery="Select 'A' Test from ""Журнал"""
 
  oDoc = StarDesktop.LoadComponentFromUrl("private:factory/scalc", "_blank", 0, Array())
 
  props(0).Name="DatabaseName" : props(0).Value=FileURL
  props(1).Name="SourceType"   : props(1).Value=1
  props(2).Name="SourceObject" : props(2).Value=sqlQuery
  props(3).Name="IsNative"     : props(3).Value=True
   
  oRange=oDoc.Sheets(0).GetCellRangeByName("A1")
  oRange.doImport props
End Sub
Владимир.

sokol92

Похоже, для таблиц имена полей типа TEXT обрабатываются нормально, любые иные выражения текстового типа - нет.
Это работает:
sqlQuery="Select ""Запись_Журнал"" Test from ""Журнал"""
Это нет:
sqlQuery="Select ""Запись_Журнал"" || '' Test from ""Журнал"""
Владимир.

kompilainenn

Емнип, внутри SQLite всё текст, это не может влиять?
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

sokol92

Владимир.

sokol92

#19
Цитата: kompilainenn от 14 июля 2025, 17:40Емнип, внутри SQLite всё текст, это не может влиять?
Мы, к сожалению, не работаем с этой базой (и с компонентой Base).

Кстати, разработчики SQLite давно предлагали (и предлагают) использовать свой формат файлов для офисных приложений.
Владимир.

sokol92

Сделал пример более лаконичным.
1. Создаем базу test.db с одним полем "name" типа TEXT (насколько я понимаю, в SQLite тип поля - рекомендация, а не требование).

2. Записываем в эту таблицу одну запись с полем name равным "A".

3. В LO cоздаем базу данных Test.odb со ссылкой на test.db, класс драйвера org.sqlite.JDBC

4. Баг: запрос
Select name, name || '' strexp   from Test
в макросе TestSQLite возвращает 'A', 0 вместо правильного 'A', 'A'.

Вот скрипт для Python (3.13+) MS Windows для пунктов 1, 2:
import sqlite3
con = sqlite3.connect("C:/temp/Test.db")
cur = con.cursor()
cur.execute("CREATE TABLE test(name TEXT)")
cur.execute("INSERT INTO test VALUES('A')")
con.commit()

Если еще актуально, то могу написать в Багзиллу.
Владимир.

meat_12237

Да, напишите, пожайлуста.

Мне кажется, эта проблема - наследие ранней hsqldb, встроенной в Base. В ней не было поддержки агрегатных функций. И как только Base видит что-то сложное в sql запросе, то ждеет арифметику и, как следствие, число.

Сейчас использую костыль с применением триггеров. При изменении любой из влияющих таблиц срабатывает триггер и данные из представления копируются в выделенную таблицу. Это работает.

sokol92

Цитата: meat_12237 от 16 июля 2025, 17:44В ней не было поддержки агрегатных функций.
В моем последнем примере вообще нет функций. Использованы конструкции, существующие с момента изобретения SQL.
Владимир.

economist

Поддержка агрегатных функций в HSQLDB была всегда. Но у SQLite они необязательны при GROUP BY, а в HSQL - обязательны, иначе ошибка.

Группировка без функций выведет "последнее значение" в группах, они, если это, скажем, большая колонка с упорядоченными по А-Я ФИО - на Я начинаются и называются в народе Я-ошибкой. "И последние станут первыми..."
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Цитата: sokol92 от 16 июля 2025, 14:32Если еще актуально, то могу написать в Багзиллу
Да, пожалуйста!
С уважением,
Михаил Каганский


meat_12237


sokol92

Цитата: meat_12237 от 27 августа 2025, 11:07Как-то тихо в Багзилле...
Там свои порядки.  :)

Для начала:
1. Подпишитесь на указанный баг ("Add me to CC list" и кнопка "Save changes")
2. Напишите комментарий, подтверждающий баг.
3. Поменяйте статус бага на "New" (если багзилла это разрешает).

 
Владимир.