![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
каскадное копирование TSQL [D7, XP]
pleasure © (2010-02-18 13:28:00)существует три взаимосвязанных таблицы a->b->c ("c" подчинена "b", а "b" подчинена "а") меж ними связь один ко многим. каскадное удаление происходит на ура. а вот каким образом реализовать каскадное копирование ?
к примеру в таблице "а" копируем одну из строчек. следом копировать все свзяанные строки из "b" в неё же но с новым a.id, далее свзяанные строки из "с" ....
Проще говоря делается справочник прейскуранта услуг. а - прейскурант, b - услуги, с - составляющие услуг.
копирование предназначено для того, чтобы не вносить новые услуги и их составляющие с нуля.
к тому же у составляющих услуг должна быть ссылка адекватная новому Id услуги.
у кого какие соображения по этому поводу?
pleasure (2010-02-19 09:14:00) [21]
> Ega23 © (18.02.10 15:25) [16]
>
> Вечером напишу.
;((
pleasure (2010-02-18 16:09:00) [22]а мне видно пора опять книжку перечитать по TSQL, но уже внимательнее (((
Ega23 (2010-02-18 15:25:00) [23]Вечером напишу.
pleasure (2010-02-18 15:15:00) [24]а - прейскурант, b - услуги, с - составляющие услуг.
Старый прейскурант включает услуги, а услуги в свою очередь подразделяются на составляющие (медикаменты, работа и т.д.).
Нужно завести новый прейскурант. Чтобы не заносить все услуги и составляющие услуг делаем их копию из старого прейскуранта.
через for и while понятно как, а вот через запросы в ХП несовсем понятно как это реализовать. Точнее до половины "pleasure © (18.02.10 13:45) [4]" а дальше хз
Ega23 (2010-02-18 15:05:00) [25]А дальше?
Что со всем этим нужно делать-то? Где бизнес-логика?
pleasure (2010-02-18 14:31:00) [26]CREATE TABLE [dbo].[SPreiskur] (
[id] int IDENTITY(1, 1) NOT NULL,
[name] varchar(100) COLLATE Cyrillic_General_CI_AS NULL,
[data] smalldatetime DEFAULT getdate() NOT NULL,
[deistv] smallint DEFAULT 0 NOT NULL,
[idDogov] int NULL,
PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [SPreiskur_fk] FOREIGN KEY ([idDogov])
REFERENCES [dbo].[SDogovor] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[SUslugi] (
[id] int IDENTITY(1, 1) NOT NULL,
[name] varchar(250) COLLATE Cyrillic_General_CI_AS DEFAULT '-' NULL,
[kod] char(15) COLLATE Cyrillic_General_CI_AS DEFAULT '99999' NULL,
[cena] money DEFAULT 0 NOT NULL,
[tarifOMS] money DEFAULT 0 NOT NULL,
[vnerealiz] money DEFAULT 0 NOT NULL,
[TimeUsl] float DEFAULT 0 NOT NULL,
[PrRacx] money DEFAULT 0 NOT NULL,
[KocPacx] money DEFAULT 0 NOT NULL,
[KocPacxPr] float DEFAULT 0 NOT NULL,
[ItogPacx] money DEFAULT 0 NOT NULL,
[Rentab] money DEFAULT 0 NOT NULL,
[RentabPr] float DEFAULT 0 NOT NULL,
[ZPL] money DEFAULT 0 NOT NULL,
[Amortiz] money DEFAULT 0 NOT NULL,
[idSOtd] int NULL,
[idParent] int DEFAULT 99999 NULL,
[idPreisk] int NULL,
[USERNAME] varchar(75) COLLATE Cyrillic_General_CI_AS DEFAULT user_name() NOT NULL,
[MiagInv] money DEFAULT 0 NOT NULL,
[MInvTime] float DEFAULT 0 NOT NULL,
[prPervichn] bit DEFAULT 0 NOT NULL,
PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [SUslugi_fk] FOREIGN KEY ([idPreisk])
REFERENCES [dbo].[SPreiskur] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT [SUslugi_fk2] FOREIGN KEY ([idSOtd])
REFERENCES [dbo].[SOtdelen] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
)
ON [PRIMARY]
GO
CREATE TABLE [dbo].[EMedik] (
[id] int IDENTITY(1, 1) NOT NULL,
[idMedik] int NULL,
[idUslugi] int NULL,
[pacxod] float DEFAULT 0 NOT NULL,
[stoim] money DEFAULT 0 NOT NULL,
PRIMARY KEY CLUSTERED ([id]),
CONSTRAINT [EMedik_fk] FOREIGN KEY ([idUslugi])
REFERENCES [dbo].[SUslugi] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT [EMedik_fk2] FOREIGN KEY ([idMedik])
REFERENCES [dbo].[SMedik] ([id])
ON UPDATE CASCADE
ON DELETE CASCADE
)
ON [PRIMARY]
GO
Ega23 (2010-02-18 14:26:00) [27]DDL на таблицы давай.
Sergey13 (2010-02-18 14:18:00) [28]> [9] pleasure © (18.02.10 14:07)
Я их написал в первом ответе.
pleasure (2010-02-18 14:13:00) [29]не тригры точно здесь не помогут при а и b ещё прокатит а вот дальше начинается полнейший бардак. поторопился я (((
pleasure (2010-02-18 14:07:00) [30]Sergey13, а ваше предложение?
Sergey13 (2010-02-18 14:06:00) [31]Тригер тут вообще не к месту упомянут, ИМХО.
12 (2010-02-18 14:01:00) [32]
> Хранимка.
+1
> точно, надо на тригеры вставки повесить обработчики,
а потом еще и еще
а потом забыли про половину
а потом удивляемся, а чего это у нас идеальный с виду код так тормозит
Sergey13 (2010-02-18 13:59:00) [33]> [5] pleasure © (18.02.10 13:55)
> пущай они и думают, а не мне голову ломать ;))))
Хороший подход. Плодотворный.
pleasure (2010-02-18 13:55:00) [34]точно, надо на тригеры вставки повесить обработчики, пущай они и думают, а не мне голову ломать ;))))
pleasure (2010-02-18 13:45:00) [35]у меня выглядит
INSERT into Preiskur ([name], [data], deistv, idDogov)
values (@name,CAST(@data as smalldatetime),'1',@idDogov)
select @idd =@@IDENTITY
-- копирование в Справочник услуг услуг со старого прейскуранта
insert into SUslugi ([name], idPreisk, idSOtd, kod, cena, tarifOMS,
vnerealiz, TimeUsl, PrRacx, KocPacx, KocPacxPr, ItogPacx, Rentab,
RentabPr, ZPL, idparent, Amortiz, oldID)
select [name],@idd, idSOtd, kod, cena, tarifOMS, vnerealiz, TimeUsl,
PrRacx, KocPacx, KocPacxPr, ItogPacx, Rentab, RentabPr,
ZPL, '0', Amortiz, id
from SUslugi WHERE SUslugi.idPreisk=@id
но это начало копируются старые услуги в новый прейскурант, а составляющие нет ;(, да и не должны. а вот отследить свзяанн.... короче не осиляю я такой длинной связки пока через запросы ((((((
pleasure (2010-02-18 13:41:00) [36]возможно решение через тригер на данные таблицы inserted
Ega23 (2010-02-18 13:37:00) [37]Хранимка.
Sergey13 (2010-02-18 13:34:00) [38]Ну так копировать во вложенных циклах с подменой старых связей на новые.