Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Foxhound25
Member

Откуда:
Сообщений: 4
Добрый день!
Помогите решить следующую проблему:
Получаю данные запросом
select ASch.id1, tbNalog.idSection, tbNalog.flagDTKT, ASch.idSchetSubSchet, ASch.kodAPrizSchet, ASch.nameAPrizSchet
from tbNalog
  right join tbSprAPrizSchet ASch on ASch.id1 = tbNalog.id1
where ASch.idSchetSubSchet = :idSchetSubSchet
,
и отображаю в гриде, в котором мне и нужно их редактировать.
Но загвоздка в то что в запросе 2 связанные по схеме "1 к 1 необязательно" таблицы, редактировать нужно данные 2-ой таблицы(которых может и не быть).
И когда редактирую запись датасета к которой нет записи во 2-ой таблице выпадает ошибка:
Exception class EOleException with message 'Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения'.
, то-есть Query пытается сделать update записи которой нет.
И в таком случае мне нужно что бы Query делал insert. Как это реализовать?
11 мар 19, 17:44    [21829535]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
L_argo
Member

Откуда:
Сообщений: 742
Foxhound25,

только отдельным запросом(-сами).
11 мар 19, 18:12    [21829584]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Arioch
Member

Откуда:
Сообщений: 10807
запросом update or insert например

http://firebirdsql.su/doku.php?id=update_or_insert
11 мар 19, 18:30    [21829623]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Foxhound25
Member

Откуда:
Сообщений: 4
Arioch, запросы update и insert я умею писать, но как быть с тем что Query сам пытается обновить и получаем ошибку, не могу догнать?
11 мар 19, 19:08    [21829658]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10857
Foxhound25
но как быть с тем что Query сам пытается обновить
Присвойте ему UpdateObject
11 мар 19, 19:11    [21829662]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Foxhound25,

самое "на поверхности" - сделать руками

например http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_OnPostError.html

или например http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_BeforePost.html
11 мар 19, 19:14    [21829664]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Arioch
Member

Откуда:
Сообщений: 10807
_Vasilisk_
Foxhound25
но как быть с тем что Query сам пытается обновить
Присвойте ему UpdateObject


а нет такого
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/!!MEMBEROVERVIEW_ADODB_TADOQuery.html

это вам не BDE, это Microsoft ADO

впрочем, можно попытаться в потомке перекрыть http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ADODB_TCustomADODataSet_PSUpdateRecord@TUpdateKind@TDataSet.html - вдруг сработает
11 мар 19, 19:22    [21829669]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Arioch
или например http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_BeforePost.html


в 2003 именно так советовали, вряд ли много изменилось

К сообщению приложен файл. Размер - 59Kb
11 мар 19, 19:35    [21829677]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Foxhound25
Member

Откуда:
Сообщений: 4
Arioch
Foxhound25,

самое "на поверхности" - сделать руками

например http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/DB_TDataSet_OnPostError.html
...
добавил insert на OnPostError
procedure TMainForm.APrizSchetQPostError(DataSet: TDataSet; E: EDatabaseError;
  var Action: TDataAction);
begin
  if E is EDatabaseError then
  begin
    AddNalog.Parameters.ParamByName('id1').Value := DataSet.FieldByName('id1').Value;
    AddNalog.Parameters.ParamByName('idSection').Value := DataSet.FieldByName('idSection').Value;
    AddNalog.Parameters.ParamByName('flagDTKT').Value := DataSet.FieldByName('flagDTKT').Value;
    AddNalog.Execute;
    DataSet.Close;
    DataSet.Open;
    Action := daAbort;
  end
  else
    Action := daFail;
end;
, но осталась проблема что мне нужно получить эту вставленную в таблицу запись в DataSet'е, как лучше это сделать(CloseOpen как то не очень)? Спасибо )
12 мар 19, 11:52    [21830066]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Arioch
Member

Откуда:
Сообщений: 10807
Foxhound25,

там есть всякие методы типа update record, refresh record - экспериментируйте, проверяйте, код на Expert-exchange сравните со своим, может быть там что-то есть про обновление
12 мар 19, 12:50    [21830154]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Bali
Member

Откуда:
Сообщений: 54
Foxhound25,
А свойства у квери не пробовали установить:
AddNalog.properties['Update Criteria'].Value := adCriteriaUPDCols;
AddNalog.properties['Update Resync'].Value := adResyncAll;
AddNalog.Properties['Unique Table'].Value := 'tbNalog';
AddNalog.Properties['Resync Command'].Value := 'Select * from tbNalog where (KeyID = ?) and (KeyID2 = ?) and (KeyIDn = ?)';	

KeyID - первичные ключи таблицы tbNalog.
12 мар 19, 14:30    [21830283]     Ответить | Цитировать Сообщить модератору
 Re: Как заPost-тить данные на AdoQuery с двумя связанными "1 к 1 необязательно" таблицами  [new]
Foxhound25
Member

Откуда:
Сообщений: 4
Всем спасибо, особенно Arioch. Много нового для себя узнал чего Ado может- чего не может. В игоге совсем по другому задачу решил!
20 мар 19, 14:56    [21838574]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить