![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ввод данных в две таблицы из одной формы [D7, IB6.x, FireBird 1.5]
grav © (2008-04-17 17:49:00)Требуется реализовать ввод данных в БД. Данные следующие. Имеется здание, в нем располагаются объекты (склад, столовая и т.д.). Нужно чтобы пользователь вводил: Здание №1, его параметры (год постройки, общая площадь, полная стоимость и т.д.). Потом на этой же форме вводил все объекты располагающиеся в этом здании: 1. Столовая, площадь, проектная мощность и т.д. 2. Спортзал .... 3...
Потом Здание №2 и его объекты. И чтобы это все на одной форме располагалось.
Своих варианта два. Первый - использовать два DBGrid, вверху для зданий, внизу для объектов. Второй - использовать TDBCtrlGrid, с которым не могу разобраться :)
Подскажите, как такое правильно реализуется?
Сергей М. (2008-05-13 13:11:00) [21]
> есть более красивый метод?
>
Есть - пройтись в циклепо всем компонентам-наследникам класса TIBCustomDataSet
grav (2008-05-13 13:07:00) [22]
> Сергей М. © (13.05.08 12:56) [72]
Спасибо, работает.
Но еще вопрос появился :) У меня три дбгрида и пять IBTable. Три из них связаны мастер-детайл. Еще два для LookUp полей.
Последовательно проверять UpdatesPending для каждой таблицы или есть более красивый метод?
Сергей М. (2008-05-13 12:56:00) [23]
> Что не так?
см. ApplyUpdates
grav (2008-05-13 12:48:00) [24]
> Сергей М. © (13.05.08 12:36) [70]
Использую IBTable. Поставил CachedUpdates:=True; Действительно, меняю что нибудь в гриде, отлавливает, что произошли изменения.
Делаю коммит. Но данные почему то не сохраняются. Что не так?
Сергей М. (2008-05-13 12:36:00) [25]
> Как отследить, что они менялись?
Простейший способ - анализировать св-во TIBDataSet.UpdatesPending, если, конечно же, этот компонент используется и работает в режиме кэширования изменений.
grav (2008-05-13 12:32:00) [26]
> Anatoly Podgoretsky © (13.05.08 12:29) [68]
А если случайно нажал пользователь что то? Или не хочет сохранять изменения, передумал?
Anatoly Podgoretsky (2008-05-13 12:29:00) [27]> grav (13.05.2008 12:21:04) [64]
Зачем знать, просто делай Commit
Сергей М. (2008-05-13 12:29:00) [28]
> TIBTransaction
Нет там подобных свойств.
> как узнать менялись ли данные в DBGrid
В DBGrid нет никаких данных, данные имеются в DataSet, к которому через DataSource подключен DBGrid. А уж у DataSet на этот счет есть события AfterPost, AfterDelete
grav (2008-05-13 12:28:00) [29]
> Sergey13 © (13.05.08 12:24) [65]
Криво вопрос сформулировал я. Вот есть форма с гридами. Пользователь чего то поменял, автоматически запустилась транзакция. Пользователь форму закрывает, измененные данные теряются.
Можно поставить на автоматическое подтверждение транзакции, а хочется чтобы выводилось сообщение "Данные изменены. Сохранить?"
Как отследить, что они менялись?
Sergey13 (2008-05-13 12:24:00) [30]> [64] grav (13.05.08 12:21)
> менялись ли данные в DBGrid
Нет конечно. Их, данных, там просто нет.
grav (2008-05-13 12:21:00) [31]
> Ты о каком компоненте речь ведешь ?
TIBTransaction
А как узнать менялись ли данные в DBGrid и надо ли делать коммит?
Сергей М. (2008-05-13 12:06:00) [32]
> поставить глобальную переменную и отслеживать ее
Это уж как угодно - хоть глобальную хоть не глобальную.
> самой транзакции нет свойства, которое отслеживает рпошел
> коомит или нет?
Ты о каком компоненте речь ведешь ?
grav (2008-05-13 12:03:00) [33]
> Сергей М. © (13.05.08 12:01) [61]
Т.е. поставить глобальную переменную и отслеживать ее. У самой транзакции нет свойства, которое отслеживает рпошел коомит или нет?
Сергей М. (2008-05-13 12:01:00) [34]
> если коммит прошел, можно очищать поля на форме
Если коммит прошел, то он прошел.
Иначе бы возникло исключение.
Отсутствие исключения и есть факт успешного выполнения коммита.
grav (2008-05-13 11:56:00) [35]Сорри, за то что пишу в старой теме.
Как в программе определить был Commit или нет?
Хотел так:if not MainForm.WriteTr.Active then ....
Не срабатывает после коммита.
Я думал, если коммит прошел, то транзакция становится не активной.
PS
Нужно для очитски полей ввода. Т.е. если коммит прошел, можно очищать поля на форме.
Плохиш (2008-04-25 11:33:00) [36]
> опять надо IBQuery.SQL.Clear;
Совершенно не надо и даже вредно. Стоит посмотреть какие ещё свойства есть у TStrings.
Сергей М. (2008-04-25 11:16:00) [37]
with GroupBox do
for i := 0 to ControlCount - 1 do
if Controls[i] is TEdit then
TEdit(Controls[i]).Text := '';
grav (2008-04-25 11:11:00) [38]Подскажите пожалуйста, как очистить все TEdit в пределах одного TGroupBox перед вводом новой записи?
grav (2008-04-23 14:49:00) [39]
> Anatoly Podgoretsky © (23.04.08 13:19) [55]
> Неверный подход, используй параметры.
Эх. А про параметры я совсем и забыл. Мучаюсь с вставкой занчений из пустых эдитов. Спасибо!
Anatoly Podgoretsky (2008-04-23 13:19:00) [40]Неверный подход, используй параметры.