<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Решение интересное, но есть более простое 😉
http://www.forum.mista.ru/topic.php?id=388253 (23 пост)
(0) Да уж, чего-то перемудрил с преобразованием. Намного проще ‘цифры строкой’ в параметре запросу передать и не мучаться, раз уж «1С Язык запросов, чем-то похожий на SQL» не умеет типы преобразовывать.
(2) А если так?
(3) Да так тоже очень изящно, молоток. Просто, как ты сам же любишь говорить, не взрывай мозг, делай проще.
не дай бог такое увидеть в чей-то базе
а само решение интересное
(5) Это ещё не самое худшее, что можно увидеть в чьей-то базе.
Не дай бог увидеть в чьей-то базе то, что есть в других некоторых базах, вот где жесть.
А что за задачи такие — выбрать даты? Откуда, что за даты?
Что есть «банковский день»?
(9)http://slovari.yandex.ru/банковский%20день/Экономический%20словарь/День%20банковск ий/
(10) если говорить прямо: лабуда. что значит «обычно банковский день продолжается с 10 до 16 часов.», а необычно? каким законодательным актом устанавливается банковский день?
(11) Наверное, ни какого законодательного акта нет. Это скорее экономический термин чем законодательный. Но его некоторые используют при заключении договоров, оговаривая короткие сроки оплаты.
как соединить 2 таблицы в запросе, при этом у таблиц нет общих реквизитов? можно добавить нуда колонку, например 1, 2 3…. и в другую также, потом по этим соединить?
(13) Какой должен быть результат?
Долго искал, как вывести даты из определенного диапазона, а тут нашел! Автору статьи респект!
Прикольно, оригинально, улыбнуло. В свое время тоже башку ломал, как собрать период внутри запроса, не прибегая к собирательству циклов встроенного языка.
Но считаю самым оптимальным в плане производительности и разработки вот такой:
ВЫБРАТЬ ДатаКалендаря ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь ГДЕ ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
Минус — только один, производственный календарь должен присутствовать в конфигурации, и должен быть заполнен.
2739 — год конца света
Спасибо! Решение интересное.
Как пример использования дат в запросе хороший. В своей повседневной работе стал использовать. Нету структурированности в данной статье, а так все здорово!! Спасибо.
Спасибо! С удовольствием плюсую!!!
спасибо круто все
Решение интересное особенно в том плане, что месяц можно выводить как вздумется, цифрой, строкой…
Сейчас нашел наконец то что и нужно мне
ГДЕ Десятки.Цифра * 10 <<?>> РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
непонятно немного 🙁
(25) Вернул пропавшие знаки на их место
А как соединить в запросе строковое поле и поле даты?
Что-то такое:
ТекстЗапроса=
…..
Документ.Номер+» от «+Документ.Дата
….
Через Выразить, подстрока.. не получается
(27) Нужно дату преобразовать к строке и тогда соединить.
Конечно, это проще сделать после выполнения запроса.
(28) Нагуглил решение как в запросе дату к строке преобразовать. В первом посте именно на него ссылаются.
Как пример использования дат в запросе хороший. В своей повседневной работе стал использовать. Нету структурированности в данной статье, а так все здорово!! Спасибо.
Расчет даты оплаты в банковских дней — работает неправильно.
Передаю дату: 14.03.2013 00:00:00 (четверг)
Банковских дней — 1.
Получаю: 17.03.2013 00:00:00 (воскресенье!)
Передаю банковских дней — 6.
Получаю: 24.03.2013 00:00:00 (опять воскресенье!)
(31) Magister, после очередного обновления потерялись все знаки сравнения…
(32) Спасибо за оперативность, вижу уже исправлено 🙂
Правда я и сам успел уже дойти до исправления.
Спасибо ! Мне Пригодится ))))
Вчера прочитал эту статью, сегодня понадобилось сделать то же самое (просто календарик). Не понравился пример, за пару минут наваял свой текст запроса. Получилось красивее, имхо. Увеличение диапазона на порядок требует добавления лишь одной строки в текст запроса.
Показать
Ну, или получше решение можно предложить?
(37) venger, предлагаю взять исправленный вариант из статьи 🙂
Уже терялись знаки сравнения. Видимо не все правильно восстановил. Поправил.
(38) Спасибо:-))) Шикарно! И все даты в списке в начале периода, в независимости от того, какое время у входящих параметров.