if ($event['type'] == 'delete') { $deleteCond = " AND id<>" . $ID; } if (!$line['Тип клиента']) { $line['Тип клиента'] = $line['Клиент']['Тип']; } // значение при добавлении позиции $line['Текущий тип клиента'] = $line['Клиент']['Тип']; if ($line['Тип клиента'] == "Клиент") { if (!$line['Статус до']) { $line['Статус до'] = $line['Клиент']['Статус']; } if (!$line['Статус']) { $line['Статус'] = $line['Статус до']; } } /* Цель: находим сколько времени контрагент сидел в каждом статусе */ if ($line['Клиент']['raw']) { // статусы $result = sql_select_field(FIELDS_TABLE, "type_value", "id=", 530); $row = sql_fetch_assoc($result); $statusArray = explode("\r\n", $row['type_value']); $timeDiff = array(); foreach ($statusArray as $status) { $timeDiff[$status] = 0; } // выбираем все позиции, кроме текущей $positions = data_select_array( 80, "ALL_ROWS", "f1660=", $line['Клиент']['raw'], " AND status=0 AND f510='Да' AND f480<>'0000-00-00 00:00:00' AND f530<>'' AND f550='Клиент' AND id<>", $ID ); foreach ($positions as $pid => $position) { $positions[$pid]['date'] = strtotime($position['f480']); $positions[$pid]['status'] = $position['f530']; } // заносим данные текущей строки if ($line['Дата'] && $line['Дата'] != "0000-00-00 00:00:00" && $line['Статус'] && $line['Выполнено'] == "Да" && $line['Статус записи'] == 0 && !$deleteCond && $line['Тип клиента'] == 'Клиент' ) { $positions[$ID] = $line; $positions[$ID]['date'] = strtotime($line['Дата']); $positions[$ID]['status'] = $line['Статус']; } // сортируем по дате, если даты равные то по id if (!function_exists("mySort")) { function mySort($a, $B)/> { if ($a['date'] == $b['date']) { return ($a['id'] > $b['id']) ? -1 : 1; } return ($a['date'] > $b['date']) ? -1 : 1; } } uasort($positions, "mySort"); //print_r($positions); // проходим по всем записям $last_status = ""; $this_data = array(); foreach ($positions as $id => $pos_data) { // первая итерация, последний статус в клиента if (!$last_status) { $last_status = $pos_data['status']; } // считаем разницу во времени if ($this_data['date']) { $timeDiff[$pos_data['status']] += $this_data['date'] - $pos_data['date']; } // сохраняем данные для следующей итерации $this_data = $pos_data; } // после прохода по всем работам, рассчитываем время от времени добавления контрагента до первого статуса $timeDiff[$this_data['f480']] += $this_data['date'] - strtotime($line['Клиент']['Время добавления']); $line['Клиент']['Время в статусах'] = serialize($timeDiff); // ставим текущий статус клиента, если нет ставим самый первый статус if ($last_status) { $line['Клиент']['Статус'] = $last_status; } }Добрый вечер. Такая проблема: после того,как долго добивался,чтобы воронка(представление написанное самим) работала правильно,всё-таки этого добился!! Но после этого этого обнаружил лишний статус в воронке и удалил его через конфигурацию(просто удалил лишнюю строку/поле в поле статус в таблице и под таблице,по которой делалась воронка. После этого перестало корректно работать вот это вычисление (Сохранение работы по клиенту) ,"статус до" вписывался корректно,а " статус" который нужно выбирать не обновлялся в карте клиента в нормальной форме.(имею ввиду поле "статус" в подтаблице "работы с клиентом" ,сделанной по абсолютной аналогии с вашей. Статус начинал обновляться только при добавлении ещё одной записи тут же в подтаблице,при чем меняя статус второй записи,в карте обновлялся статус из первой записи. Много чего перепробовал, решил удалить вычисление и написать его заново( просто скопировал предыдущий код,представленный здесь). Сохранил,теперь переход из статуса в статус работает ещё более некорректно и изменяется как ему хочется(если вообще изменяется).
Подскажите , пожалуйста,всё перепробовал. Дело скорее всего не в коде,так как аналогичный код(имеется в виду сохранения изменения в записи подтаблицы) в другой таблице работает корректно. Дело ,скорее всего, в том,что удалил один из статусов " криво". Не знаю что теперь делать,чтобы всё работало как до этого!? Заново таблицы что ли создавать ??? Вот представлен код(сохранения работы с пострадавшим) из аналогичной таблицы.
P.S. при этом пока удалил временно Отображение (Воронку),чтобы не влияло на подтаблицу,так как ссылается на неё.
if ($event['type'] == 'delete') { $deleteCond = " AND id<>" . $ID; } // значение при добавлении позиции // $line['Статус до'] = $line['Пострадавший']['Статус']; if (!$line['Статус до']) { $line['Статус до'] = $line['Пострадавший']['Статус']; } if (!$line['Статус']) { $line['Статус'] = $line['Статус до']; } /* Цель: находим сколько времени контрагент сидел в каждом статусе */ if ($line['Пострадавший']['raw']) { // статусы $result = sql_select_field(FIELDS_TABLE, "type_value", "id=", 1050); $row = sql_fetch_assoc($result); $statusArray = explode("\r\n", $row['type_value']); $timeDiff = array(); foreach ($statusArray as $status) { $timeDiff[$status] = 0; } // выбираем все позиции, кроме текущей $positions = data_select_array( 140, "ALL_ROWS", "f1100=", $line['Пострадавший']['raw'], " AND status=0 AND f1030='Да' AND f1000<>'0000-00-00 00:00:00' AND f1050<>'' AND id<>", $ID ); foreach ($positions as $pid => $position) { $positions[$pid]['date'] = strtotime($position['f1000']); $positions[$pid]['status'] = $position['f1050']; } // заносим данные текущей строки if ($line['Дата'] && $line['Дата'] != "0000-00-00 00:00:00" && $line['Статус'] && $line['Выполнено'] == "Да" && $line['Статус записи'] == 0 && !$deleteCond ) { $positions[$ID] = $line; $positions[$ID]['date'] = strtotime($line['Дата']); $positions[$ID]['status'] = $line['Статус']; } // сортируем по дате, если даты равные то по id if (!function_exists("mySort")) { function mySort($a, $B)/> { if ($a['date'] == $b['date']) { return ($a['id'] > $b['id']) ? -1 : 1; } return ($a['date'] > $b['date']) ? -1 : 1; } } uasort($positions, "mySort"); // проходим по всем записям $last_status = ""; $this_data = array(); foreach ($positions as $id => $pos_data) { // первая итерация, последний статус в пострадавшего if (!$last_status) { $last_status = $pos_data['status']; } // считаем разницу во времени if ($this_data['date']) { $timeDiff[$pos_data['status']] += $this_data['date'] - $pos_data['date']; } // сохраняем данные для следующей итерации $this_data = $pos_data; } // после прохода по всем работам, рассчитываем время от времени добавления контрагента до первого статуса $timeDiff[$this_data['f980']] += $this_data['date'] - strtotime($line['Пострадавший']['Время добавления']); $line['Пострадавший']['Время в статусах'] = serialize($timeDiff); // ставим текущий статус компании, если нет ставим самый первый статус if ($last_status) { $line['Пострадавший']['Статус'] = $last_status; } }