<?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) Somebody1, я не использовал это. Но наверное крутая штука, навороченная. Но, честно, я как-то не очень доверяю навороченным штукам. Хотя, если разобраться один раз, полагаю, что можно успешно использовать.
У меня все просто — обычная конвертация, принцип загрузки откуда угодно (формируем структуры из любых данных), кусок кода (достаточно маленький и простой для проверки), включающий online-обмен.
(2) unichkin, а это уже доработка конфигурации. Да, внешние источники работают гораздо быстрее.
(4) необязательно доработка. Для разового обмена можно просто пустую конфу создать
Все равно не понятно куда подсовывать эти волшебные куски кода.
Какие то важные части пазла остались у автора в голове.
Это круто, …наверное.
(6) Makushimo, ведь русским по белому написано:
.
Что тут не понятного?
На всякий случай расписал подробнее со ссылкой на картинку.
Статья просто супер!!!
Спасибо, дружище! Я делала загрузку из текстового файла.У меня все получилось!
Красиво!
Интересная информация!
А что за функция
ВыполнитьПередачуИнформацииОНачалеОбменаВПриемник() ?
И еще я не понял —
«В качестве бонуса — шаблон внешней обработки заполнения, использующей правила конвертации для загрузки данных». Что-то я не вижу обработку?
Автор спасибо отличная идея, лежала на поверхности
Автор, спасибо за статью!
Полезнейшая информация! Сейчас в работе сталкиваюсь с проблемой по этой теме… Возможно ли как нибудь получить Вашу консультацию? Буду признателен Вам за ответ!
Использую подобный подход с преобразованием входящего файла в произвольном формате, преобразовании данных в наборы структур.. И вот с какой проблемой столкнулся: видимо из-за того, что в качестве источника используется нессылочный тип данных, в выходном файле многократно дублируются данные об объектах. Например, входной файл из 180 Мб превращается в выходной на 4.8 Гб.
К примеру, если есть несколько структур-документов, в которых в табличных частях есть структуры-номенклатуры, то в выходном файле будет несколько полных блоков для одной и той же номенклатуры, с разными НПП, вместо того чтобы был один блок номенклатуры в начале, а уже в блоках документов была бы отсылка по НПП к этому блоку.
Никто с таким не сталкивался?
Сам спросил, сам и отвечу:
чтобы такого не происходило, надо «сказать» обработке V8Exchange запоминать выгруженные объекты. Типовая версия для объектов, у которых не определен ТипДанных для источника, не формирует КлючВыгруженныхДанных и не запоминает в соответствие выгруженные объекты. Надо самим формировать КлючВыгруженныхДанных на основании данных структуры