Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.11.2009, 00:26
device™ device™ вне форума
Прохожий
 
Регистрация: 22.11.2009
Сообщения: 4
Репутация: 10
По умолчанию

Вобщем сделал я простенький пример:
Первая выборка по производителю, вторая выборка по типу, третяя выборка по цвету.

Есть 3 производителя ручек. Каждый производит 2 типа (гелевые и капилярные). В каждом типе производится по 3 цвета. Итого в БД получается 18 ручек.

Что происходит когда я запускаю выборку:

Допустим выбираю производителя. Начинаю выбирать тип ручки, и у меня как бы производитель не учитывается, показывает все ручки одного типа, без учета производителя, с цветом тоже самое - без учета производителя и типа.

Подскажите какой момент я недоработал?

PHP код:
procedure TForm1.FormCreate(SenderTObject);
  var 
Str1Str2Str3String;
  
begin

  Query2
.SQL.Clear;
  
Query2.SQL.Add('SELECT * FROM Pros');
  
Query2.Open;
  
ComboBox1.Clear;
  while 
not Query2.Eof do
    
begin
    Str1
:=Query2.FieldByName('ProizvodName').AsString;
    
ComboBox1.Items.Add(Str1);
    
Query2.Next;
    
end;
  
ComboBox1.Items.Add('Все производители');
  
ComboBox1.ItemIndex:=ComboBox1.Items.Count-1;

    
begin
    Query3
.SQL.Clear;
    
Query3.SQL.Add('SELECT * FROM Types');
    
Query3.Open;
    
ComboBox2.Clear;
    while 
not Query3.Eof do
      
begin
      Str2
:=Query3.FieldByName('TypeName').AsString;
      
ComboBox2.Items.Add(Str2);
      
Query3.Next;
      
end;
    
ComboBox2.Items.Add('Все типы');
    
ComboBox2.ItemIndex:=ComboBox2.Items.Count-1;

      
begin
      Query4
.SQL.Clear;
      
Query4.SQL.Add('SELECT * FROM Colors');
      
Query4.Open;
      
ComboBox3.Clear;
      while 
not Query4.Eof do
        
begin
        Str3
:=Query4.FieldByName('ColorName').AsString;
        
ComboBox3.Items.Add(Str3);
        
Query4.Next;
        
end;
      
ComboBox3.Items.Add('Все цвета');
      
ComboBox3.ItemIndex:=ComboBox3.Items.Count-1;
      
end;
    
end;
  
end;

  
procedure TForm1.ComboBox1Change(SenderTObject);
    var 
CurID1Integer;

    
begin
    Query1
.Close;
    
Query1.SQL.Clear;
    
Query1.SQL.Add('SELECT * FROM Ruchkas ');
    if 
ComboBox1.ItemIndex ComboBox1.Items.Count-1 then

      begin
      Query1
.SQL.Add('WHERE ProizvodID=:pProizvodID');
      
Query2.Locate('ProizvodName',ComboBox1.Text,[ ]);
      
CurID1:=Query2.FieldByName('ProizvodID').AsInteger;
      
Query1.Params[0].AsInteger:=CurID1;
      
Query1.ExecSQL
      
      end
;
    
Query1.Open;
  
end;

  
procedure TForm1.ComboBox2Change(SenderTObject);
    var 
CurID2Integer;
    
begin
    Query1
.Close;
    
Query1.SQL.Clear;
    
Query1.SQL.Add('SELECT * FROM Ruchkas ');
    if 
ComboBox2.ItemIndex ComboBox2.Items.Count-1 then

      begin
      Query1
.SQL.Add('WHERE TypeID=:pTypeID');
      
Query3.Locate('TypeName',ComboBox2.Text,[ ]);
      
CurID2:=Query3.FieldByName('TypeID').AsInteger;
      
Query1.Params[0].AsInteger:=CurID2;
      
end;
    
Query1.Open;
  
end;

  
procedure TForm1.ComboBox3Change(SenderTObject);
    var 
CurID3Integer;
    
begin
    Query1
.Close;
    
Query1.SQL.Clear;
    
Query1.SQL.Add('SELECT * FROM Ruchkas ');
    if 
ComboBox3.ItemIndex ComboBox3.Items.Count-1 then

      begin
      Query1
.SQL.Add('WHERE ColorID=:pColorID');
      
Query4.Locate('ColorName',ComboBox3.Text,[ ]);
      
CurID3:=Query4.FieldByName('ColorID').AsInteger;
      
Query1.Params[0].AsInteger:=CurID3;
      
end;
    
Query1.Open;
  
end;
end

Последний раз редактировалось device™, 24.11.2009 в 16:37.
Ответить с цитированием
  #2  
Старый 22.11.2009, 13:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Для реализации ваших связаных справочников почитайте про организацию связи между таблицами Master - Detail.
Если очень сжато то так:
В дельфи для таблиц используется специальное свойство в TAdoTable,TTable называется MasterSource.
Код:
Detail.MasterSource := DatasourceMasterSource;
Detail.MasterFields := 'Key';
здесь DatasourceMasterSource - Datasource связаный с таблицей Master
Для запросов используется несколько другая техника. В теле запроса упоминается имя поля связи
Код:
select * from Detail where MasterKey=:Key
здесь MasterKey и Key - поля по которым организована связь между Detail и Master соответственно.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 24.11.2009, 16:15
device™ device™ вне форума
Прохожий
 
Регистрация: 22.11.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Для реализации ваших связаных справочников почитайте про организацию связи между таблицами Master - Detail.
Если очень сжато то так:
В дельфи для таблиц используется специальное свойство в TAdoTable,TTable называется MasterSource.
Код:
Detail.MasterSource := DatasourceMasterSource;
Detail.MasterFields := 'Key';
здесь DatasourceMasterSource - Datasource связаный с таблицей Master
Для запросов используется несколько другая техника. В теле запроса упоминается имя поля связи
Код:
select * from Detail where MasterKey=:Key
здесь MasterKey и Key - поля по которым организована связь между Detail и Master соответственно.
Можно немного по подробнее с этим моментом?
Вот моя аська 37-88-64-000 если есть возможность можно по аське, просто уже неделю мучаюсь, никак не получается
Ответить с цитированием
  #4  
Старый 24.11.2009, 16:40
device™ device™ вне форума
Прохожий
 
Регистрация: 22.11.2009
Сообщения: 4
Репутация: 10
По умолчанию

Мне кажеться что вот здесь недоработано:

PHP код:
procedure TForm1.ComboBox2Change(SenderTObject); 
    var 
CurID2Integer
    
begin 
--------------------------------------------------------
    
Query1.Close
    
Query1.SQL.Clear
    
Query1.SQL.Add('SELECT * FROM Ruchkas ');
--------------------------------------------------------
//т.е. как бы та выборка которая была первой (производитель) неучитывается, 
//за счет того, что открывается заного БД Ruchkas 
    
if ComboBox2.ItemIndex ComboBox2.Items.Count-1 then 

      begin 
      Query1
.SQL.Add('WHERE TypeID=:pTypeID'); 
      
Query3.Locate('TypeName',ComboBox2.Text,[ ]); 
      
CurID2:=Query3.FieldByName('TypeID').AsInteger
      
Query1.Params[0].AsInteger:=CurID2
      
end
    
Query1.Open
  
end

ПС.
У меня тут используется DBGrid...

Последний раз редактировалось device™, 24.11.2009 в 16:43.
Ответить с цитированием
  #5  
Старый 28.11.2009, 17:50
device™ device™ вне форума
Прохожий
 
Регистрация: 22.11.2009
Сообщения: 4
Репутация: 10
По умолчанию

PHP код:
procedure TForm1.FormCreate(SenderTObject);
var 
S3S4S5S6S7 String;
begin
Query3
.DatabaseName:=GetCurrentDir;
Query4.DatabaseName:=GetCurrentDir;
Query5.DatabaseName:=GetCurrentDir;
Query6.DatabaseName:=GetCurrentDir;
Query7.DatabaseName:=GetCurrentDir;


Query2.SQL.Clear;
Query2.SQL.Add('SELECT * FROM Pros');
Query2.Open;
ComboBox1.Clear;
while 
not Query2.Eof do
begin
S3
:=Query2.FieldByName('ProizvodName').AsString;
ComboBox1.Items.Add(Str1);
Query2.Next;
end;
ComboBox1.Items.Add('Âñå ïðîèçâîäèòåëè');
ComboBox1.ItemIndex:=ComboBox1.Items.Count-1;

begin
Query3
.SQL.Clear;
Query3.SQL.Add('SELECT * FROM Types');
Query3.Open;
ComboBox2.Clear;
while 
not Query3.Eof do
begin
Str2
:=Query3.FieldByName('TypeName').AsString;
ComboBox2.Items.Add(Str2);
Query3.Next;
end;
ComboBox2.Items.Add('Âñå òèïû');
ComboBox2.ItemIndex:=ComboBox2.Items.Count-1;

begin
Query4
.SQL.Clear;
Query4.SQL.Add('SELECT * FROM Colors');
Query4.Open;
ComboBox3.Clear;
while 
not Query4.Eof do
begin
Str3
:=Query4.FieldByName('ColorName').AsString;
ComboBox3.Items.Add(Str3);
Query4.Next;
end;
ComboBox3.Items.Add('Âñå öâåòà');
ComboBox3.ItemIndex:=ComboBox3.Items.Count-1;
end;
end;

end;



procedure TForm1.ComboBox1Change(SenderTObject);
var 
CurID3CurID2CurID1iInteger;
begin 
Query1
.Close;
Query1.SQL.Clear;
Query1.SQL.Add('SELECT * FROM Ruchkas ');
Query1.SQL.Add('where ');
i:=0;

if (
ComboBox1.ItemIndex<>ComboBox1.Items.Count-1)    then
begin
Query1
.SQL.Add('ProizvodID=:pProizvodID');
Query2.Locate('ProizvodName',ComboBox1.Text,[ ]);
CurID1:=Query2.FieldByName('ProizvodID').AsInteger;
Query1.Params[i].AsInteger:=CurID1;
inc(i);
end;

if (
ComboBox3.ItemIndex<>ComboBox3.Items.Count-1)    then
begin
if (i>0)  then
Query1
.SQL.Add('and ColorID=:pColorID')
else
Query1.SQL.Add('ColorID=:pColorID');
Query4.Locate('ColorName',ComboBox3.Text,[ ]);
CurID3:=Query4.FieldByName('ColorID').AsInteger;
Query1.Params[i].AsInteger:=CurID3;
inc(i);
end;

if (
ComboBox2.ItemIndex<>ComboBox2.Items.Count-1)    then
begin
if (i>0)  then
Query1
.SQL.Add('and TypeID=:pTypeID')
else
Query1.SQL.Add('TypeID=:pTypeID');
Query3.Locate('TypeName',ComboBox2.Text,[ ]);
CurID2:=Query3.FieldByName('TypeID').AsInteger;
Query1.Params[i].AsInteger:=CurID2;
end;

Query1.Open;
end;
end.

end
Ответить с цитированием
  #6  
Старый 27.12.2010, 14:28
Second Second вне форума
Прохожий
 
Регистрация: 19.11.2009
Сообщения: 1
Репутация: 10
По умолчанию

использую FB и хотелось бы более развертутого ответа по реализации Master Detail.

- как правильно связать таблицы, с чего начинать ?
- для работы с БД FB я использую IBExpert, как там создать и что для связи таблиц ?


сделал все как описано, но во втором гриде пустые поля от таблицы =/
в чем может быть причина ??



Мой вопрос снят с повестки, все заработало. Моя невнимательность была ошибкой.
Страдалец большое спасибо за твои публичные советы +_+

Последний раз редактировалось Second, 27.12.2010 в 17:31.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025