Создать базу данных в Calc через dialod (пользовательская форма)

Автор Кот, 27 ноября 2022, 13:56

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

Кот

Добрый день!
Подскажите пожалуйста, где можно найти что-то похожее?
В calc создается форма (dialog), через которую заполняется таблица.
Таблица имеет несколько столбцов с формулами

нр п/п
=ЕСЛИ(C4>0;СТРОКА()-СТРОКА($B$3);"")

фамилия имя отчество (в одном столбце)
=$Лист1.$C4&" "&$Лист1.$D4&" "&$Лист1.$E4

фамилия и инициалы
=ЛЕВ(F4;ПОИСК(" ";F4)+1)&"."&ПСТР(F4;ПОИСК(" ";F4;ПОИСК(" ";F4)+1)+1;1)&"."

Не получается в LO записать формулы в макрос, да и вообще чего то не получается создать.
Окажите помощь или где найти примеры для LO.
Спасибо!

eeigor

#1
Зачем вам всё это нужно? Ради программирования?
Заполняйте прямо на листе Фамилию, Имя и Отчество. Зафиксируйте строку с заголовками таблицы. Для заполнения полей с формулами надо выделить соответствующие ячейки выше (запись 1 с формулами является опорной, далее используем запись выше) и сделать двойной щелчок в правом нижем углу выделенного диапазона ячеек (курсор примет форму крестика). Заполнено будет всё до конца вниз.

С программированием если, то проще добавить кнопку Добавить и вставить новую запись снизу, скопировав формулы из записи выше, где они есть. Запись 1, как уже говорил, является опорной (содержит все необходимые формулы и форматирование). При этом не надо записывать формулы в макрос, как вы хотите.
Фрагмент кода, заполняющий формулы:
' Fill in the formulas in the last record (just added) from the previous one.
For j = 0 To oPrevDataRow.Columns.Count - 1
oCell = oPrevDataRow.getCellByPosition(j, 0)
If oCell.Type = com.sun.star.table.CellContentType.FORMULA Then
With oCell.CellAddress
oRange = oSheet _
.getCellRangeByPosition(.Column, .Row, .Column, .Row + 1)  'block of 2 cells vertically
oRange.fillAuto(com.sun.star.sheet.FillDirection.TO_BOTTOM, 1)  'nSourceCount:=1
End With
End If
Next

Впрочем, вопрос был про БД через диалог. Но создание диалогов - норма для БД Base. Для табличного процессора это - чрезмерное (и необоснованное, на мой взгляд) усложнение документа.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#2
Формулы в примере автора можно заменить:
C6:E6 Бахдалатова Виктория Додхудоевна
F6:=TEXTJOIN(" ";1;$C6:$E6)   '-> Бахдавлатова Виктория Додхудоевна
G6:=REGEX(F6;"(.*(?#Фамилия)) (.(?#Инициал имени)).* (.(?#Инициал отчества)).*";"$1 $2.$3.")  '-> Бахдавлатова В.Д.

Примечание. Комментарии в формуле можно удалить.
G6:=REGEX(F6;"(.*) (.).* (.).*";"$1 $2.$3.")
Вместо:
G6:=LEFT(F6;SEARCH(" ";F6)+1)&"."&MID(F6;SEARCH(" ";F6;SEARCH(" ";F6)+1)+1;1)&"."
Обычно чем короче формула, тем она понятнее, но это не всегда верно. Вам придется разбираться с регулярными выражениями, но это того стоит.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

Цитата: bigor от 27 ноября 2022, 23:06G6=С6&" "&LEFT(D6;1)&"."&LEFT(E6;1)&"."
Ещё короче:
G6:=C6&" "&LEFT(D6)&"."&LEFT(E6)&"."

UPD. Моя regex-формула носила больше учебный характер.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community