> Например, для одной страны могут быть и подтвержденные,
> и неподвержденные записи. И что тогда должно быть в рез-
> те?
В результате должны остаться:
1. Если страна подтверждена - то только запись о том, что страна подтверждена.
2. Если не подтвеждена - запись что такая страна есть, но она не подтвеждена.
В результате сделал так - не знаю на сколько верно, но работать стало очень быстро.
Сначала запрос:
CommandText := 'SELECT Country, BandADIF, Mode, SUM(' + S + ') AS QSL ' +
'FROM ' + LogName + ' WHERE Country <> ' + QuotedStr('') +
'GROUP BY Country, BandADIF, Mode ORDER BY Country ';
Active := True;
SUM(' + S + ') - вставляся нужные пользователю подтверждения - только бумага и/или еще какие. В результате запрос изначально один. А затем:
function GetCountryStatus(Call, Band, Mode: string): integer;
type
TCfmWkd = (cwNone, cwWkd, cwCfm);
var
BandFind, ModeFind: TCfmWkd;
CountryData: TCountryData;
begin
Result := COUNTRY_ERROR;
if (not CheckTrueCall(Call)) or
(not ValidADIFBand(Band)) or
(not ValidMode(Mode)) then
Exit;
CountryData := FindCall(Call);
if CountryData.MainPref = '' then
Exit;
Result := COUNTRY_NOT_NEED;
BandFind := cwNone;
ModeFind := cwNone;
if FLogDataSet.Locate('Country', CountryData.MainPref, []) then
begin
while (not FLogDataSet.Eof) and
(FLogDataSet.FieldByName('Country').AsString = CountryData.MainPref) do
begin
if (BandFind <> cwCfm) and
(FLogDataSet.FieldByName('BandADIF').AsString = Band) then
begin
if FLogDataSet.FieldByName('QSL').AsInteger < 0 then
BandFind := cwCfm;
if BandFind <> cwCfm then
BandFind := cwWkd;
end;
if (ModeFind <> cwCfm) and
(FLogDataSet.FieldByName('Mode').AsString = Mode) then
begin
if FLogDataSet.FieldByName('QSL').AsInteger < 0 then
ModeFind := cwCfm;
if ModeFind <> cwCfm then
ModeFind := cwWkd;
end;
if (BandFind = cwCfm) and (ModeFind = cwCfm) then
Break
else
FLogDataSet.Next;
end;
case BandFind of
cwNone: Result := Result or COUNTRY_NEW_BAND;
cwWkd : Result := Result or COUNTRY_NOT_CFM_BAND;
end;
case ModeFind of
cwNone: Result := Result or COUNTRY_NEW_MODE;
cwWkd : Result := Result or COUNTRY_NOT_CFM_MODE;
end;
end
else
Result := COUNTRY_NEW;
end;
Получилось что работает на несколько порядков быстрее, чем для каждой страны свой запрос делать.