Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Вниз

Добавление записей в БД   Найти похожие ветки 

 
Олеся ©   (2004-10-22 14:50) [0]

Проблема такая, есть некая таблица Table1, данная таблица связана с Table2, Table3 и т.д., допустим, через ключ id, причем Table2,3 и т.д. являются как бы дочерними таблицами, будем так называть, при вызове функции добавления, появляется форма, в которую пользователь заносит нужные данные, вопрос вот в чем, при одновременном добавлении записей в главную и дочерние таблицы, возникает ошибка, так как без Post первой таблицы не передается ключ id, а если делать Post до добавления в дочернии, то при отмене действия, в главной таблице запись все же остается.


 
Sergey13 ©   (2004-10-22 14:58) [1]

Значит надо попробовать получить значение ИД главной таблицы заранее.


 
Ega23 ©   (2004-10-22 15:00) [2]

Вообщето обычно сначала заполняют справочные таблицы, а потом подчиненные. Но если ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО добавлять записи во все таблицы сразу, то лучше воспользуйся написанием хранимой процедуры на сервере.

Да, вот ещё что: забудь про TTable.


 
Ega23 ©   (2004-10-22 15:00) [3]

Вообщето обычно сначала заполняют справочные таблицы, а потом подчиненные. Но если ДЕЙСТВИТЕЛЬНО НЕОБХОДИМО добавлять записи во все таблицы сразу, то лучше воспользуйся написанием хранимой процедуры на сервере.

Да, вот ещё что: забудь про TTable.


 
msguns ©   (2004-10-22 15:11) [4]

Если при вводе надо скакать по окнам (панелям) главной и подчиненных, то следует сразу отказаться от DB-aware контролов, а все впихивать либо в стрингриды (массивы записей), либо, если данных много, использовать клиентские датасеты с промежуточным сохранением на лок.диске.
А вообще мне лично непонятно, откуда такое суровое условие. И почему нельзя ввести до конца заголовок, запостить его, а потом уж заниматься деталями.


 
Anatoly Podgoretsky ©   (2004-10-22 15:35) [5]

Трансакции


 
Олеся ©   (2004-10-22 15:35) [6]

Sergey32: А как получить значение будущего id, без вставки записи? И притом мне это мало что дает, при вставке в дочернии таблицы я использую append, а не запрос типа insert into (так как подобный запрос при таком количестве таблиц, и записей...), поэтому свой, личный id, вручную я передать не могу.

Ega23: я думала об этом, если честно, но не представляю себе как написать подобную хранимую процедуру, возможно я не полностью осведомлена в этой теме.
Я использую ADOTable.

msguns: я использую DBEhoGrid, и отказаться от него не представляет никакой возможности. Условие должно выполнятся, такое ТЗ.


 
Олеся ©   (2004-10-22 15:37) [7]

Anatoly Podgorelsky: проходили мы такое, делала для ADOConnection BeginTran, толку было ноль, очень сложно все преобразования уследить, да еще сделать так, чтобы они были в одной транзакции, но может вы подскажете ваш подход?


 
Ega23 ©   (2004-10-22 15:38) [8]

Забудь про TADOTable и будет тебе счастье.
Вредный элемент.


 
Олеся ©   (2004-10-22 15:42) [9]

Ega23: а что вы мне предлагаете использовать как замену?аргументируйте пожалуйста, у меня огромнейший проект весь на ADO компонентах, если я из-за исправления одной ошибки, буду все переделывать, мне нужны необходимые для этого аргументации. Да еще при условии, что у меня не возникнут новые проблемы, которые при таком перевороте могут оказаться более значимыми!


 
Ega23 ©   (2004-10-22 15:44) [10]

TADOQuery.

И что-то не верится мне, что "огромнейший проект" построили на ADOTable"ах. Ну редактирование справочных таблиц. Да вот, собственно, и всё. Больше применения - не вижу...


 
Johnmen ©   (2004-10-22 15:46) [11]

Как верно заметил АП, здесь надо вдумчиво изучать и аналогично применять управление транзакциями...


 
DenK_vrtz ©   (2004-10-22 15:52) [12]

>Ega23 ©

Видел я как-то у одного "маньяка" проект. Из DataSet-ов одни TTable. А потом начинается беготня по while not() do. Душераздирающее зрелище! :)


 
Олеся ©   (2004-10-22 15:59) [13]

Ega23: А-а, я просто не поняла постановку совета, так у меня на дочерние таблицы и есть ADOQuary, куда передается параметр id, но как я смогу узнать заранее какой id у меня примет главная запись?


 
Anatoly Podgoretsky ©   (2004-10-22 16:11) [14]

Либо запрашиваешь самостоятельно и вставляешь вручную, либо после вставки узнаешь у сервера @IDENTITY

Трансакции позволят вернуть все в исходное состояние, если будет желание отказаться от модификации.


 
Олеся ©   (2004-10-22 16:14) [15]

Спасибо всем за советы, попробую разобраться в транзакциях.


 
bushmen ©   (2004-10-22 16:38) [16]

"SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope."


 
dim- ©   (2004-10-23 10:44) [17]

а еще можешь в качестве id использовать GUID.
при создании записи в главной таблице формируешь GUID, а в дочернии его передаешь.
uses
 ..ActiveX,ComObj;

Function GetGUID ():ShortString;
var                                                      
 Guid: TGuid;                                          
 strGuid: string;                                      
begin                                                    
 CoCreateGuid(Guid);                                    
 strGuid := GuidToString(Guid);                        
 Delete(strGuid,length(strGuid),1);                    
 Delete(strGuid,1,1);                                  
 Result := strGuid;                                    
end;


 
bushmen ©   (2004-10-23 12:59) [18]

>а еще можешь в качестве id использовать GUID

Ключ будет медленне работать, чем int с identity



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.11.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.034 c
1-1099480835
Tracer
2004-11-03 14:20
2004.11.21
Как в тело программы запихнуть файлы?


1-1099780146
Змей
2004-11-07 01:29
2004.11.21
treeview


1-1099787875
Thor234
2004-11-07 03:37
2004.11.21
Панель инструментов/задач


14-1099416329
Mihey_temporary
2004-11-02 20:25
2004.11.21
Фень Юань "Программирование графики для Windows"


1-1099577292
tchn
2004-11-04 17:08
2004.11.21
динамически создать компонент?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский