#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 для повторного вычисления сводок.