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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2011, 10:29   #1
igsxor
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 35
Вопрос ComboBox.Insert в таблицу линка id-шников.

Доброго времени.

Немного опишу программу:

Есть форма на которой расположены несколько Grid'ов.
В левом гриде выводится дерево материалов,в правом верхнем Grid'е отображаются данные по профилям материалов.(Например,когда юзер путешествует по левому гриду,то в правом гриде отображаются данные по профилям.Если к примеру в левом гриде выбран металл Титан,то в правом отображается его профиль(пруток или лист и т.п.) )

Пытаюсь реализовать добавление нового профиля(К примеру если появится новый профиль...) и нового тех процесса(Прокат,сплав,отливка и т.п.) через дополнительное модальное окно,в котором расположены 2 ComboBox'а.
По нажатию кнопки 'Добавить профиль'(правый верхний грид),появляется это модальное окошко.Список выбор профилей и техпроцессов в комбобоксы подтягиваются из 2 таблиц БД.
В БД есть таблица линка,которая содержит по мимо своего id-шника ещё 3 внешних id-шника(id_MaterialProfMetLink - первичный,id_material - внешний к таблице материаллов(левый грид),id_MaterialProfile - внешний ключ к таблице профилей(Эта же таблица подтягивается в выпадающий список комбобокса),id_MaterialMethodProces - внешний ключ к таблице техпроцессов(Эта же таблица подтягивается в выпадающий список 2-го комбобокса))

Вопросы:
Как сделать инсерт в таблицу линка при помощи комбобоксов,расположенных на модальном окне?В свойстве ItemIndex назначаются номера для таблиц профилей и тех процессов.Можно ли их использовать?

Код:
Процедура из модуля главной формы
Код:
procedure Tfrm_sprMaterial.ProfileFilter();
 var index_prf,index_prc: integer;  //индекс профиля и тех просесса
 begin

  if adoq_inputp.Active then adoq_inputp.Close;

 //1 ComboBox
  if (trim(cmbName_profile.Text)='') then
   cmbName_profile.ItemIndex := 0;

   index_prf:= cmbName_profile.ItemIndex; //присваиваем индекс из комбобокса 1

  if (index_prf = 0) then
    adoq_inputp.Parameters.ParamByName('id_mat').Value   :=
                TUserData(cmbName_profile.Items.Objects[index_prf]).Value;
  else
    begin
     index_prf := cmbName_profile.Items.IndexOf(trim(cmbName_profile.Text));

     if (index_prf > -1) then
      adoq_input.Parameters.ParamByName('id_mat').Value :=
                TUserData(cmbName_profile.Items.Objects[index_prf]).Value;
    end;

 //2 ComboBox
  if (trim(cmbName_process.Text)='') then
   cmbName_profile.ItemIndex := 0;

   index_prc:= cmbName_process.ItemIndex; // присваиваем индекс из комбобокса2
  if (index_prc = 0) then
    adoq_inputp.Parameters.ParamByName('id_mat').Value   :=
                TUserData(cmbName_process.Items.Objects[index_prc]).Value;

     else
        begin
         adoq_inputp.Parameters.ParamByName('id_mat').Value   :=
                  TUserData(cmbName_profile.Items.Objects[index_prf]).ID;
         adoq_input.Parameters.ParamByName('id_mat').Value :=
                 TUserData(cmbName_process.Items.Objects[index_prc]).ID;
        end;

 end;
..............описание класса TUserData................
type
  TUserData = class
  private
    fid :integer;
    fValue:Variant;
    fFieldName:String;
    fRusName:String;
    fFieldSize:Integer;
    fVisible:Boolean;
  public
    constructor Create(_id:integer; _value:Variant; _FieldName:String='';
              _RusName:String='';_FieldSize:Integer=64; _Visible:Boolean=true );
    destructor  Destroy; override;
  published
    property id:integer read fid write fid;
    property Value:Variant read fValue write fValue;
    property FieldName:String read fFieldName write fFieldName;
    property RusName:String read fRusName write fRusName;
    property FieldSize:Integer read fFieldSize write fFieldSize;
    property Visible:Boolean read fVisible write fVisible;
  end;
Процедура из модуля модального окна
Код:
//Вносим изменение в БД по событию нажатия кнопки Ввод
procedure Tfrm_inputProf.sbInputClick(Sender: TObject);
 var
  strp :string;
begin

  if CheckInputProfData() then
  begin
   strp :=
   'INSERT INTO T_MaterialProfMetLink(id_MaterialProfMetLink,id_Material,'+
   'id_MaterialProfile,id_MaterialMethodProces) values(' +
   '(SELECT (MAX(id_MaterialProfMetLink) + 1) FROM t_MaterialProfMetLink),'+
   'id_mat,''' + cmbName_profile.Text + ''',''' + cmbName_process.Text + ''')';

    adoq_inputp.SQL.Clear;
    adoq_inputp.SQL.Add(strp);
    adoq_inputp.ExecSQL;
  end;

end;
Фото:
Изображения
Тип файла: jpg главная_форма.jpg (52.0 Кб, 133 просмотров)
Тип файла: jpg модальное_окно.jpg (29.9 Кб, 140 просмотров)
igsxor вне форума Ответить с цитированием
Старый 11.09.2011, 22:02   #2
Surgeon
Форумчанин
 
Регистрация: 04.10.2007
Сообщений: 106
По умолчанию

Блин спасибо за детальное описание, но все равно не уверен что правильно понял.
У меня используется один DBGrid для подключения любой из трех таблиц содержащих связи текущей задачи и персон/событий/документов.
Выбор и активация запроса по выбору в ComboBox, передается параметр, перед этим делается активной страница PageControl расположенного вверху ( 3 страницы персоны/события/документы) - там отображается и редактируется соответствующий справочник (П/С/Д).
Код:
procedure TMainFOrm.CBSelectPEDForTaskChange(Sender: TObject);
begin
case CBSelectPEDForTask.ItemIndex of
 0: begin
     PgCntrlPED.ActivePageIndex:=0;
     DBGPEDLinksToTask.DataSource:=Main_DM.dsTaskPERSONSACTIVITYLINK;
     Main_DM.ADODSTaskPERSONSACTIVITYLINK.Close;
     Main_DM.ADODSTaskPERSONSACTIVITYLINK.Parameters.ParamByName('TSKID').Value:=DBGTasks.DataSource.DataSet.FieldValues['IDTASK'];
     Main_DM.ADODSTaskPERSONSACTIVITYLINK.Open;
    end;
 end;// case
end;
Вот кусок мего кода добавляющий в таблицу связей новую запись -
связь между заданием и персоной. Вызываю Append поскольку здесь использую ADO (редактируемый наборы данных даже у запроса), а именно ADODataSet, можно было бы отдельный ADOQuery или ADODataSet с SQL запросом на вставку и передавать туда через параметры, но лень было.
Код:
procedure TMainFOrm.btAddPEDLinkToTaskClick(Sender: TObject);
begin
case CBSelectPEDForTask.ItemIndex of
 0: begin
     Main_DM.ADODSPERSONSACTIVITYLINK.Append;      Main_DM.ADODSPERSONSACTIVITYLINK.FieldByName('TASKID').Value:=DBGTasks.DataSource.DataSet.FieldValues['IDTASK'];
     Main_DM.ADODSPERSONSACTIVITYLINK.FieldByName('PERSONID').Value:=DBGPERSONSLIST.DataSource.DataSet.FieldValues['IDPERSON'];

    end;
 end;// case
end;
Все не так плохо, как вам кажется, на самом деле все гораздо хуже.
http://delphiworld.narod.ru/dw.html - 5000 статей!!! удобный поиск, оффлайн сборник, рекомендую всем
Surgeon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись в MySQL таблицу, выбранную из списка combobox AkiTe Помощь студентам 1 08.06.2011 08:26
Вставка в таблицу методом INSERT...... IF NOT EXISTS Nikolay88 БД в Delphi 0 26.05.2011 17:12
Скрипт без линка pavelslap JavaScript, Ajax 4 27.12.2010 21:14
Нужны несколько системных EXE-шников Altera Операционные системы общие вопросы 8 09.09.2010 19:34
От линка в ячейке к документу 3акup Microsoft Office Excel 2 13.02.2009 13:56