Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Пропускаются некоторые строки в DBISAM


Автор: Rasool 14.12.2018, 18:34
Такая проблема. Пишу в Embarcadero® Delphi® XE Version 15.0.3953.35171 программу работы с БД DBISAM.
В процедуре TmainForm.CalcAverageParametersOnShort в цикле не читаются подряд строки c BladeNo = '745', BladeParamname = 'R2', bladeSection = 'А1-А1', 'А2-А2', 'А3-А3', 'А4-А4', 'А5-А5'.
Там пропускаются строки с bladeSection = 'А1-А1', из-за этого в таблице в среднем значении в графе таблицы 'R2' вместо 0,005 стоит прочерк (выполняется строка averageVal := NO_VALUES; ).

Код

            Sql.Clear;
            Sql.Add('CREATE TABLE IF NOT EXISTS "ShortParam"        ');
            Sql.Add('(                                              ');
            Sql.Add('   "ParamName" CHARACTER(50),                  ');
            Sql.Add('   "Section" CHARACTER(50),                    ');
            Sql.Add('   "Value" FLOAT,                              ');
            Sql.Add('   "ValueInDopusk" INTEGER,                    ');
            Sql.Add('   "BladeNo" CHARACTER(50),                    ');
            Sql.Add('   "BladeId" INTEGER,                          ');
            Sql.Add('   "BladeMeasureDate" DATE,                    ');
            Sql.Add('   "BladeMeasureTime" TIME,                    ');
            Sql.Add('   "PartyNo" CHARACTER(50),                    ');
            Sql.Add('   "BladeName" CHARACTER(50),                  ');
            Sql.Add('   "FileName" CHARACTER(128),                   ');
            Sql.Add(')                                              ');
            ExecSQL;



Код

// Считаем среднеарифметическое и максимальное/минимальное отклонения для параметров
procedure TmainForm.CalcAverageParametersOnShort;
var
    ParamName, BladeNo, BladeParamname, bladeSection, star_out_dopusk: string;
    blNo, blSection: string;
    addVal, Val, averageVal: Double;
    i, RowCount, BladeId: Integer;
begin
    With TDBISAMQuery.Create(nil) do
        try
            // Sql.Add('SELECT * FROM "' + ExtractFilePath(Application.ExeName) +
            // 'Param.DAT"');
            // Open;
            // l:=TList.Create;
            //
            // GetFieldList(l,'PartyNo');
            // for I := 0 to l.count-1 do
            // showmessage(l.);

            Screen.Cursor := crHourGlass;
            // Извлечение названий параметров ParamName из таблицы Param.DAT
            Close;
            Sql.Clear;
            Sql.Add('SELECT T.* ');
            Sql.Add('FROM "' + ExtractFilePath(Application.ExeName) +
              'Shortparam.DAT" T ');
            Sql.Add('ORDER BY BladeNo, PartyNo, ParamName, Section ');
            // Sql.Add('ORDER BY Section ');
            Open;

            addVal := getShortProtocolParamValue('R2', '745', 'А1-А1', star_out_dopusk);
            // Все берет правильно, 0,005

            while (not Eof) do
            begin
                BladeNo := FieldByName('BladeNo').AsString;
                while (FieldByName('BladeNo').AsString = BladeNo) and
                  (not Eof) do
                begin
                    BladeParamname := FieldByName('ParamName').AsString;
                    RowCount := 0;
                    Val := 0;
                    while (FieldByName('ParamName').AsString = BladeParamname)
                      and (not Eof) do
                    begin
                        bladeSection := FieldByName('Section').AsString; // Здесь пропускает 'А1-А1'
                        try
                            addVal := getShortProtocolParamValue(BladeParamname,
                              BladeNo, bladeSection, star_out_dopusk);
                            if addVal = NO_VALUES then
                            begin
                                Next;
                                Continue;
                            end;
                            inc(RowCount);
                            Val := Val + addVal;
                        finally
                            Next;
                        end;
                        // end;
                    end;
                    if RowCount > 0 then
                        averageVal := Val / RowCount
                    else
                        averageVal := NO_VALUES;
                    try
                        // BladeId := StrToInt(BladeNo);
                        BladeId := 0;
                    finally
                        AverageShortParamTable.AppendRecord
                          ([BladeParamname { название параметра } ,
                          averageVal { значение параметра } , 1 { в допуске } ,
                          BladeNo, BladeId, aBladeData, aBladeTime]);
                    end;
                end;
            end;
        finally
            Close;
            Free;
            Screen.Cursor := crDefault;
        end;
end;



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)