ADOQuery wyszukiwanie podgrup w grupie głównej

0

Witam! Najprawdopodobnie dla Was jest to błahostka a dla mnie niewiewdza i brak podstaw ale nie znalazłem rozwiązania otóż mam taki kod:

     ///////////////////////////////////// sprawdzam aczy są podgrupy
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Add(' SELECT TGD_Kod,TGD_GIDNumer FROM cdn.TwrGrupyDom');
      ADOQuery1.SQL.append(' where tgd_gidtyp=-16 and tgd_gronumer='+grupa+' ');
      ADOQuery1.Open;



      while (not adoquery1.eof) do

      begin
    

      if ADOQuery1.FieldByName('TGD_GIDNumer').AsString<>'' then
              begin
                sprawdz_podgrupy_1(sender);

                rztreeview1.Items.AddChild(nadrzedna, ADOQuery1.FieldByName('Tgd_kod').AsString)
              end;

      ADOQuery1.next;

      end;
      /////////////////////////////////////////////////////////////////////////

Nieistotne co odczytuje ale chce utworzyć drzewko (które do I poziomu sie tworzy tak jak potrzebuej) natomiast nie wiem jak rozwiązać sytuacje gdy w jakiejś podgrupie Tworzy się kolejna podgrupa i w tej kolejna.. itd. są one dynamiczne i nie wiem ile ich jeszcze bedzie wygląda to mniej więcej tak jak w załączniku. Najprostszym rozwiazaniem było by w miejscu dać "odskocznie" żeby sprawdziło mi czy nie ma podgrup np sprawdz_podgrupy_1(sender) i tu wrzucić identyczny kod jak w nadrzędnej ale co w sytuacji jak bede miał 10 podgrup musiałbym znowu w sprawdz_podgrupy_1(sender) dawać sprawdz_podgrupy_2(sender) itd jest na to sposób - nie kombinowany bo powiem nie wiem jak to rozwiązać.

1
function Zwroć_Listę_Podrednych_Id(Id:Integer):TIntegerArray;
var QueryStr:String;
var add:TIntegerArray;
begin
  SetLength(add,1);
  add[0]:=Id;
  while Length(Add)>0 do
  begin
    AppendArray(Result,Add);
    QueryStr:='select Distinct Id where Parent in ('+ArrToCommaSeparated(Add)+') and Id not in ('+ArrToCommaSeparated(Result)+')';
    add:=ExecouteQueryAndReturnIdList(QueryStr);
  end;
end;

Pętla wykona się tyle razy ile masz poziomów. Wynikiem będzie lista Id - składniki których należy ściągnąć.

0

rekurencja

0

_13th_Dragon poddałeś mi wizje zrobienia tego na tablicy w dość nietypowy sposób dla przykładu takie rozwiązanie"

procedure TForm1.szukaj_podgrup(Sender: TObject);
var
xxl:integer;
podgrupa_podgrupy:string;
begin

xxl:=0;

    repeat
    podgrupa_podgrupy:=podgrupa[xxl];

     if podgrupa_podgrupy<>'' then
     begin
     ADOQuery3.SQL.Clear;
     ADOQuery3.SQL.Add(' SELECT TGD_Kod,TGD_GIDNumer FROM cdn.TwrGrupyDom');
     ADOQuery3.SQL.append(' where tgd_gidtyp=-16 and tgd_gronumer='+podgrupa[xxl]+' ');
     ADOQuery3.Open;

       while (not adoquery3.eof) do

          begin
          inc(numer_grupy);
          podgrupa[numer_grupy]:=ADOQuery3.FieldByName('TGD_GIDNumer').AsString;

          adoquery3.next;
          end;

     end; //podgrupa_podgrupy

    inc(xxl);
    until  xxl=numer_grupy


    end;

najpierw towrzę w głównej pętli tablice -> wypełniam ją i po zakończeniu

while (not adoquery1.eof)

z pierwszego posta lece do powyższego i poprzez powtarzanie zapytania sprawdzam czy jest podgrupa i podgrupa podgrup itd. dodając do tablicy odczytaną wartośc zwiekszając jej index aż do końca możliwości. Fętlą for nie udało mi się zrobić gdyż wartość do pobierała na początku. A co do rekurencji muszę się doedukować.

0

Lepiej już zrób rekurencyjnie jak to zaproponował @babubabu, będzie przynajmniej prostsze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1