Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163

Не работает DELETE для "повторяющихся" строк

19.02.2024, 20:51. Показов 5275. Ответов 134

Студворк — интернет-сервис помощи студентам
Здравствуйте, добрые люди!
Долго колупался с ускорением заполнения базы и доколупался до хорошей для меня скорости наполнения, однако без граблей не обошлось, когда я опустил проверки на точность параметров при замене данных получил дублирование для одного набора ключей записей с разной точностью. Исходная тема (Импорт данных из файла в БД) короткая, да и проблема видна когда пытаюсь отладить макрос в самой БД.
Как видно из запроса есть 5 ключевых параметров и пара значимых полей в записи - это значение и его точность.

Чтобы было понятно, чем больше число тем ниже точность.

Итак нашел я замечательный пример и попробовал состряпать свой запрос на удаление повторяющейся записи с меньшей точностью. Для начала изобразил выборку, абы проверить правильно ли выбирает, оставил в последствии только те записи, что подлежат удалению:

SQL
1
2
3
SELECT a.* FROM Weather a,
(SELECT * FROM Weather) b
WHERE a.ID_MD = b.ID_MD AND a.DT = b.DT AND a.LAT = b.LAT AND a.LON = b.LON AND a.SOURCE = b.SOURCE AND a.QUAL > b.QUAL AND NOT ISNULL(a.ZNCH) AND NOT ISNULL(b.ZNCH)
Эта штуковина работает, однако по замыслу авторов для удаления этих записей замена SELECT a.* на DELETE a.* приводит к ошибке "Не возможно удаление записей из указанных таблиц", а справка говорит, что недостаточно прав в пяти вариациях... С чего бы? В свойствах запроса разрешения на удаление есть
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2024, 20:51
Ответы с готовыми решениями:

Клавиша delete не работает,а вот shift + delete работает
Ни ничего не могу удалить как обычно клавишей delete работает только при сочетании shift + delete W7 64 bit Добавлено через 2 часа...

1. Реализовать функции для вставки и удаления строк аналогичные процедурам Insert и Delete в Турбо-Паскале.
Реализовать функции для вставки и удаления строк аналогичные процедурам Insert и Delete в Турбо-Паскале. Помогите,пожалуйста,завтра нужно...

Не работает функция для удаления повторяющихся символов в строке
Вместо удаления остается часть, например из EEEEEEE делается не E, а EEE к примеру, как исправить? string removeSymbols(string input) {...

134
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
20.02.2024, 23:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от POJIBOX Посмотреть сообщение
могу удалить под них весь диапазон...
Ох, не любит Jet удаления, тем более массовые.
1
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
20.02.2024, 23:27  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
При достаточно большом количестве данных, и единичные, и групповые и с агрегированием, выборки
должны извлекаться быстрее.
сейчас при неполных пакетах около 1 млн. записей. по моим оценкам их не должно быть больше 10-20 млн. при полной загрузке БД.

Добавлено через 1 минуту
Цитата Сообщение от Jamaica Посмотреть сообщение
Ох, не любит Jet удаления, тем более массовые.
Да он чего только не любит, UPDATE судя по отзывам на форуме так и вообще беда.

Как-то можно это обойти? Я сейчас чисто рублю диапазоны для новых данных, чтобы не разбирать INSERT vs UPDATE
0
Эксперт MS Access
 Аватар для Eugene-LS
13253 / 5932 / 1526
Регистрация: 05.10.2016
Сообщений: 16,595
20.02.2024, 23:31
Цитата Сообщение от Jamaica Посмотреть сообщение
Ох, не любит Jet удаления, тем более массовые.
Вот я и предлагал "LEFT JOIN- нить"
...
А в прочем, видимо, общение = важнее решения.
Найти "братьев по разуму" уже счастье.


0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
20.02.2024, 23:40  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
А в прочем, видимо, общение = важнее решения.
Найти "братьев по разуму" уже счастье.
Ну для меня скорее "Старших Братьев" ибо повторюсь, хоть мне и нравится вообще говоря "программирование" и я рядом стоял ), но все же это не мой хлеб

Добавлено через 2 минуты
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Вот я и предлагал "LEFT JOIN- нить"
А вот эта часть описана в "мануалах" явно не для простых людей, вот из теории вероятности или при описании логических операторов эти кружки понятны на раз, а вот что значат они для таблиц, тайна сие есть за семью печатями
0
Эксперт MS Access
 Аватар для Eugene-LS
13253 / 5932 / 1526
Регистрация: 05.10.2016
Сообщений: 16,595
20.02.2024, 23:46
Цитата Сообщение от POJIBOX Посмотреть сообщение
тайна сие есть за семью печатями
Вот вам и разъяснят - ну или я (в течении пары ближ. суток).
... или вы "погуглите" ...
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 00:00  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
... или вы "погуглите" ...
про гуглы я как раз и писал, там кружочки нарисованы по разному закрашеные, а вот про физический смысл как-то смутно написано (я бы сказал от слова совсем ничего), а для обычного ламера было бы понятнее, что например:

из правой таблицы записи соответствующие условию "А" вносятся в левую таблицу (игнорируя наличие в ней данных, то бишь заполняя пустые и заменяя заполненные поля) при соблюдении условия "Б".

А то просто картинка и пойми, что там имелося ввиду... То ли данные объединяются и какие при этом остаются, то ли... то ли...
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
21.02.2024, 00:11
Цитата Сообщение от POJIBOX Посмотреть сообщение
Как-то можно это обойти?
ltv_1953 Вам давал оптимальное решение.
Заполнение таблицы в БД, какой эффективный способ?
Единственно, он, как и я, считал первое поле таблицы ключевым.
Если добавить ключевое поле (ID счетчик/ключик) и адаптировать его запрос
под 5 значимых полей в описании объединения,
то данные должны летать мухой.

зы: Сейчас попробую.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 00:19  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
Единственно, он, как и я, считал первое поле таблицы ключевым.
И я конечно не мог с этим согласиться, даже с учетом непонимания как работает JOIN...

Цитата Сообщение от Jamaica Посмотреть сообщение
Если добавить ключевое поле (ID счетчик/ключик) и адаптировать его запрос
Т.е. хошь не хошь, а ключик надо добавить? Блин ведь я читал где-то про неявные номера записи и было показано как их вытащить... Но тогда это было не по теме, а просто на интерес
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
21.02.2024, 01:03
Допустим, у нас входящий набор данных после парсинга сохранен в таблице Import,
имеющим структуру, аналогичную таблице Weather (без ключевого поля ID).

Запрос выберет уникальные по 5 полям записи из таблицы Import и сохранит их в Weather:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INSERT INTO Weather ( ID_MD, DT, LAT, LON, SOURCE, ZNCH, UDT, QUAL, PDT )
SELECT * FROM 
(
SELECT 
    Import.*
FROM 
    Import 
LEFT JOIN 
    Weather 
    ON  (Weather.SOURCE = Import.SOURCE) 
        AND (Weather.LON = Import.LON) 
        AND (Weather.LAT = Import.LAT) 
        AND (Weather.DT = Import.DT) 
        AND (Weather.ID_MD = Import.ID_MD)
WHERE 
    Weather.ID_MD IS NULL
)
Добавлено через 4 минуты
Цитата Сообщение от Jamaica Посмотреть сообщение
Единственно, он, как и я, считал первое поле таблицы ключевым.
Ан нет.
Тут я лоханулся.
Не нужно в данном случае ключевое поле, подойдет любое другое.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 01:12  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
Запрос выберет уникальные по 5 полям записи из таблицы Import и сохранит их в Weather:
ААААААА, что значит уникальные? Говорю описание JOIN и то как Вы это объясняете понятно только тем, кто уже понимает эту тему...

Цитата Сообщение от Jamaica Посмотреть сообщение
SQL
1
2
WHERE 
    Weather.ID_MD IS NULL
таких записей в таблице нееету, если это только не формальный параметр и я видел это в примерах, что для меня бред сумасшедшего

и где тут фильтровать по новизне и разрешению?

или какой выигрыш от того, что сначала пишем во временную таблицу, а потом объединяем, но без фильтров?

И зачем внешний SELECT по всем записям из вложенного???

всё пойдемте отдыхать!!!
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,383
21.02.2024, 02:57
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Перевожу для "гражданских":
ой, тоже мне, а в курсе, что цифр перед точкой может быть 4, а не 2?
0
Эксперт MS Access
 Аватар для Eugene-LS
13253 / 5932 / 1526
Регистрация: 05.10.2016
Сообщений: 16,595
21.02.2024, 05:02
Цитата Сообщение от alvk Посмотреть сообщение
ой, тоже мне
А иди знай как ТС угловые хранит - я бы в секундах ...
Там синусы - косинусы в формулах на каждом шагу ...

Не по теме:

Муля! - не нервируй меня!

0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 10:10  [ТС]
Извините за панибратство, но: ребята, давайте жить дружно!
Зачем браниться, поясните лучше младшему товарищу за код ему непонятный.
А систему записи координат не надо трогать, максимум, что я могу сделать - это очистить дублирующий столбец в формате float, он все равно не используется по коду нигде.
Остальное меня устраивает на 100% ибо данные поступают именно в такой кодировке и мне не нужно что-то придумывать для индексирования и вычисления этих индексов с учетом сложности хранения и сравнения дробных форматов.

Добавлено через 24 минуты
Цитата Сообщение от Eugene-LS Посмотреть сообщение
А иди знай как ТС угловые хранит
АААА, ну так тута ничего секретного, в БД, что я скинул в таблицах Latitude и Longitude вроде как все читается, там десятичные доли градуса, а в исходной данных они кодируются умножением на 1000 и поступают (рассчитываются) всегда в виде целочисленных значений. Поэтому потом при обработке все умножается на коэф. перевода в радианы с учетом той самой 1000 - ничего лишнего

Добавлено через 13 минут
Цитата Сообщение от alvk Посмотреть сообщение
ой, тоже мне, а в курсе, что цифр перед точкой может быть 4, а не 2?
в моем случае "никогда" не будет за диапазоном 0-90 грд по широте, а вообще -90 ... 90, а по долготе 0 - 180 (-180...180 грд. в общем случае)

Добавлено через 13 минут
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Там синусы - косинусы в формулах на каждом шагу ...
пока только в одной из 7 задач используется, во всех остальных анализ идет в узловых точках, так что функции как правило связаны с взвешенным суммированием или просто суммированием, ну или сложные формулы связи параметров...
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
21.02.2024, 11:49
Цитата Сообщение от POJIBOX Посмотреть сообщение
ААААААА, что значит уникальные? ...
"Уникальные" = те в таблице Import, которых нет в таблице Weather по равным значениям пяти значимых полей.
Цитата Сообщение от POJIBOX Посмотреть сообщение
таких записей в таблице нееету,
Вот этим условием (WHERE Weather.ID_MD Is Null) аккурат и находится "разница" в объединяемых наборах данных
при LEFT/RIGHT JOIN.
Цитата Сообщение от POJIBOX Посмотреть сообщение
и где тут фильтровать по новизне и разрешению?
Тут пока не надо, надо будет в другом запросе, на обновление, когда в новой порции импорта
имеются "дубли" с лучшими значениями:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UPDATE (
    SELECT Import.QUAL, Weather.QUAL, Weather.UDT, Import.UDT
    FROM Import LEFT JOIN Weather 
        ON (Import.SOURCE = Weather.SOURCE) 
        AND (Import.LON = Weather.LON) 
        AND (Import.LAT = Weather.LAT) 
        AND (Import.DT = Weather.DT) 
        AND (Import.ID_MD = Weather.ID_MD)
    WHERE 
        Weather.QUAL<Import.QUAL
    ) AS Q 
SET 
    Q.Weather.QUAL = Q.Import.QUAL, 
    Q.Weather.UDT = Q.Import.UDT
Цитата Сообщение от POJIBOX Посмотреть сообщение
И зачем внешний SELECT по всем записям из вложенного???
Это "пена" моего уставшего сознания.
надо так:
SQL
1
2
3
4
5
6
7
8
9
10
INSERT INTO Weather
SELECT Import.*
FROM Import LEFT JOIN Weather 
    ON (Import.ID_MD = Weather.ID_MD) 
    AND (Import.DT = Weather.DT) 
    AND (Import.LAT = Weather.LAT) 
    AND (Import.LON = Weather.LON) 
    AND (Import.SOURCE = Weather.SOURCE)
WHERE 
    Weather.ID_MD IS NULL
Цитата Сообщение от POJIBOX Посмотреть сообщение
какой выигрыш от того, что сначала пишем во временную таблицу, а потом объединяем
Разговор был вроде как о времени исполнения. Нет?
Полагаю, импорт/апдейт новых порций данных пакетами будет заметно быстрее импорта отдельными инсертами,
с проверкой на полные "дубли", и "дубли" с лучшими значениями.
Проверить не могу, потому как нет исходных данных новых порций в том виде,
который Вы пользуете, и нет Вашего алгоритма добавления данных.

Добавлено через 7 минут
И да, надо исполнение двух запросов обернуть в транзакцию,
дабы не получить рассогласованные данные.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 13:19  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
нет Вашего алгоритма добавления данных
Я уже кажется описывал, но мне не сложно:
- я получаю пакет файлов для каждого ID_MD и DT и SOURCE (ИД параметра метеообстановки ( температура, влажность и т.п. для разных слоев, но слои я не стал выделять ибо проще использовать готовое ИД без расшифровки) + ДАТА с временем на которую прогнозируется параметр + Источник данных), кроме того в файле содержится ДАТА составления прогноза - UDT (по хорошему в пакете файлов должна быть одна UDT для всех файлов... но это по хорошему). Проверяю ID_MD и SOURCE на нужность, а UDT на новизну(не старее текущей) - если не подходят пропускаю файл. Итак есть 4 ячейки.
Опустим подробности фильтрации по диапазону широты и долготы, смысл понятен.
Расшифровываем упакованный побитово массив данных. Выбираем из него сочетания широты LAT и долготы LON (Они вычисляются для каждой точки ибо в файле есть информация только о границах массива и его организации, откуда собственно и берется качество данных - QUAL в виде расстояния между ячейками в градусах!!!) со значением ZNCH. И да, я выбираю только те сочетания которые меня интересуют.
+ 4 ячейки.
Последняя ячейка PDT - признак накопления данных за период, встречается только в 1 параметре, но отказаться никак нельзя (вообще можно, но не хочется менять отработанную логику вычислений ибо времени мало).
Вот и весь алгоритм. Т.Е. как бы я не хотел, все равно каждая строка будет вводиться по факту в БД отдельной командой
Ах да, забыл, если данные идут с низким разрешением - приходится еще и интерполяцией восстанавливать пропущенные в файле значения

Добавлено через 5 минут
Цитата Сообщение от Jamaica Посмотреть сообщение
потому как нет исходных данных новых порций в том виде,
который Вы пользуете
Я сделаю два набора данных для 2 последовательных дат, вообще программно часть данных из первого набора в полном наборе удалена. Но насколько я понимаю Вам как раз лучше иметь не смешанные данные, чтобы проверить объединение
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
21.02.2024, 13:29
Цитата Сообщение от POJIBOX Посмотреть сообщение
все равно каждая строка будет вводиться по факту в БД отдельной командой
Вот именно этот кусок кода и интересует, если, конечно он в Access, а не на стороне.

Вот, Вы взяли сырые данные, обработали их, разложили каждую метрику по нужным полочкам,
и с этих полочек инсертите в Weather.
Как описаны полочки (набор переменных / массив / рекордсет / коллекция / что-то иное)?
Далее хотелось бы кусок кода, где Вы берете данные метрик с полочек и инсертите в таблицу.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 13:44  [ТС]
Итак:
https://cloud.mail.ru/public/MGSv/Xo9aMo5Mx
https://cloud.mail.ru/public/BSgt/fbAnYUhAy
первый файл за 5.02 второй за 6.02
НО, без но не получилось, если данные с высоким разрешением поступили позже низкого, то они должны были затереть низкое разрешение
Однако по любому остались некоторые повторяющиеся.

Добавлено через 6 минут
Обертка - внешняя процедура с неработающим блоком очистки от "мусора"

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
        int k = 0;
 
        MainForm->Tbl_Wthr->Close();
        MainForm->Tbl_Wthr->LockType = ltBatchOptimistic;
        MainForm->Tbl_Wthr->Open();
 
        for (int i = FileList.size() - 1; i >= 0; i--) {
            MS->LoadFromFile(FileList[i].FN);
            LUDT = SaveData(MS, LUDT, true);
 
            DLF_ProgBar->Position = ++k;
            Application->ProcessMessages();
        }
 
        if (LUDT > MainForm->GetLastUDT()) {
            MainForm->SetLastUDT(LUDT);
            MainForm->QrRd->Close();
            MainForm->QrRd->SQL->Text = "DELETE FROM Period WHERE DT < :pDT";
            MainForm->QrRd->Parameters->ParamByName("pDT")->Value =
                LUDT - TDateTime(30);
            MainForm->QrRd->Prepared = true;
            MainForm->QrRd->ExecSQL();
        }
 
 /*     MainForm->QrRd->Close();
        MainForm->QrRd->SQL->Add("DELETE a.* FROM Weather AS a, (SELECT * FROM Weather)  AS b");
        MainForm->QrRd->SQL->Add("WHERE (a.DT >= :pDT AND (a.ID_MD = b.ID_MD) AND (a.DT = b.DT)");
        MainForm->QrRd->SQL->Add("AND (a.LAT = b.LAT) AND (a.LON = b.LON) AND (a.SOURCE = b.SOURCE)");
        MainForm->QrRd->SQL->Add("AND (a.QUAL > b.QUAL OR a.UDT < b.UDT) AND (NOT(a.ZNCH IS NULL)) AND (NOT(b.ZNCH IS NULL)))");
        MainForm->QrRd->Parameters->ParamByName("pDT")->Value = LUDT;
        MainForm->QrRd->Prepared = true;
        MainForm->QrRd->ExecSQL();
 */
        MainForm->Tbl_Wthr->UpdateBatch(); //  arAll
        MainForm->Tbl_Wthr->Close();
        MainForm->Tbl_Wthr->LockType = ltOptimistic;
        MainForm->Tbl_Wthr->Open();
а здесь собственно цикл с сохранением данных я не вставляю фильтрацию по параметрам - смысла нет только объем

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
        DLF_QrRd->Close();
        DLF_QrRd->SQL->Text =
            "DELETE FROM Weather WHERE ID_MD = :pMD AND DT = :pDT AND SOURCE = :pSRC AND (QUAL >= :pQUAL OR UDT < :pUDT) AND (LAT BETWEEN :pLAT1 AND :pLAT2) AND (LON BETWEEN :pLON1 AND :pLON2)";
        DLF_QrRd->Parameters->ParamByName("pMD")->Value = ID_MD;
        DLF_QrRd->Parameters->ParamByName("pDT")->Value = ProgDT;
        DLF_QrRd->Parameters->ParamByName("pUDT")->Value = LUDT;
        DLF_QrRd->Parameters->ParamByName("pSRC")->Value = source;
        DLF_QrRd->Parameters->ParamByName("pQUAL")->Value = abs(iDY);
        DLF_QrRd->Parameters->ParamByName("pLAT1")->Value = iLTmin;
        DLF_QrRd->Parameters->ParamByName("pLAT2")->Value = iLTmax;
        DLF_QrRd->Parameters->ParamByName("pLON1")->Value = iLon1;
        DLF_QrRd->Parameters->ParamByName("pLON2")->Value = iLon2;
        DLF_QrRd->Prepared = true;
        DLF_QrRd->ExecSQL();
 
        DLF_QrWrt->Close();
        DLF_QrWrt->SQL->Text =
            "INSERT INTO Weather VALUES (:pMD, :pDT, :pLAT, :pLON, :pSRC, :pZNCH, :pUDT, :pQUAL, :pPDT)";
        DLF_QrWrt->Parameters->ParamByName("pMD")->Value = ID_MD;
        DLF_QrWrt->Parameters->ParamByName("pDT")->Value = ProgDT;
        DLF_QrWrt->Parameters->ParamByName("pSRC")->Value = source;
        DLF_QrWrt->Parameters->ParamByName("pUDT")->Value = MsgDT;
        DLF_QrWrt->Parameters->ParamByName("pPDT")->Value = pdt;
        DLF_QrWrt->Parameters->ParamByName("pQUAL")->Value = abs(iDY);
 
        if (nx == -1) {
            if (scan != 2)
            { //                    "РЕЖИМ СКАНИРОВАНИЯ НЕ ПОДДЕРЖИВАЕТСЯ!
                ErrFS++;
                tlg = end_msg + 1;
                continue;
            }
 
            if ((LonArr = (int*)malloc(sizeof(int) * ny)) == NULL) {
                ErrMem++;
                tlg = end_msg + 1;
                continue;
            }
 
            if ((LonFst = (int*)malloc(sizeof(int) * ny)) == NULL) {
                tlg = end_msg + 1;
                ErrMem++;
                free(LonArr);
                continue;
            }
 
            if (GDS_get_lon(gds, LonArr, LonFst) < 0) {
                tlg = end_msg + 1;
                ErrFS++;
                free(LonArr);
                free(LonFst);
                continue;
            }
 
            if ((array = (float*)malloc(sizeof(float) * nxny)) == NULL) {
                D_L_F_Memo->Lines->Add("Data_Load - memory problems");
                ErrMem++;
                tlg = end_msg + 1;
                free(LonArr);
                free(LonFst);
                continue;
            }
 
            temp = int_power(10.0, -PDS_DecimalScale(pds));
 
            BDS_unpack(array, bds, BMS_bitmap(bms), BDS_NumBits(bds), nxny,
                temp * BDS_RefValue(bds),
                temp * int_power(2.0, BDS_BinScale(bds)));
 
            if (array[1] == NULL && array[31] == NULL) {
                tlg = end_msg + 1;
                BadData++;
                free(LonArr);
                free(LonFst);
                free(array);
                continue;
            }
 
            int Poz, riad, mestoU, mestoN;
            double LonU1, LonU2;
 
            iDX = abs(iDY); //  = GDS_LatLon_dy(gds)
 
            riad = (iMinLat - iLat1) / iDY; //  iMinLat <= iLat1 ? 0 :
 
            iLat = iLat1 + iDY * riad; //   if(iLat < iMinLat) iLat += iDY;
 
            mestoN = (iMinLon - iLon1) / iDX; //   iMinLon <= iLon1 ? 0 :
 
            iLon = iLon1 + iDX * mestoN;
 
            double DX;
 
            iLTN = iLat;
            iLNN = iLon;
 
            while (iLat <= iLat2 && iLat <= iMaxLat + iDX / 2) {
                DX = double(iLon2 - iLon1) / LonArr[riad];
 
                mestoU = iMinLon <= iLon1 ? 0 : (iMinLon - iLon1) / DX;
 
                iLon = iLNN;
 
                LonU1 = iLon1 + DX * mestoU;
                LonU2 = LonU1 + DX;
 
                Poz = LonFst[riad] + mestoU;
 
                DLF_QrWrt->Parameters->ParamByName("pLAT")->Value = iLat;
                DLF_QrWrt->Prepared = true;
 
                while (iLon <= iLon2 && iLon <= iMaxLon) {
                    DLF_QrWrt->Parameters->ParamByName("pLON")->Value = iLon;
 
                    Result = LineInterp2D(
                        LonU1, array[Poz], LonU2, array[Poz + 1], iLon);
                    if (iDX == 2500 && IntPlt) {
                        ArrX.push_back(Result);
                        ArrX.push_back(0.0);
                    }
                    DLF_QrWrt->Parameters->ParamByName("pZNCH")->Value = Result;
                    DLF_QrWrt->ExecSQL();
 
                    iLon += iDX;
 
                    if (iLon > LonU2) {
                        LonU1 = LonU2;
                        LonU2 += DX;
                        Poz++;
                    }
                }
 
                if (iDX == 2500 && IntPlt) {
                    ARRN.push_back(ArrX);
                    ArrX.clear();
                }
 
                riad++;
                iLat += iDY;
            }
            free(LonArr);
            free(LonFst);
            NumSLL++;
 
        } else {
            int Poz, riad, mesto;
            bool Skip = false;
 
            if (scan == 2)
                riad = (iMinLat - iLat1) / iDY; //  iMinLat <= iLat1 ? 0 :
            else if (scan == 0) {
                iDY = -iDY;
                riad = (iMaxLat - iLat1) / iDY; //  iLat1 <= iMaxLat ? 0 :
 
            } else {
                ErrFS++;
                tlg = end_msg + 1;
                continue;
            }
 
            if ((array = (float*)malloc(sizeof(float) * nxny)) == NULL) {
                D_L_F_Memo->Lines->Add("Data_Load - memory problems");
                ErrMem++;
                tlg = end_msg + 1;
                continue;
            }
 
            temp = int_power(10.0, -PDS_DecimalScale(pds));
 
            BDS_unpack(array, bds, BMS_bitmap(bms), BDS_NumBits(bds), nxny,
                temp * BDS_RefValue(bds),
                temp * int_power(2.0, BDS_BinScale(bds)));
 
            if (array[1] == NULL && array[31] == NULL) {
                tlg = end_msg + 1;
                BadData++;
                free(array);
                continue;
            }
 
            iDX = GDS_LatLon_dx(gds);
 
            iLat = iLat1 + iDY * riad;
            iLTN = iLat;
 
            mesto = iMinLon <= iLon1 ? 0 : (iMinLon - iLon1) / iDX;
 
            iLon = iLon1 + iDX * mesto;
            iLNN = iLon;
 
            while ((scan == 2 && iLat <= iLat2 && iLat <= iMaxLat + iDX / 2) ||
                   (scan == 0 && iLat >= iLat2 && iLat >= iMinLat - iDX / 2))
            {
                Poz = riad * nx + mesto;
                iLon = iLNN;
                DLF_QrWrt->Parameters->ParamByName("pLAT")->Value = iLat;
                DLF_QrWrt->Prepared = true;
 
                while (iLon <= iLon2 && iLon <= iMaxLon) {
                    DLF_QrWrt->Parameters->ParamByName("pLON")->Value = iLon;
 
                    //Result = array[Poz];
                    if (iDX == 2500 && IntPlt) {
                        ArrX.push_back(array[Poz]); //  Result
                        ArrX.push_back(0.0);
                    }
 
                    DLF_QrWrt->Parameters->ParamByName("pZNCH")->Value =
                        array[Poz]; //  Result
                    DLF_QrWrt->ExecSQL();
 
                    iLon += iDX;
                    Poz++;
                }
 
                if (iDX == 2500 && IntPlt) {
                    ARRN.push_back(ArrX);
                    ArrX.clear();
                }
                riad++;
                iLat += iDY;
            }
            NumLL++;
        }
 
        free(array);
 
        if (iDX == 2500 && IntPlt) {
            for (int n = ARRN.size() - 1; n >= 0; n--) {
                iLat = iLTN + iDY * n;
                DLF_QrWrt->Parameters->ParamByName("pLAT")->Value = iLat;
                DLF_QrWrt->Prepared = true;
                for (int i = 1; i < ARRN[n].size() - 2; i += 2) {
                    // iLon = iLNN + 1250 * i;
                    ARRN[n][i] = (ARRN[n][i - 1] + ARRN[n][i + 1]) * 0.5;
                    DLF_QrWrt->Parameters->ParamByName("pLON")->Value =
                        iLNN + 1250 * i; //iLon;
                    DLF_QrWrt->Parameters->ParamByName("pZNCH")->Value =
                        ARRN[n][i];
                    DLF_QrWrt->ExecSQL();
                }
            }
            for (int n = ARRN.size() - 1; n > 0; n--) {
                iLat = iLTN + round(iDY * (n - 0.5));
                DLF_QrWrt->Parameters->ParamByName("pLAT")->Value = iLat;
                DLF_QrWrt->Prepared = true;
                for (int i = ARRN[n].size() - 2; i >= 0; i--) {
                    // iLon = iLNN + 1250 * i;
                    Result = (ARRN[n][i] + ARRN[n - 1][i]) * 0.5;
                    DLF_QrWrt->Parameters->ParamByName("pLON")->Value = iLon =
                        iLNN + 1250 * i; //iLon;
                    DLF_QrWrt->Parameters->ParamByName("pZNCH")->Value = Result;
                    DLF_QrWrt->ExecSQL();
                }
            }
        }
 
        String Src_S = source > 9 ? IntToStr(source) : " " + IntToStr(source);
 
        D_L_F_Memo->Lines->Add(
            Src_S + " : " + FormatDateTime("dd.mm.yyyy hh.nn", ProgDT) + " : " +
            k5toa(pds) + IntToStr(PDS_KPDS7(pds)) + " : " + IntToStr(iDX));
 
        //      D_L_F_Memo->Lines->Add("Загружено: " + k5toa(pds) +
        //                             IntToStr(PDS_KPDS7(pds)) + " : " +
        //                             FormatDateTime("dd.mm.yyyy hh.nn", ProgDT) + " : " +
        //                             IntToStr(PlNum) + " значений");
        tlg += s_grib;
 
        if (iDX == 2500 && IntPlt) {
            while (!ARRN.empty()) {
                ARRN.pop_back();
            }
            ARRN.clear();
            ArrX.clear();
        }
    }
 
    if (!dir)
        DLF_ProgBar->Position = long(endtlg);
    return (LUDT);
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
21.02.2024, 13:59
Ну так это описание аккурат "на стороне".

Тут Вам самому, при желании, придется проверять варианты на скорость исполнения.
Я пас, в C++ полный 0.

Попробую, для самоуспокоения, имитировать варианты на VBA,
но это НЕ совсем (или совсем НЕ) корректно будет.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
21.02.2024, 14:03  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
Ну так это описание аккурат "на стороне".
Я ж с самого начала говорил, декодировать средствами SQL не серьезно

Цитата Сообщение от Jamaica Посмотреть сообщение
Попробую, для самоуспокоения, имитировать варианты на VBA,
но это НЕ совсем (или совсем НЕ) корректно будет.
Я думаю лучше прямо в ACCESS создавать процедуры не стоит ВБА мучить

А писать в отдельную временную таблицу я могу, если это даст выигрыш
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
21.02.2024, 14:09
В таблице Weather прям напрашивается составной индекс на поля (ID_MD, SOURCE, DT). Насколько я понял они в процессе загрузки постоянны (приходят в процедуру заполнения как константы из вне)?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2024, 14:09

Для линейного вещественного массива найти произведение всех повторяющихся и не повторяющихся элементов
Для линейного вещественного массива Х найти произведение всех: а) повторяющихся элементов б) не повторяющихся элементов Добавлено...

Как вызвать "Delete" для строк?
with lst1.Items do for i:=1to TextEnd do begin s:=Strings; if Pos('(compInst',s)&gt;0then begin ...

Стандартная функция delete в Eclipse работает а в AndroidStudio не работает
case R.id.btnDelete: {//Кнопка удаление последнего символа ...

Почему не работает Update, но работает аналогичный Delete?
В xmal есть datagrid в него подтянута из базы информация. Название и количество. Надо сделать во viewmodel кнопки delete и update. Delete ...

Использование строк: Функция Delete(s1, s2)
Здравствуйте! В общем, мне нужно было создать функцию DELETE(s1, s2), которая удаляет из строки s1 все символы, встречающиеся в строке...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний против массовых профанаций
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
SUNO Ai - Река Без Дна
zorxor 31.07.2026
Автор стихотворения - астрофизик Марина Катыс Ссылка на сгенерированную музыкальную композицию: https:/ / suno. com/ song/ 6f6e5464-b290-4650-be6c-44c85f8d8013 Я говорю, что Время- как вода течет. . .
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru