Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вставка записей в 2 таблицы [D5, MSSQL, ]


Страницы:   1 2 3

Shoo ©   (2001-12-13 13:20:00) 

Мастера, интересует такая вещь: имею БД на MS SQL 7.0, использую ADO, имеется 2 таблицы, KatNakl и SpNakl, связанные таким образом: SpNakl.cNakl -> KatNakl.NRec. По нажатию кнопки хочу добавить данные в обе таблицы, у TADOQuery использую свойство SQL для формирования запроса на добавление и метод ExecSQL для выполнения запроса, примерно так:

procedure TForm1.Button1Click(Sender: TObject);
var mycNakl: longint;
begin
mycNakl := 0;
ADOQuery1.SQL.Clear;
with ADOQuery1.SQL do
begin
Add("insert into katnakl (datenakl, smena, priznak)");
Add("values (""10.12.2001"", 1, ""1"")");
end;
ADOQuery1.ExecSQL;

//как здесь получить новое значение поля NRec в KatNakl,
//записав его, скажем в mycNakl,
//чтобы подставить его в cNakl таблицы SpNakl?

ADOQuery1.SQL.Clear;
with ADOQuery1.SQL do
begin
Add("insert into spnakl (cnakl, name)");
Add("values (" + IntToStr(mycNakl) + ", ""QQQQQQQ""");
end;
ADOQuery1.ExecSQL;
end;
end;

И вообще, правильным ли путем я иду? Как лучше вставлять данные в моем случае? Заранее благодарен.


neXt   (2001-12-13 15:10:00) [41]

я по ADO не спец, могу сказать как из стандартной TQuery вызывать, уверен что один фиг


neXt   (2001-12-13 15:05:00) [42]

-- Ну позно, я написал уже для простого поля, но поправить не сложно
-- не проверял так что это только пример
----------------------------------------------------------------
if object_id("KatNakl_SpNakl_Insert") is not null
drop proc KatNakl_SpNakl_Insert

GO
create proc KatNakl_SpNakl_Insert
@KatNakl_NRec numeric = null output, --Выходной параметр идентификатор KatNakl
@SpNakl_NRec numeric = null output, --Выходной параметр идентификатор SpNakl
-- Значения полей таблицы KatNakl
@DateNakl DateTime ,
@Smena int ,
@Priznak char ,
-- Значения полей таблицы SpNakl
@BarCod numeric ,
@Name char ,
@Kol numeric
as
declare @RetVal int

select @RetVal = 0 -- Если всё выполнилось удачно , то вернёт 0

-- Либо всё - либо ничего !!!
begin tran save tran TRAN_INSERT_KatNakl_SpNakl

-- Найдём новое не занятое значение первичного ключа
select @KatNakl_NRec = isnull( max(NRec) + 1 , 1 )
from KatNakl

-- Добавим запись в KatNakl
insert into KatNakl
(
NRec ,
DateNakl,
Smena ,
Priznak
)
select
@KatNakl_NRec,
@DateNakl ,
@Smena ,
@Priznak

-- Проверим добавилось ли?
if @@rowcount <> 1
begin
-- Код оибки добавления записи в
-- первую таблицу (можно выработать
-- свою систему нумерации ошибок)
@RetVal = 1000
-- Отменяем неудачное действие
rollback TRAN_INSERT_KatNakl_SpNakl
-- И на выход
goto EXIT_OFF
end

-- Найдём новое не занятое значение первичного ключа
select @SpNakl_NRec = isnull( max(NRec) + 1 , 1 )
from SpNakl

-- Если все хорошо то добавляем запись во вторую таблицу
insert into SpNakl
(
NRec ,
cNakl ,
BarCod ,
Name ,
Kol
)
select
@SpNakl_NRec ,
@KatNakl_NRec,
@BarCod ,
@Name ,
@Kol

if @@rowcount <> 1
begin
-- Код оибки
@RetVal = 1001
-- Отменяем неудачное действие
rollback TRAN_INSERT_KatNakl_SpNakl
-- И на выход
goto EXIT_OFF
end

EXIT_OFF:
commit tran
return @RetVal
GO


Shoo   (2001-12-13 14:59:00) [43]

Да, как IDENTITY.


neXt   (2001-12-13 14:51:00) [44]

технические подробности:
Ключ NRec в таблицах стоит как IDENTITY ? или его значение нужно наигрывать перед каждым добавлением


Shoo   (2001-12-13 14:29:00) [45]

2neXt:
Да, пожалуйста:

Table KatNakl:
Fields
NRec - numeric (primary key)
DateNakl - DateTime
Smena - int
Priznak - char

Table SpNakl:
Fields
NRec - numeric (primary key)
cNakl - numeric (связана с KatNakl.NRec)
BarCod - numeric
Name - char
Kol - numeric

Если есть необходимость, типы полей можно изменить, БД пока пуста.


neXt   (2001-12-13 14:17:00) [46]

Дай полный список полей обоих таблиц с типами


Shoo   (2001-12-13 14:15:00) [47]

И еще, прошу извинить, я забыл написать, что поле KatNakl.NRec является первичным ключом, формируемым автоматически и именно его значение мне нужно получить для записи данных во вторую таблицу


Shoo   (2001-12-13 14:06:00) [48]

2neXt:
Увы, для меня это все еще не так просто. Если несложно, на основе моего примера, приведите, плз, очень сжато, примерный текст хранимой процедуры, которая будет этим заниматься и как ее потом корректно вызывать? Спасибо.


Delirium   (2001-12-13 13:43:00) [49]

Существует специальная функция для генерации уникальных идентификаторов
NEWID тип uniqueidentifier, это значение каждый раз новое и абсолютно уникальное. На мой взгляд исользование таких идентификаторов - самый грамотный подход.


neXt   (2001-12-13 13:31:00) [50]

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо