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

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

каскадное копирование TSQL [D7, XP]


Страницы:   1 2

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]

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


Страницы:   1 2

Наверх

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