<?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) Если можно реализовать этот функционал меньшим количеством строк кода буду рад увидеть. На больших не пробовал.
(2) через запрос будет короче
(3) «буду рад увидеть»
Проверять можно не только ТабличнуюЧасть, но и любую ТаблицуЗначений.
(3) регистрозависимо?
(6) Что именно? Если передача имен колонок — то нет, неважно в каком регистре. Если содержание таблицы — да, регистрозависимо.
(6)
что имеется в виду ?
(8) «а» и «А»
(9) ах вот что , ну да для текстовых строк
А нельзя ли было однопроходным алгоритмом по сортированной таблице сделать?
(11) Хотелось бы увидеть такой код
(12)
такой код есть в Искусство программирования. Том 1—4»
Автор: Дональд Эрвин Кнут
Вот для основы:
Показать
Можно переделать более универсально и передавать имя таблицы, а также добавить вывод прочей информации.
(14) Поиск задублированных строк осуществляется следующим кодом, всё остальное в функции довесы. Причем код универсальный для любой таблицы значений и любого количества колонок:
То что происходит выгрузка ТЗ, так ведь и в запрос её нужно передать. То что есть сворачивания и сортировки естественно есть и в запросе.
Вариант запросом рассматривался, выбран был этот вариант.
(12) Типа идешь вниз по таблице, если ключевые занчения не поменялись, то это дубль
(16) Вариант.
Но боюсь, что интерпретатор 1С при проходе всех строк будет работать намного дольше чем «Свернуть», «Отсортировать», тем более придется сравнивать все ключевые поля на каждой итерации.
(17) нужно устроить конкурс по скорости поиска дублей )))
Как то делал так, насчет скорости не замерял
Показать
(19) Будут найдены дубли, а потом по ним снова поиск дублей.
(20) да, но можно сделать некую проверку, или выгрузить, а затем свернуть. Но на большой ТЗ, думаю будет не очень
(21) 🙂 🙂
Благодарю автора за приведенный код — пригодился в работе. Один вопрос — Колонки если нужно сделать отбор по двум — нужно вызывать функцию соответственно дважды, передавая разное значение переменной Колонки?
(23)
Пример таблицы:
Колонка1 | Колонка2
10 | 1
10 | 2
1. Если Вы хотите проверить задублированные строки по паре значений — нужно передавать через запятую названия 2 колонок.
«Колонка1,Колонка2» — этом случае задвоенных значений нет.
2. Если же Вы хотите проверить для каждой из колонок наличие дублей — то вызывать соответственно два раза.
Из примера выше — по колонке 1 будет выдано, что есть задвоенные значения, по второй колонке задвоенных нет.
(24) Благодарю пригодился второй способ.
(19) Вот тут так для табличных частей сделал без повторных проверокhttps://forum.infostart.ru/forum9/topic44859/message2066170/
(26) Этот код видел, в теме отписался. Собственно эта тема и сподвигла выложить свою процедуру (давно валялась) 🙂