Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывод сведений из запроса в компонент StringGrid [D5, dBase, FoxPro, Paradox]


Страницы:   1 2 3

Сергей ©   (2008-06-05 21:10:00) 

Доброго времени суток уважаемые мастера! У меня вопрос следующего характера.
Имеются две таблицы. В одной хранятся данные по регионам и по организациям, а в другой данные о хозяйственных операциях которые проводились данными организациями. Нужно сформировать вывод данных таким образом, чтобы сведения вытаскивались из этих взаимосвязаных таблиц в развернутом виде. То есть:
Регион 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
 - ...


Сергей   (2008-06-05 22:43:00) [21]

MsGuns...  Ну в своем случае я все это сделал. А как в итоге все это в StringGrid перетащить. В StringGridе это все потом проанализируется пользователем и потом отшлется в xls файл


Сергей   (2008-06-05 22:39:00) [22]

Но если я уберу втору конструкцию.. А именно, если я правильно понял:
     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;
То я вообще не вытяну сведения о хозяйственных операциях в какой нибудь организации...


MsGuns   (2008-06-05 22:35:00) [23]

Можно полюбопытствовать: зачем такие пляски с бубном-стрингридом, если это банально реализуется с помощью двух логически связанных датасетов, отображаемых в DBGrid'ах ?


Сергей   (2008-06-05 22:33:00) [24]

То есть вот этой строчкой "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
- ...


Правильный_Вася   (2008-06-05 22:32:00) [25]

научись пользоваться отладчиком


Anatoly Podgoretsky   (2008-06-05 22:32:00) [26]

> Сергей  (05.06.2008 22:26:13)  [13]

First лишнии и опять for d := 1 to find_sql2.RecordCount


Anatoly Podgoretsky   (2008-06-05 22:31:00) [27]

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

Твой код трудно анализировать и желание это делать, пока он в таком виде нет.


Правильный_Вася   (2008-06-05 22:30:00) [28]


>  while not find_sql1.Eof do         find_sql2.Close;

зависает, т.к. ты в цикле пытаешься закрыть датасет


Anatoly Podgoretsky   (2008-06-05 22:30:00) [29]

> Сергей  (05.06.2008 22:14:09)  [9]

Ты поступил неправильно, убирать надо вторую конструкцию, а не первую.
Со второй ты еще не раз наступишь на грабли.


Сергей   (2008-06-05 22:26:00) [30]

Уважаемый Сергей М.!!! Привожу результат полученного кода:
   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;
Если конечно я вас правильно понял. Но теперь у меня все повисает на глухо.


Сергей М.   (2008-06-05 22:20:00) [31]


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


Вот снавала приведи все свои циклы в соответствие шаблону в [8] - потом и рассуждать будем, что и где у тебя "застревает"


Сергей   (2008-06-05 22:18:00) [32]

Сергей М. - В том то и дело, что при извлечении из первого запроса я получаю данные по регионам. Потом я встановлюсь на первую запись и вытягиваю все сведения из таблицы хозяйственных операций. После этого я пытаюсь перейти на вторую запись из запроса find_sql1 (выбранных регионов. Но как итог у меня в StringGrid данные не появляются. Где и на каком месте происходит застревание я не знаю


Сергей М.   (2008-06-05 22:16:00) [33]

Читай [8] до просветления.


Сергей   (2008-06-05 22:14:00) [34]

Сергей М. Я попытался убрать условие "while not find_sql1.Eof do" и оставил только "for b := 1 to find_sql1.RecordCount + 1 do".. Но дело с места и не двинулось...


Сергей М.   (2008-06-05 22:12:00) [35]

Не занимайся экспериментами, организовывай любойцикл по НД данных по стандартному надежному шаблону:

MyDataSet.First; //если необходимо; сразу после открытия НД вызов этого метода нетребуется
while not MyDataSet.Eof do
begin
 .. работа с текущей записью ..
 MyDataSet.Next;
end;


Сергей   (2008-06-05 22:08:00) [36]

while not find_sql1.Eof do
for b := 1 to find_sql1.RecordCount + 1 do
Если в данном случае я попытаюсь сделать так "for b := 1 to find_sql1.RecordCount do", то у меня одна запись из набора пропадает


Сергей М.   (2008-06-05 22:05:00) [37]


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


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

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

И зачем проверка на Eof, если ты все равно используешь иное граничное условие цикла - RecordCount ?


Сергей М.   (2008-06-05 22:02:00) [38]

А безобразие так и осталось)


Сергей   (2008-06-05 22:02:00) [39]

Простите Сергей М.??? А как же тогда будет лучше? В данном случае идете перебор по записям полученным в первом запросе. То есть мы сперва вытягиваем данные по регионам, а потом под регионы начинаем тянуть уже информацию об организациях и о хозяйственных операциях произведимых данными организациями.
С интересом рассмотрел бы ваш варинат...


Сергей   (2008-06-05 21:58:00) [40]

Попробовал.. Теперь у меня листинг имеет вот такой вид: Но результат от этого не поменялся
   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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо