<?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='\
Тема стара и сто раз избита. Предложенный вариант по сравнению с уже бывшими не смотрится ни функциональным, ни удобным, ни красивым… Ниже среднего.
(1) Насчет «красивости» могу поспорить, выглядит довольно таки удобно.
Два плюса автору. Удобно!!! Спасибо
(2) На мой взгляд следующие недостатки:
По «красивости»: большой набор «кнопок» с текстом разного цвета, которые не выглядят как кнопки, довольно спорное интерфейсное решение.
По логичности интерфейса. Почему то нажатие на «2009», если я менял год, превращает ее в 2010. Какая, спрашивается, связь? И почему-то смена года ни как не влияет на период, введенный датами «Период с … по …». Кнопка стандартного выбора периода затесалась между нестандартным выбором года и нестандартным выбором дня. Ей бы место чуть в сторонке.
По функциональности. Нет возможности удобного выбора часто требующихся периодов «с начала года», «с начала квартала», «с начала месяца». Нет возможности управлять выбором периода с клавиатуры. Что бы выбрать один день из календарика, нужно нажать «День», нажать на кнопку выбора в поле ввода даты, потом уже выбирать день. Не многовато ли кликов для такого простого действия? Почему бы не сделать «календарик» сразу на форме?
(4) Спасибо за замечания, проработаем…
Кстати:
«кнопки»: пробовал раньше с отдельными кнопками и с гиперссылками, но пользователи ориентировались не так быстро, как сейчас (проверено). Сначала усложнял, потом упрощал 🙂
«календарик» тоже пробовал, но формочка получалась слишком громоздкой. Хочется все-таки золотую середину… В общем для этого и выложил обработку для обсуждения.
_+_
(2), (3) Ребяты, не поленитесь — посмотрите выбор периода здесь на сайте НовейшийОтчет. Вот тогда и поговорим о красивости и удобстве.
В сравнении со стандартным предложенный автором несомненно выигрывает. Но в сравнении с НО — явно не Рио-де_Жанейро.
да. при выборе 2009 год, внизу должно меняться 1.01 31.12
имхо.
В нетиповой конфигурации не работает.Плохо
(9) Интересно. А что пишет? А подключение сделали как написано?
извините, а как пользоваться этой обработкой?
скачала, прицепила во внешние дополнительные обрабоки
вхожу в обработку, вбираю период, в самой обработке все кнопочки замечательно работают, но на этом вся радость от этой обработки заканчивается
в журнале каким был период таким и остался
видно что-то не так делаю
подскажите в чем причина
(11) Данную обработку необходимо подключать именно в конфигураторе. Как внешняя она не будет работать. Идея конечно интересная, но пока тяжело представить, каким образом программно узнать, в каком объекте пользователь хочет изменить период… Без хрустального шара не обойтись 🙂
(12) извините, если скажу глупость, но может быть можно, чтобы в любом журнале кроме типовой иконки «установить интервал дат» появилась еще дополнительная иконка, с помощью которой как раз можно было зайти в вашу обработку непосредственно из самого журнала.
ну а нельзя, так нельзя.
типовая установка интервала дат тоже вполне ничего.
пригодилось.
Плюс автору за идею! Спасибо.
не совсем универсально, не для всех конфигураций подходит…