Конференция "Базы" » Вывод сведений из запроса в компонент StringGrid [D5, dBase, FoxPro, Paradox]
 
  • Сергей (05.06.08 21:10) [0]
    Доброго времени суток уважаемые мастера! У меня вопрос следующего характера.
    Имеются две таблицы. В одной хранятся данные по регионам и по организациям, а в другой данные о хозяйственных операциях которые проводились данными организациями. Нужно сформировать вывод данных таким образом, чтобы сведения вытаскивались из этих взаимосвязаных таблиц в развернутом виде. То есть:
    Регион 1
     - Организация 1
     - Организация 2
     - ...
    Регион 2
     - ..
    При этом я использую следующий код:
       with find_sql1 do
        begin
         find_sql1.Close;
         find_sql1.SQL.Clear;
         find_sql1.SQL.Add('Select * from reghoz'+
                           ' where NOD0 = 1 and NOD1 <> 0 and NOD2 = 0'+
                           ' ORDER BY NOD1');
         find_sql1.Open;
         find_sql1.First;
         a := find_sql1.FieldByName('NOD1').AsInteger;
        end;
       while not find_sql1.Eof do
        for b := 1 to find_sql1.RecordCount + 1 do
         begin
          rep_dlg.rep_tipil_tsg.Cells[1,b] := find_sql1.FieldByName('NAME').AsString;
            find_sql2.Close;
            find_sql2.SQL.Clear;
            find_sql2.SQL.Add('Select * from reghoz, isp_lst'+
                              ' where reghoz.NOD1 = '''+IntToStr(a)+''' and reghoz.NOD2 = isp_lst.id_hoz'+
                              ' ORDER BY reghoz.NOD1, reghoz.NOD2');
            find_sql2.Open;
            find_sql2.First;
           while not find_sql2.Eof do
               for d := 1 to find_sql2.RecordCount do
                begin
                 rep_dlg.rep_tipil_tsg.Cells[1,d+1] := find_sql2.FieldByName('NAME').AsString;
                 find_sql2.Next;
                end;
              find_sql1.Next;

    Но в результате происходит вывод только сведений первого региона. Остальные регионы не вытаскиваются:
    Регион 1
     - Организация 1
     - Организация 2
     - ...
  • Правильный_Вася (05.06.08 21:29) [1]
    сделай запрос, чтоб возвращал нужные регионы
  • Сергей М. © (05.06.08 21:55) [2]

    >    while not find_sql1.Eof do
    >     for b := 1 to find_sql1.RecordCount + 1 do


    Что это за безобразие ?
  • Сергей (05.06.08 21:58) [3]
    Попробовал.. Теперь у меня листинг имеет вот такой вид: Но результат от этого не поменялся
       with find_sql1 do
        begin
         find_sql1.Close;
         find_sql1.SQL.Clear;
         find_sql1.SQL.Add('Select * from reghoz'+
                           ' where reghoz.NOD2 = 0 and reghoz.NOD0 = 1 and'+
                           ' reghoz.NOD1 in (Select DISTINCT(id_reg) from isp_lst)'+
                           ' ORDER BY reghoz.NOD1');
         find_sql1.Open;
         find_sql1.First;
         a := find_sql1.FieldByName('NOD1').AsInteger;
        end;
       while not find_sql1.Eof do
        for b := 1 to find_sql1.RecordCount + 1 do
         begin
          rep_dlg.rep_tipil_tsg.Cells[1,b] := find_sql1.FieldByName('NAME').AsString;
            find_sql2.Close;
            find_sql2.SQL.Clear;
            find_sql2.SQL.Add('Select * from reghoz, isp_lst'+
                              ' where reghoz.NOD1 = '''+IntToStr(a)+''' and isp_lst.id_hoz = reghoz.NOD2'+
                              ' ORDER BY reghoz.NOD1, reghoz.NOD2');
            find_sql2.Open;
            find_sql2.First;
            c := find_sql2.RecNo;
           while not find_sql2.Eof do
            for d := 1 to find_sql2.RecordCount do
             begin
              rep_dlg.rep_tipil_tsg.Cells[1,d+1] := find_sql2.FieldByName('NAME').AsString;
              find_sql2.Next;
             
             end;
             find_sql1.Next;
           end;
  • Сергей (05.06.08 22:02) [4]
    Простите Сергей М.??? А как же тогда будет лучше? В данном случае идете перебор по записям полученным в первом запросе. То есть мы сперва вытягиваем данные по регионам, а потом под регионы начинаем тянуть уже информацию об организациях и о хозяйственных операциях произведимых данными организациями.
    С интересом рассмотрел бы ваш варинат...
  • Сергей М. © (05.06.08 22:02) [5]
    А безобразие так и осталось)
  • Сергей М. © (05.06.08 22:05) [6]

    > В данном случае идете перебор по записям полученным в первом
    > запросе


    Если записей RecordCount, то что за запись RecordCount + 1 ?

    И с чего ты взял, что св-во RecordCount будет отражать реальное число записей в НД ?

    И зачем проверка на Eof, если ты все равно используешь иное граничное условие цикла - RecordCount ?
  • Сергей (05.06.08 22:08) [7]
    while not find_sql1.Eof do
    for b := 1 to find_sql1.RecordCount + 1 do
    Если в данном случае я попытаюсь сделать так "for b := 1 to find_sql1.RecordCount do", то у меня одна запись из набора пропадает
  • Сергей М. © (05.06.08 22:12) [8]
    Не занимайся экспериментами, организовывай любой цикл по НД данных по стандартному надежному шаблону:

    MyDataSet.First; //если необходимо; сразу после открытия НД вызов этого метода не требуется
    while not MyDataSet.Eof do
    begin
     .. работа с текущей записью ..
     MyDataSet.Next;
    end;
  • Сергей (05.06.08 22:14) [9]
    Сергей М. Я попытался убрать условие "while not find_sql1.Eof do" и оставил только "for b := 1 to find_sql1.RecordCount + 1 do".. Но дело с места и не двинулось...
  • Сергей М. © (05.06.08 22:16) [10]
    Читай [8] до просветления.
  • Сергей (05.06.08 22:18) [11]
    Сергей М. - В том то и дело, что при извлечении из первого запроса я получаю данные по регионам. Потом я встановлюсь на первую запись и вытягиваю все сведения из таблицы хозяйственных операций. После этого я пытаюсь перейти на вторую запись из запроса find_sql1 (выбранных регионов. Но как итог у меня в StringGrid данные не появляются. Где и на каком месте происходит застревание я не знаю
  • Сергей М. © (05.06.08 22:20) [12]

    > Сергей   (05.06.08 22:18) [11]


    Вот снавала приведи все свои циклы в соответствие шаблону в [8] - потом и рассуждать будем, что и где у тебя "застревает"
  • Сергей (05.06.08 22:26) [13]
    Уважаемый Сергей М.!!! Привожу результат полученного кода:
       with find_sql1 do
        begin
         find_sql1.Close;
         find_sql1.SQL.Clear;
         find_sql1.SQL.Add('Select * from reghoz'+
                           ' where reghoz.NOD2 = 0 and reghoz.NOD0 = 1 and'+
                           ' reghoz.NOD1 in (Select DISTINCT(id_reg) from isp_lst)'+
                           ' ORDER BY reghoz.NOD1');
         find_sql1.Open;
         find_sql1.First;
         a := find_sql1.FieldByName('NOD1').AsInteger;
        end;
       while not find_sql1.Eof do
            find_sql2.Close;
            find_sql2.SQL.Clear;
            find_sql2.SQL.Add('Select * from reghoz, isp_lst'+
                              ' where reghoz.NOD1 = '''+IntToStr(a)+''' and isp_lst.id_hoz = reghoz.NOD2'+
                              ' ORDER BY reghoz.NOD1, reghoz.NOD2');
            find_sql2.Open;
            find_sql2.First;
          while not find_sql2.Eof do
            for d := 1 to find_sql2.RecordCount do
             begin
             rep_dlg.rep_tipil_tsg.Cells[1,d] := find_sql1.FieldByName('NAME').AsString;
              rep_dlg.rep_tipil_tsg.Cells[1,d+1] := find_sql2.FieldByName('NAME').AsString;
              find_sql2.Next;
              find_sql1.Next;
             end;
    Если конечно я вас правильно понял. Но теперь у меня все повисает на глухо.
  • Anatoly Podgoretsky © (05.06.08 22:30) [14]
    > Сергей  (05.06.2008 22:14:09)  [9]

    Ты поступил неправильно, убирать надо вторую конструкцию, а не первую.
    Со второй ты еще не раз наступишь на грабли.
  • Правильный_Вася (05.06.08 22:30) [15]

    >  while not find_sql1.Eof do         find_sql2.Close;

    зависает, т.к. ты в цикле пытаешься закрыть датасет
  • Anatoly Podgoretsky © (05.06.08 22:31) [16]
    > Сергей  (05.06.2008 22:18:11)  [11]

    Твой код трудно анализировать и желание это делать, пока он в таком виде нет.
  • Anatoly Podgoretsky © (05.06.08 22:32) [17]
    > Сергей  (05.06.2008 22:26:13)  [13]

    First лишнии и опять for d := 1 to find_sql2.RecordCount
  • Правильный_Вася (05.06.08 22:32) [18]
    научись пользоваться отладчиком
  • Сергей (05.06.08 22:33) [19]
    То есть вот этой строчкой "rep_dlg.rep_tipil_tsg.Cells[1,d] := find_sql1.FieldByName('NAME').AsString"я говорю, чтобы он мне вывел первую запись из запроса find_sql1 по региону и записал в соответствующее поле в объекте StringGrid. А так как записи по хозяйственным операциям еще есть то он мне должен под записью региона вывести запси по организациям и соответственно хозяйственным операциям. Вот тут я и пишу строку "rep_dlg.rep_tipil_tsg.Cells[1,d+1] := find_sql2.FieldByName('NAME').AsString;" Ну а потом до тех пор пока не кончаться записи во втором запросе find_sql2 и после этого должна взяться следующая запись из первого запроса и перебор должен пойти дальше.. Чтобы в итоге получился желаемый вывод:
    Регион 1
    - Организация 1
    - Организация 2
    - ...
 
Конференция "Базы" » Вывод сведений из запроса в компонент StringGrid [D5, dBase, FoxPro, Paradox]
Есть новые Нет новых   [134473   +24][b:0][p:0.001]