Как работает фильтр в объекте Table?
Одна из двух таблиц имеет колонку:
Название
Вторая:
Название | Тип
Как сделать так что бы нажав на название в одной таблице (DBGrid1), в другой (DBGrid2) показывался тип только тот, который соответсвует этому названию? Как я понимаю тут можно использовать Filter, но я с ним неразу не работал, поэтому прошу помощи...
то что ты хочешь - эо классичеcкий master-detail. Первая таблица - это "Мастер", вторая, соответственно - "Деталь" - в TTable есть свойства, установив которые ты достигнешь нужного результата, точнее в зависимой таблице нужно указать датасурс ее мастера...
Я поставил в зависимой таблице:
MasterSourse = DataSourse1, но никаких изменений незаметил, может надо еще что-то изменить, добавить?
Если хочешь посмотреть, как что творится - создай мастером новый проект (в меню файл новый ...). Выбери в появившемся депозитарии готовых форм вкладку buisnes, а на ней Database Form Wizard. Там просто и понятно тебе скомпилится пример, который легко будет пощупать и разложить по косточкам.
Блин, у меня мастер доходит только до места:
"Выберите пару полей от полевых списков, которые присоединят два запроса. Исп. добавляющую кнопку, что бы добавить выбранную к списку", а кнопка не активна, то есть на нее нажать нельзя и Далее тоже неактивна, может из-за того что у меня C++ Builder не зарегистрирован? А можешь создать такой проект и прислать мне на [email]demon@tushino.ru[/email] вместе с базами (любыми для примера), я буду ОЧЕНЬ благодарен :)
Насчет же проекта - будет время - вышлю.
Под рукой к сожалению BCB нет, но твоя проблемма по-моему в том, что в таблицах должны быть определены индексы по тем полям, которые связываются. Связь master/detail делается только с ними.
Насчет же проекта - будет время - вышлю.
Немогу индексы добавить, кнопка неактивна, даже когда и не Мастер, может какая-то ошибка, надо попробываться C++ Builder переставить, а ты постарайся все же прислать проект, мне просто очень нужно, ну просто позарез...
Их нужно добавлять как правило на этапе создания формы. В том же database desctope или ручками типа:
Tbl->FieldDefs->Clear();
Tbl->FieldDefs->Add("N", ftAutoInc, 0, true);
Tbl->FieldDefs->Add("kmBeg", ftFloat, 0, false);
Tbl->IndexDefs->Clear();
Tbl->IndexDefs->Add("","N", TIndexOptions() <<ixPrimary << ixUnique);
Tbl->IndexDefs->Add("iN_file","N", TIndexOptions() << ixCaseInsensitive);
Tbl->IndexDefs->Add("ikmBeg","kmBeg", TIndexOptions() << ixCaseInsensitive);
Tbl->CreateTable();
Все проверяй почту, а где ты добавляешь индексы?
Их нужно добавлять как правило на этапе создания формы. В том же database desctope или ручками типа:
Tbl->FieldDefs->Clear();
Tbl->FieldDefs->Add("N", ftAutoInc, 0, true);
Tbl->FieldDefs->Add("kmBeg", ftFloat, 0, false);
Tbl->IndexDefs->Clear();
Tbl->IndexDefs->Add("","N", TIndexOptions() <<ixPrimary << ixUnique);
Tbl->IndexDefs->Add("iN_file","N", TIndexOptions() << ixCaseInsensitive);
Tbl->IndexDefs->Add("ikmBeg","kmBeg", TIndexOptions() << ixCaseInsensitive);
Tbl->CreateTable();
А как ты их связал, ты просто указал во второй таблице MasterSource=DataSource2 и MasterFields=N это вроде понятно, а вот откудова ты взял IndexName=qwert ??? И какая вообще зависимость между колонкой N одной таблицей и другой таблицей, как я понимаю она сравнивается с колонкой N_Objecta, но это нигде не указано что-ли? откудова он знает с чем сравнивать надо?
У меня в примере qwert (ну извини что так назвал) это и есть вторичный индекс на поле N_proverki. Вторичный индекс необходим в detail форме и он связывается с primary index в master форме.
Посмотри в примере структуру файлов таблиц БД (через Database Desktop).
Повторяю еще раз: создай первичный и вторичный индексы!!!
У меня в примере qwert (ну извини что так назвал) это и есть вторичный индекс на поле N_proverki. Вторичный индекс необходим в detail форме и он связывается с primary index в master форме.
Посмотри в примере структуру файлов таблиц БД (через Database Desktop).
Я вроде сделал два таблице, вроде все работает, но когда я добавляю третию таблицу и ее связываю со второй. То начинаются глюки с добавлением записей во вторую таблицу, то есть индекс первой таблице уже не записвается. Таблица 2 это master для 3-ий таблице (с полем "ARTICUL") и detail для 1-ой таблице (с полем "KAT"). Когда я добавляю запись во вторую таблицу, поле "KAT" остается пустым, и поэтому новую запись не видно, так как она связана с полем "KAT" 1-ой таблице. Блин все запутано офигеть, давай я тебе проект кину, ты посмотришь и скажешь в чем проблемма может быть?
Повторяю еще раз: создай первичный и вторичный индексы!!!
У меня в примере qwert (ну извини что так назвал) это и есть вторичный индекс на поле N_proverki. Вторичный индекс необходим в detail форме и он связывается с primary index в master форме.
Посмотри в примере структуру файлов таблиц БД (через Database Desktop).
Вроде доконца с этим разобрался, остался один вопрос, как сделать что бы таблица зависела не от одного поля, в твоем примере "N", а он двух одновременно???
void __fastcall TTexas::RadioButton1Click(TObject *Sender)
{ char Tag_for_filter[13] = "Category = ";
if(Table1->Active == true && Table2->Active == true && Table6->Active == true)
{ if( *Font_Color != clBlack )
RadioButton_Var->Font->Color = *Font_Color;
itoa(((TRadioButton *)Sender)->Tag,&Tag_for_filter[11],10);
Table1->Filtered = false; Table1->Filter = Tag_for_filter; Table1->Filtered = true;
Table2->Filtered = false; Table2->Filter = Tag_for_filter; Table2->Filtered = true;
if(Edit12->Text == "0")
{ Table6->Filtered = false; Table6->Filter = Tag_for_filter; Table6->Filtered = true;
}
}
RadioButton_Var = ((TRadioButton *)Sender);
*Font_Color = ((TRadioButton *)Sender)->Font->Color;
((TRadioButton *)Sender)->Font->Color = clRed;
radiobutton_semafor = 1;
}
Вдогонку. В принципе в твоем примере не фильтр нужен а проиндексировать две связаных таблицы, использовать для этого фильтр не рационально.
А как можно связать 2-а параметра таблице? не один, а два. т.е. что бы таблица орентирвалась не просто на одно поле другой таблице, а что бы ориентирвалась на два поля другой таблице разными своими полями соответсвенно???
А как можно связать 2-а параметра таблице? не один, а два. т.е. что бы таблица орентирвалась не просто на одно поле другой таблице, а что бы ориентирвалась на два поля другой таблице разными своими полями соответсвенно???
Извини, не вдуплил, поясни. Если у тебя два поля в первой таблице логически не завязаны и два поля в другой таблице тоже логически не завязаны, но тем не менее ты их хочешь вязать между собой, то как ты собираешься отображать ведомую таблицу? Ведь конфликты начнуться. А если ты собираешься делать какойто аппарат для этого, так у тебя юзер приморится отвечать на запреты. Или я все таки чего-то не понял?
Извини, не вдуплил, поясни. Если у тебя два поля в первой таблице логически не завязаны и два поля в другой таблице тоже логически не завязаны, но тем не менее ты их хочешь вязать между собой, то как ты собираешься отображать ведомую таблицу? Ведь конфликты начнуться. А если ты собираешься делать какойто аппарат для этого, так у тебя юзер приморится отвечать на запреты. Или я все таки чего-то не понял?
Представь есть таблица:
Категория: Тип:
1 2
1 2
2 3
2 3
И есть еще одна таблица:
Категория: Тип: Имя:
1 2 3
2 3 5
1 2 7
2 3 8
Я хочу связать Категорию одной таблице с категорией другой и тип одной с типом другой.
Например я выбераю 1 строку 1 таблице, а во-второй появляется 1 и 3 строка. или если я выберу 3 строку в первой таблице, во-второй появится 2 и 4 строчка.
Я хочу связать Категорию одной таблице с категорией другой и тип одной с типом другой.
Например я выбераю 1 строку 1 таблице, а во-второй появляется 1 и 3 строка. или если я выберу 3 строку в первой таблице, во-второй появится 2 и 4 строчка.
Вот. И я о том-же. В твоем примере связка идет по категории
1
1
2
2
Категория:
1
2
1
2
выбрал 1-ую появилась 1-ая и 3-я (выбрал 3-ью - 2,4). Типы зачем вяжешь? они ведь под категорией сидят? В твоем примере все четко, типы из одной категории, не пересекаются с типами во второй.
А если хочешь юзеру жизнь облегчить и дать возможность выбрать, то ли по типу, то ли по категории, ну и что, связка то по категории работает. А по чем он там щелкнул какая разница.
Вот. И я о том-же. В твоем примере связка идет по категории
1
1
2
2
Категория:
1
2
1
2
выбрал 1-ую появилась 1-ая и 3-я (выбрал 3-ью - 2,4). Типы зачем вяжешь? они ведь под категорией сидят? В твоем примере все четко, типы из одной категории, не пересекаются с типами во второй.
А если хочешь юзеру жизнь облегчить и дать возможность выбрать, то ли по типу, то ли по категории, ну и что, связка то по категории работает. А по чем он там щелкнул какая разница.
Дело в том что могут быть типа с одинаковым именем в разных категориях, а по категориям я выдеряю типы, а уже из типов инфа идет.
у меня есть 3 таблицы:
В первой видны категории, во второй видны типы выбранной категории, а в третий должна быть видна информация по выбранному типу, выбраной категории. Так что если вязать только по категории, то в информации будет инфа по всем типам, а не по выбранном, а если вязать только по типу, то возможно будет информация с одинм типом из разных категорий, и поэтому в таблице информации будет информация по всем выбранным типам, а не только из выбранной категории. Поэтому хочу как-нибудь связять и тип и категорию, толька вот как бы ее связать если-палки... (Если бы типы не повторялись все бы было ОК).
Дело в том что могут быть типа с одинаковым именем в разных категориях,...
Как вариант 1-2 по N_Cat, 2-3 по N_Tip
N_1 N_Cat Name Cat
1_____1___Комплект-ие
2_____2___Периферия
3_____3___Сетевая пр-ия
4_____4___Расходники
N_2 N_Cat N_Tip Name_Tip
1_____1___11___Материнки
2_____1___12___HDD
3_____2___21___Принтеры
4_____1___13___Видеокарты
5_____4___41___Cartridge
6_____3___31___Кабеля
7_____3___32___Разъемы
N_3 N_Tip N_Code Name_Code
1____11____1____GA-8PE667
2____11____2____Transcend UWL30
3____12____1____Fujitsu 20Gb
4____11____3____ASUS PE4
5____12____2____Samsung 40Gb
6____13____1____Gf2 MX400
7____13____2____Radeon 9000
8____31____1____RG-58
9____13____3____Gf3 Ti200
10___31____2____UTP Cable
11___11____4____EliteGroup
Тогда – на экране видишь первую таблицу полностью и стоишь на 1-ой записи,
Во второй таблице (первый запуск) тоже стоишь на первой записи
T2
N_2 N_Cat N_Tip Name_Tip
1_____1____11__Материнки
2_____1____12__HDD
4_____1____13__Видеокарты
T3
N_3 N_Tip N_Code Name_Code
1____11____1_____GA-8PE667
2____11____2_____Transcend UWL30
4____11____3_____ASUS PE4
11___11____4_____EliteGroup
Ну и так далее. Если символьная инфа пересекается – значит выносишь в справочник(классификатор,индексатор) и тянешь оттуда наименование по идексу(то что на экране всего много не беда – физически то это одна строчка). Зачем нужен N_1,N_2…, поймешь если используешь Т.Paradox (есть своя специфика, я их вообще делаю уникальными, чтоб не было гимора с фильтрами и т.д.) Как формируется N_Tip я думаю понятно.Ну и вообще вариантов море. Тебе мне кажется нужно поймать кого-то кто работает с СУБД (неважно с какой), проблема то не в программировании, а как я понял в постановке. В книжках по борланде этого нет. Попадалась мне как-то года четыре назад книженция, что-то там о СУБД тра-та-та … институт МАХАРИШИ. Меня еще тогда это Махариши очень удивило, поспрашай у знакомых. Если бы она мне попалась вовремя, т.к. теория там была изложена отлично, достойная книжка, а то я столько велосипедов изобрел в свое время.
Как вариант 1-2 по N_Cat, 2-3 по N_Tip
N_1 N_Cat Name Cat
1_____1___Комплект-ие
2_____2___Периферия
3_____3___Сетевая пр-ия
4_____4___Расходники
N_2 N_Cat N_Tip Name_Tip
1_____1___11___Материнки
2_____1___12___HDD
3_____2___21___Принтеры
4_____1___13___Видеокарты
5_____4___41___Cartridge
6_____3___31___Кабеля
7_____3___32___Разъемы
N_3 N_Tip N_Code Name_Code
1____11____1____GA-8PE667
2____11____2____Transcend UWL30
3____12____1____Fujitsu 20Gb
4____11____3____ASUS PE4
5____12____2____Samsung 40Gb
6____13____1____Gf2 MX400
7____13____2____Radeon 9000
8____31____1____RG-58
9____13____3____Gf3 Ti200
10___31____2____UTP Cable
11___11____4____EliteGroup
Тогда – на экране видишь первую таблицу полностью и стоишь на 1-ой записи,
Во второй таблице (первый запуск) тоже стоишь на первой записи
T2
N_2 N_Cat N_Tip Name_Tip
1_____1____11__Материнки
2_____1____12__HDD
4_____1____13__Видеокарты
T3
N_3 N_Tip N_Code Name_Code
1____11____1_____GA-8PE667
2____11____2_____Transcend UWL30
4____11____3_____ASUS PE4
11___11____4_____EliteGroup
Ну и так далее. Если символьная инфа пересекается – значит выносишь в справочник(классификатор,индексатор) и тянешь оттуда наименование по идексу(то что на экране всего много не беда – физически то это одна строчка). Зачем нужен N_1,N_2…, поймешь если используешь Т.Paradox (есть своя специфика, я их вообще делаю уникальными, чтоб не было гимора с фильтрами и т.д.) Как формируется N_Tip я думаю понятно.Ну и вообще вариантов море. Тебе мне кажется нужно поймать кого-то кто работает с СУБД (неважно с какой), проблема то не в программировании, а как я понял в постановке. В книжках по борланде этого нет. Попадалась мне как-то года четыре назад книженция, что-то там о СУБД тра-та-та … институт МАХАРИШИ. Меня еще тогда это Махариши очень удивило, поспрашай у знакомых. Если бы она мне попалась вовремя, т.к. теория там была изложена отлично, достойная книжка, а то я столько велосипедов изобрел в свое время.
Ну я впринцепи так и делаю, только вот если тип будет повторяться, это работать не будет, а то что ты с индексами говорил, я что-то не очень понял, я вообще делаю через Dbase, может тебе прислать проект, посмотришь как можно сделать?
Ну я впринцепи так и делаю, только вот если тип будет повторяться, это работать не будет, а то что ты с индексами говорил, я что-то не очень понял, я вообще делаю через Dbase, может тебе прислать проект, посмотришь как можно сделать?
Что значит типы будут повторяться? Давай с понятиями определимся, в последней 3-ей таблице высвечиваются 4-е строки с N_Tip_11 и все нормально. Я так понимаю - символьная информация может повторяться - а хранить и набивать в базу кучу одинаковых строк - тупняк. Предположим, что (см.третью таблицу) у тебя есть куча материнок GA-8PE667 но с разными серийными номерами, тогда Name_Code - гонишь в справочник.
N3 N_Tip N_Code Memo_for_Name_Code Serial_Number
1___11_____1______**************______(01)417A78
2___11_____1______**************______(01)417A79
3___11_____2______**************______BB38242788
.....
Справочник(класификатор,индексатор кто как называет)
Таблица 4 - справочник
N_Code Name_Code
1______GA-8PE667
2______Transcend
.....
Т.е. ФИЗИЧЕСКИ в третьей таблице наименования GA-8PE667 - НЕТ !!! есть memo поле под это наименование - и когда ты выплескиваешь таблицу на экран ты по связке N_Code из справочника (где СИМВОЛЫ - GA-8PE667 - присутствуют в единственном экземпляре) во все memo поля таблицы где N_Code = 1 попадает GA-8PE667). При этом юзверю этот справочник и видеть не обязательно. Делаешь кнопочку F2 - справочник. И говоришь юзеру - ввод данных в поле Memo_for_Name_Code только по нажатию F2, сам же по обработке нажатия выплеснул справочник на экран - позволил выбрать строку и по нажатию (Enter предположим) загнал в третью таблицу НЕ СИМВОЛЬНОЕ НАИМЕНОВАНИЕ - а просто присвоил N_Code номер строки в Таблице 4 (естественно на таблицу четыре пишешь свою обработку, если юзер не нашел там этого наименования, чтоб он его добавил, тут же контроль и т.д. и т.п)
А проект это хорошо, но ведь к каждой мульке придется обьяснения на трех листах писать, да и кто сказал. что то что я предложил оптимально, - лови базовика или постановщика, а когда разберешься с первичными, вторичными и прочими индексами, с понятиями главная таблица, справочник и т.д. ты и сам проет запузыришь еще и скажешь - "черт, а я это еще лучше сделал".
Причем все проекты когда-то начинают работать, но вот внесение изменений без гимороя ... когда у тебя таблица на таблице сидит и таблицей погоняет, внес изменения в середину цепочки и подчиненные таблицы начинают рушится.
Махариши не нашел, но http://www.pbl.narod.ru/
затем - Теория БД -> Документация ->
Основы проектирования реляционных баз данных.
Удачи