|
Asm/C++/Delphi/Py/PHP/VBA
|
|
MS Access Один столбец в DBGrid после добавления записи (очередное непонятное поведение)06.06.2018, 15:06. Показов 1458. Ответов 13
Метки нет (Все метки)
Здравствуйте!
В DBGrid порядка 10 полей. Некоторые из них не видны ( DBGrid.Columns[0].Visible := False;).Теперь я добавляю новую запись, ввожу туда что-то и перехожу на другую запись (стрелкой вверх, например). В AfterPost обновляю запрос. И у меня вылетает ошибка а-ля Index out of bounds на DBGrid.Columns[2].Visible := False;. Оказывается, почему-то вдруг стало DBGrid.Columns.Count = 1, хотя на экране (даже после обновления этого SQL-запроса) всё как положено – столбцов несколько. И RecordCount после запроса (в месте ошибки) тоже пара десятков.Причём, прикол в том, что если я обновляю запись не переходом к другой (стрелка вверх), а нажатием на кнопку Post в DBNavigator (√), то всё ок, столбцов столько, сколько нужно. Что это за маразм такой?!
0
|
|
| 06.06.2018, 15:06 | |
|
Ответы с готовыми решениями:
13
Позиционирование курсора в DBGrid после добавления новой записи Не обновляется dbgrid после добавления или удаления записи DBGrid: умножить один столбец на другой и вывести в другой DBGrid |
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 15:48 | |
|
Нужно создать в design-time в гриде сколько надо колонок (в инспекторе объектов в DBGrid свойство Columns), каждая со своим полем (свойство колонки FieldName) и больше не парится по поводу видимости/невидимости колонок.
Там же, в свойствах колонок можно изменить заголовок каждой из них и ширину.
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 17:00 | |
|
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 06.06.2018, 17:35 [ТС] | |
|
А если ситуаций штук 10, значит имеем 10 гридов?
![]() А потом нужно добавить/удалить поле во все гриды, каждый из них редактируем. И вообще очень "удобно" с каждым из них работать, учитывая, что они друг на друге лежат. Неее, не вариант
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 19:18 | |
|
В гриде не редактируют (редактируют, конечно, но дилетанты и студенты, правда, иногда такое редактирование оправдано, но в простых случаях - только для справочников без ссылочных полей).
Переносить в код "зарядку" одного грида на 10 разных ситуаций - тоже не самое удачное решение - очень много кода, за которым следить и следить, постоянно огребая разного рода проблемы (судя по темам автора - это уже происходит). Проще сделать 10 форм, каждая со своим гридом, и которые заточены на определенную ситуацию. Это если напрягает что гриды будут лежать друг на друге.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 06.06.2018, 19:59 [ТС] | |
|
Ну проще тогда не 10 гридов, а 10 ADOQuery. И менять в DataSource'е эти ADOQuery.
Или сделать 1 грид с 20 полями на все варианты и некоторые из них (которые не участвуют в запросе) отключать. Так же можно делать (не проверял и пока не надо, просто интересуюсь)?
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 20:19 | |
|
10 ADOQuery тоже не совсем удачное решение.
Любой грид - это целая "система" для пользователя: настроенная ширина колонок, центровка заголовков и данных в некоторых из них, ширина и высота самого грида, свои наименования полей в заголовках, отличные от имен полей. Это лишь некоторые, основные отличия каждого грида. А потом начинаются разные мелочи и детали, тоже отличающие один грид от другого. Не, 10 ADOQuery на один грид - не выход. Что-то этакое халтурное. Из выше сказанного и 20 колонок с переключателями "видимая/невидимая" тоже как-то не вдохновляет.
1
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 06.06.2018, 20:44 [ТС] | |
|
Скандербег, всё зависит от ситуации, я думаю. Иногда и ряд ADOQuery подойдёт. Но если делать по-настоящему качественно, то наверное, вы правы.
Мне просто интересно, как отключить "поле" в ADOQuery? Потому как если в запросе его нет, выскакивает исключение. Добавлено через 7 минут Есть ситуации, когда данные грузятся из одной таблицы, но вариантов отображения несколько. Тогда проще настроить всё в одном DBGrid'е. И включать/отключать столбцы в DBGrid'е и поля в ADOQuery. Хотя можно, конечно, делать что-то вроде NULL AS ИмяПоля для ненужных полей, чтобы не заморачиваться с их отключением и отключать только столбцы."Я так думаю" ©
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 20:45 | |
|
А полей в ADOQuery и не должно быть. Все нужные поля есть в результате запроса, называемом набором данных (НД).
Зачем еще какие-то поля... (если, конечно, мы об одном и том же и речь идет о тех полях, которые добавляются в редакторе полей, вызываемом двойным щелчком по компоненту).
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
||
| 06.06.2018, 21:09 [ТС] | ||
|
Но если нужны вычисляемые или lookup-поля, например, то придётся же в ADOQuery добавлять все поля из запроса + вычисляемые + lookup.
0
|
||
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
|
| 06.06.2018, 21:19 | |
|
Совсем нет. Это к ADOQuery не имеет отношения, т.к. все что нужно, как правило, формируют в самом SQL запросе, а в гриде отображются все нужные поля, в том числе и ссылочные (lookup), и вычисленные в запросе.
Если бы использовался TADOTable, то да, пришлось бы городить на клиенте и lookup поля, и вычисления. Это обычная забава студентов, которых учат не тому чему надо.
0
|
|
|
Asm/C++/Delphi/Py/PHP/VBA
|
|
| 06.06.2018, 21:37 [ТС] | |
|
Скандербег, если делать lookup запросами (как я понимаю), то для того, чтобы ограничить ввод списком а-ля ComboBox, нужно городить огород из PickList'а (значения в который загружать вручную), обработчиков событий при редактировании. Либо я чего-то не знаю. Этот как раз тема Редактирование подставленного значения в DBGrid
Что касается вычисленных значений в запросах, то это уже тема Доп. поле при добавление записи. Проблема тут в обновлении этого поля (например, при добавлении новой записи). Да и не всегда всё-таки SQL-запросом можно обойтись. Нужные значения могут быть сложно вычисляемыми с привлечением каких-то внешних данных (не из БД, например). Ну это я уже фантазирую, тем не менее (как минимум первая проблема имеется)
0
|
|
|
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
|
||
| 06.06.2018, 22:07 | ||
|
Для тех кто разрабатывает БД нет проблем с подстановкой lookup полей в SQL запросе. В SQL есть всеми применяемые методы объединения данных.
Ваша беда в том, что никак не хотите отказываться от редактирования данных в гриде. Тогда нужно думать об ADOTable, который позволяет делать непосредственное редактирование в гриде более естественным. Разумеется, со всеми вытекающими последствиями в виде городьбы lookup-полей, вычисляемых полей и прочей "нечисти" .Насчет "доп. полей" и их обновления. Когда происходит добавление, обновление или удаление данных с использованием SQL, то чтобы измененные данные появились на клиенте (в гриде ли, где-либо еще), нужно перечитать данные селективным (от слова select) запросом, который находится в ADOQuery и который связан с отображением данных в гриде , а это, в свою очередь приведет к перерасчету вычисляемого в запросе поля. Только и всего. Но, опять же, повторюсь, это если использовать SQL запросы при добавлении, обновлении, удалении и чтения данных. Что делает проект более профессиональным. Если редактирование происходит все же в гриде, то добавить вычисляемое поле в ADOTable, которое вычисляется автоматически, никто не помешает. Но тогда об ADOQuery лучше забыть. Добавлено через 4 минуты К тому же, в любой СУБД есть встроенные функции, которых только в очень редких случаях может не хватить (даже не помню таких).
1
|
||
| 06.06.2018, 22:07 | |
|
Помогаю со студенческими работами здесь
14
Автоматическое добавление записи в таблицу, после добавления записи в другой таблице Обновить записи в первой форме, после добавления записи во второй DBGrid: умножить один столбец на другой и вывести в третий
Непонятное поведение поведение TIM6 на STM32f4discovery Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|