2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
1
MS Access

Разные результаты на одних исходных данных

17.09.2024, 11:41. Показов 1660. Ответов 24

Author24 — интернет-сервис помощи студентам
Здравствуйте господа и товарищи!
Случилася беда откуда не ждали: при очередной обкатке было обнаружено странное поведение модуля обработки и вывода данных!
При запуске процедуры результаты расчетов могут отличаться и значительно.
Уже не знаю куда смотреть, то ли я накосячил где в С++, то ли БД работает как-то особо и я это пропустил.
Короче выложу текст задействованных процедур, они запускаются в отдельном потоке, т.к. считаются иногда очень долго а пользователь может передумать. И да к базе обращается все равно только 1 поток, а значения в исходной таблице не меняются.
Знаю что есть некоторые дублирования, они сделаны для обхода оптимизации и отслеживания значений при отладке.
Процедуры выкладываю снизу вверх:

1. расчет значения
C++
1
2
3
4
5
6
7
8
9
10
11
12
float CalcClouds(const float r500, const float r700, const float r850)
{
    float N1 = 0.0172 * r500 - 0.43;
    float R = (r500 + r700) * 0.005;
    float N2 = 2 * R - 0.7;
    R = (r850 + r700) * 0.005;
    float N3 = 3.25 * R - 1.95;
    float Res = 1.0 - (1.0 - 0.2 * N1) * (1.0 - 0.4 * N2) * (1.0 - 0.5 * N3);
    Res = (Res < 0.0) ? 0.0 : round(Res * 11.56); //10
 
    return (Res);
}
2. выборка данных в точке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
S_DataFormat __fastcall TMainForm::Get_Data_O(
    int Src, TDateTime DT, int LAT, int LON)
{
    int MD[3] = { 878969332, 878969532, 878969682 };
    String txt[3] = { "-RH500", "-RH700", "-RH850" };
    float RH[3];
    int Q = 0;
    TDateTime UDT = TDateTime(80000);
    S_DataFormat OBL, Rez;
 
    AQ_Get_Data->Close();
    AQ_Get_Data->SQL->Clear();
    AQ_Get_Data->SQL->Add(
        "SELECT ZNCH, UDT, QUAL FROM Weather WHERE DT = :pDT"); //
    AQ_Get_Data->SQL->Add("AND SOURCE = :pSRC AND ID_MD = :pMD");
    AQ_Get_Data->SQL->Add("AND LON = :pLON AND LAT = :pLAT");
    AQ_Get_Data->Parameters->ParamByName("pDT")->Value = DT;
    AQ_Get_Data->Parameters->ParamByName("pSRC")->Value = Src;
    AQ_Get_Data->Parameters->ParamByName("pLAT")->Value = LAT;
    AQ_Get_Data->Parameters->ParamByName("pLON")->Value = LON;
 
    for (int i = 2; i >= 0; i--) {
        AQ_Get_Data->Parameters->ParamByName("pMD")->Value = MD[i];
        AQ_Get_Data->Open();
        if (AQ_Get_Data->RecordCount > 0) {
            RH[i] = AQ_Get_Data->FieldByName("ZNCH")->AsFloat;
            UDT = min(UDT, AQ_Get_Data->FieldByName("UDT")->AsDateTime);
            Q = max(Q, AQ_Get_Data->FieldByName("QUAL")->AsInteger);
        } else {
            OBL.Text = txt[i];
            goto GDO_END;
        }
        AQ_Get_Data->Close();
    }
    OBL.udt = UDT;
    OBL.qual = Q;
    OBL.znch = CalcClouds(RH[0], RH[1], RH[2]);
GDO_END:
    Rez = OBL;
    return (Rez);
}
3. перебор точек
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void __fastcall TMainForm::Select_Data_O(int Src, TDateTime DT, int LATn,
    int LATk, int LONn, int LONk, int RezLat, int RezLon)
{
    int max = Select_LatLon(LATn, LATk, LONn, LONk, RezLat, RezLon);
 
    if (max == 0)
        return;
 
    QrWrt->Close();
    QrWrt->SQL->Clear();
    QrWrt->SQL->Add(
        "INSERT INTO " + Tbl_Calc->TableName +
        " VALUES (:pDT, :pLAT, :pLON, :pZNCH, :pUDT, :pQUAL, 0, :pX, :pY, :pTXT, 0)");
    QrWrt->Parameters->ParamByName("pDT")->Value = DT;
 
    int LAT, LON;
    S_DataFormat OBL;
    AQLAT->First();
    float i = 0.0;
 
    while (!AQLAT->Eof) {
        QrWrt->Parameters->ParamByName("pLAT")->Value = LAT =
            AQLAT->FieldByName("LAT")->AsInteger;
        QrWrt->Parameters->ParamByName("pY")->Value =
            LatToY(LATn, LATk, LAT, ImageMF->Height);
        AQLON->First();
        while (!AQLON->Eof) {
            if (DataPrep->CheckTerminated())
                return;
            StatBar->SimpleText =
                "Выполнено " + FloatToStrF(i / max, ffFixed, 3, 2) + "%";
            QrWrt->Parameters->ParamByName("pLON")->Value = LON =
                AQLON->FieldByName("LON")->AsInteger;
            QrWrt->Parameters->ParamByName("pX")->Value =
                LonToX(LONn, LONk, LON, ImageMF->Width);
            OBL = Get_Data_O(Src, DT, LAT, LON);
            QrWrt->Parameters->ParamByName("pUDT")->Value = OBL.udt;
            QrWrt->Parameters->ParamByName("pQUAL")->Value = OBL.qual;
            QrWrt->Parameters->ParamByName("pZNCH")->Value = OBL.znch;
            QrWrt->Parameters->ParamByName("pTXT")->Value = OBL.Text;
            QrWrt->ExecSQL();
            AQLON->Next();
            i = i + 100.0;
        }
        AQLAT->Next();
    }
    StatBar->SimpleText = "Выполнено 100%";
    Tbl_Calc->Close();
    Tbl_Calc->Open();
}
Процедура
C++
1
Select_LatLon(LATn, LATk, LONn, LONk, RezLat, RezLon)
просто выполняет запросы на формирование перечней координат с требуемым разрешением (AQLON, AQLAT).
LatToY() и LonToX() - работают правильно ибо все точки отображаются
процедуры запуска процесса расчета и отображения не вижу смысла приводить, они только веса добавят, а работают правильно, хотя бы по тому, что все расчетные точки присутствуют при отображении - проблема висит в вычислении значений, а это первые 2 процедуры.
Шапки таблиц ежели кому надо:
Разные результаты на одних исходных данных

Разные результаты на одних исходных данных
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2024, 11:41
Ответы с готовыми решениями:

Спрогнозировать результаты матча на основе исходных данных
Здравствуйте! Нужно спрогнозировать результаты футбольного матча на основе данных: 0 =&gt; , ...

Вывести значения вводимых исходных данных и результаты расчетов
Вывести значения вводимых исходных данных и результаты расчетов, сопровождая их вывод именами...

Вычислить значений выражений при заданных исходных данных. Сравнить полученные результаты с указанными правильным рез-ом
Как сделать в экселе решение через ВБА даного примера?? Кто понимает в математике? Код.

Вычисления значений функций с указанными значениями исходных данных. Результаты вывести в виде таблицы. Использовать пот
Вычисления значений функций с указанными значениями исходных данных. Результаты вывести в виде...

24
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
17.09.2024, 12:05 2
В селекте сортировки же нету?
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
17.09.2024, 12:48  [ТС] 3
Цитата Сообщение от didgik Посмотреть сообщение
В селекте сортировки же нету?
нету, вообще предполагается, что данные уникальны, по чем сортировать?
в смысле при заполнении таблицы дубликаты удаляются по определенным правилам

Попробовал сортировку по значению - оно в расчете участвует - без результата

Добавлено через 26 минут
Очень странно, попробовал другую более тяжелую процедуру такая же проблема, такое впечатление что при выборке данных из базы значения выдаются хаотично...
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
17.09.2024, 14:16 4
по DT надо сортировать и по ID. Чтоб каждый запрос всегда выдавал одинаковую последовательность.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
17.09.2024, 15:22  [ТС] 5
Цитата Сообщение от didgik Посмотреть сообщение
по DT надо сортировать и по ID.
зачем по DT, если там четкое соответствие, ID - индекс номинальный, он вставлен только для чистки базы от дубликатов и значения не имеет, совокупность MD_ID, DT, LAT, LON, SOURCE однозначно определяют координаты данных в таблице Weather. Результаты вычислений сохраняются в таблице вообще без ID.
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
17.09.2024, 16:08 6
я в алгоритм не вникал, просто предположил, что если следующий расчет зависит от предыдущего, то сортировка важна. А так надо понять. что именно подразумевается под различием. Если в одном случае 2+2 = 4, а в другом 2+2 = 5 это одно. Если в одном случае результат: 1,2,3,4 а в другом 3,2,4,1 то это другое.

Добавлено через 26 минут
Сортировка, кстати, в AQLAT. вроде не указан запрос в него.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
17.09.2024, 16:59  [ТС] 7
Цитата Сообщение от didgik Посмотреть сообщение
в одном случае 2+2 = 4, а в другом 2+2 = 5
Именно, при повторном прогоне раз на раз не приходится, но при всех равных исходных данных - разные значения

AQLAT - формируется в Select_LatLon() я об этом написал, может не хорошо видно

Добавлено через 2 минуты
Цитата Сообщение от didgik Посмотреть сообщение
если следующий расчет зависит от предыдущего
Не зависит никак, расчеты наполняют таблицу, которая отсортирована по DT, причем выполняются они также по порядку возрастания DT...

Добавлено через 1 минуту
В алгоритме отрисовки указатель устанавливается на первую строку с DT и далее отрисовывает пока не встретит другое DT
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
17.09.2024, 18:03 8
Тогда не знаю чем еще помочь. Не делать же отладку с логами в самом деле...
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 17:55  [ТС] 9
Вообще закрадывается сомнение, а кто-то проверяет работу приложений с базами данных на корректность выборки?

Добавлено через 1 час 35 минут
Кажется вопрос решен! Попробую проверить, но видимо дело с синхронизацией потока расчета данных и процедуры отображения. Они работали с одной таблицей и соответственно перемещали текущий указатель, в результате записи вставлялись как попало, странно только почему отображались ВСЕ!!! точки, как можно обойти проверку на изменение параметра времени...

Добавлено через 1 час 24 минуты
К сожалению ни применение выборки, ни оборачивание в транзакцию результата не дает, расчеты "липовые"...
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 18:25 10
Надо учесть, что "insert into ..." вставляет данные непосредственно в таблицу БД, а Датасеты работают с теми данными, которые были считаны из БД когда то давно.

Добавлено через 7 минут
Цитата Сообщение от POJIBOX Посмотреть сообщение
Короче выложу текст задействованных процедур, они запускаются в отдельном потоке, т.к. считаются иногда очень долго а пользователь может передумать.
И сдается мне, в данном случае надо кардинально менять схему.

Надо сначала скопом считывать данные в массив, обрабатывать во второй массив и потом результат записывать в таблицу.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 18:29  [ТС] 11
Цитата Сообщение от didgik Посмотреть сообщение
которые были считаны из БД когда то давно.
проблема не в этом, проблема в том, что при повторном расчете результаты в таблице отличаются, они не пропадают или их не хватает, они именно не совпадают от раза к разу, однако после перезапуска программы первый расчет вроде бы одинаковый...

Добавлено через 2 минуты
Цитата Сообщение от didgik Посмотреть сообщение
скопом считывать данные в массив
И на кой тогда спрашивается я трахаюсь с изучением БД и ЭСКУЭЛЬ? создал бы массив и работал бы с ним...

Добавлено через 1 минуту
Цитата Сообщение от didgik Посмотреть сообщение
в данном случае надо кардинально менять схему
Видимо это следующий шаг, придется убрать поток, и добавить кнопку "стоп"...
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 18:31 12
Цитата Сообщение от POJIBOX Посмотреть сообщение
И на кой тогда спрашивается я трахаюсь с изучением БД и ЭСКУЭЛЬ? создал бы массив и работал бы с ним...
Это неизвестно. Просто используешь инструмент не-по назначению.

Добавлено через 1 минуту
Цитата Сообщение от POJIBOX Посмотреть сообщение
Видимо это следующий шаг, придется убрать поток, и добавить кнопку "стоп"...
Может забываешь перед расчетами обновить Датасет из таблицы? Впрочем без конкретных примеров гадать можно долго.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 18:35  [ТС] 13
Цитата Сообщение от didgik Посмотреть сообщение
скопом считывать данные в массив
Я подозреваю, что такой функции опять же нет, да еще чтобы синхронизацию для 3 разных параметров соблюсти ибо потом каждую запись придется искать "вручную"

Добавлено через 1 минуту
Цитата Сообщение от didgik Посмотреть сообщение
Впрочем без конкретных примеров гадать можно долго.
Зачем обновлять статическую таблицу? в ней на момент расчетов ничего не меняется
И я вроде бы объясняю, что данные из таблицы подтягиваются, вот только почему-то результат расчетов всегда разный...
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 18:35 14
Цитата Сообщение от POJIBOX Посмотреть сообщение
Я подозреваю, что такой функции опять же нет, да еще чтобы синхронизацию для 3 разных параметров соблюсти ибо потом каждую запись придется искать "вручную"
Ну как бы для этого и нужен программист, чтоб сделать такую функцию.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 18:41  [ТС] 15
Цитата Сообщение от didgik Посмотреть сообщение
для этого и нужен программист, чтоб сделать такую функцию
боюсь она в принципе уже сделана по сути, только результаты распихиваются не по промежуточным массивам а записываются в другую таблицу.

И проблема выдергивания "разных" данных существует, хотя по "закону" ее не должно быть!

Запрос формируется по одному и тому же алгоритму из одной той же базы данных, в начале алгоритма таблица результатов очищается, а в некоторых ситуациях (например выход из режима расчетов) вообще удаляется
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 18:46 16
Цитата Сообщение от POJIBOX Посмотреть сообщение
боюсь она в принципе уже сделана по сути, только результаты распихиваются не по промежуточным массивам а записываются в другую таблицу.
Я не про правильность работы, а про скорость. В массиве считалось бы все мгновенно и не надо было бы мутить с потоками. Возможно и ошибки бы не было из-за рассинхронизации или тому подобного.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 19:02  [ТС] 17
Цитата Сообщение от didgik Посмотреть сообщение
Я не про правильность работы, а про скорость
Все верно, только в массив-то все равно надо было выборку запихнуть, не подскажете как это сделать "быстро"?
Выборку то все равно делать, чтобы в массив засунуть

Добавлено через 8 минут
Цитата Сообщение от didgik Посмотреть сообщение
Я не про правильность работы, а про скорость.
Тут конечно может быть стоило бы освоить сложные запросы SQL, но насколько я понял формулы с логикой туда очень трудно вписать будет,
Покажите пример как сложить "значения" для 1 разного "параметра" и группы одинаковых из 1 таблицы или на худой конец где прочитать, простых примеров тьма, а по сложному программированию весьма скудновато
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 19:11 18
Цитата Сообщение от POJIBOX Посмотреть сообщение
Покажите пример как сложить "значения" для 1 разного "параметра" и группы одинаковых из 1 таблицы или на худой конец где прочитать, простых примеров тьма, а по сложному программированию весьма скудновато
Я с ходу не соображу что требуется. Нужен пример, что есть и желаемый результат.
0
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
18.09.2024, 19:28  [ТС] 19
Разные результаты на одних исходных данных


ну вот пример, скажем мне надо сложить 3 значения (ZNCH) с разными MD_ID и одинаковыми DT, LAT, LON, SOURCE, соответственно поместить в результаты выборки вместе с параметрами по которым выбирали (можно без SOURCE), да при этом не мешало бы выбрать мах из QUAL, да проверить UDT на равенство, ежели не равно то можно просто не выполнять никаких действий с этой группой.
Вот только нужно понимать, что MD_ID далеко не 3, а десятка 2, так что просто агрегатная сумма не прокатит формула на самом деле страшнее чем просто сумма
0
32 / 20 / 6
Регистрация: 21.10.2022
Сообщений: 305
Записей в блоге: 1
18.09.2024, 19:59 20
Цитата Сообщение от POJIBOX Посмотреть сообщение
что MD_ID далеко не 3, а десятка 2
а в коде жестко забито только три значения MD_ID
0
18.09.2024, 19:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2024, 19:59
Помогаю со студенческими работами здесь

Вычислить значения переменных. Вывести на печать значения вводимых исходных данных и результаты вычислений
Вычислить значения переменных по заданным расчетным формулам и наборам исходных данных. Вывести...

Разные типа соединения с сервером, разные результаты.
Такая проблема Запускаю апплет-сервлет коннекшн по типу http://localhost:8100/appletservlet.html...

разные сервера разные результаты
парни, доброго времени суток! не ругайте громко, я с Java Script не совсем на &quot;ты&quot;. столкнулся со...

Может ли функция при одних и тех же значениях абсцисс иметь разные ординаты?
Здравствуйте. Есть задание (см. фото): дан график функции y=x^2 и 2 точки на графике - A(0,0) и...

md5 разные результаты
with TIdHashMessageDigest5.Create do try outStream.Position := 0; outStream.Position :=...

Разные результаты @dblookup
Добрый день! Есть реплики БД в кластере. В БД есть представление, где первая отсортированная...

Разные результаты парсинга
Приветствую. Пишу парсер цен книжного магазина. Проблема: результаты парсинга и фактического...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru