Не могу разобраться как связать 2 таблицы. Срочно нужна помощь.

KMaxV
Дата: 26.11.2007 00:17:24
Добро время суток всем!
Есть две таблицы input и output у каждой из них есть автоинкримент + они вязаны между собой как мастер-датель соответственно по полю input.ti_id =output.sv_ti_id програмно в IbExpert(компоненты Фиб+, ФаирБерд 2.0). Сначала идет заполнение таблицы input, а потом output с условием input.ti_id =output.sv_ti_id. Заполнение input происходит след. образом:
//dtInput-FIBDataset
dtInput.Insert;
dtInput.FieldByName('msm').AsFloat:=msm;
dtInput.FieldByName('msn').AsFloat:=msm;
dtInput.FieldByName('am').AsFloat:=am*180/pi;
dtInput.FieldByName('an').AsFloat:=an*180/pi;
dtInput.FieldByName('dm').AsFloat:=dms;
dtInput.FieldByName('dp').AsFloat:=dps;
dtInput.FieldByName('hdet').AsFloat:=hk;
dtInput.FieldByName('hdna').AsFloat:=hdna;
dtInput.FieldByName('hzag').AsFloat:=hz;
dtInput.FieldByName('dzags').AsFloat:=dzs;
dtInput.FieldByName('dzagb').AsFloat:=dzb;
dtInput.FieldByName('azag').AsFloat:=am*180/pi;
dtInput.FieldByName('vb').AsFloat:=Vnk;
dtInput.FieldByName('vs').AsFloat:=Vvk;
dtInput.FieldByName('vd').AsFloat:=vdet;
dtInput.Post;

а вот как теперь сделать, чтоб output заполнялась с условием nput.ti_id =output.sv_ti_id?
Есть вариант:
//qeOutput-FIBQuery
qeOutput.Close;
qeOutput.SQL.Clear;
qeOutput.SQL.Add( 'insert into tb_output (sv_ti_id,hod) values ((select max(gen_tb_i_id) from tb_input),11');
qeOutput.ExecQuery;
dtOutput.Close;
dtOutput.Open;
запрос выполняется, Но к сожалению записи в таблицу не делает, хотя приращение gen_tb_o_id делает. Помогите кто чем может. Заранее благодарен.
Di_LIne
Дата: 26.11.2007 00:29:15
В книжке "Мир InterBase" расписано подробно и с примерами.
И на IBSE.RU посмотреть можно...
kdv
Дата: 26.11.2007 02:53:15
мда. select max говоришь? master-detail? Читать некогда?
www.ibase.ru/devinfo/ibx.htm
www.ibase.ru/devinfo/generator.htm
KMaxV
Дата: 26.11.2007 11:31:16
kdv
мда. select max говоришь? master-detail? Читать некогда?
www.ibase.ru/devinfo/ibx.htm
www.ibase.ru/devinfo/generator.htm


Читал! Делал! Не получилось :-(
Не могу понять что не получается!
Когда заполняю insetsql, updatesql, refreshsql, deletesql выдает что sv_ti_id не может быть 0 при этом в проге написано
dtOutput.Insert;
dtOutput.FieldByName('sv_ti_id').AsInteger:=dtInput.FieldByName('ti_id').AsInteger;
dtOutput.FieldByName('hod').AsFloat:=hod;
dtOutput.Post;
Хоть скажите правильно я думаю или нет?
kdv
Дата: 26.11.2007 11:33:32
мне сложно сказать, что ты читал, и что ты думаешь.
связка m-d одна из примитивных вещей, которые описаны в любой книге, где упоминается ib/fb. в том числе все достаточно прозрачно написано в ibx.htm
KMaxV
Дата: 26.11.2007 12:02:53
И я так думал, но практика показала нечто другое :-(
Будем искать!
Di_LIne
Дата: 26.11.2007 15:14:26
KMaxV
Будем искать!

Мало те перламутровых страниц?
Лучше в смысл вникай... А не ищи... реализацию своего примера.
KMaxV
Дата: 27.11.2007 00:22:26
Di_LIne

Мало те перламутровых страниц?
Лучше в смысл вникай... А не ищи... реализацию своего примера.

Окрыл я "Мир Интербейза" и начал читать, хорошая книг, но после того как начал выполнять примеры начались непонятки.Все работало пока не решился вставить новую запись в две связанные таблицы.
Все как по букварю:
{процедура для отображения в детеил значений соответствующих значениям мастера}
procedure TForm1.pFIBDataSet2NewRecord(DataSet: TDataSet);
begin
pFIBDataSet1.FieldByName('sv_ti_id').AsInteger:=
pFIBDataSet2.FieldByName('ti_id').AsInteger;
end;
{процедура для заполнения поля в мастере и детеил соответственно}
procedure TForm1.Button1Click(Sender: TObject);
begin
pFIBDataSet2.Insert;
pFIBDataSet2.Edit;
pFIBDataSet2.FieldByName('msm').AsFloat:=0.01;
pFIBDataSet2.Post;
pFIBDataSet1.Insert;
pFIBDataSet1.FieldByName('hod').AsFloat:=0.01;
pFIBDataSet1.Post;
end;
Выдает ошибку что не найдено поле tb_input.ti_id.
При этом использую AutoUpdateOptions для генерации значений первичного ключа ti_id;
Подскажите что делаю не так :-(
Гаджимурадов Рустам
Дата: 27.11.2007 00:24:42

KMaxV> {процедура для отображения в детеил значений соответствующих значениям мастера}
KMaxV> procedure TForm1.pFIBDataSet2NewRecord(DataSet: TDataSet);

Код процедур (равно как и запросы) надо тегом SRC выделять.

KMaxV> Выдает ошибку что не найдено поле tb_input.ti_id.

Ну значит не найдено. Запросы-то покажи.


Posted via ActualForum NNTP Server 1.4

KMaxV
Дата: 27.11.2007 00:40:09
Что-то я вообще ничего непонимаю :-( Обидно :-(
object pFIBDataSet1: TpFIBDataSet
    UpdateSQL.Strings = (
      'UPDATE TB_OUTPUT'
      'SET '
      '    SV_TI_ID = :Mas_TI_ID,'
      '    HOD = :HOD'
      'WHERE'
      '    TO_ID = :OLD_TO_ID'
      '    ')
    DeleteSQL.Strings = (
      'DELETE FROM'
      '    TB_OUTPUT'
      'WHERE'
      '        TO_ID = :OLD_TO_ID'
      '    ')
    InsertSQL.Strings = (
      'INSERT INTO TB_OUTPUT('
      '    TO_ID,'
      '    SV_TI_ID,'
      '    HOD'
      ')'
      'VALUES('
      '    :TO_ID,'
      '    :Mas_TI_ID,'
      '    :HOD'
      ')')
    RefreshSQL.Strings = (
      'SELECT'
      '    TO_ID,'
      '    SV_TI_ID,'
      '    HOD'
      'FROM'
      '    TB_OUTPUT '
      ''
      ' WHERE '
      '        TB_OUTPUT.TO_ID = :OLD_TO_ID'
      '    ')
    SelectSQL.Strings = (
      'SELECT'
      '    TO_ID,'
      '    SV_TI_ID,'
      '    HOD'
      'FROM'
      '    TB_OUTPUT'
      'Where sv_ti_id=:ti_id ')
    AutoUpdateOptions.UpdateTableName = 'TB_OUTPUT'
    AutoUpdateOptions.KeyFields = 'TO_ID'
    AutoUpdateOptions.GeneratorName = 'GEN_TB_O_ID'
    AutoUpdateOptions.WhenGetGenID = wgOnNewRecord
    Active = True
    Transaction = pFIBTransaction1
    Database = pFIBDatabase1
    AutoCommit = True
    DataSource = DataSource2
    Left = 525
    Top = 100
    WaitEndMasterScroll = True
    dcForceMasterRefresh = True
    dcForceOpen = True
  end
  object pFIBDataSet2: TpFIBDataSet
    UpdateSQL.Strings = (
      'UPDATE TB_INPUT'
      'SET '
      '    MSM = :MSM'
      'WHERE'
      '    TI_ID = :OLD_TI_ID'
      '    ')
    DeleteSQL.Strings = (
      'DELETE FROM'
      '    TB_INPUT'
      'WHERE'
      '        TI_ID = :OLD_TI_ID'
      '    ')
    InsertSQL.Strings = (
      'INSERT INTO TB_INPUT('
      '    TI_ID,'
      '    MSM'
      ')'
      'VALUES('
      '    :TI_ID,'
      '    :MSM'
      ')')
    RefreshSQL.Strings = (
      'SELECT'
      '    TI_ID,'
      '    MSM'
      'FROM'
      '    TB_INPUT '
      ''
      ' WHERE '
      '        TB_INPUT.TI_ID = :OLD_TI_ID'
      '    ')
    SelectSQL.Strings = (
      'SELECT'
      '    TI_ID,'
      '    MSM'
      'FROM'
      '    TB_INPUT ')
    AutoUpdateOptions.UpdateTableName = 'TB_INPUT'
    AutoUpdateOptions.KeyFields = 'TI_ID'
    AutoUpdateOptions.GeneratorName = 'GEN_TB_I_ID'
    AutoUpdateOptions.WhenGetGenID = wgOnNewRecord
    Active = True
    OnNewRecord = pFIBDataSet2NewRecord
    Transaction = pFIBTransaction1
    Database = pFIBDatabase1
    AutoCommit = True
При данных значениях пишет что "Dataset not in edit or insert mode"
Код процедур:
procedure TForm1.pFIBDataSet2NewRecord(DataSet: TDataSet);
begin
pFIBDataSet1.FieldByName('sv_ti_id').AsInteger:=
pFIBDataSet2.FieldByName('ti_id').AsInteger;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
pFIBDataSet2.Insert;
pFIBDataSet2.FieldByName('msm').AsFloat:=0.01;
pFIBDataSet2.Post;
pFIBDataSet1.Insert;
pFIBDataSet1.FieldByName('hod').AsFloat:=0.01;
pFIBDataSet1.Post;

end;