<?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='\
Чтобы хромая старушка быстрее бегала (или хотя бы просто могла передвигаться), ей можно дать костыли (SQL), заставить сбросить лишний вес (свёртка) или гонять пинками, как делает эта программа.
Если использовать данную разработку, то до того как размер файла достигнет 1 гигабайта. См.http://infostart.ru/projects/1725/
“почему она делает это так долго, совершенно не понятно?”
Читают и записывают при открытом индексном файле и установленном порядке чтения по индексу, а не в физической последовательности. 😉
к 3: это-то как раз понятно ;-), не понятно почему 1С пошли таким путем. Просто у нас была ситуация в июле 2007 года, когда на открытии периода ночью база встала, а на утро 40 пользователей ДОЛЖНЫ работать. Пришлось изобретать быстрый способ решения ситуации. Далее в конце года делали свертку базы (размер около 12 гб ;-). Если интересует кого, могу описать что и как делали. Сверка была произведена за 7 часов в новый год.
(4) Да, было бы интересно почитать.
Это точный диагноз, что в длительном времени переноса остатков причиной является большой индексный файл? Имхается мне, что это тут не при чем…
И мне что-то имхается, что они еще движения пересчитывают за месяц, а не только «тупо копирует все записи остатков с предыдущего месяца на текущий»…
(4)
“не понятно почему 1С пошли таким путем”
Причин для этого несколько, например:
1) Нет информации для принятия решения, что быстрее будет работать – просмотр всего файла или его части по индексу.
2) Выполнение еще кое-чего, что без индекса будет работать плохо. См. сообщение (6) от zaic.
3) … 😉
(5)
“Это точный диагноз…большой индексный файл?”
Нет. Точнее, не только из-за этого. Однако, в DBFной версии 1Са читают и записывают, не задумываясь, с использование индекса. Например, при изменении структуры таблицы она переписывается по записям в рабочий каталог при открытых индексных файлах и установленного порядка просмотра – по индексу. Что абсолютно не требуется, работает значительно медленнее и не требует предварительного анализа для выбора алгоритма обработки. Я обнаружил только одно место, где производится чтение в физической последовательности – некоторые этапы в “Тестирование и исправление информационной базы”. Внутри DBEng32.dll вообще не предусмотрено чтение таблицы в физической последовательности, если у таблицы имеется индексный файл. И в тестировании ИБ они обманывают сами себя – удаляют описание индексов из словаря данных.
вообще-то 1С в новый период не переносит записи с нулевыми остатками (закрытые нулевые итоги на конец месяца), автор, как я понял, тупо переносит все подряд? не станет ли регистр от этого еще баальше?