Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как поступить со связными таблицами, Алгоритм добавления записи 
:(
    Опции темы
Garyck
Дата 10.11.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 11.10.2007

Репутация: нет
Всего: нет



Суть вот в чем:
Есть БД interbase. Есть огромное желание создать прогруммульку работующую с локальной базой и при необходимости с удаленной, 
поэтому делается все для минимализации транзакций.

Суть программы в создании накладных с товарами. 
Есть две связные таблицы - одна таблица "накладные", вторая "товары в накладных".
В программе две формы: одна с таблицей-списком всех накладных, вторая с редактированием содержимого накладных (с таблицей товаров)
На первой форме есть кнопки: Добавить, Редактировать и удалить.
На второй: Сохранить и отменить.
С кнопками второй формы все понятно. При сохранении запускается транзакия записи на Update и при нажатии "Отмена" - закрытие формы.
С двумя последними кнопками первой формы тоже все ясно: при нажатии на них либо появляется вторая форма с дочерней таблицей, либо удаляется текущая запись.
А вот с добалением - не очень понятно. Допустим при нажатии "добавить", запустить транзакцияю на insert и открыть форму редактирования. Вроде все отлично: пользователь добавляет в таблицу товары и сохраняет. Но если пользователь передумал - то приходится удалять запись из таблицы накладных, что не очень мне нравится, если учеть то, что при добавлении к ней было использовано значение генератора, которое вхолостую использовано.
А если при добавлении накладной - не добавлять запись в таблицу накладных, а добавить - только с сохранением всей накладной, то - невозможно будет заполнить дочернюю таблицу "товаров накладной".
Надеюсь я понятно объяснил суть проблемы.
Может кто подскажет алгоритм действия?
PM MAIL   Вверх
Rodman
Дата 11.11.2007, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



Цитата(Garyck @  10.11.2007,  18:29 Найти цитируемый пост)
Но если пользователь передумал 

не пойму как это...

ты заполняешь таблицу при появлении формы??? 


я честно говоря от такого кол-ва букаф потерял суть...

давай коротко и ясно об нужной форме расскажи!
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Deniz
Дата 12.11.2007, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Garyck @  10.11.2007,  21:29 Найти цитируемый пост)
Но если пользователь передумал - то приходится удалять запись из таблицы накладных, что не очень мне нравится, если учеть то, что при добавлении к ней было использовано значение генератора, которое вхолостую использовано.
Не надо удалять, просто делаешь Rollback у транзакции.
Про генератор и холостые значения - забудь, это не такая большая проблема.

Как вариант решения, положи ClientDataSet или что-то типа MemoryTable заполняй там, а когда пользователь нажал "Сохранить" переноси в БД.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Garyck
Дата 12.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 11.10.2007

Репутация: нет
Всего: нет



Цитата(Rodman @ 11.11.2007,  13:07)
Цитата(Garyck @  10.11.2007,  18:29 Найти цитируемый пост)
Но если пользователь передумал 

не пойму как это...

ты заполняешь таблицу при появлении формы??? 


я честно говоря от такого кол-ва букаф потерял суть...

давай коротко и ясно об нужной форме расскажи!

При появлении формы я открываю таблицу.
Смысл в том, что в программе все запросы на редактирования выполняются SQL коммандой, специально выделенной транзакцией для записи. А все ГРИДЫ работают только на чтение в отдельной транзакцией на ЧТЕНИЕ.
Это связано с тем, что программа должна работать с большим количеством юзеров.

Добавлено через 1 минуту и 29 секунд
Цитата(Deniz @ 12.11.2007,  07:02)
Цитата(Garyck @  10.11.2007,  21:29 Найти цитируемый пост)
Но если пользователь передумал - то приходится удалять запись из таблицы накладных, что не очень мне нравится, если учеть то, что при добавлении к ней было использовано значение генератора, которое вхолостую использовано.
Не надо удалять, просто делаешь Rollback у транзакции.
Про генератор и холостые значения - забудь, это не такая большая проблема.

Как вариант решения, положи ClientDataSet или что-то типа MemoryTable заполняй там, а когда пользователь нажал "Сохранить" переноси в БД.

Ролбек не подходит. А на счет данных на клиенте идея отличная, сейчас попробую.
PM MAIL   Вверх
Deniz
Дата 12.11.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Garyck @  12.11.2007,  14:45 Найти цитируемый пост)
Ролбек не подходит

Что значит не подходит?
К кому не подходит?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Garyck
Дата 13.11.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 11.10.2007

Репутация: нет
Всего: нет



Цитата(Deniz @ 12.11.2007,  15:14)
Цитата(Garyck @  12.11.2007,  14:45 Найти цитируемый пост)
Ролбек не подходит

Что значит не подходит?
К кому не подходит?

Я может плохо объяснил в прошлом посте.
У меня две транзакции в проекте: одна ТОЛЬКО на чтение, а вторая на ЗАПИСЬ.
И так вот, все Гриды работают с первой. Поэтому для отображения реальной информации необходимо коммитеть все изменения.
PM MAIL   Вверх
Deniz
Дата 14.11.2007, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Гриды не работают с транзакциями
Если ты добавишь данные в Dataset, к которому подключен грид, они появятся и в гриде и в БД.
Потом можно добавлять данные в связанную таблицу, тоже будут видны из грида.
Главное не закрывать(Commit/Rollback) вторую транзакцию.
Есть одно "но", если добавление данных проводится с помощью другого компонента (IBSQL, IBQuery), то этот метод не сработает.
Все это сказано для теории, на практике держать длинную пишущую не хорошо и так делать не надо.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Garyck
Дата 14.11.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 11.10.2007

Репутация: нет
Всего: нет



Цитата(Deniz @ 14.11.2007,  06:41)
Гриды не работают с транзакциями
Если ты добавишь данные в Dataset, к которому подключен грид, они появятся и в гриде и в БД.
Потом можно добавлять данные в связанную таблицу, тоже будут видны из грида.
Главное не закрывать(Commit/Rollback) вторую транзакцию.
Есть одно "но", если добавление данных проводится с помощью другого компонента (IBSQL, IBQuery), то этот метод не сработает.
Все это сказано для теории, на практике держать длинную пишущую не хорошо и так делать не надо.

На счет того что гриды не работают с транзакциями, это и ежу понятно smile 
Ясен пень что они из Dataset, но откуда они возьмуться в нем при закрытой транзакции?

Я же говорил что у меня изменение данных в другой транзакции и, соответственно в другом компоненте.
Поэтому никакие ролбеки меня не спасут, или редактировать данные на клиенте, либо удалять все отмененное из БД.
PM MAIL   Вверх
Deniz
Дата 16.11.2007, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Garyck, ты не указал с какими компонентами работаешь, а я по привычке подумал, что ты используешь FIBPlus (сам использую), поэтому и ...
В FIBPlus в pFIBDataSet можно указать читающую и пишущую транзакцию, т.е. делаешь ds.Insert ... ds.post, стартует пишущая транзакция и делает добавление в БД, но её можно коммитеть не сразу. Тем временем в DataSet все данные видны. Вот.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Garyck
Дата 17.11.2007, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 11.10.2007

Репутация: нет
Всего: нет



Цитата(Deniz @  16.11.2007,  07:30 Найти цитируемый пост)
Garyck, ты не указал с какими компонентами работаешь, а я по привычке подумал, что ты используешь FIBPlus (сам использую), поэтому и ...В FIBPlus в pFIBDataSet можно указать читающую и пишущую транзакцию, т.е. делаешь ds.Insert ... ds.post, стартует пишущая транзакция и делает добавление в БД, но её можно коммитеть не сразу. Тем временем в DataSet все данные видны. Вот.

Я с ними не пробывал работать, посмотрю...

А кто может подкинуть пример работы с
MemoryTable или хотябы документацию.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.