Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятки с ADOTable и DBGridEh, Полные непонятки :wacko  
:(
    Опции темы
ZeroMem
  Дата 9.9.2007, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Дело обстоит так. Использую MSAccess и TADOTable  с DBGridEh в D7
У меня есть 2 формы. 1 Главная и 1 подчиненная. 
Задача: пользователь в основной таблице на главной форме находится на некоторой записи. После нажатия на кнопку, открывается дочерняя форма, где я могу изменить значения некоторых из них (там есть еще функционал, но он никак не связан с задачей). Для отображения данных, я просто из OnFormShow дочерней формы забиваю данные в ее же ComboBox'ы и едиты:
Код

  edtClientInn.Text := FOrder.tm.FieldByName('ClientInn').AsString;
  cbDateZakaz.Text := FOrder.tm.FieldByName('DateZakaz').AsString;
  lblNomer.Caption := FOrder.tm.FieldByName('NomZakaz').AsString;

Основная таблица находится как раз на FOrder - главной форме. И использует tm: TADOTable как источник.
Но!!!
При открытие дочерней формы tm всегда говорит, что он находится на 1-й записи! То есть почему-то возвращает данные только первой строки, хотя должен вроде брать данные строки основной таблицы, на которую встал пользователь! не понимаю почему так...
Я это дело позже обошел просто так: при нажатии кнопки открытия дочерней формы, я до открытия прописал код, который из tm подставляет данные в контролы дочерней. Работает.
Но когда пытаюсь сохранить в tm по закрытию формы, данные пишутся именно в 1-ю строку и при этом изменения 1-й строки отображаются в основной таблице только после перезапуска программы! открытие/закрытие датасета tm тоже не помогло. 
Код

procedure TfrmAddEdit.btnSaveClick(Sender: TObject);
var
  Price_ID: Variant;
  vals: array[0..2] of String;
begin
  if memZakazAgents.State in [dsEdit, dsInsert] then memZakazAgents.Post;
  if memOplati.State in [dsEdit, dsInsert] then memOplati.Post;

  memZakazAgents.ApplyUpdates(-1);
  memOplati.ApplyUpdates(-1);
  with FOrder do
  begin
    vals[0] := STypeSheet.Lookup('Sheet', cbSheet.Text, 'Sheet_ID');
    vals[1] := SLocation.Lookup('Location', cbLocation.Text, 'Location_ID');
    vals[2] := SSize.Lookup('Size', cbSize.Text, 'Size_ID');
  end;

  cmdPriceGet.CommandText := 'select PriceList_ID From PriceList WHERE Sheet_ID = ' + vals[0] + ' AND Location_ID = ' + vals[1] + ' AND Size_ID = ' + vals[2];
  Price_ID := cmdPriceGet.Execute.Fields.Item[0].Value;
                          
  if not VarIsNull(Price_ID) then
    with FOrder do
    begin
      if not (tm.State in [dsEdit, dsInsert]) then tm.Edit;
      tm.FieldByName('PriceList_ID').AsVariant := Price_ID;
    end
  else
  begin
    MessageDlg('Îøèáêà! Òàêîé çàïèñè â ïðàéñå íå ñóùåñòâóåò!', mtError, [mbOK], 0);
    Exit;
  end;
  
  with FOrder.tm do
  begin
    FieldByName('Lp_TypZakaza').AsString := cbTipZakaz.Text;
    FieldByName('DateZakaz').AsString := cbDateZakaz.Text;
    FieldByName('ClientInn').AsString := edtClientInn.Text;
  end;

  FOrder.tm.Post;
  Self.Close;
end;

Уже совсем не знаю что делать. Надо просто сделать так, чтобы данные для дочерней корректно брались из tm, а потом изменения корректно записывались!  smile  smile  
PM MAIL ICQ   Вверх
ZeroMem
Дата 9.9.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Хм... думаю ответы на все эти вопросы будут получены, если понять почему вот так бывает:
На главной форме кинул кнопку. и при щелчке сиавлю датасет таблицы в состояние Edit.
Код

  tm.Edit;

Беру на второй форме созлаю тоже кнопку и обращаюсь как 
Код

  FOrder.tm.Edit;

Вопрос: Почему при щелчке на кнопке в основной форме грид показывает, что датасет в состоянии редактирования, а при щелчке со второй - НЕТ??!!
PM MAIL ICQ   Вверх
Rodman
Дата 10.9.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



а если из ГЛАВНОЙ формы сразу заполнять эдиты ДОЧЕРНЕЙ и потом открывать ее...
PM MAIL WWW Skype GTalk YIM MSN   Вверх
ZeroMem
Дата 10.9.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Так и пришлось сделать.
Интересно, но если в дочерней форме в классе формы объявить переменную tbl типа, как tm, т.е. TADOTable, а при открытие формы сделать из главной 
Код

  frmAddEdit.tbl := tm;

а в дочерней работать только с tbl, то все работает! smile 
ХЗ почему, но работае! smile  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0418 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.