Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2013, 16:08   #1
shiva4
Пользователь
 
Регистрация: 23.02.2012
Сообщений: 11
По умолчанию Параллельный ввод данных и Oracle

Всем привет!

Есть БД (на Oracle) где есть, в частности, "основная таблица" пусть будет "MAIN" (с уникальным полем "ID") и 2 дополнительные таблицы "WR" и "FR" связанные с таблицей "MAIN" по уникальному полю ID (WR.ID, FR.ID). Для одной записи таблицы MAIN может быть несколько значений в таблицах WR и FR.
Значения MAIN.ID - цифровые, увеличивающиеся на единицу по мере добавления новых записей.

Теперь сам вопрос.

Если в БД одновременно 2 (или больше) человека станут добавлять записи, как сделать, что бы в случае если один из них откажется от ввода - последовательность по полю MAIN.ID сохраняла шаг в единицу без перескоков.

например:

MAIN.ID=5 - последнее введенное значение в БД.
Подключаются 2 пользователя. Оба нажимают кнопку "Добавить", в результате чего программа вычисляет следующее значение для поля MAIN.ID и открывает форму с полями ввода.

Первый кто нажал "Добавить" получает значение "6".
2-й получает значение - "7".
Затем 1-й отказывается от ввода, а 2-й сохраняет всю введенную информацию. Получается что после "5" следующее значение - "7".

В теории можно конечно дать ввод всех полей, а уже на этапе сохранения вычислять новое значение MAIN.ID и 1-й сохранивший получает в данном случае значение "6", а 2-й если станет сохранять - получит "7", а откажется - для MAIN.ID это будет на важно. Нумерация не нарушится.

Только вот неудобно в данном случае возиться с 2 дополнительными таблицами, значения в которых обязательно сохраняются в дополнение к таблице MAIN.



Я изначально сделал так.

1. Нажал "Добавить". TOraSesson.StartTransaction

2.Программа вычиcлила MAIN.ID и отобразила форму ввода. На ней помимо полей ввода информации для главной таблицы, находятся 2 DB-Грида, отображающих информацию с дополнительных таблиц.

3.Пользователь заполняет поля ввода, после чего становится доступен ввод в дополнительные таблицы.

4. Вводится информация (выбор из списка с помощью мыши) в дополнительные таблицы.(без Commit-a)

5.По завершении ввода пользователем нажимается кнопка "Сохранить" на исходной форме ввода и тогда происходит сохранение в главную таблицу и выполняется Commit после. Соответственно фиксируются изменения и в дополнительных таблицах для которых Commit не был сделан. А иначе Rollback и введенная информация не остается ни в 1 из 3-х таблиц.

Можно конечно взять, например, что то типа массива, где хранить данные для дополнительных таблиц .. отображать в StringGrid-e дополнительную информацию. А при сохранении все заведенное пользователем писать в таблицы. Но как это громоздко получается..

Быть может есть более удачные идеи?
shiva4 вне форума Ответить с цитированием
Старый 17.07.2013, 19:30   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от shiva4 Посмотреть сообщение
как сделать, что бы в случае если один из них откажется от ввода - последовательность по полю MAIN.ID сохраняла шаг в единицу без перескоков.
В случае Oracle это неверная постановка задачи. Переходите обратно на dBASE и там кухарничайте. Oracle изначально заточен на многопользовательскую работу, и пропуск некоторых значений последовательностей -- неизбежное зло.

Вы, например, знаете, что они вообще не обязаны быть монотонно возрастающими, если вы их не создали с ключом ordered?

Цитата:
Сообщение от shiva4 Посмотреть сообщение
Можно конечно взять, например, что то типа массива, где хранить данные для дополнительных таблиц .. отображать в StringGrid-e дополнительную информацию.
Да-да-да, программисты dBASE так и делают. Флаг в руки, руки прочь от Oracle.

В самом же Oracle предусмотрен механизм returning, позволяющий вернуть измененные триггерами значения вызывающей программе. Честно говоря, позабыл уже, как там конкретно делается в ODAC... В общем случае целесообразно прописывать значения ID не отходя от сервера -- триггерами, а в клиентской программе указать, что ключевые поля заполняются сервером, что отсрочит расход последовательности до момента отправки данных на сервер.
Vapaamies вне форума Ответить с цитированием
Старый 18.07.2013, 08:29   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В случае Oracle это неверная постановка задачи.
А меня больше всего интересуют мотивы сего задания. Зачем ключевые поля делать строго последовательными? Если нужна нумерация, то это достигается хотя бы тем же
Код:
Select rownum,* from ....
Где rownum и будет давать на выходящем наборе от 1 до ыдцатиадцати без пропусков и перескоков.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.07.2013, 09:23   #4
shiva4
Пользователь
 
Регистрация: 23.02.2012
Сообщений: 11
По умолчанию

По поводу DBase, я действительно преимущественно с ним сталкивался при написании программ. С Oracle мало сталкивался, посему прошу не сильно пинать ногами. Читаю Дейв Энсор Йен Стивенсон "Oracle.Проектирование баз данных", но это дело не быстрое.

Сейчас возникла необходимость написать под Oracle программу. Естественно что навыки и мышление от написания локальных вещей на том же DBase никуда не делись. Базовые представления по Oracle есть, но вот практики написания с нуля маловато, потому и возникли такие вопросы.

На счет того, что Oracle изначально заточен на многопользовательскую работу я в курсе. Если бы был нужен Dbase - я бы об Oracle не спрашивал. К тому же с этой программой предполагается тоже не 1 человек будет работать и Dbase тоже не решил бы эту задачу лучше чем это можно сделать в Oracle.

По поводу строгой последовательности..хотелось бы что бы порядок был, хотя это и не критично, другое дело что есть еще 1 поле "NN", где последовательная нумерация имеет значение в виду области специфики программы. А посему, наличие пропусков по полю "NN" более критично.

На счет тригеров тоже мысль была..before Insert поставить вычисление поля "ID", но все равно, как понимаю, нужно организовать ввод информации, которая представляет собой список значений для дополнительных таблиц - в ОЗУ. "Основные данные" будут в полях ввода находиться до сохранения (там в каждом поле по 1 значению). А после нажатия кнопки "Сохранить" запускать процесс вставки данных в 3 таблицы, где будет вычисляться "ID" "NN" на момент записи.

Rownum вещь неплохая, но она не отображает реального положения вещей, насколько я посмотрел. У меня при вставке записей изначальное положение строк не соответствует последовательности вставки этих записей, а потому в данном случае этот вариант к сожалению не подходит.

Последний раз редактировалось shiva4; 18.07.2013 в 09:35.
shiva4 вне форума Ответить с цитированием
Старый 18.07.2013, 10:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Читаю Дейв Энсор Йен Стивенсон "Oracle.Проектирование баз данных"
Читай Томаса Кайта.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.07.2013, 16:40   #6
shiva4
Пользователь
 
Регистрация: 23.02.2012
Сообщений: 11
По умолчанию

имеется в виду Томас Кайт: Oracle для профессионалов ?
shiva4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Java в базе данных Oracle veter48 Java Базы данных (JDBC, JPA, Hibernate) 3 12.05.2013 23:16
База Данных в Oracle DateBase kisya8 Помощь студентам 0 20.10.2012 17:45
Конвертация данных с Paradox -->> Oracle Azamat_k БД в Delphi 5 17.07.2012 11:14
Подключение к сайту, ввод данных, отправка данных. Hichigo Общие вопросы C/C++ 0 20.07.2010 20:24