Редактируемые подробные записи в Delphi DBGrid

#delphi #filter #jet #dbgrid

#delphi #Фильтр #jet #dbgrid

Вопрос:

У меня есть база данных (хранится в Access .MDB-файл), в котором регистрируются сотрудники и любое их отсутствие, например отпуск, болезнь, учебный курс, даты начала и окончания и потерянные часы продуктивного времени.

Затем у меня есть dbgrid, привязанный к «основному» запросу ADO, который находит всех сотрудников, соответствующих выбранным критериям диапазона дат, отдела, строки поиска по имени, суммируя потерянные часы продуктивного времени.

У меня есть другая dbgrid, привязанная к «подробной» таблице ADO, содержащей записи отсутствия.

Желаемый эффект заключается в том, что подробная dbgrid должна содержать только те записи из таблицы отсутствия, которые соответствуют строке, выбранной в основной записи (таблицы отсутствия «основного» персонала и «подробных сведений» содержат общее поле EmployeeID).

Хотя я могу добиться этого с помощью запросов ADO, создаваемых «на лету», изменяя запрос каждый раз, когда пользователь переходит к другой основной записи о персонале, я надеялся использовать подробную DBGrid в качестве основного метода удаления, обновления и добавления дополнительных записей об отсутствии в комплекте с поиском в таблице; таким образом, пользователь может выбирать типы записей, не запоминая код для этого типа.

Я также хотел бы, чтобы изменения в этой подробной таблице были отражены в сводках в главной dbgrid.

Я достиг этого, используя детализированную таблицу, связанную как MasterDetail с запросом персонала, но для фильтра необходимо установить значение True и управлять onfilterevent в коде; но по мере увеличения размера базы данных это становится все медленнее и медленнее.

Могу ли я что-нибудь сделать, чтобы улучшить эту производительность, или я буду вынужден использовать подробную dbgrid исключительно для чтения, а все записи об отсутствии вводить через другую форму или панель?

Комментарии:

1. вы связали основные и подробные наборы данных? поскольку подробная DBGrid должна отражать детальный набор данных

2. Да, у меня есть, но мне нужно использовать onfilterevent также в добавляемой подробной таблице, поскольку мне также нужно фильтровать по диапазону дат. Большая проблема в том, что использование этого метода происходит очень медленно, поскольку таблицы становятся больше. Также использование AfterPost после записи подробной записи в таблицу сведений, чтобы я мог получить новую сумму часов, означает, что я должен использовать закладки, чтобы вернуться к выбранной основной записи, и это не рекомендуется при использовании запросов, поскольку возвращаемый набор данных может отличаться, когда несколько пользователей обновляют базу данных.

Ответ №1:

Дополнительная информация о том, как сделать таблицу детализацией другого набора данных

 ADOTable2.MasterSource := DataSource1;
ADOTable2.MasterFields := 'EmployeeID';
  

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