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

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

Непонятки с запросом [XP]


petvv ©   (2011-12-21 09:19:00) 

Есть код:


var
 i:Integer;
begin
 qKard.Close;
 qKard.SQL.Clear;
 qKard.SQL.Add('select KardID, FIO from Kard where AtpID='+IntToStr(
   ComboATP.ItemIndex+1));
 qKard.SQL.Text;
 qKard.Open;
 qKard.First;
 for i :=1  to qKard.RecordCount do
   begin
     qOtch111.Close;
     qOtch111.SQL.Clear;
     qOtch111.SQL.Add(
     'select LitFact, DTCheck, Marka, FIO from Statist, Fuel, Kard where ' +
     'Statist.ITR=False and Statist.ATP=:QATP and Statist.DTCheck>=:QDatBeg ' +
     'and Statist.DTCheck<=:QDatEnd and Statist.GSM=Fuel.ID and Statist.NKard=' +
     ':QNKard');
     qOtch111.SQL.Text;
     qOtch111.ParamByName('QATP').AsInteger:=ComboATP.ItemIndex+1;
     qOtch111.ParamByName('QDatBeg').AsDateTime:=DTBeg.Date;
     qOtch111.ParamByName('QDatEnd').AsDateTime:=DTEnd.Date;
     qOtch111.ParamByName('QNKard').AsInteger:=qKard.FieldByName('KardID').Value;
     qOtch111.Open;
     qOtch111.RecordCount;
     frxReport2.Variables['DatBeg'] := '''' + DateTimeToStr(DTBeg.Date) + '''';
     frxReport2.Variables['DatEnd'] := '''' + DateTimeToStr(DTEnd.Date) + '''';
     frxReport2.Variables['Firm'] := '''' + ComboATP.Text + '''';
     frxReport2.Variables['FIO'] := '''' + qKard.FieldByName('FIO').AsString +'''';
//      frxReport2.PrepareReport(True);
//      frxReport2.Print;
     frxReport2.ShowReport(True);
     qKard.Next;
   end;


который юзает два запроса. Первый запрос выдёргивает из БД номера карт принадлежащие определённой конторе (в базе их всего две).
Далее в цикле по каждой карте выбираются транзакции (в базе оставил всего 2 транзакции, для двух разных карт)

по идее
во здесь qOtch111.RecordCount;=1 для каждого прохода.

но здесь qOtch111.RecordCount;получается =20

Мля откудова, в базе всего 2 записи oO


Ega23   (2011-12-21 10:35:00) [1]

1.  qKard.SQL.Text;  ЩИТО?
2. while not DataSet.Eof    вместо for.
3. qOtch111.SQL.Text; ЩИТО?
4. qOtch111.RecordCount;  ЩИТО?
5. Нахрена каждый раз инициализируется qOtch111.SQL.Text? Сделай это один раз перед циклом, внутри цикла меняй только значения параметров.
5. from Statist, Fuel, Kard    - ты Kard ни с кем не связал, у тебя произведение идёт.


RWolf   (2011-12-21 10:08:00) [2]

в общем, предлагаю добавить условие  "and Statist.NKard=Kard.NKard" или что-то вроде.


RWolf   (2011-12-21 10:06:00) [3]

то, что ты делаешь в 16-й строке, называется прямое декартово произведение таблиц. Точнее, Statist и Fuel связаны по ключевому (?) полю, а Kard — нет, значит, если не учитывать ограничения на выборку, получаем набор из числа записей, равного произведению числа записей исходных наборов.


Кщд   (2011-12-21 09:55:00) [4]

>petvv   (21.12.11 09:50) [3]
>Ты это к чему
это он к тому, что в таблице Kard - 10 записей)


petvv   (2011-12-21 09:50:00) [5]


> а что удивительного — если перемножить три таблицы, ещё
> и не столько получится

Ты это к чему


RWolf   (2011-12-21 09:49:00) [6]

а что удивительного — если перемножить три таблицы, ещё и не столько получится.


MBo   (2011-12-21 09:41:00) [7]

>qOtch111.RecordCount
А куда записывается результат получения свойства?


Наверх

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