1 (edited by Nilaus 2015-05-08 15:50:42)

Topic: OnShow

В приложенном тестовом проекте (делали его Вы) есть таблица клиенты и таблица визиты, через поиск показывающая визиты клиента.

Как сделать, чтобы при клике на визиты(Таблицу2) при добавлении, либо редактировании  объекта к визиту появлялись только объекты выбранного клиента.
Сейчас появляются объекты не выбранного в таблице1 клиента, а последнего открытого через форму AddCl ( т.е. событие OnShow для формы ddVizits корректно работает только при условии открытии формы  AddCl, т.к. ID для комбобокса берется с кнопки на этой форме).

Post's attachments

Attachment icon t_fixed.7z 275.46 kb, 467 downloads since 2015-05-08 

Re: OnShow

можно ссылку на это тестовое приложение?

Dmitry.

Re: OnShow

Добавил.

Re: OnShow

переделайте событие ddVizits_OnShow таким образом

procedure ddVizits_OnShow (Sender: string; Action: string);
var
    idClient: string;
begin
    idClient := SQLExecute('SELECT id_clients FROM visits WHERE id='+IntToStr(ddVizits.bSave.dbGeneralTableId));
    frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb, objects.id FROM objects WHERE id_clients='+idClient  );
end;
Dmitry.

Re: OnShow

Работает, но при добавлении нового клиента  при добавлении визита ошибка. Если ее игнорировать, можно добавить визит, но объекты в комбобоксе появляются все. При редактировании записи все работает как надо.

Post's attachments

Attachment icon Ошибка.jpg 53.74 kb, 305 downloads since 2015-05-08 

Re: OnShow

Попробуйте так

procedure ddVizits_OnShow (Sender: string; Action: string);
var
    idClient: string;
begin
    if AddCl.Visible then
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb, objects.id FROM objects LEFT OUTER JOIN clients ON clients.id=objects.id_clients WHERE clients.id='+ IntToStr( AddCl.bSaveClient.dbGeneralTableId ) )
    else begin
        idClient := SQLExecute('SELECT id_clients FROM visits WHERE id='+IntToStr(ddVizits.bSave.dbGeneralTableId));
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb, objects.id FROM objects WHERE id_clients='+idClient  );
    end;
end;
Dmitry.

Re: OnShow

Дмитрий, спасибо, так работает, но только почему-то в указанных в коде комбобоксах перестала работать склейка из двух полей {Ul} {nameOb}.

Re: OnShow

Nilaus
в проекте я не вижу полу с именем UI

Dmitry.

Re: OnShow

DriveSoft
Я этот код по аналогии в другой проект добавляю. Там в аналогичной таблице objects, помимо поля nameOb, есть поле UI (текстовое). В комбобоксе для удобства я выводил оба этих поля, но я так понял вышеуказанный код выводит только одно поле, игнорируя запись в FieldName.

Re: OnShow

попробуйте так

procedure ddVizits_OnShow (Sender: string; Action: string);
var
    idClient: string;
begin
    if AddCl.Visible then
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb || ' ' || objects.UI, objects.id FROM objects LEFT OUTER JOIN clients ON clients.id=objects.id_clients WHERE clients.id='+ IntToStr( AddCl.bSaveClient.dbGeneralTableId ) )
    else begin
        idClient := SQLExecute('SELECT id_clients FROM visits WHERE id='+IntToStr(ddVizits.bSave.dbGeneralTableId));
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb || ' ' || objects.UI, objects.id FROM objects WHERE id_clients='+idClient  );
    end;
end;
Dmitry.

Re: OnShow

Вот так работает, но без пробелов

objects.nameOb || objects.UI

У Вас ругается на код (выделяет красным)

objects.nameOb || ' ' || objects.UI

Пробовал играться, убирал пробелы

objects.nameOb || '' || objects.UI

Но так уже ругается в программе на unrecognized token.

Re: OnShow

Nilaus
приложите пожалуйста вашу последнюю версию проекта.

Dmitry.

Re: OnShow

Прикладываю.

Post's attachments

Attachment icon t.7z 275.65 kb, 470 downloads since 2015-05-13 

Re: OnShow

забыл экранировать кавычку кавычкой )
исправленный вариант

procedure ddVizits_OnShow (Sender: string; Action: string);
var
    idClient: string;
begin
    if AddCl.Visible then
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb || '' '' || objects.UI, objects.id FROM objects LEFT OUTER JOIN clients ON clients.id=objects.id_clients WHERE clients.id='+ IntToStr( AddCl.bSaveClient.dbGeneralTableId ) )
    else begin
        idClient := SQLExecute('SELECT id_clients FROM visits WHERE id='+IntToStr(ddVizits.bSave.dbGeneralTableId));
        frmAddVisitObject.ComboBox1.dbSQLExecute('SELECT objects.nameOb || '' '' || objects.UI, objects.id FROM objects WHERE id_clients='+idClient  );
    end;
end;
Dmitry.

Re: OnShow

Спасибо, теперь все работает отлично!
Не подскажите, возможно ли в SQL запросе прописать в условии выбора выбранную строку в таблице?   По примеру того же тестового проекта, при выборе значения в таблице 1, кнопка поиск искала бы в первой таблице посредством SQL запроса. Это надо, чтобы сократить количество таблиц, т.к. вторую и третью таблицу хочу объединить посредством того же SQL запроса. Где-то видел похожее тут выкладывали, перерыл все, не нашел...

Re: OnShow

Nilaus
например так

'SELECT * FROM tablename WHERE id=' + Form1.TableGrid1.sqlValue
Dmitry.