<?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='\
а где обработка? ))
Интересная обработка, не тестировал, но были случая когда необходимо было найти по гуиду…
(2)
Интересно, а как бы ты потестировал картинку? 😉
(0) Автор, а сам файл-то где?
Ctrl+Alt+W открываем табло,
1)пишем выражение, например,
получаем результат
2)теперь обратно, пишем выражение
получаем результат
Лично для меня так проще и всегда под рукой 😉
(1) Не знаю куда файл делся. Добавил.
(4) А если у вас только строка «9f6206b2-1ed6-423c-9b08-fd4978930c49», как через табло найти ссылку?
(3) Файл куда-то пропал. Добавил.
(6) Правда конечно еще тип объекта знать заранее еще нужно, но вроде так получилось:
=>
=>
(8) То-то и оно, что тип надо знать. Да и писать выражение замучаешься.
А обработка перебирает все возможные сслыочные типы и находит нужную ссылку, если она вообще из этой базы.
(9) Да мне не вломы выражение настучать! 😀
Если уж придеться написать микрокод, то скорее всего воспользуюсь «Универсальным подбором и обработкой объектов».
Автор, проверочку на дурака надо таки делать 😉
Если ссылка никакая не введена, система не поймет, что она рф_Ссылка.Пустая()
и вывалит тебе то, что на рис.
Надо:
(11) Вы правы.
Когда поле составного типа, даже если оно Ссылка, пустой она не бывает, она бывает Неопределено. Поэтому надо использовать ЗначениеЗаполнено().
Обработку исправил.
Вот бы еще поделились знанием: что это за «некоторые специфические случаи», когда у вас есть только некоторых специфических случаях при анализе проблем с базами данных, когда у вас есть только GUID, и ничего более не известно.
Вот у нас есть две базы, сильно различных по составу объектов, но с обменом данными. Там периодически выскакивают в логе записи вроде
«Не найдено качество по ссылке. c2bf13dc-58d3-4871-945c-8bb923a3226c»
Но здесь тип объекта я знаю.
Скачивать не стал ибо такие обработки пишутся на ходу. Вот код, чтобы легче писалося
http://infostart.ru/profile/10200/blog/960/
Просто но со вкусом, работать с ней приятно, в той которую для себя наваял есть ещё : ЗначениеИзСтрокиВнутр,ЗначениеВСтрокуВнутр. Тут бы то же пригодилось.
(13) Случаи на самом деле очень специфические.
У меня было как раз с обменом примерно то же самое. Когда в базе-приемнике объект с некоторым GUID уже был и совсем не того типа, который программа пыталась записать.
Из вашего сообщения можно сделать вывод, что программа при переносе не нашла качество со сслыкой … . Если бы такого GUID в базе не было бы, то обработка переноса спокойно создала бы новой качество с таким GUID. А проблема-то в том, что GUID такой уже есть, но он принадлежит совсем не тому типу. Так что вы как раз не знаете тип того объекта, который имеет указанный GUID (Это только мое предположение, конечно). Можно попробовать его найти с помощью обработки.
(16) Как раз знаю тип объекта, и это действительно качество ;-] В моем случае просто неадекватно (совсем никак) обработалось удаление элемента справочника.
а) В базе-источнике создали новое качество для хитрых целей.
б) В базу-приемник оно перенеслось, с тем же GUID.
в) В базе-источнике удалили это качество, и оно удалилось.
г) В базе-приемнике — оно осталось.
д) И через некоторое время им воспользовались в базе-приемнике.
е) А вот в базу-источник этот документ загрузиться уже не смог.
Насчет «обработка переноса спокойно создала бы» — нет, в нашем случае планы обмена нарочно написаны, чтоб ничего такого автоматически не создавалось.
Очень пригодилась, когда переходил с бухи 1.6 на 2.0
пригодилась когда пропал документ, все думал, что демоны бухи взяли его и изменили до неузнаваемости, развернул копию (там нашел док получил юнид, а в базе хотел его получить), думал сам написать такую обработку, но наткнулся на эту)
спасибо)