<?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='\
Что то не пойму, а разве обработка удаления помеченных объектов не выполняет тоже самое, и про какие галочки вы говорите? Сколько раз пользовался и ни разу не приходилось где то дополнительно их расставлять. И ваш код не обрабатывает помеченные объекты, ссылающиеся на помеченные объекты, например Номенклатура и единица измерения, обе помечены на удаление, но у вас удаляться не будут.
(1) karpik666, речь идет о стандартной обработке: Операции — Удаление помеченных объектов в случае, когда надо выбрать определенный тип объектов, например, только помеченные на удаление договоры. Тогда приходится снимать все флаги с уже отмеченных объектов и проставлять нужные. Зачастую это долгая долбежка.
Приведенный код — да, не отрабатывает поиск зависимых объектов, есть над чем подумать, спасибо.
(2) понял, что имеете ввиду, ну конечно это геморой, есть уже доработанные обработки, которые даже работают без монопольного режима, проще их добавить и скорость повыше и бухам удобней.
Такое уже сделано в инструментах разработчика. Подбор и обработка объектов / обработка «Удалить с контролем ссылок».
(4) tormozit, приведенный в статье прием скорее для типовой конфигурации, без дополнительных доработок и внешних инструментов, только штатные.
Согласно приведенному фрагменту кода: Если к помеченному элементу «Номенклатура» найдется помеченная на удаление ссылка «ЕдиницаИзмерения» то элемент Номенклатуры удалять нельзя!!!???
На самом деле требуется анализировать полученные ссылки на пометку удаления… далее рекурсивно убеждаться в том, что нет дальнейших препятствий к удалению. Рассмотренный частный случай элемента без связей на практике мало применим!
(6) V.Nikonov, да вы правы. Но рекурсию не сделать, так как это выполнение произвольного кода, где нет возможности писать процедуры и функции (насколько я знаю).
Поэтому можно пройтись по найденным ссылкам, и если все помечены на удаление, то все-таки удалить.
Показать
(7) вы не обижайтесь, но по мне практического применения в данной статье Ноль, не могу представить себе бухгалтера использующую такую возможность, при том пока не работающую как надо, имхо это как программировать на Ассемблере, вроде круто, но многого не накодишь.
(8) karpik666, не всё, что тут выкладывается пригодится продвинутому прогеру, это да.
Этим может воспользоваться не бухгалтер, а например администратор базы данных, который не силен в кодинге, но вполне разбирается в матчасти. Или начинающему прогеру, у которого нет соответствующего инструмента.
Мне про подобную возможность в Инструментах разработчика стало известно только после написания статьи, качать и проверять другие разработки пока недосуг.
Самому же возможность пригодилась и пригодится в будущем, так как надо очень выборочное удаление объектов с контролем ссылочной целостности. Благодаря комментарию (6) буду использовать с большей эффективностью.
Бухи, кстати, у нас удалением не занимаются…
(9) по мне человек должен немного разбираться, что он делает прежде, чем пытаться что-то сделать в базе. Тем более удаление помеченных объектов. Пока предложенный вами вариант ни кому не подходит, так как по факту он не работает. Сам пользуюсь вот такой обработкой для удаления помеченных объектов. полностью устраивает, работает без монопольного режима, и можно выбирать какие объекты удалять. Кто ее написал, тому большое спасибо
(10) karpik666, спасибо, посмотрю…