<?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='\
Нехорошо наверно залазить в типовую подписку.
Показал откуда ноги растут, а уже как реализовать… По уму, лучше свою подписку сделать с редиректом вызова стандартной. Тут ты прав.
Когда добавляю новый документ, обычно делаю это копированием какого-нибудь типового и удаляю из модуля формы и модуля объекта все лишнее: счет на оплату например, у него не так много лишнего по сравнению с другими документами.
Кроме того, что Вы привели в тексте, еще полезно оставить код для подключения обработок табличных частей (если они есть в новом документе) и внешних печатных форм.
(3)
+ Подключение торгового оборудования, и вот отличная идея для статьи. «Шаблон нового типа документов». Без сарказма. При наличии времени расширю формат статьи.
З.Ы. По управляемым на данный момент ни чего больше не нашёл.
(3)
Зачем? Документ не типовой, его можно править как угодно.
(5)
Затем что не каждый может обновления ставить по 25 раз в день на каждое изменение. Например у вас РИБ в 100 узлов в 15 городах. Приходят и просят поправить в документе печатную форму, добавить ещё одного подписанта.
И если есть универсальный(общепринятый) механизм то лучше использовать его чем «править как угодно».
(6)
Ситуация описанная тобой понята и принята к сведению.
Для подавляющего большинства изменений-нет необходимости немедленно вносить их в рабочую конфигурацию. А для тех что горят, можно воспользоваться динамическим обновлением.
Имхо-это универсальный механизм по созданию костылей. Он оправдан только если нельзя вносить изменения в объект, либо если изменения нужны не очень большому количеству пользователей.
(7)
Ага… только ген дир так не считает. Будешь с ним спорить?
Исправлять последствия неудачного динамического обновления за чей счёт будем? Время работы программиста стоит денег. Статей про исправление после дин обновления написано много.
И хотелось бы увидеть за сколько будет исправлено в РИБе из 100 узлов. В которой простой может быть только 3 часа в сутки ночью.
А чем то можете кроме «ИМХО» аргументировать?
Ну вот уже два исключения из правила… могу ещё таких с 10ок накидать.
Если у вас ларёк с 2мя пользователями это одно дело и совсем другое когда у вас база на 100 одновременно работающих пользователей простой которой вообще не допустим. Или у вас распределёнка. Узлы будете из за каждого изменения обновлять?
(8)
Сочувствую. Я даже не знаю как выглядит наш директор 🙂 Для споров есть начальник АСУ, который тоже программист одноэсник.
И хотелось бы увидеть за сколько будет исправлено в РИБе из 100 узлов
Я не призываю использовать динамическое обновление все время, но иногда это необходимо. С последствиями неудачного обновления сталкивался на собственном опыте, но использовать его наш отдел не перестал. Опыта работы с РИБ нет.
Увы, моё недоверие к внешним обработкам вызвано разборками, после того как несколько человек правят одну и ту же обработку и независимо меняют ее. Такое не часто бывает, но все равно неприятно 🙁