С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
MS Access

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте господа и товарищи!
Случилася беда откуда не ждали: при очередной обкатке было обнаружено странное поведение модуля обработки и вывода данных!
При запуске процедуры результаты расчетов могут отличаться и значительно.
Уже не знаю куда смотреть, то ли я накосячил где в С++, то ли БД работает как-то особо и я это пропустил.
Короче выложу текст задействованных процедур, они запускаются в отдельном потоке, т.к. считаются иногда очень долго а пользователь может передумать. И да к базе обращается все равно только 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2024, 11:41
Ответы с готовыми решениями:

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

Вывести значения вводимых исходных данных и результаты расчетов
Вывести значения вводимых исходных данных и результаты расчетов, сопровождая их вывод именами выводимых на С# 1)S={x}^{3}{\tan...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


ну вот пример, скажем мне надо сложить 3 значения (ZNCH) с разными MD_ID и одинаковыми DT, LAT, LON, SOURCE, соответственно поместить в результаты выборки вместе с параметрами по которым выбирали (можно без SOURCE), да при этом не мешало бы выбрать мах из QUAL, да проверить UDT на равенство, ежели не равно то можно просто не выполнять никаких действий с этой группой.
Вот только нужно понимать, что MD_ID далеко не 3, а десятка 2, так что просто агрегатная сумма не прокатит формула на самом деле страшнее чем просто сумма
0
42 / 45 / 6
Регистрация: 21.10.2022
Сообщений: 560
Записей в блоге: 2
18.09.2024, 19:59
Цитата Сообщение от POJIBOX Посмотреть сообщение
что MD_ID далеко не 3, а десятка 2
а в коде жестко забито только три значения MD_ID
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2024, 19:59
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru