Заполнение Grid макросом

Автор iyugov, 15 мая 2021, 11:18

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

iyugov

На форме LibreOffice Base есть элемент управления Grid, не связанный с источниками данных. Есть макрос, который получает некоторые данные (программно выполняет сложный запрос с параметрами, значения которых берёт из других данных формы) и должен поместить результат в Grid - добавить и заполнить нужное количество строк таблицы.
Вот это:
oFormTasks = oCurrentDocument.Forms.getByName("form_tasks")
oGridTasksNotDone = oFormTasks.getByName("grid_tasks_not_done")
oRowSetTasksNotDone = oGridTasksNotDone.getRowSet()
oRowSetTasksNotDone.insertRow()

не получается: "Ошибка функциональной последовательности".
Как можно (и можно ли) программно добавлять, изменять, удалять содержимое Grid программно, без прямой связи с таблицами, запросами и командами SQL?

economist

Цитата: iyugov от 15 мая 2021, 11:18значения которых берёт из других данных формы

Не совсем понял, но кмк это решается без макроса, во внешних Формах (файлы odt), путем создания нескольких Форм, относящихся к разным ODB/Таблицам/Запросам. На Grid сверху можно навесить Filter/Sort/Limit и тем самым получить нужный набор строк.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

iyugov

На форме уже есть две неависимые друг от друга субформы с таблицами: ученики и темы. В таблице, о которой спрашиваю, будут НЕ решённые выбранным учеником задания по выбранной теме. Создал запрос:
SELECT
  "tasks_of_topic"."id"
FROM
  (SELECT "id" FROM "tasks" WHERE "topic_id" = :topic_id) AS "tasks_of_topic"
    LEFT JOIN
  (SELECT "task_id" FROM "tasks_and_students" WHERE "student_id" = :student_id) AS "tasks_of_student"
    ON
      "tasks_of_topic"."id" = "tasks_of_student"."task_id"
WHERE
  "tasks_of_student"."task_id" IS NULL

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

economist

Если так?
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

iyugov

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

economist

2 формы могут определять выбор в третьей, кмк, только через макрос.

Что же касается самого кейса - он решен в СПО Moodle. Огромным его плюсом является готовая платформа для обучения, размещения лекций/книг/видео, для тестирования, в т.ч. проверочного, по ранее невыполненным задачам. И наполнять её контентом могут десятки людей одновременно.     
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

iyugov

#6
К Moodle уже присматриваюсь, но пока ощущение такое, что это для чего-то другого. Вероятно, что-то такое потом сделаю, но пока не пересекаясь с нынешним проектом.
Общая задача, которую решаю и которую пытаюсь автоматизировать, такая: быстрый подбор заданий с хорошей детализацией по темам и особенностям групп заданий. Нужно, чтобы я смог быстро выдавать ученикам столько комплектов заданий, сколько потребуется. Больше - в принципе ничего. Последние два года у меня только эта задача.
Параметры задачи, если интересно, такие:
- комплекты заданий нужно формировать очень часто (у некоторых групп уроки до 4 раз в неделю плюс домашнее задание; на проверочные работы нужно несколько вариантов, на переписывание двоек нужны отдельные варианты), и именно формирование комплектов, особенно из разных тем, съедает большую часть времени;
- для выполнения заданий не всегда есть возможность усадить учеников за компьютер, многие задания выполняются на бумаге, а для некоторых заданий принципиально, чтобы они НЕ выполнялись на компьютере;
- учёт выполненных заданий ведётся не по отдельным ученикам группы, а по группам целиком (не склонен давать ученикам задания, которые ранее доставались другим ученикам той же группы);
- вынесение каких-либо других элементов учёбы (теории, примеров) в эту систему не предполагается; там только задания.

Сейчас уже написан макрос, который получает номера заданий и подгружает в пустой документ соответствующие задания из других файлов, т. е. формирует комплект заданий без ручного поиска каждого задания, и это уже очень хорошо. Для этого всю прошлую неделю работал другой макрос, который вытаскивал из больших файлов все те 8700 заданий и ответов к ним и по отдельности пересохранял их в файлы. В базу данных перенесена вся иерархия тем и привязка заданий к темам. Соответствие уже пройденных заданий тоже будет перенесено, это элементарно. Всё, что осталось, - знать, какие задания по теме ученик (или группа) решал, а какие нет, чтобы просто составить список номеров свежих заданий.
Осталось разобраться с этим Grid (на StackOverflow мне намекнули, что это Table, а не Grid) - и проект будет завершён до более чем приемлемого состояния. Пишут, что заполнить Table данными, не связанными с БД, скорее нельзя, чем можно, а Grid доступен только в диалогах. В принципе я уже согласен на список на форме (List, ListBox), если его можно заполнить, и как-нибудь решить проблему с отображением дополнительных данных о задаче (например, дату её решения). И всё. Свет в конце тоннеля уже хорошо виден. А Moodle - это как бы параллельно будет, на одной из работ поэкспериментирую с сервером.

eeigor

#7
«Пишут, что заполнить Table данными, не связанными с БД, скорее нельзя, чем можно...»

Не силён в Base, конечно, хотя общего много с Access (кроме макросов). Так вот в Access не составляло труда создать независимый ADODB.Recordset на основе имеющихся данных или создать его пустым, определить структуру и заполнить самостоятельно, добавляя записи по одной, а потом связать с формой в качестве источника записей. Достаточно гибко. А как в Base? Только таблица и SQL-запрос? Что за объект создаётся запросом? Разве мы не можем создать его программно, заполнить и подключить к форме? Судя по библиотеке Access2Base можем, и это QueryDef (в терминах библиотеки доступа к данным DAO). Могу ошибаться... Хотя я сторонник создания объектов напрямую, без помощи Access2Base.
Скорее можно, чем нельзя. Только таблица здесь ни при чём.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

economist

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

iyugov

Посоветовали не оставлять таблицу на форме без источника данных, а создать таблицу базы данных специально под этот элемент и назначить её источником данных. Так и сделал. Всё получилось: теперь можно манипулировать содержанием таблицы и через insertRow(), и через запросы DELETE/SELECT (с последующим .reload()). Вышло даже лучше, чем планировалось: данные из таблицы БД проще использовать в дальнейшей обработке.
Вопрос полагаю закрытым.