Topic: Ломаем TDataSet :)))
1) пытаемся вместо внешнего ключа из первой таблицы подставить собственно значение поля таблицы, на которую ссылается этот ключ (вторая таблица - справочник):
// решаем вопрос выдачи в отчет статуса датчика по конкретному замеру, теперь в id_SensorStatusList разыменованый статус датчика
while not SensorsSettingData.Eof do
begin
SensorsSettingData.FieldByName('id_SensorStatusList').asString := SQLExecute('SELECT SensorStatus FROM SensorStatusList WHERE id='+SensorsSettingData.FieldByName('id_SensorStatusList').asString);
SensorsSettingData.Next;
end;
ругается на несовместимость типов SensorsSettingData.FieldByName('id_SensorStatusList') и получаемого по SQL-запросу строкового значения поля SensorStatus из таблицы SensorStatusList. есть ли вариант динамически менять тип поля в структуре TDataSet?
2) пытаемся вместо внешнего ключа первой таблицы проставить значения со второй таблицы (типы полей совпадают, оба integer):
while not SensorsSettingData.Eof do
begin // нет подстановки
SensorsSettingData.FieldByName('id_Sensors').asString := SQLExecute('SELECT SerialNumber FROM Sensors WHERE id='+SensorsSettingData.FieldByName('id_Sensors').asString);
ShowMessage(SensorsSettingData.FieldByName('id_Sensors').asString);
SensorsSettingData.Next;
end;
ShowMessage показывает, что нихрена не изменилось значение SensorsSettingData.FieldByName('id_Sensors') - как было взято из БД, таким и осталось, и пофиг на операцию присваивания. как так-то? все эти модификаторы представления asString, asInteger - зачем тогда?
3) и самое простое - пытаемся вычислить среднее значение по конкретному полю из нескольких записей (count и avgPressure - real):
count := 0; avgPressure := 0;
while not SensorsSettingData.Eof do
begin
avgPressure := avgPressure + SensorsSettingData.FieldByName('currentPressure').asFloat;
count := count + 1;
SensorsSettingData.Next;
end;
avgPressure := avgPressure / count;
...работает!