Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Применение Unique Table в ADO / 21 сообщений из 21, страница 1 из 1
15.08.2018, 12:08
    #39687988
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
Добрый день.

Разрабатываю очередное приложение и вновь наткнулся на старую проблему (раньше менял подход), но сейчас решил разобраться в сути, ведь решение должно быть
Есть у меня 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
15.08.2018, 12:12
    #39687992
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
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
15.08.2018, 12:21
    #39688003
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
Вот смысл этого предложения не совсем понятен, что значит именованные таблицы?
...
Рейтинг: 0 / 0
15.08.2018, 12:26
    #39688008
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
patrick1968что значит именованные таблицы?
Названная (указанная) таблица.
...
Рейтинг: 0 / 0
15.08.2018, 12:33
    #39688020
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
казалось бы при чём тут Дельфи, если речь про Microsoft SQL и Microsoft-же ADO

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

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
28.08.2018, 12:24
    #39694235
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
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
28.08.2018, 13:12
    #39694275
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
a LockType какой устанавливать? а то при ltOptimistic система всё равно пытается добавлять в таблицу Models
...
Рейтинг: 0 / 0
28.08.2018, 16:21
    #39694458
AJi
AJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
А почему не воспользоваться хранимыми процедурами?
...
Рейтинг: 0 / 0
28.08.2018, 16:38
    #39694472
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
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
28.08.2018, 17:44
    #39694520
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
Вот это не совсем понятно 'Select from SpisokTnLicsNU where (TN = ?) and (MgLics = ?) and (KeyID = ?)';
текст основного запроса для примера пришлите пожалуйста
...
Рейтинг: 0 / 0
28.08.2018, 21:34
    #39694592
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
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
29.08.2018, 13:32
    #39694925
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
а у меня картинка вот какая, все дело видно в том, что 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
29.08.2018, 15:29
    #39695049
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
patrick1968,
Да какая разница как вы соеденяете таблицы.
В Resync Command должна быть только изменяемая таблица только со СВОИМИ первичными ключами в секции WHERE:
Код: sql
1.
qOptions.Properties['Resync Command'].Value := 'SELECT * FROM dbo.Options op where op.OptID = ?
...
Рейтинг: 0 / 0
29.08.2018, 15:36
    #39695054
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
Уже по разному делал, сейчас сделал как вы описали, ошибка та же - прямо наваждение какое-то
...
Рейтинг: 0 / 0
29.08.2018, 15:48
    #39695060
Bali
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
patrick1968,
Возможно у вас есть таблицы с внешними ключами (FOREIGN KEY) и связанными таблицами, или тригерами на вставку, редакцию или удаление.
...
Рейтинг: 0 / 0
24.10.2018, 15:18
    #39722208
patrick1968
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
Добрый день. Возвращаюсь к выше обсуждаемому и заново столкнулся с подобным, перевернул кучу статей по теме и вроде всё по науке, но процедура работает с ошибками хотя и данные изменяет, огромная просьба прояснить ситуацию
к теме есть у меня запрос связывающий несколько таблиц (во все первичные ключи)
Код: 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
Период между сообщениями больше года.
21.11.2020, 19:34
    #40021026
fumitox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Применение Unique Table в ADO
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Применение Unique Table в ADO / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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