Управление БД из формы через элементы управления.

Автор Ириминаге, 22 марта 2022, 13:02

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

Ириминаге

Здравствуйте! Есть необходимость вносить изменения в базу из созданных форм. Возможно ли осуществить выполнение SQL команд при нажатии кнопки или это решается каким-то другим путём?
Грубо говоря, создаём в форме текстовые поля Текс1 и Текс2, в них вносится информация, а потом, по нажатию кнопки Жмяк, это вносится в базу.
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

Варианты записи в базу из формы (по требованию, фоновая и прямая):
1. Пишем макрос с "UPDATE Table SET Дата=2020 WHERE ID=..." и назначаем его на "финальную" кнопку формы
2. Используем события Формы для записи
3. Связанные с таблицей (д.б. поле первичного ключа) контролы - по мере заполнения сами передают (отражают) введенные данные в таблице.

Первый вар-т самый простой, к тому же позволяет последовательно менять по мере ввода содержимое раскрывающихся списков итп "Справочников", не вникая в связи и отношения Форма-Субформа и не задавая связи таблиц (сама их возможность может отсутствовать в некоторых популярных СУБД).   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Цитата: economist от 22 марта 2022, 14:15
Варианты записи в базу из формы (по требованию, фоновая и прямая):
1. Пишем макрос с "UPDATE Table SET Дата=2020 WHERE ID=..." и назначаем его на "финальную" кнопку формы
2. Используем события Формы для записи
3. Связанные с таблицей (д.б. поле первичного ключа) контролы - по мере заполнения сами передают (отражают) введенные данные в таблице.

Первый вар-т самый простой, к тому же позволяет последовательно менять по мере ввода содержимое раскрывающихся списков итп "Справочников", не вникая в связи и отношения Форма-Субформа и не задавая связи таблиц (сама их возможность может отсутствовать в некоторых популярных СУБД).   

Огромнейшее спасибо! Хоть перестал брести в тумане! Первый вопрос: как UPDATE можно задействовать в макросе?
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

#3
Например так:

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("ИМЯ_ЗАРЕГ_БД") ' смотреть по Alt+F12 - LO Base - Базs Данных
Connection = DataSource.GetConnection("", "") ' user и password, для многих движков д.б. "" и "" (HSQLDB, SQLite, FireBirdEmbed)
Statement = Connection.createStatement()
SQL= "UPDATE РЕЕСТР Set Сумма=0 WHERE N=" & N ' тут ваш SQL
Statement.executeUpdate(SQL)
Connection.close
Connection.dispose()
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Большое спасибо за терпение! Попробовал ваш вариант, но у меня выскакивает ошибка
при выполнении кода
Цитата: economist от 22 марта 2022, 17:18Statement = Connection.createStatement()

"Ошибка времени выполнения Basic.
Объектная переменная не установлена."
Объявлял переменную Statement типа Object, но это не помогло...
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

Ошибка касается объекта Connection.

Какой движок БД используется (см. в левом нижнем углу экрана в окне Base)? 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Цитата: economist от 23 марта 2022, 13:05
Ошибка касается объекта Connection.

Какой движок БД используется (см. в левом нижнем углу экрана в окне Base)? 
HSQLDB встроенная
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

economist

#7
Значит неправильно указано зарегистрированное имя базы данных (для файла *.ODB), либо имя или путь к ODB содержит нежелательные символы (точки, пробелы, кириллицу, символ № итп - зависит от движка БД). Также возможны неправильные настройки соединения, если они были сделаны вручную. Создайте новую зарег. БД и подключитесь к ней, ничего не меняя. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Если использовать:
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName("file:///D:\1\test.odb")
ConnectToDataBase=oDataSource.GetConnection("","")
Statement = Connection.createStatement()
SQL= "UPDATE test1 SET Num2 = 5 WHERE Num1 = 2 "
Statement.executeUpdate(SQL)
db.close()
db.dispose()


То выделяется строка "ConnectToDataBase=oDataSource.GetConnection("","")"  и выдается ошибка
ЦитироватьОшибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.sdbc.SQLException
Message: Подключение не может быть установлено. Не заданы устройства хранения или URL..

Если же использовать
oDataSource=dbContext.getByName("test")

то ошибка
ЦитироватьОшибка времени выполнения Basic.
Объектная переменная не установлена
И выделяется строка "Statement = Connection.createStatement()"

Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

sokol92

#9
Цитата: Ириминаге от 23 марта 2022, 16:32"file:///D:\1\test.odb"

Что это за зверь?  :)
Путь к файлам нужно указывать в URI-формате. Можно так:

ConvertToURL("D:\1\test.odb")

или (в Вашем случае)

file:///D:/1/test.odb

Владимир.

economist

1) Имя БД нужно брать написано в комментарии строки 2 из кода в #3, а не задавать как путь к файлу ODB
2) Таблица test1 имеет PRIMARY KEY? Если нет, то такая таблица не может быть изменена (ограничение HSQLDB, могу ошибаться)
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Ириминаге

Цитата: sokol92 от 23 марта 2022, 17:14
Попробовал оба способа, ответ один -
"Ошибка времени выполнения Basic.
Объектная переменная не установлена", что возвращает нас к вопросу, что это за объектная переменная, без которой, как писал Филатов: "И икра не лезет в горло,
И компот не льется в рот!"
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

mikekaganski

Цитата: Ириминаге от 24 марта 2022, 08:21что возвращает нас к вопросу, что это за объектная переменная

Ответ на этот вопрос получается отладкой: установкой точки останова на проблемной строке и инспекцией всех задействованных переменных.
С уважением,
Михаил Каганский

Ириминаге

Цитата: economist от 23 марта 2022, 17:26
1) Имя БД нужно брать написано в комментарии строки 2 из кода в #3, а не задавать как путь к файлу ODB
2) Таблица test1 имеет PRIMARY KEY? Если нет, то такая таблица не может быть изменена (ограничение HSQLDB, могу ошибаться)


Если брать "oDataSource=dbContext.getByName("D:\1\test.odb")", то ошибка ещё прозаичнее:
"Ошибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.container.NoSuchElementException
Message: D:\1\test.odb."

Primary Key есть.
Он верил в Мир и Здравый Смысл,
В себя, в людей, в любовь, в науку!
Но кто-то Кафку положил,
В его протянутую руку...

mikekaganski

Цитата: economist от 23 марта 2022, 17:261) Имя БД нужно брать написано в комментарии строки 2 из кода в #3, а не задавать как путь к файлу ODB

Можно и URL задавать. Оно работает.

Цитата: Ириминаге от 24 марта 2022, 08:29Если брать "oDataSource=dbContext.getByName("D:\1\test.odb")", то ошибка ещё прозаичнее:

Но только как URL, а не системный путь.

Лучше всего приложите сам файл ODB.
С уважением,
Михаил Каганский