-
Доброго времени суток уважаемые мастера! У меня вопрос следующего характера.
Имеются две таблицы. В одной хранятся данные по регионам и по организациям, а в другой данные о хозяйственных операциях которые проводились данными организациями. Нужно сформировать вывод данных таким образом, чтобы сведения вытаскивались из этих взаимосвязаных таблиц в развернутом виде. То есть:
Регион 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
- ...
-
сделай запрос, чтоб возвращал нужные регионы
-
> while not find_sql1.Eof do
> for b := 1 to find_sql1.RecordCount + 1 do
Что это за безобразие ?
-
Попробовал.. Теперь у меня листинг имеет вот такой вид: Но результат от этого не поменялся
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;
-
Простите Сергей М.??? А как же тогда будет лучше? В данном случае идете перебор по записям полученным в первом запросе. То есть мы сперва вытягиваем данные по регионам, а потом под регионы начинаем тянуть уже информацию об организациях и о хозяйственных операциях произведимых данными организациями.
С интересом рассмотрел бы ваш варинат...
-
А безобразие так и осталось)
-
> В данном случае идете перебор по записям полученным в первом
> запросе
Если записей RecordCount, то что за запись RecordCount + 1 ?
И с чего ты взял, что св-во RecordCount будет отражать реальное число записей в НД ?
И зачем проверка на Eof, если ты все равно используешь иное граничное условие цикла - RecordCount ?
-
while not find_sql1.Eof do
for b := 1 to find_sql1.RecordCount + 1 do
Если в данном случае я попытаюсь сделать так "for b := 1 to find_sql1.RecordCount do", то у меня одна запись из набора пропадает
-
Не занимайся экспериментами, организовывай любой цикл по НД данных по стандартному надежному шаблону:
MyDataSet.First; //если необходимо; сразу после открытия НД вызов этого метода не требуется
while not MyDataSet.Eof do
begin
.. работа с текущей записью ..
MyDataSet.Next;
end;
-
Сергей М. Я попытался убрать условие "while not find_sql1.Eof do" и оставил только "for b := 1 to find_sql1.RecordCount + 1 do".. Но дело с места и не двинулось...
-
Читай [8] до просветления.
-
Сергей М. - В том то и дело, что при извлечении из первого запроса я получаю данные по регионам. Потом я встановлюсь на первую запись и вытягиваю все сведения из таблицы хозяйственных операций. После этого я пытаюсь перейти на вторую запись из запроса find_sql1 (выбранных регионов. Но как итог у меня в StringGrid данные не появляются. Где и на каком месте происходит застревание я не знаю
-
> Сергей (05.06.08 22:18) [11]
Вот снавала приведи все свои циклы в соответствие шаблону в [8] - потом и рассуждать будем, что и где у тебя "застревает"
-
Уважаемый Сергей М.!!! Привожу результат полученного кода:
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;
Если конечно я вас правильно понял. Но теперь у меня все повисает на глухо.
-
> Сергей (05.06.2008 22:14:09) [9]
Ты поступил неправильно, убирать надо вторую конструкцию, а не первую.
Со второй ты еще не раз наступишь на грабли.
-
> while not find_sql1.Eof do find_sql2.Close;
зависает, т.к. ты в цикле пытаешься закрыть датасет
-
> Сергей (05.06.2008 22:18:11) [11]
Твой код трудно анализировать и желание это делать, пока он в таком виде нет.
-
> Сергей (05.06.2008 22:26:13) [13]
First лишнии и опять for d := 1 to find_sql2.RecordCount
-
научись пользоваться отладчиком
-
То есть вот этой строчкой "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
- ...