Можно ли копировать записи в базе libreoffice

Запуск версии 5.2.2.2 LibreOffice в Linux.

Я оцениваю замену использования внешнего интерфейса MS-Access на серверную часть таблицы Postgres, в первую очередь потому, что Microsoft, похоже, жаждет EOL Access. Я читал, что LibreOffice Base — хорошая альтернатива, и действительно, она кажется во всех отношениях, кроме одного. В интерфейсе стиля таблицы/электронной таблицы я не могу скопировать запись в таблице в конец таблицы, где я затем внесу изменения (чтобы избежать нарушений первичного ключа).

Я погуглил, и похоже, что я не первый, кто наткнулся на это. Это удивительно, потому что можно подумать, что это довольно простая вещь, которую хотелось бы сделать/поддержать. Один парень написал макрос для этого. Но вызов макроса должен осуществляться нажатием кнопки в форме. Мы не хотим использовать формы или нажимать кнопки, поэтому я хмурюсь по этому поводу.

Мне было интересно, знает ли кто-нибудь способ обойти эту дыру, желательно сделать что-то интуитивное, например ^c для копирования и ^v для вставки в пустую строку внизу таблицы. Мы запускаем 5.2.2.2. Они поддерживали это в более поздних версиях?

Заранее спасибо.


person daveg    schedule 22.01.2021    source источник
comment
Обновление: я получил 7.0.1.2. Та же проблема :-(   -  person daveg    schedule 22.01.2021
comment
Один парень написал макрос для этого. - Не могли бы вы дать ссылку?   -  person Jim K    schedule 25.01.2021


Ответы (1)


Представление табличных данных не имеет большого количества функций. То, что вы хотите, может быть сделано различными способами с помощью форм, например, с помощью элемента управления таблицей. Но поскольку вам явно не нужны формы, вот один из способов, который должен работать. Этот код макроса находится в Python-UNO, но его можно адаптировать к LO Basic или Java.

from com.sun.star.datatransfer import DataFlavor, UnsupportedFlavorException

oDoc = XSCRIPTCONTEXT.getDocument()
ctx = XSCRIPTCONTEXT.getComponentContext()
oClip = ctx.getServiceManager().createInstanceWithContext(
    "com.sun.star.datatransfer.clipboard.SystemClipboard", ctx)
transferable = oClip.getContents()
dataFlavors = transferable.getTransferDataFlavors()
df = DataFlavor()
df.HumanPresentableName = "Data source Table"
df.MimeType = (
    'application/x-openoffice-dbaccess-table;'
    'windows_formatname="Data source Table"')
try:
    data = transferable.getTransferData(df)
    props = data
    for prop in props:
        if prop.Name == "Cursor":
            resultSet = prop.Value
            rownum = resultSet.Row
except UnsupportedFlavorException:
    msgbox("Clipboard does not have data of type {0}.".format(
        df.HumanPresentableName))

Идея состоит в том, чтобы скопировать строку, а затем запустить макрос для создания новой строки, например, привязав ее к горячей клавише по вашему выбору. Объект resultSet содержит всю информацию, необходимую для получения данных скопированной строки. Используйте инструмент самоанализа, такой как МРТ, для отображения свойств и методов объекта. Затем вам нужно будет написать код для вставки новой записи в ту же таблицу с этими значениями, за исключением создания другого первичного ключа.

В качестве справки для этого ответа я нашел PDF-файл по адресу https://fivedots.coe.psu.ac.th/%7Ead/jlop/chaps/43.%20Using%20the%20Clipboard.pdf, в котором содержится довольно много полезной информации, в том числе раздел специально для Base. Однако это очень продвинутое макрокодирование. Как было предложено ранее, нормальным решением было бы использование форм, и даже это может быть не особенно просто, поскольку макросы Base обычно сложнее, чем макросы Writer или Calc.

Еще одна идея: вы пробовали pgAdmin, чтобы увидеть, делает ли он то, что вам нужно? Он может редактировать данные таблицы, если я правильно помню.

Обязательно разместите сообщение на форуме AskLO со ссылкой на этот вопрос. Крыслингер вон там эксперт по всем вопросам Базы.

ИЗМЕНИТЬ:

Я думал, что формы могут обрабатывать только одну запись за раз.

Нисколько. Мастер форм может создать табличный элемент управления, в котором отображаются все записи. 5-й шаг мастера говорит: «Расположите элементы управления в форме», которая выглядит так, как будто выбран элемент управления «Таблица». Для меня управление столом было по умолчанию.

Формы строятся на наборах записей с одной активной активной записью, аналогично представлению табличных данных. Первичная запись может быть связана с другими записями, таблицами и запросами в единой форме. В вашем случае все, что вам нужно, это работать с одной таблицей, так что это должно быть довольно просто.

Мастер ограничен и не генерирует очень хорошие формы. Итак, что я часто делаю, так это использую мастер для создания начальной формы, а затем использую представление дизайна формы и навигатор форм, чтобы удалить большую часть того, что он создал, и добавить таблицы и элементы управления в моем собственном выборе структуры/отношений, редактируя элементы управления, чтобы указать SQL или поля, которые сообщают, как связаны данные формы.

person Jim K    schedule 23.01.2021
comment
Спасибо, Джим, за ответ и код. То, что вы хотите, может быть сделано различными способами с помощью форм, например, с помощью элемента управления таблицей. Я заинтригован ! Не могли бы вы дать мне высокоуровневый подход к этому? Я думал, что формы могут обрабатывать только одну запись за раз. - person daveg; 24.01.2021
comment
@daveg: см. отредактированный ответ. - person Jim K; 25.01.2021