![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Всем привет. Интересует best-practice в решении следующей задачи:
есть две таблицы связанные между собой. В первой хранится документ (заказ), во второй - изделия, связанные с определённым заказом. Как "по учебнику" реализуется оформление нового заказа? Интересуют нюансы связанные с порядком заполнения таблиц: в какую таблицу инфа попадает в первую очередь? p.s как реализовано у меня: 1) try BeginTrans 2) Post в первую таблицу самого документа (Пустого, т.е. без изделий) 3) Запоминаю ID документа-заказа 3) Post*N во вторую таблицу (N записей во вторую таблицу с привязкой по ключевому полю на выше запомненный ID) 4) CommitTrans 5) Except RollBackTrans |
|
#2
|
||||
|
||||
|
Ну в принципе все правильно.
Сначала родительская таблица, потом дочерние. Советую использовать запросы на прямую |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Uniq! (19.03.2014)
| ||
|
#3
|
||||
|
||||
|
Что значит на прямую? так?
Код:
Query.Sql.Text := 'Insert into...'; Query.ExecSQL; Я сейчас вообще в ADOTable реализовал всё. Ибо приложение несложное и особых функций в нём не предполагается. |
|
#4
|
||||
|
||||
|
Да, так нагляднее и удобнее, чем посты и аппенды.
Я для работы с бд вообще так сделал: Код:
function OpenQuery(const ASQLQuery: string; AParams: IParams = nil): IDataSet;
begin
Result := TInternalDataset.Create(ASQLQuery, AParams);
end;
procedure ExecSQL(const ASQLQuery: string; AParams: IParams = nil);
var
p: TParams;
begin
if Assigned(AParams) then
p := AParams.Params
else
p := nil;
Database.Execute(ASQLQuery, p);
end;Использую так: Код:
ds := OpenQuery(SQL_LOAD_ЧЁТО_ТАМ, p);
with ds.DataSet do
begin
First;
while not Eof do
begin
... |