<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='\
Я бы все равно не взял программиста, который таким образом оформил код.
А я бы сам не пошел в такую контору, которая дала-бы мне такую тестовую задачу
upd.
Не, неправ я оказался)
И, возможно, я ошибаюсь, но нам необходимо проверить делится ли число на 2, 3, 5 или 7.
Если не делится, значит оно — простое.
Соответственно, как то так:
На вход пусть подается ТЗ ТаблицаЧисел
Показать
(3) Ошибаетесь. Возьмите 11*11=121. Не делится нацело по данному алгоритму, но и простым уже не является.
А если сравнить с например
http://www.sql.ru/forum/224064/prostye-chisla
Не нашел повторения числа 4 в приведенной таблице , но есть повторения числа 8 Проверьте — возможно опечатка
(6) Да, это ошибка. Таблица была неполная. 1*4=4: 2*2=4
(5)Вот одно из правильных решенийhttp://jdevnotes.blogspot.ru/2009/06/sql.html
«ВЫРАЗИТЬ(A/Б КАК ЧИСЛО(19,2))*Б = Б
Если это выражение истинно, то Б является делителем числа А.»
Это ошибка, исправьте на
ВЫРАЗИТЬ(A/Б КАК ЧИСЛО(19,0))*Б = А
(9) Да Вы правы, это ошибка. Исправил. Благодарю за замечание.
Вот такой запрос находит все нечетные простые числа на отрезке [1 … 131073] за 1,308 сек. Используется решето Сундарама. Параметрами является N, которое задает интервал поиска как [1 … 2N+1] и заранее вычисленное значение (SQRT(2N+1)-1)/2.
Показать
Первая часть запроса, формирующая ряд чисел, взята отсюда:Порождающий запрос . «Все нечетные простые числа» означает, что к результату (к полученному множеству простых чисел) нужно добавить единственное простое четное число 2.
(11) Классно, все работает ! Сундарама молодец !
(0) Понял, наконец, что меня смущает в варианте 2. Вся эта возня с квадратами ни к чему. Достаточно добавить поле ХХ (квадрат) к таблице чисел, что можно сделать (кажется) прямо при чтении таблицы в запрос. Тогда весь необходимый код уложится в минимум строк:
Показать
Условие делимости так написано нарочно, в надежде на то, что Делимое.Х / Делитель.Х будет вычисляться один раз.
(13) Да, все правильно. так быстрее.
У вас ошибка в заголовке. Правильно — «Как получить список простых чисел в запросе и самое главное зачем?»
(1) Что не так с оформлением?
(15)
(16)
1С. Общие требования к построению конструкций встроенного языка:
1. В конструкциях встроенного языка ключевые слова пишутся канонически (как в документации или Синтакс-помощнике).
Правильно:
КонецЕсли
Неправильно:
конецЕсли, КОНЕЦЕСЛИ, конецесли, Конецесли.
2. При следовании друг за другом нескольких операторов присваивания, допускается выравнивать их следующим образом:
ДиалогВыбора.ПолноеИмяФайла = ИмяФайла;
ДиалогВыбора.Каталог = ИмяПути; (тут должно быть выровнено по «=», но пробелы стираются при добавлении коммента)
Если не соблюдать эти 2 простых правила, то код будет резать глаза.
(18) Глупости.
Возможно Вы один из тех людей, что следуют дзен-правилам 1с и дорожат сертификатами, но не все таковыми являются.
То что 1с хочет навязать PascalCase не делает людей использующих camelCase неполноценными.
1) Я, например, оформляю код так и не вижу в нем ничего плохого и нечитабельного:
Показать
Если работодатель будет против — буду делать в соответсвии корпоративным нормативом (ну или уволюсь).
2) Табуляции это, конечно, здорово, сам их использую на винде.
ТЫК
Только вот под линем они могут пойти по огромной такой [3,14]зде и выглядеть будет крайне отвратно.
Вы же доподлино не знаете под какой платформой сидит человек для подобных суждений, верно?
Алсо, на инфостарте табуляции в кодбоксе также отображаются криво, оценить можете в сниппетах под спойлерами всю плачевность ситуации:
ВЫВОД: не стоит быть столь категоричным и плясать под дудку 1с.
Все же главное читабельность. А агрессивные работодатели с еб@нутыми требованиями/придирками получат соответсвующих специалистов.
БОНУС: В школах-институтах нас по рукам за GOTO били, так может теперь и Перейти (GOTO) не использовать?
Давненько не видел в чужих публикациях этого оператора, хотя его можно очень толково применять.
Интересное упражнение. Поколдовал в конфегураторе и что-то такое получилось:
Показать
Кстати, этот запрос легко модицифировать и получить все натуральные делители для нужного числа, а кто-то тут не так давно отказывался от решения подобной задачи на собеседовании )))
У меня тоже решето Аткина проигрывает решету Сундарама. Вот моя реализация:
Показать
для сравнения. Тут вроде бы нечего дальше оптимизировать, а работает примерно в 1,6 раза дольше, чем Сундарама, который еще можно чуть-чуть «подкрутить» в плане оптимизации (за счет проверки пустых мест рядом с четными, а не соединением с таблицей чисел). Это странно. Алгоритм Аткина вообще-то считается более быстрым.
(18)
ДиалогВыбора.Каталог = ИмяПути; (тут должно быть выровнено по «=», но пробелы стираются при добавлении коммента)
Отнюдь не «должно», хотя и красиво выглядит. И есть довольно много противников такого выравнивания (я лично к ним не отношусь).
А вот по первому пункту согласен.
(19)
Я не следую всем правилам, просто когда все в едином стиле — это воспринимается лучше зрительно и говорит о том, что программист писал не на отъе***, а старался.
Зачем вы тогда по-русски пишете сейчас без ошибок, со знаками препинания, и предложения начинаете с большой буквы?
(22)
Во-первых выглядит симпатичнее, а во-вторых сразу понятно, что это блок заполнения какой-то структуры.
Т.е. если тебе нужно что-то исправить, не относящееся к этому, можно много строк просто пропустить глазами, что ускоряет восприятие «чужого» кода, да и своего тоже.
(24)
Алсо, на инфостарте табуляции в кодбоксе также отображаются криво
(24)
Т.е. если тебе нужно что-то исправить, не относящееся к этому, можно много строк просто пропустить глазами, что ускоряет восприятие «чужого» кода, да и своего тоже.
Угу, я тоже так свой код оформляю. Сделал даже программый «выравниватель» — и для EDT:
https://infostart.ru/public/569440/
https://www.youtube.com/watch?v=R8WB-Y24w_A&feature=youtu.be
и для Конфигуратора:
Но есть жесткие противники этого. На партнерке даже мини-холивар был по поводу «выравнивания». Раньше в Рекомендациях 1С по оформлению кода был этот пункт, а сейчас убрали вроде.
(17)Показ лаборатории иностранному гостю. «А вот тут мы вырастили биллиардный шар с волосами.»
«Зачем?» — «Не знаю, но было очень трудно»
(21) Можно немного увеличить скорость выполнения запроса использованием конструкций
(28) «конструкций …» — что-то здесь пропущено
Возникает вопрос:
В реальной жизни есть боевая задача по данной теме?
(для 1С)
(29)
МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 12, 1), МЕСЯЦ, Случай1.Х )) В (1,5)
МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 12, 1), МЕСЯЦ, Случай2.Х )) = 7
МЕСЯЦ(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 12, 1), МЕСЯЦ, Случай3.Х )) = 11
Правда, для больших чисел программа начинает ругаться на переполнение. Я так понял, поэтому и применяется вариант с секундами.
(31) Да, но и с секундами будет когда-нибудь ругаться. Там предел 2#k8SjZc9Dxk32 — 1 или 2#k8SjZc9Dxk31 — 1. Это примерно миллиард. Надеюсь, никто не додумается из миллиарда простые числа в запросе определять. Так как будет уже не с временем (оно почти линейно растет, поэтому миллиард за 16000 секунд должен посчитаться), а с памятью проблемы.
+ за