Будьте добры, подскажите по написанию макроса. Имеет

Автор ForumOOo (бот), 3 февраля 2016, 16:25

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

ForumOOo (бот)

Компонент: Base
Версия продукта: 5.x
Сборка: LibreOffice 5.0.4
ОС: Любая

Будьте добры, подскажите по написанию макроса.

Имеется флажок и кнопка. И еще две формы.
Идея: чтобы при нажатии кнопки и установленном флажке открывалась одна форма, а при снятом флажке другая.

Сейчас вопрос решен только тем, что создано две кнопки, каждая из которых открывает свое окно. Но это топорный метод.

--
Подпись: MasterLi

rami

Цитата: ForumOOo (бот) от  3 февраля 2016, 14:25Имеется флажок и кнопка. И еще две формы.
Идея: чтобы при нажатии кнопки и установленном флажке открывалась одна форма, а при снятом флажке другая.
Вот, например:

MasterLi

Да, работает.
Только мудрёно получилось: Label меняется. Можно и без этого.

MasterLi

Фу-у-ух разобрался ...

Sub Direction
Dim oForm, oForms, oCheckBox, oButton
oForms=ThisComponent.getDrawPage().getForms()
oForm=oForms.getByName("MainForm")
oCheckBox=oForm.getByName("Госзаказ")
oButton=oForm.getByName("Кнопка_направление")
If oCheckBox.State Then ThisComponent.Parent.FormDocuments.getByName("Направление (госзаказ)").open else ThisComponent.Parent.FormDocuments.getByName("Направление").Open
End Sub

rami

Цитата: MasterLi от  4 февраля 2016, 03:31Только мудрёно получилось: Label меняется. Можно и без этого.
Вы просили подсказать, так я подсказал...

Ах да, забыл подсказать как отключить макрос от чекбокса ??? , ну это просто заходите в редактирование формы, выделяете чекбокс, жмёте в выпадающем меню на "Элемент управления..." и во вкладке "События" удаляете назначенный макрос.

MasterLi

Цитата: MasterLi от  4 февраля 2016, 07:15Ах да, забыл подсказать как отключить макрос от чекбокса  , ну это просто заходите в редактирование формы, выделяете чекбокс, жмёте в выпадающем меню на "Элемент управления..." и во вкладке "События" удаляете назначенный макрос.

Это ежу понятно :)

MasterLi

Цитата: rami от  4 февраля 2016, 07:31Вы просили подсказать, так я подсказал...
Помогите еще кой в чем:

Две формы.
Обе черпают информацию из одной и той же таблицы.
В первой форме кнопка, открывающая вторую форму.
Что дописать в макрос, чтобы в открывающейся форме показывалась та же запись, что и в данный момент в первой форме ?

MasterLi

Помогите, друзья. Если переименовываешь форму, в код вставляешь новое имя формы - перестаёт работать. Да, и когда назад возвращаешь, то всё равно не работает. Есть один момент. формы я скинул в папку.

Sub Direction
Dim oForm, oForms, oCheckBox, oButton
oForms=ThisComponent.getDrawPage().getForms()
oForm=oForms.getByName("MainForm")
oCheckBox=oForm.getByName("Госзаказ")
oButton=oForm.getByName("Кнопка_направление")
If oCheckBox.State Then ThisComponent.Parent.FormDocuments.getByName("Направление (госзаказ)").open else ThisComponent.Parent.FormDocuments.getByName("Направление").Open
End Sub


Ошибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.container.NoSuchElementException
Message: Направление ТОО Касарас (ПЛАТНО).

economist

Цитата: MasterLi от 25 января 2021, 10:42формы я скинул в папку.
В смысле сохранили как ODT-файлы (как "внешие" формы)?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

MasterLi

#9
Цитата: economist от 25 января 2021, 12:37В смысле сохранили как ODT-файлы (как "внешие" формы)?
Нет. Для разных ТОО создал разные папки форм.
НО теперь, даже если я использую их вне папки, всё равно не работает.

Вообще не понимаю почему ?! Всё написано правильно !!!

MasterLi

Теперь я знаю точно - это из-за того, что я формы распределил по папкам. Когда формы в корне - всё работает.
Друзья, помогите ! Что допилить в коде, чтобы он брал формы из папок ?

economist

#11
Цитата: MasterLi от 26 января 2021, 05:12Нет. Для разных ТОО создал разные папки форм.

Всё равно непонятно. Файл Базы данных *.ODB - он один, так? В нем (внутри ODB) - две Формы. О каких "папках" речь? Какое расширение у файлов Форм?

С понятием "Форма" в OpenOffice|LibreOffice всё сложно, потому переспрашиваю. Каждый флажок, кнопка итп эл. управления (прижилось слово "контрол") - принадлежит какой-то одной конкретной Форме в ODB/ODT/ODS-файле. Но форм может быть много, они могут лежать поверх друг друга, стопкой, как прозрачные слои в Photoshop, хотя могут и лежать "рядом", не перекрываясь. У Форм есть структура (дерево в Навигаторе Форм) и иерархия - Подформы входят в родительскую Форму и наследуют её свойства, реализуя интерфейс "провалиться в навороченный справочник или особое окно для правки".

Форму из ODB можно сохранить в ODT, в другую папку и использовать его как "внешнюю форму" для ввода данных в БД. Наличие отдельного файла здорово упрощает многопользовательский доступ и безопасность на уровне файловой системы ОС, без запросов паролей итп. Форма может работать с БД даже удаленно, через LAN, WAN.  

Всю "стопку" форм (созданных вручную в ODT) - можно "привязять" к ODB и использовать как мета-форму для ввода данных в БД. В этом случае макросами можно реализовать очень крутой функционал. Фактически одна мета-форма в ODT может одновременно отображать и заполнять данные в/из нескольких, абсолютно разных БД, движков. Скажем TXT/SQLite/FireBird/PostgreSQL.

Всегда стоит в ODT/ODS-файле одну из Форм "стопки" - отвязать от БД и файла ODB, для того чтобы значения контролов этой формы не "сбрасывались" при перезагрузке Формы, при включении режима Разработки итд. Это полезно, ведь контролы могут использоваться внутри ODT/ODB для внутренних нужд, мини-справочников итд. В отличие от Текстовых полей Writer - контролы не в пример легче "обвесить" макросами, скрыть, сделать непечатаемыми итд.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

MasterLi


Sub Direction_Axim
Dim oForm, oForms, oCheckBox, oButton
oForms=ThisComponent.getDrawPage().getForms()
oForm=oForms.getByName("MainForm_Axim")
oCheckBox=oForm.getByName("ГОСЗАКАЗ")
oButton=oForm.getByName("Кнопка_направление_Аксим")
If oCheckBox.State Then ThisComponent.Parent.FormDocuments.getByName("Направление ТОО Аксим плюс (ГОСЗАКАЗ)").open else ThisComponent.Parent.FormDocuments.getByName("Направление ТОО Аксим плюс (ПЛАТНО)").Open
End Sub

Sub Direction_Kasaras
Dim oForm, oForms, oCheckBox, oButton
oForms=ThisComponent.getDrawPage().getForms()
oForm=oForms.getByName("MainForm_Kasaras")
oCheckBox=oForm.getByName("ГОСЗАКАЗ")
oButton=oForm.getByName("Кнопка_направление_Касарас")
If oCheckBox.State Then ThisComponent.Parent.FormDocuments.getByName("Направление ТОО Касарас (ГОСЗАКАЗ)").open else ThisComponent.Parent.FormDocuments.getByName("Направление ТОО Касарас (ПЛАТНО)").Open
End Sub


economist

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

MasterLi

#14
Это не подформы.
Я создаю папку и скидываю их туда. Делаю это для удобства. Чтобы разделить разные ТОО.

Получается, что если формы находятся "в корне", то скрипт работает. Если в папке, то скрипт выдаёт ошибку. Голову сломал, не пойму почему ...
Где-то в мат.часте читал, что нужно использовать слэш / ... только куда его вставить не знаю.