![]() |
|
|
![]()
|
|
| Garyck |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 11.10.2007 Репутация: нет Всего: нет |
Суть вот в чем:
Есть БД interbase. Есть огромное желание создать прогруммульку работующую с локальной базой и при необходимости с удаленной, поэтому делается все для минимализации транзакций. Суть программы в создании накладных с товарами. Есть две связные таблицы - одна таблица "накладные", вторая "товары в накладных". В программе две формы: одна с таблицей-списком всех накладных, вторая с редактированием содержимого накладных (с таблицей товаров) На первой форме есть кнопки: Добавить, Редактировать и удалить. На второй: Сохранить и отменить. С кнопками второй формы все понятно. При сохранении запускается транзакия записи на Update и при нажатии "Отмена" - закрытие формы. С двумя последними кнопками первой формы тоже все ясно: при нажатии на них либо появляется вторая форма с дочерней таблицей, либо удаляется текущая запись. А вот с добалением - не очень понятно. Допустим при нажатии "добавить", запустить транзакцияю на insert и открыть форму редактирования. Вроде все отлично: пользователь добавляет в таблицу товары и сохраняет. Но если пользователь передумал - то приходится удалять запись из таблицы накладных, что не очень мне нравится, если учеть то, что при добавлении к ней было использовано значение генератора, которое вхолостую использовано. А если при добавлении накладной - не добавлять запись в таблицу накладных, а добавить - только с сохранением всей накладной, то - невозможно будет заполнить дочернюю таблицу "товаров накладной". Надеюсь я понятно объяснил суть проблемы. Может кто подскажет алгоритм действия? |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 22 Всего: 122 |
не пойму как это... ты заполняешь таблицу при появлении формы??? я честно говоря от такого кол-ва букаф потерял суть... давай коротко и ясно об нужной форме расскажи! |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Не надо удалять, просто делаешь Rollback у транзакции. Про генератор и холостые значения - забудь, это не такая большая проблема. Как вариант решения, положи ClientDataSet или что-то типа MemoryTable заполняй там, а когда пользователь нажал "Сохранить" переноси в БД. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Garyck |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 11.10.2007 Репутация: нет Всего: нет |
При появлении формы я открываю таблицу. Смысл в том, что в программе все запросы на редактирования выполняются SQL коммандой, специально выделенной транзакцией для записи. А все ГРИДЫ работают только на чтение в отдельной транзакцией на ЧТЕНИЕ. Это связано с тем, что программа должна работать с большим количеством юзеров. Добавлено через 1 минуту и 29 секунд Ролбек не подходит. А на счет данных на клиенте идея отличная, сейчас попробую. |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
-------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Garyck |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 11.10.2007 Репутация: нет Всего: нет |
Я может плохо объяснил в прошлом посте. У меня две транзакции в проекте: одна ТОЛЬКО на чтение, а вторая на ЗАПИСЬ. И так вот, все Гриды работают с первой. Поэтому для отображения реальной информации необходимо коммитеть все изменения. |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Гриды не работают с транзакциями
Если ты добавишь данные в Dataset, к которому подключен грид, они появятся и в гриде и в БД. Потом можно добавлять данные в связанную таблицу, тоже будут видны из грида. Главное не закрывать(Commit/Rollback) вторую транзакцию. Есть одно "но", если добавление данных проводится с помощью другого компонента (IBSQL, IBQuery), то этот метод не сработает. Все это сказано для теории, на практике держать длинную пишущую не хорошо и так делать не надо. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Garyck |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 11.10.2007 Репутация: нет Всего: нет |
На счет того что гриды не работают с транзакциями, это и ежу понятно Ясен пень что они из Dataset, но откуда они возьмуться в нем при закрытой транзакции? Я же говорил что у меня изменение данных в другой транзакции и, соответственно в другом компоненте. Поэтому никакие ролбеки меня не спасут, или редактировать данные на клиенте, либо удалять все отмененное из БД. |
|||
|
||||
| Deniz |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 8 Всего: 44 |
Garyck, ты не указал с какими компонентами работаешь, а я по привычке подумал, что ты используешь FIBPlus (сам использую), поэтому и ...
В FIBPlus в pFIBDataSet можно указать читающую и пишущую транзакцию, т.е. делаешь ds.Insert ... ds.post, стартует пишущая транзакция и делает добавление в БД, но её можно коммитеть не сразу. Тем временем в DataSet все данные видны. Вот. -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
| Garyck |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 11.10.2007 Репутация: нет Всего: нет |
Я с ними не пробывал работать, посмотрю... А кто может подкинуть пример работы с MemoryTable или хотябы документацию. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |