0
Сообщений в теме: 11
#1
Отправлено 30 Март 2016 - 11:01
Добрый день. Подскажите пожалуйста как можно установить срабатывание вычисления после удаления записи?
Удаление чаще всего происходит в подтаблице, иногда через доп. действие.
Удаление чаще всего происходит в подтаблице, иногда через доп. действие.
#2
Отправлено 30 Март 2016 - 11:11
Не совсем понял, удаление происходит через запрос в коде, или вручную? Что именно интересует, как запустить срабатывание вычисления при запросе, или какое событие установить в вычислении?
#3
Отправлено 30 Март 2016 - 11:20
Удаление происходит и вручную и через код. После удаления необходимо запустить вычисление по удаленной записи. Это относится к приходам и расходам. Сейчас приходится каждый раз после удаления позиции переходить к удаленной записи, чтобы обновить кол-во на складе.
#4
Отправлено 30 Март 2016 - 11:46
Так в чем проблема добавить вычисление на событие удаления записи, не совсем понял? В чем именно у вас загвоздка?
#5
Отправлено 30 Март 2016 - 11:51
событие удаления записи не работает в КБ или работает не так как мне нужно - вычисление не срабатывает. переменная event как будто не заполняется при ручном удалении из подтаблицы.
#6
Отправлено 30 Март 2016 - 13:02
Не понял, вычисление на удаление вообще не срабатывает, даже при элементарном коде, или не срабатывает конкретный код вычисления? И причем тут переменная $event? Зачем она вам нужна?
Если как вы говорите, "событие удаления записи не работает в КБ" - то в этом случае надо обращаться в ТП с заявкой о баге. Если же "не работает как нужно", то необходимо конкретизировать что именно вам нужно, и прикладывать свой код с описанием где лежит и на какие события настроен. Чем подробнее все сразу опишите, тем быстрее разберемся. Пока для меня все выглядит как непонятный туман из слов.
Если как вы говорите, "событие удаления записи не работает в КБ" - то в этом случае надо обращаться в ТП с заявкой о баге. Если же "не работает как нужно", то необходимо конкретизировать что именно вам нужно, и прикладывать свой код с описанием где лежит и на какие события настроен. Чем подробнее все сразу опишите, тем быстрее разберемся. Пока для меня все выглядит как непонятный туман из слов.
#7
Отправлено 30 Март 2016 - 13:20
Насколько я знаю событие удаление записи срабатывает перед удалением записи и вычисление не понимает, что происходит удаление если $event не заполняется. Для этого в вычислении используется $event и если в event удаление, то добавляется доп. фильтр в запрос, который как регулирует то, что конкретная позиция была удалена.
if($line['Основание']['raw']!=NULL && $line['Основание']['Тип']) { $type_action = $line['Основание']['Тип']; # тип приход или расход $line['Сумма'] = $line['Цена'] * $line['Кол-во']; # подсчет суммы расхода $line['Ед. изм.'] = $line['Наименование']['raw']; # подстановка ед.изм # Поиск позиций расхода $sqlQuery = "SELECT SUM(`f1151`) AS `amount` FROM `".DATA_TABLE."90` WHERE `status`<>'2' AND `f1146`='".$line['Основание']['raw']."'"; $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); $row = sql_fetch_assoc($result); $line['Основание']['Сумма'] = $row['amount']; # установка суммы расхода if (!$line['Наименование']['raw']) return; # проверка на пустое поле связи # Доп. инфо в партии if($type_action=='Расход') { if(!$line['Основание']['Путь']) $osnovanie = $line['Основание']['Основание расхода']." по счету <a href=\"/view_line2.php?table=43&line=".$line['Основание']['№ счёта']['ID']."\">№".$line['Основание']['№ счёта']['Номер']."</a> (<a href=\"/view_line2.php?table=42&line=".$line['Основание']['Покупатель']['ID']."\">".$line['Основание']['Покупатель']['Название']."</a>) <br><a href=\"/view_line2.php?table=88&line=".$line['Основание']['ID']."\"> Расход №".$line['Основание']['Номер']."</a>"; else $osnovanie = $line['Основание']['Основание расхода']; } elseif($type_action=='Приход') { if(!$line['Основание']['Путь']) $osnovanie = $line['Основание']['Основание расхода']." от поставщика <a href=\"/view_line2.php?table=351&line=".$line['Основание']['Поставщик']['ID']."\">".$line['Основание']['Поставщик']['Наименование']."</a><br><a href=\"/view_line2.php?table=87&line=".$line['Основание']['ID']."\">Приход №".$line['Основание']['Номер']."</a>"; else $osnovanie = $line['Основание']['Основание расхода']; } # Поиск позиции на складе $sqlQuery = "SELECT `id` FROM `".DATA_TABLE."85` WHERE `status`=0 AND `f1096`='".$line['Наименование']['raw']."' AND `f10420`='".$line['Основание']['Тип расхода']."' AND `f10510`='".$line['Основание']['Место']['ID']."'";//выборка на складе $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); if($row = sql_fetch_assoc($result)) { # поиск партии $sqlQuery = "SELECT COUNT(*) AS `cnt` FROM `".DATA_TABLE."86` WHERE `status`='0' AND `f12290`='".$ID."'"; $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); $subrow = sql_fetch_assoc($result); if($subrow['cnt']) # обновляем партию если надо { $sqlQuery = "UPDATE `".DATA_TABLE."86` SET `f1109`='".$line['Цена']."', `f1110`='".$line['Кол-во']."',`f12000`='".$line['Основание']['Путь']."',`f12320`='".$osnovanie."' WHERE `f12290`='".$ID."' "; sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); } else # добавляем партию { $sqlQuery = "INSERT INTO `".DATA_TABLE."86` (`user_id`, `add_time`, `status`, `f1106`, `f1108`, `f1109`, `f1110`, `f11990`,`f12290`, `f1111`,`f12000`,`f12320`) VALUES ('".$user['id']."', '".date("Y-m-d H:i:s")."', '0', '".$row['id']."', '".date("Y-m-d 00:00:00")."', '".$line['Цена']."', '".$line['Кол-во']."','".$type_action."', $ID, '".$line['Основание']['Номер']."','".$line['Основание']['Путь']."','".$osnovanie."')"; sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); } if ($event['type']=='delete') $deleteCond = " AND `pos_rash`.`id`<>".intval($ID); # условие при удалении позиции # выборка и подсчет нужных позиций прихода $sqlQuery = "SELECT SUM(`f1150`) AS `d_balance`, SUM(`f1151`) AS `d_amount` FROM `".DATA_TABLE."90` AS `pos_rash`, `".DATA_TABLE."88` AS `rash` WHERE `pos_rash`.`status`='0' AND `rash`.`status`<>'2' AND `f1147`='".$line['Наименование']['raw']."' AND `rash`.`id` = `f1146` AND `f12260` = '".$line['Основание']['Тип расхода']."' AND `f12270` = '".$line['Основание']['Место']['ID']."' AND `f18740` = 'Приход' $deleteCond"; $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); $p_row = sql_fetch_assoc($result); if ($p_row['p_balance'] == NULL) $p_balance = 0; # получили кол-во прихода (общее) else $p_balance = $p_row['p_balance']; if ($p_row['p_amount'] == NULL) $p_amount = 0; # получили сумму прихода (общее) else $p_amount = $p_row['p_amount']; # поиск позиций расхода $sqlQuery = "SELECT SUM(`f1150`) AS `d_balance`, SUM(`f1151`) AS `d_amount` FROM `".DATA_TABLE."90` AS `pos_rash`, `".DATA_TABLE."88` AS `rash` WHERE `pos_rash`.`status`='0' AND `rash`.`status`<>'2' AND `f1147`='".$line['Наименование']['raw']."' AND `rash`.`id` = `f1146` AND `f12260` = '".$line['Основание']['Тип расхода']."' AND `f12270` = '".$line['Основание']['Место']['ID']."' `f18740` = 'Расход' $deleteCond"; $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); $d_row = sql_fetch_assoc($result); if ($d_row['d_balance'] == NULL) $d_balance = 0; else $d_balance = $d_row['d_balance']; if ($d_row['d_amount'] == NULL) $d_amount = 0; else $d_amount = $d_row['d_amount']; $w_balance = $p_balance - $d_balance; # остаток из разницы $w_amount = $p_amount - $d_amount; # сумма из разницы # поиск позиций прихода $sqlQuery = "SELECT `f1140`, `f1139` FROM `".DATA_TABLE."89` AS `pos_pr`, `".DATA_TABLE."87` AS `pr` WHERE `pr`.`status`<>'2' AND `pos_pr`.`status`<>'2' AND `f1137`='".$line['Наименование']['raw']."' AND `pr`.`id`= `f1136` AND `f10580` = '".$line['Основание']['Тип расхода']."' AND `f12280` = '".$line['Основание']['Место']['ID']."' AND `f18740` = 'Расход' ORDER BY `pos_pr`.`id` DESC"; $s_res = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); $prices = array(); while ($s_row = sql_fetch_assoc($s_res)) { $prices[$s_row['f1149']] += $s_row['f1150']; if (array_sum($prices) >= $w_balance) { $prices[$s_row['f1149']] = $prices[$s_row['f1149']] - (array_sum($prices) - $w_balance); break; } } foreach ($prices AS $one_price => $one_quant) { $price_list .= form_local_number($one_price, "10/2"); if (count($prices) > 1) $price_list .= " - $one_quant ".$line['Наименование']['Ед. изм.']."\r\n"; $last_amount += $one_price * $one_quant; } if (!array_sum($prices)) $price_list = ''; $sqlQuery = "UPDATE `".DATA_TABLE."85` SET `f4181`='".$line['Наименование']['raw']."', `f1096`='".$line['Наименование']['raw']."', `f1097`='".$line['Наименование']['raw']."', `f1101`='$last_amount', `f1100`='$w_balance', `f1098`='$price_list' WHERE `id`='".$row['id']."' AND `f10420`='".$line['Основание']['Тип расхода']."' AND `f10510`='".$line['Основание']['Место']['ID']."'"; sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR); } }
#8
Отправлено 30 Март 2016 - 14:32
Судя по коду, он у вас работает не только при событии удаления записи, я правильно понял? Соответственно, видимо из-за "универсальности" кода вам понадобилась дополнительная проверка на if ($event['type']=='delete'), чтобы обозначенный кусок выполнялся только при событии удаления, так? Просто вы абсолютно ничего не написали выше ни о первом ни втором, хотя это ключевой момент. Т.к. из этого не следует что вычисление целиком не работает при событии удаления, если оно установлено в настройках, а скорее не работает только кусок внутри условия с $event, если оно действительно "не заполняется", как вы утверждаете. Вы проверяли содержимое данной переменной? Тут нет других вариантов кроме как пошаговая отладка кода с целью выяснения по какой именно причине он не работает. Если 100% выяснится что не работает условие if ($event['type']=='delete') из-за пустой $event при удалении, то отправляйте заявку в техподдержку, т.к. возможно это баг. Хотя, насколько я знаю, все работало (если только не сломали).
#9
Отправлено 31 Март 2016 - 09:57
Подскажите пожалуйста как проверить переменную $event при действиях в режиме подтаблицы? У меня echo не выводится.
#10
Отправлено 31 Март 2016 - 10:08
Так не проверяйте сразу в режиме подтаблицы, перейдите в режим обычной таблицы или просмотра записи и попробуйте удалить для начала оттуда. Кстати, для $event нужно скорее использовать не echo, а print_r или var_dump, т.к. это массив. Echo тут может вывести только или пустоту (если действительно переменная пуста) или фразу "Array". Хотя это тоже конечно уже результат, но не детальный.
#11
Отправлено 31 Март 2016 - 15:26
Спасибо разобрался с этим вычислением.
Но сейчас столкнулся еще с одной проблемой.
Есть таблица Расход и подтаблица позиции расхода. В табл. Расход стоит вычисление:
Но сейчас столкнулся еще с одной проблемой.
Есть таблица Расход и подтаблица позиции расхода. В табл. Расход стоит вычисление:
if ($event['type']=='delete') { if ($line['Статус записи']==2) data_delete(90, EVENTS_ENABLE, 'f1146=',$line['ID']); // delete all subrecords } else { if ($line['Статус записи']==2) data_delete(90, EVENTS_ENABLE, 'status=2 and f1146=',$line['ID']); // delete old trash subrecords data_update(90, EVENTS_ENABLE, array('status'=>$line['Статус записи']), 'status=',$event['changed'][1126]['old'],' and f1146=',$line['ID']); record_sublines_status_log(90, 1146, $line); }Оно удаляет из подтаблицы все записи при удалении основной записи. Но почему-то при этом $event[type] пустой. Подскажите пожалуйста что не так с этим вычислением? Почему событие может не срабатывать?
Сообщение отредактировал aleks.goodcolor: 31 Март 2016 - 15:29
#12
Отправлено 31 Март 2016 - 15:45
Я обо всем уже выше написал. $event[type] не может быть пустым в принципе, иначе это баг. Вычисление не может работать само по себе без события.
Количество пользователей, читающих эту тему: 2
0 пользователей, 2 гостей, 0 анонимных