C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Cвязать таблицы, правильно
Лена
Отправлено: 11.10.2006, 10:19


Мастер участка

Группа: Участник
Сообщений: 501



Есть таблица c 4-мя колонками:
CREATE TABLE keys
(
code varchar(32) NOT NULL,
description varchar(50),
enabled bool NOT NULL,
person_id int4,
CONSTRAINT pk_keys PRIMARY KEY (code)
)
WITHOUT OIDS;
ALTER TABLE keys OWNER TO postgres;

Общий вид такой в гриде:
код code varchar(32),
описание description varchar(50),
доступ enabled bool NOT NULL,
person_id int4 сделан Visible = false
На русском, колонки, которые видимы в гриде №1.


Есть еще одна таблица c полями в гриде №2:
CREATE TABLE visitors
(
id int4 NOT NULL DEFAULT nextval('visitors_id_seq'::regclass),
firstname varchar(50) NOT NULL,
lastname varchar(50) NOT NULL,
patronymic varchar(50),
post varchar(50),
number varchar(50),
org_id int4 DEFAULT 0,
group_id int4 NOT NULL,
remark varchar(50),
photo bytea,
enabled bool NOT NULL,
CONSTRAINT pk_visitors PRIMARY KEY (id)
)
WITHOUT OIDS;
ALTER TABLE visitors OWNER TO postgres;

Я хочу добавить в грид №1 еще одну колонку и в этой колонке отобразить содержимое полей firstname, lastname, patronymic, post другой таблицы из грида №2.
Надо как-то связать эти таблицы? Как?

Отредактировано Лена — 11.10.2006, 11:22
PetVlad
Отправлено: 11.10.2006, 11:10


Ученик-кочегар

Группа: Участник
Сообщений: 2



/* не хочу разбираться с кодом просто отвечу куда смотреть*/
//В DBGrid добавить данные из другой таблицы
// В свое время не нашел ничего другого ка использовать
// событие( Events DrawColumnCell

Для связи таблиц заводится поле "ID" , чтобы при создании записи в одной таблице Это поле заполнялось как в этой таблице так и в другой таблице
Свойства "Propeties"
Table1->MasterSource = ... &&
Table1->MasterFields = ...
Лена
Отправлено: 11.10.2006, 11:19


Мастер участка

Группа: Участник
Сообщений: 501



Помог SQL запрос. smile.gif
Получила в гриде нужный результат:
select keys.code, keys.description, keys.enabled, (visitors.firstname || ' ' || visitors.lastname || ' ' || visitors.patronymic) as man from keys
join visitors on keys.person_id = visitors.id
Admin
Отправлено: 11.10.2006, 12:57


Владимир

Группа: Администратор
Сообщений: 1190



Связать можно и через Lookup-поле.
Лена
Отправлено: 11.10.2006, 13:27


Мастер участка

Группа: Участник
Сообщений: 501



Теперь новый творческий тупик. smile.gif
Вот создала поле man согласно SQL запросу выше. Вижу в гриде это поле и в нем Фамилия Имя Отчество (Иванов Иван Иванович) то, что нужно из другой таблицы. Я сделала стиль этого поля в гриде cbсElipsis. Теперь я нажимаю в этом поле кнопку построитель cbсElipsis и вывожу новую форму в которой находиться таблица visitors.
Нужно следующее — выбрать курсором запись в этой таблице нажать кнопку ОК и значения из полей с фамилией именем и отчеством должны перенестись в грид №1 где и была нажата кнопка построителя cbсElipsis.
Программно просто перенести. Например, фамилию:
CODE

void __fastcall TFormVladelec::Button1Click(TObject *Sender)
{

TDataSet * GridDataSet1;
TDataSet * GridDataSet2;

GridDataSet1 = Form1->DBGrid1->DataSource->DataSet;
GridDataSet2 = DBGrid1->DataSource->DataSet;

if (GridDataSet1 && GridDataSet2)
 {
 //пример переноса фамилии:
   GridDataSet1->Edit();
   GridDataSet1->FieldByName("man")->Value =
          GridDataSet2->FieldByName("lastname ")->Value;
   GridDataSet1->Post();

 }
Close();
}

Но это совсем не подходит, так как после вставления записи, возникает в первом гриде событие с ClientDataSet->ApplyUpdates(-1); а поскольку поле man было сформировано SQL запросом, то реально этого поля в базе нет и возникает исключение при ClientDataSet->ApplyUpdates(-1).
Как перенести?
Лена
Отправлено: 11.10.2006, 14:46


Мастер участка

Группа: Участник
Сообщений: 501



Вроде сообразила.
Подскажите как правильно расставить кавычки в запросе:
int x = GridDataSet2->FieldByName("id")->Value;
int y = GridDataSet1->FieldByName("person_id")->Value;
DataModule2->ADOQueryKey->SQL->Add("update keys set person_id="+ x +"where code="+ y+"); //здесь
Лена
Отправлено: 11.10.2006, 15:34


Мастер участка

Группа: Участник
Сообщений: 501



Вопрос удалось решить:
CODE

void __fastcall TFormVladelec::Button1Click(TObject *Sender)
{

TDataSet * GridDataSet1;
TDataSet * GridDataSet2;

GridDataSet1 = Form1->DBGrid1->DataSource->DataSet;
GridDataSet2 = DBGrid1->DataSource->DataSet;

if (GridDataSet1 && GridDataSet2)
 {

    int x = GridDataSet2->FieldByName("id")->Value;
    AnsiString y = GridDataSet1->FieldByName("code")->Value;

    DataModule2->ClientDataSetKey->Active = false;
    DataModule2->ADOQueryKey->Active = false;
    DataModule2->ADOQueryKey->SQL->Clear();
    DataModule2->ADOQueryKey->SQL->Add("update keys set person_id="+ IntToStr(x) + "where code=" + y);
    DataModule2->ADOQueryKey->ExecSQL();
    DataModule2->ADOQueryKey->SQL->Clear();
    DataModule2->ADOQueryKey->SQL->Add("select keys.code, keys.description, keys.enabled, keys.person_id, (visitors.firstname || ' ' || visitors.lastname || ' ' || visitors.patronymic) as man from keys join visitors on keys.person_id = visitors.id");
    DataModule2->ADOQueryKey->Active = true;
    DataModule2->ClientDataSetKey->Active = true;


 }
Close();

}

yahoo.gif

Вернуться в Работа с базами данных в C++Builder