[Delphi] поиск по нескольким полям

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Derec, 20 Sep 2010.

  1. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0
    Суть вопроса:

    Есть структура данных record. К примеру:

    Code:
    type
    Students = record
     f:string;
     i:string;
     o:string;
     mark:integer;
     yeat:string;
     ....
    end;
    
    var
     studlist:array[1..100] of Students;
    ....
    
    Также на форме есть Edit контролы, для того, чтобы вводить эти данные, а так же осуществлять по ним поиск, например, по фамилии.

    Проблема:

    Но! Не первый день уже бьюсь не могу понять как сделать так, чтобы поиск был по нескольким полям! Вроде бы простая проблема и должна легко решаться. Но к примеру, возникает ошибка, когда я хочу лишь искать по фамилии (поле f) и оценке (поле mark). То есть, слелующий тривиальный код не корректный: :(

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
    for i:=1 to High(studlist) do
     if (Edit1.Text=studlist[i].f) and (Edit2.Text=studlist[i].i) and (Edit3.Text=studlist[i].o) and (Edit4.Text=inttostr(studlist[i].mark)) and (Edit5.Text=studlist[i].year) then
     begin
      Memo1.Lines.Add('Запись номер : '+inttostr(i));
    end;
    end;
    
    Ошибка потому что, Edit2, Edit3,Edit5 остались пустые...


    Помогите пожалуйста освежить мозги ... :rolleyes:
     
    #1 Derec, 20 Sep 2010
    Last edited: 20 Sep 2010
  2. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Тупое решение:
    Code:
    ((Edit1.Text=studlist[i].f) OR (Edit1.Text='')) and ((Edit2.Text=studlist[i].i) OR (Edit2.Text='')) and ((Edit3.Text=studlist[i].o) OR (Edit3.Text='')) and ((Edit4.Text=inttostr(studlist[i].mark)) OR (Edit4.Text='')) and ((Edit5.Text=studlist[i].year) OR (Edit5.Text=''))
    Умное решение:
    Анализировать состояние эдитов до поиска и сравнивать только нужные поля
     
  3. Derec

    Derec Elder - Старейшина

    Joined:
    8 Nov 2007
    Messages:
    74
    Likes Received:
    4
    Reputations:
    0

    Представляете сколько может быть различных комбинаций, особенно если полей много в структуре! Ладно, если было бы 2 поля... А мне тогда придется рассматривать варианты, когда Edit1 пустой, к примеру, а все остальные заполнены и т.д. Как раз таки это решение не целесообразное, лобовое. Возможно как-то это реалиовать через логические запросы. Как, SQL ведь и работает.
     
  4. Redeemer

    Redeemer Member

    Joined:
    3 Jul 2010
    Messages:
    203
    Likes Received:
    24
    Reputations:
    1
    Ну так никто и не говорит про перебор всех комбинаций вариантов.
    А если еще не только равенство проверять надо, то вообще сказка))))
    И если любите SQL - используйте SQL. Есть куча in-memory баз данных.