<?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='\
Спасибо, очень полезная тема, часто приходилось изворачиваться и придумывать велосипед!
Вообще-то для этого есть Консоль запросов в которой отлаживаешь запрос как хочешь, а потом переносиш в код
Запрос.МенеджерВременныхТаблиц.Таблицы[Индекс].ПолучитьДанные().Выгрузить()
Где индекс это порядковый номер временной таблицы
А еще можно, нажав Shift+F9, обратиться к переменной Запрос, и вызвать ее метод «ВыполнитьПакетСПромежуточнымиДанными()». Там будет массив результатов со всеми временными таблицами.
(3) Как вариант:
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти(<Имя временной таблицы>).ПолучитьДанные().Выгрузить()
Индекс временной таблицы может меняться, а вот имя никогда…
(3)
можно и не Индекс, а имя таблицы
Давным давно еще был прием, когда в общем модуле есть отладочная функция, типа такой:
Показать
Но на самом деле и это — фигня.. После того как я узнал проотложенную отладку в ИР , все это ни к чему.
(4) Это самый лаконичный и правильный вариант на мой взгляд для новых версий платформы, но вариант автора как я понял будет работать даже в 8.1.
Комментарии лучше чем сама статья.
На текущий вариант при отладке пользуюсь вариантом предложенным (3), получаю результаты через менеджер временных таблиц, но без изменения текста запрос не всегда получается обойтись, т.к. некоторые временные таблицы уничтожаются.
Непонятно как поступает метод ВыполнитьПакетСПромежуточнымиДанными() предложенный (4), возможно, выгружает все таблицы, тогда такой вариант это то что нужно.
(5) Как угодно, все зависит от ситуации. Мне проще посмотреть Запрос.МенеджерВременныхТаблиц.Таблицы и посмотреть индекс. Это удобство.
ВыполнитьПакетСПромежуточнымиДанными() — когда хочется посмотреть все таблицы и проанализировать. Все находится перед глазами. Особенно хорошо, когда временных таблиц не много, иначе все равно приходится копаться в них. В таком случае в табло отладки интересующие таблицы удобнее вставить.
Запрос.МенеджерВременныхТаблиц.Таблицы.Найти(<Имя временной таблицы>).ПолучитьДанные().Выгрузить() — когда видишь текст запроса, видишь имя таблицы, а индекс понять сложно.
Своя функция в общем модуле или метод автора — Если 8.2 и ранние 8.3, то метод автора или своя процедура в общем модуле. С появлением расширений в 8.3.6 можно обойтись экспортной функцией в обработке.
Хорошо знать инструменты и использовать их в нужный момент.
P.S. Лично я не догадывался, что можно хитрить с текстом запроса. Буду использовать в других случаях.
(8) Ну давайте еще под 7х будем варианты всякие писать)))
Спасибо, пригодится 🙂
В 8.3 можно расширение с общим модулем прикрутить для просмотра ВТ, ну и вызывать по SHIFT+F9 расчет
(2) Ну- Ну, попробуй в ЗУПе консоль запроса использовать, когда тысяча и одна временная таблица формируют промежуточный итог, а тебе нужно посмотреть, только этот маленький промежуточный итог.
(3) Спокойно отрабатывает и по имени таблицы, не только по индексу
Запрос.МенеджерВременныхТаблиц.Таблицы[«НалоговаяБазаПоНалогуНаИмущество»].ПолучитьДанные().Выгрузить()
(20) Пол года почти уже прошло))
(21) для меня была тема актуальна, сегодня.
может еще кому-то пригодится.
Спасибо, пригодилось
Спасибо автору за тему и вариант. Также пригодились комментарии. В УПП 1.3 на 8.2, боюсь, отложенная отладка не существует.
Запрос.МенеджерВременныхТаблиц.Таблицы[2].ПолучитьДанные().Выгрузить()