<?php // Полная загрузка сервисных книжек, создан 2025-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='\
в принципе и на 8.х заработает
(1) На 8-ке есть штатный через компановку
Шепот Теней уже давно такой пример статус бара приводил
Тормозить будет……………………………………………..
дополнительно конечно оказывает небольшую нагрузку (на каждые 100 000 операций + 5 секунд)…
я сейчас вставляю этот «прогрессор» везде.
… без него ощущаю себя ослом перед зеркалом.
… помогает оценить объем работ.
Если обработка робит долго (например, больше часа, то юзаю ужеhttp://infostart.ru/public/78034/ )
Процедура глПрогрессор(Сообщение,Всего,Текущ,ТекущийПроцент) Экспорт
Если Всего>0 Тогда
Процент=Цел(Текущ/Всего*100);
Если Процент = ТекущийПроцент Тогда
Возврат; // не надо лишний раз перерисовывать
КонецЕсли;
Если Процент > Цел((Текущ-1)/Всего*100) Тогда
Состояние(Сообщение + «: «+Формат(Процент,»Ч(0)2»)+»% «+СтрЗаменить(Формат(«»,»С»+Мин(99,Процент)),» «,»l»)+СтрЗаменить(Формат(«»,»С»+Мин(99,99-Процент)),» «,»‘»)+»l»);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
не уверен что скорость увеличится пропорционально навороченным наворотам 😉
Всегда считал, что красивое должно быть минималистским.
Супер!
(0) Тормозить будет, нужно с какими-то перерывами 🙁
… ага, с перекурами 😉
(7) Возможно что и не увеличится, т.к. используется Состояние();
Я просто использую подобное в форме через Форма..Заголовок(), и в нем перерисовка заметно увеличивает время.
Поэтому и написал.
Признаю свою невнимательность!!!
(11) Проверка на изменение процента уже есть:
Если Процент > Цел((Текущ-1)/Всего*100) Тогда
другое дело, что предыдущий процент каждый раз пересчитывается… Но я проверял — нагрузка при этом не большая.. Обычно нагрузку на процессор на 99,999 % оказывают другие «операторы».
(13) Дейстительно! Можно и так проверить изменение процента! А я не догадался! 😀
Подскажите пожалуйста как встроить:
Для ин=1 По 100000 Цикл
глПрогрессор(«Тест»,100000,ин);
КонецЦикла;
в например:
Процедура XXXXX()
СПР=СоздатьОбъект(«Справочник.Контрагенты»);
СПР.ВыбратьЭлементы ();
Пока СПР.ПолучитьЭлемент () = 1 Цикл
ТРАЛИ ВАЛИ
КонецЦикла;
КонецПроцедуры
Заранее спасибо.
Работает, и очень просто в программировании.
(14) SashaA,
Прогрессбары встраиваются туда, где известно общее кол-во «итераций»
Я иногда сначала пробегаю по справочнику (документам), узнаю общее кол-во элементов, а затем уже (вторым циклом) использую прогрессбар (глПрогрессор(«Обработка»,ЭлементовВсего,ин))
Просто и наглядно.
Объясните плиз, что за конструкция Формат(«»,»С»+Мин(99,Процент)
Пытаюсь реализовать на 8.х. С 7.х не работал
(18) Формат(«»,»С»+Мин(99,Процент)) — функция форматирования строки. Второй параметр задает длину строки. Если параметр равен, например С99, то на выходе получим строку длиной 99 символов.
Т.к. первый параметр пустая строка, то на выходе будет строка состоящая из 99 пробелов.