<?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='\
Вhttp://infostart.ru/public/78737/ и предыдущих статьях обсуждалась реализация работы с графами, представленными ТаблицейЗначений. То есть до логистической задачи добраться легко. Другое дело — как ее решать…
Как ты так клепаешь свои темы ?
И главное легко и непринужденно…
Сколько стоит, правда , такая легкость — вопрос другой… скучный и нудный.
А пока я отдаю должное легкости и непринужденности.
(2) Я ж по профильному образованию оптимизатор (кафедра общих проблем управления). А с графами недавно мы изрядно поразвлекались. 😉
Статья должна содержать сквозной пример, на котором автор покажет всё своё искусство проведения взиморасчетов.
Чтобы подчеркнуть преемственность к начальному материалу Машкова :
структура начальных(входных) данных должна быть такой же, т.е. должна быть определена ТаблицаДолгов с колонками Д-р,К-р,Долг (и лишь потом переход к графу)
Прозрачность твоего подхода и его отличия от подхода Машкова была бы более четкой если бы в качестве сквозного примера ты выбрал сквозной пример №2 из темы Машкова.
А у тебя ? Осенило красивом подбором картинок и ты решил поделиться с публикой своими впечатлениями ?
Дескать , можно и вот так .. ?
Легко и непринужденно отвечаю : ну, и что ?
Фигня, Ар.
тут надо инструмент замутить. завлечь и впарить
(5) Вот именно. Не впаришь это никому.
(4) Получи разборку
если с конца «слау» подходить — то да, не впаришь
подходить надо с конца картинки:
вот такая у тебя, СЭР(А) дебеторка/кредиторка.
чтоб закрыть — тебе надо столько-то нала
чтоб столько нала получить — вот такой процент заплатишь банку
чтоб не платить банку — вот такая шняга
и вот тут-то выскакивает 1снег весь в белом: шняга, СЭР(А)!
(8) Сны разума порождают чудовищ 😮
да ладно, Ар, еще никто не жаловался
(9) Ты пойми.
Для чего мне нужен максимально понятный и преемственный к теме Машкова табличный интерфейс ?
Для того, чтобы вынуть камень из-за пазухи и методично пройтись по твоим графинам.
Показать сколько они стоят .
Ты НЕЧЕСТНО затрудняешь мне задачу.
Я опровергать твои вымыслы рисованными рисунками, что ли, буду ?
P.S.
А графины твои должны разбиты вдрызь , для того чтобы все женщины , которые..боже мой !.. снимают
перед тобой шляпу , перебежали ко мне. Вот и весь мой сказ.
у меня такое впечатление, что Игорь прочитал где-то слово «поллюция»
(11) И что у тебя за пазухой кроме обхода дерева запросом? «Деревянная» структура взаимных задолженностей (вернее, платежей) давно изучена — еще в 20-е годы прошлого века Перельман выпустил книгу «Занимательная математика», в которой разбираются финансовые пирамиды. Мои же графины небьющиеся как раз потому, что работают с произволдьными структурами.
А рисунки просто для красивости. Провести строгое доказательство с множеством латинских, греческих и готических символов нетрудно, но не наглядно…
(13) Еще раз.
Даже не касаясь сути , говорю тебе — статья твоя ни на какую альтернативу статье Машкова не тянет.
Подробного описания твоего алгоритма не содержит.
Никаких доказательств тезиса :
в статье мы не находим.
Если ты считаешь , что представленные картинки — это и есть описание алгоритма и доказательств, то мне очень жаль.
Упоминание «степени» в конце статьи скорее вредит тебе.
(14) Статья (первая) Машкова интересна своей экономической частью, что я и отметил плюсиком. А математическая часть там откровенно слабая. Моя статья направлена на прояснение поставленной задачи (сведения ее к известной).
Касательно требований наличия цепочки задолженностей, а также односвязности таблицы (графа) задолженностей. В сфере применимости многосторонних взаимозачетов (холдинг), да и вообще, когда есть организатор/гарант процесса «односвязность» таблицы задолженностей вытекает уже из того, что это одна таблица, анализируемая одним дилером. И если у дилера есть задача минимизации количества строк в этой таблице, зачем ему реальная односвязность?
Простейший пример:
А Б 10
А В 20
Г Д 10
Е Д 20
Если требовать односвязности, задолженностей 4, и это минимум. Иначе легко получить
А Д 30
Г Б 10
Е В 20
И внутри холдинга это вполне реально.
Насчет подробности описания алгоритма — это уж на чей вкус. Если бы речь шла о букваре, я бы согласился с такой претензией. А в дискуссии на уровне ученых степеней — уж пардон. Имеющий глаза, да увидит. Канву доказательства. И может попытаться опровергнуть какое-либо из промежуточных утверждений. Претензию типа «я не понял юмора, значит, не смешно» не принимаю.
(15) Статья № 1 Машкова для взгляд программиста оригинальная и сильная.
Табличный алгоритм взаимозачета превосходно реализуем запросной техникой.
Без всяких «семерочных» переборов.
В статье Машкова только один прокол : указанный алгоритм работоспособен только для односвязных графов.
Заметь (обращаю внимание математика , коим ты представляешься!), это было ДОКАЗАНО :
приведен конкретный пример удовлетворяющий начальным условиям автора, подробно повторен ход решения автора и получен неверный результат.
Все доводы Машкова, что дескать он это и так подразумевал и опустил как несложный вопрос — это разговоры в пользу бедных. Полный алгоритм получился более громоздким и затратным.
Теперь скажи , что доказывать или опровергать в твоей статье ? Набросок , идею ?
Увиденную тобой «канву доказательств» с картинками ?
Понимать их можно по-разному.
(16)
Теперь цитата из статьи
Нам не важно сейчас, существует ли «помощник» реально, или его функции берет на себя кто-то из участников взаимозачета. Важно, что определен состав участников, т.е. множество контрагентов, согласных принять участие в «групповухе», вписавших в таблицу задолженностей свои строки и готовых подписать многосторонний договор о перераспределении задолженностей. После этого согласия уже не имеет значения, была ли пара кредитор-дебитор, появившаяся в итоге, ранее связана цепочкой взаимных долгов. Так что «неверный» результат в твоем примере не доказывает ничего.
(17) Так не пойдет. Хочешь предложить мне переливание из пустого в порожнее ?
Машков лишь после приведенных доказательных примеров признал, что
Вся моя теория относится к таким множествам участников и их задолженностям, графы которых являются односвязными.
Далее опубликовал тему с необходимым алгоритмом разбиения графа на односвязные.
Теперь ты мне говоришь , что это вообще ничего не доказывает и требование односвязности — лишнее , дескать, раз клиент согласился на «групповуху» то пусть получает вместо одного должника — десять.
Мало того, отказ от требования односвязности графа при такой «групповухе» может привести к анекдотическим последствиям :
Исходный граф :
Полученная таблица к распределению :
Ты хочешь отмахнуться от требования односвязности как от пустяка , а я говорю ,
что этот пустяк к тебе вернется как дубина.
(18) Юноша повелся на твое словоблудие. Не думаю, что это может быть предметом гордости.
Что у меня, что у Машкова: Максимум, два. Как правило — один и останется.
А в 15 посте я привел реальный и конкретный пример двусвязного графа с 4 задолженностями, который по алгоритму Машкова превращается в трехсвязный с тремя задолженностями. И где твои «доказательства»?
(19)
1. Юноша , без степени , публикует не цветные картинки с наброском идеи , а
внятный, подробный , цельный алгоритм. Такой подход говорит об уважении автора к возможным оппонентам.
Такой алгоритм можно исследовать : опровергать или убеждаться в его правильности. Твоя же статья содержит не алгоритм , который можно подтвердить или опровергнуть, а некую «канву». Критиковать которую бессмысленно , потому что ты всегда можешь сказать , что под картинкой понимал совсем другое.
Размещая такую статью, ты не уважаешь возможных оппонентов , потому что не даешь им возможности убедиться в безусловной правильности твоего алгоритма.
Таким мне видится взрослый подход к анализу и сравнению твоей статьи и Машкова.
2. «И где твои доказательства ?»
Мои доказательства неверности алгоритма Машкова сводились только к одному :
Приведен конкретный пример с корректными (по автору ) начальными условиями , произведено корректное (по автору)преобразование и получен неверный результат распределения. Это означает, что общее решение приведенное в статье автора совсем не общее , а частное. Что и подтвердил автор , признав необходимость предварительного разбиения графа на односвязные. Точка.
Никаких других примеров я не касался и никаких других целей не ставил.
Это означает, что твой 15 пост к моим доказательствам никакого отношения не имеет.
P.S. Писал всё ,скрипя зубами : Господи, это же так очевидно, чего я развожу тут.
Но это ,очевидно — необходимо.
Ведь и ты ,публикуя свою «канву», был совершенно убежден
» А чего тут развозить ? По «канве» и так всё понятно, картинок хватит..»
(20)
Естественно не имеет, за отсутствием доказательств. У тебя наличествует только утверждение, что алгоритм Машкова дал неверный результат, с которым утверждением сгоряча согласился Машков, не рассматривавший и не обдумывавший многосвязные взаимозачеты. Я же продолжаю утверждать, что при естественных условиях, без которых вообще проблематично организовать многосторонний взаимозачет, результат вполне верен. Твой пример ничего не опровергает, хотя и может показаться несколько неестественным. Я же утверждаю, что и ситуация, в которой кредиторы просто обмениваются своими дебиторами (твой пример), вполне реальна (например, планируется натуральное погашение долгов и встает вопрос минимизации грузоперевозок), и даже встречается в деловом обороте не так уж редко.
Я своей статьей отнюдь не пытаюсь спорить с сутью предложенного алгоритма — я и использую, фактически, тот же алгоритм. Моя статья показывает лишь то обстоятельство, что математический аппарат решения поставленной задачи известен уже давно, а не ждал тысячи лет статьи Машкова.
(21) Придётся еще раз рассмотреть пример , пример вызывающий у тебя возражения.
Итак. Мы рассматриваем пример , опровергающий первоначальный алгоритм Машкова без учета многосвязности исходного графа.
Исходный граф задолженностей :
После преобразований строго по статье Машкова с фирмой посредником Р получаем таблицу :
Из этой таблицы в зависимости от способа распределения получим :
либо Вариант 1
либо Вариант 2
либо Вариант 3 и др.
Либо множество других вариантов .
При варианте 3 и др. тебе придется объяснять всем изумленным представителям фирмм А,B,C,D , что в результате нашей оптимизации количество ваших дебиторов(кредиторов) увеличилось (!). Мужчина ты серьезный , допускаю , что тебе это удалось.
Но критерий распределения долгов, согласованный с фирмами A,B,C,D , может быть таким что «машине придется» выбирать между вариантами 1 и 2. Она выберет вариант случайным для нас образом, т.е. эти варианты для «машины» неразличимы. Если «машина покажет » вариант 2
То никакой серьезный вид тебе не поможет. Ты можешь сколько угодно «хмурить лоб и щурить глаза»
предствители фирм A,B,C,D — будут только ржать.
Что означает этот пример ?
Этот пример означает , что первоначально приведенный алгоритм в статье Машкова может выдать непримелемый для нас результат. Отсюда вытекает необходимость предварительного исследования графа на односвязность.
P.S. Заметь , я расписываю всё подробно ,ясно , определенно, чтобы у тебя появился объект для критики .
Давая тебе возможность критики , я выказываю своё уважение тебе как оппоненту.
(22) Посмотри мой третий коммент ко второй статье Машкова:
Никакого случайного выбора. Вариант 3 — это «справедливое распределение», о котором вообще речь не идет в задаче минимизации количества задолженностей, как и о всяких других специфических вариантах. Остаются варианты 1 и 2, между которыми я (ЛПР) должен выбирать. Между прочим, поскольку я ЛПР, представителям фирм A, B, C, D будет не до смеха. Это мои дочерние компании, и граф их взаимных задолженностей уже по этой причине «односвязен». Все привязаны ко мне.
К примеру, я собираюсь обанкротить одного из двух дебиторов и знаю, что один из кредиторов банкротство выдержит, а второй понесет неприемлемый ущерб. Вот тут-то я и заставлю кредиторов обменяться дебиторами — а куда они денутся.
(23) Посмотрел твой пост. Сам твой подход к осмыслению задачи представлется мне глубоко ошибочным.
Ты кто ?
Ты — разработчик алгоритма.
Твоя задача , как разработчика , создать алгоритм с максимально широкой областью применения, максимально абстрагируюсь от конкретных мотивов ЛПР и т.д. Такой алгоритм в дальнейшем может быть настроен на какие угодно пожелания и ограничения.
Ты же заранее задаешь себе выгодные начальные условия : приводишь конкретные мотивы ЛПР , которые могут упростить тебе разработку алгоритма. Разработчики , наевшиеся г.. , знают чем чревато такое сужение постановки задачи. Дескать : а у нас только холдинг, а у нас такой ЛПР …
Что мы получаем ?
Что в самом начале разработки , игнорируя проверку на односвязность, мы можем получить такой результат , который при определенных условиях нас не устроит (Абстрактные фирмы A,B,C,D — ржут).
Только вероятность такого события заставляет нас просчитывать такой вариант и вводить проверку на односвязность графа. Не понадобится — очень хорошо ! Понадобится — изменил настройки и вперед !
(24) Мои шаги 1-3 превращают произвольный исходный граф в набор односвязных «гамаков», не добавляя при этом связей между подграфами. Это и есть наиболее универсальный подход, с масимально широкой областью применения. Этап проверки на односвязность при таком подходе просто не нужен, равно как и условие о том, что имеются «дебитокредиторы». Как потом работать с «гамаками» — выходит за рамки статьи. Участники взаимозачета могут оставаться в рамках первоначальных областях, могут «естественным образом» разбиться на более мелкие группы, однако же никто им не мешает заводить связи, изначально отсутствующие (я привел пример, когда это может потребоваться. Может, конечно и не потребоваться). Ваше с Машковым требование односвязности — это всего лишь необоснованное сужение области применения взаимозачетов.
(25)
В рамках алгоритма Машкова требование ПРОВЕРКИ и возможной разбивки на односвязные подграфы необходимо .
Такая предварительная процедура резко расширяет возможности метода.
Грубо говоря, нам всё равно какой граф исследовать. Поэтому я не понял о каком сужении ты говоришь.
Я ни слова до сих пор не сказал о содержании твоего подхода. Ни плохого , ни хорошего.
Лишь возмущался качеством подачи материала, которое не даёт оппоненту возможности всё проверить.
Ведь ценность или убогость того или иного подхода даёт только сравнение.
Статья Машкова прозрачна для меня от начала до конца без дополнительных и наводящих вопросов автору ,потому что все написано ясно , однозначно , определенно и сразу понятно как это может быть реализовано на 1с.
Вот так.
(26)
«Я ни слова до сих пор не сказал о содержании твоего подхода. Ни плохого , ни хорошего.
Лишь возмущался качеством подачи материала, которое не даёт оппоненту возможности всё проверить.»(с)
А «плюс», первым, кто поставил? 🙂
(27) См(2)
(28)
Игорь.
Это рекомендация не читать Ваши комментарии дальше (2) сообщения?
Извините, я их уже все прочел… 🙂
(29) Если у Вас что-то по существу обсуждаемого вопроса , то милости просим .
(30)
Игорь.
Спасибо за приглашение.
Но, я не вижу обсуждения — очередная попытка от Ish_2 опустить собеседника до:
«…превосходно реализуем запросной техникой. Без всяких «семерочных» переборов.»(с)
(31) Дежурный укол. Не более.
А по делу у Вас что-нибудь есть сказать ?
(32)
По делу всё сказано автором данной публикации.
(33) Всё как обычно. Ок.
(34)
«Всё как обычно.»(с)
Игорь, а чего Вы хотели? Я уже не могу долго находиться в позе смотрящего в «замочную скважину»(с). Старческий радикулит не позволяет…
Вообщем , завершаю. Не дал ты мне бросить камень. Не во что.
Диалоги на уровне «Моя тема — ништяк !» — «Твоя тема — отстой !» быстро утомляют.
Тебе повезло. Ты остаешься при своих графинах.
(36) Ну вот… А я теорему Машкова про Д+К-1 доказал. В его ветке.
(37) Ссылку ?
(38)http://forum.infostart.ru/forum24/topic39870/
100-й коммент.
+ (38) Теперь и здесь (восьмой скрин).
Машков — Арчибальду
в таблицах 1 и 2 все пробелы пропали и все почему — сместилось влево. Перерисовываю эти таблицы снова.
Табл. 1
Дебитор Кредитор Задолженность
D. . . . . . . . .1
Е. . . . . . . . .16
. . . . В. . . . .11
. . . . С. . . . .6
Табл. 2
Дебитор Кредитор Задолженность
D. . . .С. . . . Х
D. . . .В. . . .1 – Х
Е. . . .В. . . .10 + Х
Е. . . .С. . . .6-Х
(41) Моя «канва» — это не канва алгоритма, а канва доказательства того, что призвольный граф задолженностей может быть сведен к одной или нескольким совокупностям чистых дебиторов и чистых кредиторов. А далее можно строить уже вырианты решений.
Исходить будем из того, что все участники согласны на реструктуризацию задолженностей — чтобы не заморочиваться на «односвязность». Т.е. из таблицы задолженностей исключены несогласные (или таблица разбита на подтаблицы, например, по критерию «связности»). Алгоритм выделения подтаблиц, описанный во второй Вашей статье, легко реализуется за один проход исходной таблицы.
Теперь сам алгоритм «для простого бухгалтера».
Подсчитав для каждого сальдо задолженностей, получим нечто вроде Вашей таблицы 1 из (42), вернее, две подтаблицы — дебиторов 1д и кредиторов 1к.
Упорядочивая списки кредиторов и дебиторов всеми возможными способами и сопоставляя эти упорядоченные списки (как на 8-м скриншоте) получим все возможные финальные варианты. Их будет не более Д!*К!/2.
Теперь по поводу предложенной Вами «х — парамертизации» и построения соответствующих графиков. В общем, мысль интересная. Но вот так сразу не приходит на ум, график какой целевой функции строить.
(43),(41) Машкову на заметку.
Обратите внимание как элегантно выкрутился Арчибальд :
«Что Вы хотите ? Это же только «канва» , а конкретные решения могут быть различными… «.
И плавно перешел к другому вопросу.
И теперь оппоненту для того , чтобы доказать что «канва» совершенно никудышняя нужно
проанализировать последоватеьно все возможные варианты решений вытекающие из «канвы».
Определить или их неодназначность или их затратность. Т.е. оппонент превращается
в предлагающего различные варианты , а автор темы в элеганто и просто их отклоняющего.
Дескать «канва» предполагала другой вариант.
Хм.. вычислить это заранее — было нетрудно.
Поэтому главный смысл выступлений оппонентов должен быть:
«Канва» против конкретного алгоритма НЕ ТЯНЕТ .
Набор картинок — не требует анализа.
Здесь обсуждать нечего.
обратите, как элегантен Ар 🙂
(44) Еще раз, для особо упертых:
Иными словами, канва доказательства существования (множества!) решений, а не канва алгоритма нахождения (одного?) решения. Цитирую оппонента:
А ведь с тремя дебиторами и тремя кредиторами решений аж 18 штук. И в 43 посте предложен внятный алгоритм нахождения исчерпывающего множества решений.
Так что мягче, зеленое или соленое?
(45) Это основная проблема Игоря. 😀
(46) Будет алгоритм — поговорим. А на второй круг не пойдём.