Проблема с доступом к полям в макросе вызванном по событию Access2Basik.

Автор AlexSPB, 7 января 2015, 13:38

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

AlexSPB

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

Макрос повешен на событие формы  "Перед восстановлением", которое возникает при переходе на новую строку.

Sub Main (poEvent As Object)
Dim ofForm As Object, ocDate As Object, ocText As Object, ocForm as object
Dim vDesc As Variant

       Set ofForm=poEvent.Source
Set ocDate = ofForm.Controls("datДатаНачала")
ocDate.Value =Now()
End Sub


Код собран на основании "Сниппетов"   с сайта www.access2base. com . "Event example" (http://www.access2base.com/access2base.html#%5B%5BEvent%20example%5D%5D) и  "Value example" (http://www.access2base.com/access2base.html#%5B%5BValue%20example%5D%5D).

Получаю сообщение что  свойство или метод "Controls" не найдены.

Таки вопрос:   как достучаться до поля?

Yakov

Какая версия LibreOffice?
По информации с сайта
http://www.access2base.com/access2base.html
Access2Base встроен в LO4.2, а для более ранних версий нужно устанавливать отдельное расширение.
В LO 4.3  был обновлён Access2Base.


JohnSUN

Это хорошо, что из "плюсов" сюда перепрыгнул - здесь проблемы/задачи обсуждать намного удобнее: и аудитория широкая, и с прикладыванием файлов мучений меньше...
Так что, добро пожаловать на форум!
Не совсем понял, что ты имел в виду под
Цитата: AlexSPB от  7 января 2015, 13:38
Присвоить полю значение текущей даты при создании в форме новой строки, благо штатной возможности нет.
В чём тут благо и почему нет?
Попробуй через Сервис-SQL выполнить команду
ALTER TABLE "Задачи" ALTER COLUMN "ДатаНачала" SET DEFAULT CURRENT_DATE;Да, результат будет виден только после сохранения новой записи, но ведь обычно именно это и требуется от базы. Или нет? (Для ID, кстати, можешь таким же образом задать DEFAULT AS IDENTITY(START WITH 1) )
Ну, хорошо, ты хочешь заполнить поле новой записи текущей датой сразу и сразу отобразить её на форме. Не вопрос. Твой макрос с этой задачей справится, если его слегка подправить. В моём варианте это выглядит так:
Function setDataOfNewRecord(poEvent As Object) As Boolean
Dim dataSet
dataSet = poEvent.Source.getColumns()
dataSet.getByName("ДатаНачала").updateDate(CDateToUnoDate(Now()))
' dataSet.getByName("ID").updateInt(...)
' ...
' dataSet.getByName("Примечания").updateString("...")
setCurrentDate = True
End Function
То есть значения пишутся не в контролы, а прямо в поля (колонки) новой записи. А уже она вытолкнет эти данные в связанные элементы управления формы, отрисует на экране.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

AlexSPB

Большое спасибо за внимание и помощь!

У меня 4.3.5.2  под Linux Mint 17.1-64

ЦитироватьВ чём тут благо и почему нет?

В MS Access   тупо вписываешь в таблице в поле по умолчанию =Now() и профит :-) , что эквивалентно вышеуказанному вызову, но более очевидно.

Но в данном случае мне важно не дата как таковая, а разобраться с макросами что бы кое-что быстренько себе написать, и нужно обрабатывать события и заполнять поля.

Я при просмотре в отладчике заподозрил, что нужно использовать Columns , так оно и оказалось, а вот "GetByName" хоть и логично, но совсем не соответствует описанию на Access2Base/com, что конечно не радует.

Так куда податься?  Где правильное описание?

JohnSUN

Если честно, я всегда сознательно игнорировал Access2Base - считал его лишней навеской над нормально работающей моделью. Лишний код, лишние тормоза и, конечно же, лишние глюки. Поскольку Access2Base не "родной" для офисного пакета, в любой момент какое-нибудь мелкое изменение в Base (при выпуске новой версии) может привести к ошибкам в работе этой библиотеки. Ну, например, не помню точно когда, изменился формат даты в элементе формы - был просто число, как в Calc'е, а стала структура Год-Месяц-День. И сразу же перестал работать забавный макрос для ввода даты в ячейках электронной таблицы с помощью всплывающего календарика (где-то здесь на форуме лежит).
Как по мне, то лучше не заморачиваться с освоением Access2Base, а просмотреть по диагонали книжку Питоньяка (не знаю, есть ли она в переводе) и книжку Казановы (вот её действительно в переводе не видел).
Цитата: AlexSPB от  7 января 2015, 21:54разобраться с макросами что бы кое-что быстренько себе написать... Я при просмотре в отладчике
Установи себе MRI - hanya сделал замечательный инструмент, который не только позволяет нырнуть вглубь какого-нибудь документа-формы-контрола, но и по ходу дела записать все действия в виде макроса. Очень рекомендую!
Цитата: AlexSPB от  7 января 2015, 21:54и нужно обрабатывать события и заполнять поля.
Фишка в том, что в большинстве случаев как раз не нужно: правильно спроектированная и сконструированная база чаще всего не требует дополнительного кода (см. у Казановы)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

AlexSPB

ЦитироватьФишка в том, что в большинстве случаев как раз не нужно: правильно спроектированная и сконструированная база чаще всего не требует дополнительного кода (см. у Казановы)

Я в курсе  :)

Рекомендованное вами расширение, увы,  не встает.

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

UPD:  таки встало!   Качать нужно с OO, файл по вашей ссылке - битый zip