Jump to content
SpravkaCRM.ru - Ваш справочник по CRM

Search the Community

Showing results for tags 'отчеты'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Categories

  • Перевод официального мануала SuiteCRM
  • Обучающие статьи о SuiteCRM
    • Для программиста
  • Доводим напильником SuiteCRM
  • Расширения для SuiteCRM
    • Патчи с исправлениями ошибок в SuiteCRM
  • Программист за работой
  • Диалоги о SuiteCRM

Categories

  • Records
  • CRM-система для застройщика
    • Manual
  • CRM-система для кредитного брокера
  • CRM for Programmer
  • CRM-система для салонов красоты
    • Руководство

Forums

  • SugarCRM/SuiteCRM
    • Все вопросы пока сюда
    • Заметки по ходу разработки
    • Нам пишут
    • Работа
  • CRMHosting.io
    • SuiteCRM последней версии
    • CRM для продажи пиццы/суши/ролл
    • CRM для Застройщика
    • CRM для Кредитного брокера
    • CRM для Салонов красоты
  • Другие CRM-системы
    • AmoCRM
    • Bitrix24
    • BPM Online
    • Прочие CRM
  • Всего по немногу
    • Программисту
    • Arduino
    • Без систематики

Categories

  • Модули SuiteCRM/SuiteCRM
  • Manuals

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 5 results

  1. Добрый день, скажите, пожалуйста, используете ли вы графические отчеты в своей работе? Например, я могу построить графический отчет если в системе координат присутствует поле "число" или "деньга", при этом график строится (см. 01.png), однако это не то, что мне нужно. Цель - это сделать график который в примерной картинке показывал статусы предварительных контактов по отношению к Ответственным за предварительные контакты. Например, у Иванов: 10 - предварит. контактов "в процессе" 5 - преобразованы 15 - "мертвых" и т. д. В табличной части это получается сделать, с группировкой. Но в графической части - не получается. Отгуглил свой вопрос по зарубежным комьюнити, увидел, что свои графические отчеты они формируют с участием модуля "Opportunity " (Сделки) и никак иначе. Предлагают платный вариант, но и в демонстрациях платный вариант строит графики с "Opportunity". Прежде чем пробовать платный вариант, хочу досконально убедиться о возможностях базового функционала. Коллеги, есть какой-либо опыт по данной теме, возможно я неправильно настраиваю отчет? (пример настройки 2.png, 3.png и в итоге результат: 4.png) Заранее благодарен. Использую SuiteCRM 7.7.4 - в этой версии проблемы с группировкой Далее проверял на SuiteCRM 7.8.15 - здесь результата больше (группировка работает).
  2. Господа подскажите пожалуйста, у меня стоит suiteCRM 7.7 создаю отчеты отчеты формируются нормально но вот диаграммы.... при попытке создать диаграмму при попытки вывести названия контрагента диаграмма не выводится, если выводить id или что то , что не содержит Русского языка все работает нормально, отсюда правильно и я идентифицировал баг , если да кто так с Этим борется ?
  3. Version 1.0.0

    27 downloads

    Патч исправляет ошибку в работе модуля Отчёты: поиск по дате и поиск в диапазоне. Про ручное устранение этой ошибки я писал в статье: Но потом родилась мысль: а почему бы не начать писать расширения под SuiteCRM? Скачать и установить расширении ведь удобнее, чем руками лазить по коду! Вот так и родилась эта идея. И вот предлагаю дебютный мой выход в этом направлении: Патч устраняет указанные выше недостатки. Кстати, для желающих поучавствовать вот проект на Bitbucket.org: https://bitbucket.org/crmhosting/suitecrm_bugfix_reports
  4. Сегодня столкнулся с ошибкой, присутствовавшей в SuiteCRM 7.3.2 (а возможно и в более ранних и более поздних модификациях этой CRM): Если создать новый отчет в модуле Отчеты (AOR_Reports), и одним из параметров фильтрации указать поле типа Datetime, то при построении отчета записи по этому полю не ищутся. У меня это проявилось, когда я хотел найти все Задачи, созданные за определенный день (по календарику). Вот как выглядел отчет: Таким образом у нас отчет будет состоять из трех колонок: ID записи, Название и Дата создания записи. А фильтровать данные мы по идее должны по Дате создания записей: Но если заполнить поле в колонке "Значение" и нажать на кнопку "Обновить", то ничего не происходит. Записи не ищутся, хотя я точно знаю, что они есть на указанную дату. В результате разбора модуля AOR_Reports было выявлено, что непосредственно генерацией WHERE-условия для выборки по отчету занимается функция build_report_query_where, находящаяся в классе AOR_Report в файле modules/AOR_Reports/AOR_Report.php Результатом работы функции build_report_query_where являлся массив: Array ( [select] => Array ( [0] => `project_task`.id AS 'project_task_id' [1] => `project_task`.id AS 'ID0' [2] => `project_task`.name AS 'Название1' [3] => `project_task`.date_entered AS 'Дата_создания2' ) [where] => Array ( [0] => `project_task`.date_entered = '23.12.2015' [1] => project_task.deleted = 0 который потом уже далее собирался в конечный SQL-запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE `project_task`.date_entered = '23.12.2015' AND project_task.deleted = 0 Как мы видим, `project_task`.date_entered = '23.12.2015' - абсолютно не то, что нам надо, чтобы корректно найти данные. Мало того, что формат даты указан не верный, так еще подвешенным остается что делать с временем. Ведь date_entered (дата создания) у нас в базе имеет значения что то типа такого: 2015-12-23 12:34:02, что никак не идентично 23.12.2015, хотя по логике это должно быть наше значение. В общем нам надо преобразовать наш запрос таким образом, чтобы занчения в базе уравнялись в формате с вводимыми значениями. Я решил, что самым оптимальным будет введенное значение оставить как есть, а модернизации подвергнуть указание поля в базе данных: у нас должен на выходе получиться вот такой запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') = '23.12.2015' AND project_task.deleted = 0 Таким образом прибегнув к функции DATE_FORMAT мы сможем сделать эти значения идентичными по своему формату, что позволит их начать сравнивать. Реализация: Во первых в функцию build_report_query_where в самый верх добавляем строку с подключением глобальной переменной $timedate, из которой мы в последствии сможем извлечь текущие настройки формата даты для текущего пользователя: /** * @param array $query * @return array */ function build_report_query_where($query = array()){ global $beanList, $app_list_strings, $sugar_config; global $timedate; а чуть дальше в этой же функции ищем строчки: if ((isset($data['source']) && $data['source'] == 'custom_fields')) { $field = $this->db->quoteIdentifier($table_alias . '_cstm') . '.' . $condition->field; $query = $this->build_report_query_join($table_alias . '_cstm', $table_alias . '_cstm', $oldAlias, $condition_module, 'custom', $query); } else { $field = $this->db->quoteIdentifier($table_alias) . '.' . $condition->field; $condition->value = date($timedate->get_date_format(), strtotime("+{$timedate->getUserUTCOffset()} minutes", strtotime($condition->value))); } Здесь переменная $field - это название нашего поля в базе данных (`project_task`.date_entered). Нам надо указать его не как просто `project_task`.date_entered, а как DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') Для этого модернизируем этот участок кода следующим образом: if ((isset($data['source']) && $data['source'] == 'custom_fields')) { $field = $this->db->quoteIdentifier($table_alias . '_cstm') . '.' . $condition->field; $query = $this->build_report_query_join($table_alias . '_cstm', $table_alias . '_cstm', $oldAlias, $condition_module, 'custom', $query); } elseif($condition_module->field_defs[$condition->field]['type'] == 'datetime') { // Для случая, когда поле с типом Datetime $field = "DATE_FORMAT(". $this->db->quoteIdentifier($table_alias) . '.' . $condition->field.", '" . $timedate->get_cal_date_format() . "')"; } else { // Все остальные стандартные случаи $field = $this->db->quoteIdentifier($table_alias) . '.' . $condition->field; } Теперь у нас для всех полей с типом Datetime будет происходить корректное применение фильтров в Отчетах. Ну а в нашем случае получился запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') = '23.12.2015' AND project_task.deleted = 0 И вот его результат работы:
  5. Сегодня столкнулся с ошибкой, присутствовавшей в SuiteCRM 7.3.2 (а возможно и в более ранних и более поздних модификациях этой CRM): Если создать новый отчет в модуле Отчеты (AOR_Reports), и одним из параметров фильтрации указать поле типа Datetime, то при построении отчета записи по этому полю не ищутся. У меня это проявилось, когда я хотел найти все Задачи, созданные за определенный день (по календарику). Вот как выглядел отчет: Таким образом у нас отчет будет состоять из трех колонок: ID записи, Название и Дата создания записи. А фильтровать данные мы по идее должны по Дате создания записей: Но если заполнить поле в колонке "Значение" и нажать на кнопку "Обновить", то ничего не происходит. Записи не ищутся, хотя я точно знаю, что они есть на указанную дату. В результате разбора модуля AOR_Reports было выявлено, что непосредственно генерацией WHERE-условия для выборки по отчету занимается функция build_report_query_where, находящаяся в классе AOR_Report в файле modules/AOR_Reports/AOR_Report.php Результатом работы функции build_report_query_where являлся массив: Array ( [select] => Array ( [0] => `project_task`.id AS 'project_task_id' [1] => `project_task`.id AS 'ID0' [2] => `project_task`.name AS 'Название1' [3] => `project_task`.date_entered AS 'Дата_создания2' ) [where] => Array ( [0] => `project_task`.date_entered = '23.12.2015' [1] => project_task.deleted = 0 который потом уже далее собирался в конечный SQL-запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE `project_task`.date_entered = '23.12.2015' AND project_task.deleted = 0 Как мы видим, `project_task`.date_entered = '23.12.2015' - абсолютно не то, что нам надо, чтобы корректно найти данные. Мало того, что формат даты указан не верный, так еще подвешенным остается что делать с временем. Ведь date_entered (дата создания) у нас в базе имеет значения что то типа такого: 2015-12-23 12:34:02, что никак не идентично 23.12.2015, хотя по логике это должно быть наше значение. В общем нам надо преобразовать наш запрос таким образом, чтобы занчения в базе уравнялись в формате с вводимыми значениями. Я решил, что самым оптимальным будет введенное значение оставить как есть, а модернизации подвергнуть указание поля в базе данных: у нас должен на выходе получиться вот такой запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') = '23.12.2015' AND project_task.deleted = 0 Таким образом прибегнув к функции DATE_FORMAT мы сможем сделать эти значения идентичными по своему формату, что позволит их начать сравнивать. Реализация: Во первых в функцию build_report_query_where в самый верх добавляем строку с подключением глобальной переменной $timedate, из которой мы в последствии сможем извлечь текущие настройки формата даты для текущего пользователя: /** * @param array $query * @return array */ function build_report_query_where($query = array()){ global $beanList, $app_list_strings, $sugar_config; global $timedate; а чуть дальше в этой же функции ищем строчки: if ((isset($data['source']) && $data['source'] == 'custom_fields')) { $field = $this->db->quoteIdentifier($table_alias . '_cstm') . '.' . $condition->field; $query = $this->build_report_query_join($table_alias . '_cstm', $table_alias . '_cstm', $oldAlias, $condition_module, 'custom', $query); } else { $field = $this->db->quoteIdentifier($table_alias) . '.' . $condition->field; $condition->value = date($timedate->get_date_format(), strtotime("+{$timedate->getUserUTCOffset()} minutes", strtotime($condition->value))); } Здесь переменная $field - это название нашего поля в базе данных (`project_task`.date_entered). Нам надо указать его не как просто `project_task`.date_entered, а как DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') Для этого модернизируем этот участок кода следующим образом: if ((isset($data['source']) && $data['source'] == 'custom_fields')) { $field = $this->db->quoteIdentifier($table_alias . '_cstm') . '.' . $condition->field; $query = $this->build_report_query_join($table_alias . '_cstm', $table_alias . '_cstm', $oldAlias, $condition_module, 'custom', $query); } elseif($condition_module->field_defs[$condition->field]['type'] == 'datetime') { // Для случая, когда поле с типом Datetime $field = "DATE_FORMAT(". $this->db->quoteIdentifier($table_alias) . '.' . $condition->field.", '" . $timedate->get_cal_date_format() . "')"; } else { // Все остальные стандартные случаи $field = $this->db->quoteIdentifier($table_alias) . '.' . $condition->field; } Теперь у нас для всех полей с типом Datetime будет происходить корректное применение фильтров в Отчетах. Ну а в нашем случае получился запрос: SELECT `project_task`.id AS 'project_task_id', `project_task`.id AS 'ID0', `project_task`.name AS 'Название1', `project_task`.date_entered AS 'Дата_создания2' FROM `project_task` WHERE DATE_FORMAT(`project_task`.date_entered, '%d.%m.%Y') = '23.12.2015' AND project_task.deleted = 0 И вот его результат работы: Патч для SuiteCRM, который исправляет описанную ошибку:
×