Показать сообщение отдельно
  #1  
Старый 20.09.2013, 02:00
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию Master Detail ltBatchOptimistic AutoInc

Здесь начало решения проблемы.

Я предлагаю решить задачу общими силами, т.к. на многих форумах сталкивался с подобными.

Дано. Две связанных таблицы, связаны по ID(Autoincrement int) <- MasterID(int) (Документ и привязанные к документу товары)

Задача: добавлять документ, с привязанными к нему товарами с возможностью отмены.
Справка:
ltBatchOptimistic - режим для редактирования таблиц, который позволяет использовать UpdateBatch/CancelButch (Сохранить/Отменить изменения)


Проблема вот из-за этой связи:
Код:
  tDetail.MasterSource := dsMaster;
  tDetail.MasterFields := ID;
  tDetail.IndexFieldNames := MasterID;
Создаём "Шаблон документа";
Код:
  tMaster.Insert;
  tMaster.FieldByName('Поле №1').AsInteger := 100;
  tMaster.FieldByName('Поле №2').AsString := 'В работе';
  // ещё куча стандартных значений (возможно автозаполнение средствами самого сервера
  tMaster.Post;
Позволяем Пользователю изменить стандартные значения шаблона.

Дальше необходимо привязать к Документу товар ещё не созданный, ибо его только привезли. Позволяем пользователю добавить новый товар:
Код:
  tDetail.Insert;
  // tDetail.FieldByName('MasterID').AsString := ???????
  tDetail.FieldByName('Item').AsString := Edit2.Text;
  // либо через привязанные DBEdit%.Text;
  tDetail.Post;

Собственно проблема: что присваивать полю MasterID ??
Ведь сервер ещё даже не подозревает о новом документе, и в АвтоИнкрементируемом поле сейчас висит 0 (проверено в DebugMode).

Если не присваивать ничего, то в DBGrid2 (в котором отражаются tDetail данные) ничего не отображается, т.к. присутствует Связь (описывалась вначале)

Решением под вопросом является такая конструкция:
Код:
Select Ident_Current('tMaster')
Запрос возвращает текущий Номер записи, т.е. +1 к нему и подставляем в tDetail. решение попахивает костылями. (имхо) Или мне лечиться надо?)
Ответить с цитированием