![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывод сведений из запроса в компонент StringGrid [D5, dBase, FoxPro, Paradox]
Сергей © (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;