Такая проблема. Пишу в 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;
|
Присоединённый файл ( Кол-во скачиваний: 3 )
DBISAM.JPG 43,90 Kb
|