Лена |
Отправлено: 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 запрос.
Получила в гриде нужный результат:
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
|
Теперь новый творческий тупик.
Вот создала поле 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();
}
|
|
|