powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Применение Unique Table в ADO
21 сообщений из 21, страница 1 из 1
Применение Unique Table в ADO
    #39687988
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Разрабатываю очередное приложение и вновь наткнулся на старую проблему (раньше менял подход), но сейчас решил разобраться в сути, ведь решение должно быть
Есть у меня AdoQuery из двух таблиц (очень простой)

Код: sql
1.
2.
3.
4.
 SELECT ad.AddressID, ad.AgentID, ad.AddressName, ad.[Index], ad.Town, ad.[Address], ad.[AddressType], adt.AddressTypeName
 FROM  dbo.Addresses ad inner join dbo.AddressTypes adt on adt.AddressType = ad.AddressType
 where ad.AgentID = @pAgentID
 ORDER BY ad.[Index], ad.Town, ad.[Address]



в процессе работы я его редактирую, но затем сохранять надо только в одну таблицу (Addresses), если ничего не настраивать, то при добавлении 1 записи по одной записи добавится в обе таблицы, прочитав документацию применил у датасета свойство Unique Table,

Код: pascal
1.
2.
3.
    qAddress.Parameters.ParamByName('@pAgentID').Value := null;
    qAddress.Open;
    qAddress.Properties['Unique Table'].Value := 'Addresses';




но ничего не изменилось, наверное что-то не доделал. Может кто сталкивался. Заранее спасибо

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39687992
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968Может кто сталкивался.
msdnWhile Unique Table is set, the Delete method affects only the named table. The AddNew, Resync, Update, and UpdateBatch methods affect any appropriate underlying base tables of the Recordset.
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688003
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот смысл этого предложения не совсем понятен, что значит именованные таблицы?
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688008
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
patrick1968что значит именованные таблицы?
Названная (указанная) таблица.
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688020
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
казалось бы при чём тут Дельфи, если речь про Microsoft SQL и Microsoft-же ADO

http://www.sql.ru/forum/microsoft-sql-server
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688026
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что же получается Unique table это только для удаления, а как же быть с добавлением и изменением?
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688126
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39688185
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за полезную информацию
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694156
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. В продолжение темы. В одном случае (тот запрос из первого сообщения) реализовал.

qAddress.Open;
qAddress.Properties['Unique Table'].Value := 'Addresses';
ADODataSet1.Properties['Resync Command'].Value:=
'SELECT ad.AddressID, ad.AgentID, ad.AddressName, ad.[Index], ad.Town, ad.[Address], ad.[AddressType], adt.AddressTypeName
FROM dbo.Addresses ad inner join dbo.AddressTypes adt on adt.AddressType = ad.AddressType
where ad.AddressID = ?';

правда пришлось LockType установить в ltBatchOptimistic и после Post делать BatchUpdate() работало только так
я на форуме вычитал, что якобы такая схема работает лишь в случае, когда запрос связывает только 2 таблицы, но я что-то засомневался, но во втором случае у меня как-раз так запрос связывает 3 таблицы, вносить изменения надо только в одну

SELECT op.OptID, op.ModelID, m.ModelName, m.BrandId, m.BrandName, op.Serial, op.DeviceID, op.Note
FROM dbo.Options op left outer join dbo.vModels m on m.ModelID = op.ModelID

vModels - VIEW

запрос открываю так

qOptions.Open;
qOptions.Properties['Unique Table'].Value := 'Options';
qOptions.Properties['Update Criteria'].Value := adCriteriaKey;
qOptions.Properties['Update Resync'].Value:= adResyncAll;
qOptions.Properties['Resync Command'].Value := 'SELECT op.OptID, op.ModelID, m.ModelName, m.BrandId, m.BrandName, op.Serial,
op.DeviceID, op.Note FROM dbo.Options op left outer join dbo.vModels m on m.ModelID = op.ModelID where op.OptID = ?';

но при Post'е после добавлении записи система пытается также добавлять в таблицу Models

Действительно ли только 2 таблицы?
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694235
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
В Resync Command, в селекте, указываете только таблицу которую изменяете:
Код: sql
1.
2.
3.
qOptions.Properties['Resync Command'].Value := 'SELECT op.OptID, op.ModelID, op.Serial, op.DeviceID, op.Note 
FROM dbo.Options op  
where op.OptID = ?';
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694275
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a LockType какой устанавливать? а то при ltOptimistic система всё равно пытается добавлять в таблицу Models
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694458
AJi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AJi
Гость
А почему не воспользоваться хранимыми процедурами?
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694472
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
      ds.CursorLocation := clUseClient;
      ds.Cursortype := ctStatic;
      ds.Locktype = ltPessimistic;
      ds.MarshalOptions := moMarshalModifieldOnly; 
 
      ds.properties['Update Criteria'].Value := adCriteriaUPDCols;
      ds.properties['Update Resync'].Value := adResyncAll;
      ds.Properties['Unique Table'].Value := NameTable;
      ds.Properties['Resync Command'].Value := 'Select from SpisokTnLicsNU where (TN = ?) and (MgLics = ?) and (KeyID = ?)';


В запросе соеденено 3 таблицы.
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694520
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот это не совсем понятно 'Select from SpisokTnLicsNU where (TN = ?) and (MgLics = ?) and (KeyID = ?)';
текст основного запроса для примера пришлите пожалуйста
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694592
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
Извиняюсь, рузкмеется должно быть:
Код: sql
1.
Select * from SpisokTnLicsNU where (TN = ?) and (MgLics = ?) and (KeyID = ?)


TN, MgLics, KeyID - это первичные ключи.
Сам запрос у меня динамически формируется, в зависимости что пользователю надо.
Конкретно приведенный запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select ls.*,
 sp.Fam+' '+sp.ime+' '+sp.otc as FIO,
 dbo.GetStrCNT(1,IsNull(ls.debc,0), IsNull(ls.debs,0), IsNull(ls.deba,0), 0, IsNull(ls.debIstFin,0)) as DCNT,
 dbo.GetStrCNT(1,IsNull(ls.krec,0), IsNull(ls.kres,0), IsNull(ls.krea,0), 0, IsNull(ls.kreIstFin,0)) as KCNT
 from ((dbo.SpisokTNLicsNU ls
   Left Join dbo.SpisokTN sp On (sp.tn=ls.tn))
   Left Join dbo.SpisokTNWORK spw On (spw.tn=ls.tn))
 Where  - здесь вставляюся данные из фильтра
  Order By sp.Fam, sp.ime, sp.otc
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39694925
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у меня картинка вот какая, все дело видно в том, что 1-я таблица соединяется со 2-й, а 3-я соединяется не с 1-й, а со 2-й

Код: pascal
1.
2.
3.
 qOptions.Open;
 qOptions.Properties['Unique Table'].Value := 'Options';
 qOptions.Properties['Resync Command'].Value := 'SELECT * FROM dbo.Options op left outer join dbo.Models m on m.ModelID = op.ModelID left outer join dbo.Brands b on b.BrandID = m.BrandID where (op.OptID = ?) and (m.ModelID = ?) and (b.BrandID = ?)';



а сам запрос выглядит так

Код: sql
1.
2.
3.
 SELECT op.OptID, op.ModelID, m.ModelName, m.BrandId, b.BrandName, op.Serial, op.DeviceID, op.Note
 FROM  dbo.Options op left outer join dbo.Models m on m.ModelID = op.ModelID
                      left outer join dbo.Brands b on b.BrandID = m.BrandID



в результате добавления строки в запрос - сообщение (приложено), но ведь мне не нужно добавлять записи никуда, кроме Options
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39695049
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
Да какая разница как вы соеденяете таблицы.
В Resync Command должна быть только изменяемая таблица только со СВОИМИ первичными ключами в секции WHERE:
Код: sql
1.
qOptions.Properties['Resync Command'].Value := 'SELECT * FROM dbo.Options op where op.OptID = ?
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39695054
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже по разному делал, сейчас сделал как вы описали, ошибка та же - прямо наваждение какое-то
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39695060
Bali
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
patrick1968,
Возможно у вас есть таблицы с внешними ключами (FOREIGN KEY) и связанными таблицами, или тригерами на вставку, редакцию или удаление.
...
Рейтинг: 0 / 0
Применение Unique Table в ADO
    #39722208
patrick1968
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. Возвращаюсь к выше обсуждаемому и заново столкнулся с подобным, перевернул кучу статей по теме и вроде всё по науке, но процедура работает с ошибками хотя и данные изменяет, огромная просьба прояснить ситуацию
к теме есть у меня запрос связывающий несколько таблиц (во все первичные ключи)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 SELECT d.DeviceID, d.ModelID, m.ModelName, b.BrandName, d.Serial, dd.DogovorID, dd.DDID, dd.PeriodType, pt.PeriodTypeName, dd.ServiceQTY, dd.CurrencyType, ct.CurrencyTypeName, dd.Price,
        d.AddressID, a.[Address], a.AddressName, ag.AgentID, ag.AgentName, ag.NEP,
        d.SetupPlace, d.UniqueCode, d.IPAddr, d.Host, d.Note,
		CAST(d.StopGarProd as datetime) as StopGarProd,
		CAST(d.StopGarDalz as datetime) as StopGarDalz

 FROM  dbo.Devices d left outer join dbo.Models m on m.ModelID = d.ModelID
                     left outer join dbo.Brands b on b.BrandID = m.BrandID 
					 left outer join dbo.Addresses a on a.AddressID = d.AddressID
					 left outer join dbo.DeviceOfDogovor dd on dd.DeviceID = d.DeviceID
 					 left outer join dbo.Agents ag on ag.AgentID = a.AgentID
                     left outer join dbo.PeriodTypes pt on pt.PeriodType = dd.PeriodType
                     left outer join dbo.CurrencyTypes ct on ct.CurrencyType = dd.CurrencyType
 WHERE a.AgentID = @pAgentID 
        and dd.DogovorID = @pDogovorID



после его открытия
Код: pascal
1.
2.
    UniMainModule.qDD.Properties['Unique Table'].Value := 'DeviceOfDogovor';
    UniMainModule.qDD.Properties['Resync Command'].Value := 'SELECT * FROM  dbo.DeviceOfDogovor dd where dd.DDID = ?';


в гриде несколько полей но основные pt.PeriodTypeName, dd.ServiceQTY, ct.CurrencyTypeName, dd.Price
перед Postом меняю dd.PeriodType, dd.CurrencyType соответствующим pt.PeriodTypeName, ct.CurrencyTypeName, система эти значения прописывает правильно, но при этом она изменяет записи в подчиненных таблицах, что неверно, и затем естественно следует ошибка обновления.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Применение Unique Table в ADO
    #40021026
fumitox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
procedure Tform1.adoquery1AfterOpen(DataSet: TDataSet);
begin
adoquery1.Properties['Update Resync'].Value := adResyncAll;
adoquery1.Properties['Update Criteria'].Value := adCriteriaKey;
adoquery1.Properties['Unique Table'].Value := 'Addresses';
adoquery1.Next;
adoquery1.Prior;
end;
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Применение Unique Table в ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]