Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2013, 09:38   #1
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию большая проблема с редактированием dbgrid

у меня есть таблица в mysql, соединяюсь из delphi компонентом mydac

так вот есть несколько dbgrid, данные из таблицы базы поступают в них sql запросами. Проблема в том как реализовать редактирование.

Если бы я выводил всю таблицу, то никаких проблем dbedit и post

как реализовать в данном случае, могу только представить - по щелчку на строку, эта запись должна найтись в таблице - и отобразиться в dbedit.

конечно можно обойтись наверное и без вывода в дбгрид запросом, но тогда придется одинаковых таблиц множить целую кучу, и как то связывать их. Может быть кто-нибудь сталкивался с подобным?
undead92 вне форума Ответить с цитированием
Старый 09.07.2013, 11:56   #2
astecenko
Homo Interneticus
Форумчанин
 
Аватар для astecenko
 
Регистрация: 04.03.2011
Сообщений: 611
По умолчанию

Не пользовался mydac, но по сути Вам нужны "живые запросы", если компонент поддерживает подобную возможность (может быть есть свойство или опция LiveQuery или что-то типа того), то можете использовать. Но для работы "живых запросов" в выборке должно быть достаточно ключевых полей. Да и сама реализация "живых запросов" именно так как Вы предполагаете и делается - запросами. Так что если нельзя выборки связанные с DbGrid-ами сделать "живыми" то тогда только самостоятельно писать запросы на редактирование записей. Это все без привязки к mySQL. Возможно там можно триггеры написать какие-то, не знаю, не работал...
astecenko вне форума Ответить с цитированием
Старый 09.07.2013, 14:37   #3
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,776
По умолчанию

Цитата:
Сообщение от undead92 Посмотреть сообщение
как реализовать в данном случае, могу только представить - по щелчку на строку, эта запись должна найтись в таблице - и отобразиться в dbedit.
У нормальных программистов по щелчку на строку текущая выделенная записть в DBGrid должна быть выведена в DB-компоненты в диалоге, подключенные к тому же DataSource, что и DBGrid.

Если правильно понимаю, то MyDAC должен использовать ту же систему, что и ODAC, поскольку написан на том же DAC-движке. В нем обычно бывает "ручная" и "продвинутая" версии -- TxxQuery и TxxSmartQuery. В ручной версии нужно UpdateSQL и DeleteSQL нужно писать вручную, а в smart-версии достаточно указать KeyFields, и компонент сгенерит соответствующие UpdateSQL сам.
Vapaamies вне форума Ответить с цитированием
Старый 09.07.2013, 15:53   #4
undead92
Пользователь
 
Регистрация: 26.12.2009
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
У нормальных программистов по щелчку на строку текущая выделенная записть в DBGrid должна быть выведена в DB-компоненты в диалоге, подключенные к тому же DataSource, что и DBGrid.

Если правильно понимаю, то MyDAC должен использовать ту же систему, что и ODAC, поскольку написан на том же DAC-движке. В нем обычно бывает "ручная" и "продвинутая" версии -- TxxQuery и TxxSmartQuery. В ручной версии нужно UpdateSQL и DeleteSQL нужно писать вручную, а в smart-версии достаточно указать KeyFields, и компонент сгенерит соответствующие UpdateSQL сам.

Ручной вариант получился по образцу, прикрепил.

в принципе keyfields тоже попробовал - быстрее. Но! печаль в том что все записи должны быть уникальны, потому что если в дбгриде есть 2 одинаковые строки - то выскочит ошибка

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
У нормальных программистов по щелчку на строку текущая выделенная записть в DBGrid должна быть выведена в DB-компоненты в диалоге, подключенные к тому же DataSource, что и DBGrid.

Можно про это поподробней? с примером


Идея! Если создать в базе id2 например, и сделать его автозаполнение, то если в keyfields засунуть id 2 - проблема решиться? все остальные поля в строках могут быть одинаковыми
Вложения
Тип файла: zip Новая папка.zip (445.8 Кб, 14 просмотров)

Последний раз редактировалось Stilet; 09.07.2013 в 17:07.
undead92 вне форума Ответить с цитированием
Старый 09.07.2013, 17:35   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,776
По умолчанию

Цитата:
Сообщение от undead92 Посмотреть сообщение
если в дбгриде есть 2 одинаковые строки - то выскочит ошибка
И правильно, ибо нефиг. Возможных причин две:
  • Запрос выбирает не все ключевые поля.
  • Таблица/представление БД не имеют первичного ключа.
По второму случаю предлагаю глубже ознакомиться с теорией реляционных БД, особенно в части нормализации.

По поводу редактирования и диалогов:
  • На главной форме лежит DBGrid, DataSource, DataSet (SmartQuery). DBGrid отображает данные из DataSet-а, что логично.
  • Диалог создается как отдельная форма с расположенными на ней DB-компонентами и своим DataSource, но без DataSet:
    • DB-компоненты диалога привязываются к лежащему на нем DataSource.
    • Создается публичный метод Execute, назначение которого -- редактирование переданного набора данных.

Код:
type
  TEditCar = class(TForm)
    DataSource1: TDataSource;
    DBEdit1: TDBEdit;
  public
    function Execute(DataSet: TDataSet): Boolean;
  end;

function TEditCar.Execute(DataSet: TDataSet): Boolean;
begin
  DataSource.DataSet := DataSet;
  Result := ShowModal = mrOK;
end;
Вызов такого диалога:
Код:
procedure btInsert.Click(Sender: TObject);
begin
  qCars.Insert;
  if EditCar.Execute(qCars) then
    qCars.Post
  else
    qCars.Cancel;
end;

procedure btEdit.Click(Sender: TObject);
begin
  qCars.Edit;
  if EditCar.Execute(qCars) then
    qCars.Post
  else
    qCars.Cancel;
end;
С сохранением режима редактирования при присвоении DataSource.DataSet вроде ничего не напутал...

Последний раз редактировалось Vapaamies; 09.07.2013 в 17:38.
Vapaamies вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с редактированием записи таблицы. p.majorov БД в Delphi 4 15.11.2010 13:25
Большая проблема в 300Gb :( ProIgor Операционные системы общие вопросы 3 18.09.2009 20:17
Большая проблема BlackOmen Работа с сетью в Delphi 2 16.03.2008 19:02