Вычисления

Разработчику

Общая информация

Глобальные переменные

Примеры вычислений

Подсветка вычисляемых полей

Использование переменной $user

Уведомления после важных действий

Обновление кода вычислений для корректной работы с версией 2.0.8 и выше

Общая информация

Использование вычислений в программе "Клиентская База" позволяет расширить ее функционал. С помощью вычислений можно реализовать:

  • Проведение математических операций с числовыми полями
  • Перенос информации из одной таблицы/поля в другую таблицу/поле
  • Обновление данных в одних полях таблицы при изменении значений в других
  • и многое другое.

Внимание! Прежде чем приступать к самостоятельному созданию вычислений, настоятельно рекомендуется овладеть хотя бы начальными навыками алгоритмизации и программирования, в частности знанием основ языка PHP и языка запросов SQL. В случае отсуствия у вас подобных навыков, либо отсутствия времени на их изучение, рекомендуется обратится к специалистам, или воспользоваться нашим конструктором в случае простых вычислений.

Чтобы внести вычисления в таблицу, необходимо

1. Открыть "Настройки" — "Конфигурация"

photo photo

2. Выбрать категорию, в которой находится нужная нам таблица и открыть ее настройки

photo photo

3. Перейдя в меню "Вычисления", мы увидим перечень всех вычислений в этой таблице, снятием галочки рядом с соответствующим вычислением сможем отключить его, а также сможем добавить новое.

photo photo

Важно: При необходимости можно временно отключить одно из вычислений, просто убрав галочку, которая поставлена рядом с его названием. Если при открытии таблицы возникают ошибки из-за вычислений, то отключая вычисления одно за другим, можно будет понять, где именно произошла ошибка.

4. Нажав на кнопку "Добавить вычисление", мы перейдем в новое окно, в котором можно будет указать:

  • Описание вычисления — условное обозначение вычисления
  • Запретить рекурсивный вызов - дополнительная опция  для предотвращения ошибок, связанных с зацикливанием вычислений.

При включении запрета на рекурсивный вызов вычисление будет срабатывать только один раз при каком-либо условии. Это необходимо, например, когда по изменению поля срабатывает вычисление, которое изменяет поле и соответственно вычисление по изменению поля срабатывает еще раз и т. д. При добавлении нового вычисления галочка в данной графе проставлена по умолчанию.

  • Вычисление — поле, в которое следует вставить код вычисления

Важно: В вычислении следует указывать точные названия таблиц и полей, вплоть до регистра.

  • Вычислять при условии — условие, при котором вычисление будет срабатывать. В этом поле можно указать сразу несколько условий.

photo

Важно: Желательно не указывать в поле "Вычислять при условии" значение "Отображение поля", т.к. оно значительно нагружает систему. По возможности, необходимо заменять его на события изменения полей, как более оптимальный вариант.

Глобальные переменные

В вычислениях нельзя переопределять глобальные переменные, такие как:

  • $line 
  • $table
  • $config
  • $user
  • $ID
  • $lang
  • $smarty
  • $ses_id

Например, код: 

$table='Моя таблица';

приведет к ошибке программы. При этом данные переменных могут быть прочитаны и использованы в вычислениях. Переопределение допускается только полей в переменной $line.

Примеры Вычислений

1. Применение вычисляемых полей без использования данных из таблиц

$line - это текущая строка, точнее переменная-массив с данными текущей строки. Например, $line['Сумма'] вернет значение из поля Сумма текущей строки. $line является зарезервированной переменной, создается программой и переопределять ее нельзя.

Простой пример.
Например, создадим вычисление, по которому в поле с названием "Дата" будет внесена текущая дата:

$line['Дата'] = date("Y-m-d 00:00:00");

Усложним задачу. Теперь нам необходимо, чтобы в поле "Дата" отображалось дата, которая наступит, например, через три дня.

Для этого изменяем наше вычисление

$line['Дата'] = date("Y-m-d 00:00:00", time() + 60*60*24*3);

При этом укажем, что вычисление будет производится при сохранении в таблице.

photo

Теперь при каждом сохранении записи, в поле "Дата" будет автоматически вноситься значение, согласно вычислению.

Важно! Реальное обновление данных при записи в массив $line происходит уже после выполнения вычисления, поэтому, если в вычислении нужно, например, обновить e-mail в записи, а затем отправить шаблон рассылки на новый e-mail, то в таком случае необходимо менять не $line, а делать прямой запрос на запись в бд (update_query) перед отправкой шаблона. Проиллюстрируем на примерах:

Вычисление1 - обновит значение поля "E-mail для шаблона", но шаблон письма отправит на старый e-mail:

$line['E-mail для шаблона'] = $line['Исполнитель']['E-mail исполнителя'];

 send_template(91, "id=$ID");

Вычисление2 - обновит значение поля "E-mail для шаблона" таблицы "Заказы" и отправит шаблон рассылки уже на новый e-mail:

$upd_data['E-mail для шаблона'] = $line['Исполнитель']['E-mail исполнителя'];

update_query($upd_data, "Заказы", "id=$ID");

send_template(91, "id=$ID");

 

2. Использование данных из текущей таблицы

Наиболее частым случаем является работа вычислительных полей с данными из текущей таблицы. Наглядный пример представлен в таблице "Позиции счета". В ней в поле "Сумма" вносится число равное "Цене" помноженной на "Количество". Код этого вычисления выглядит так:

$line['Сумма'] = $line['Цена'] * $line['Количество'];

У данного вычисления в поле "Вычислять при условии:"  необходимо выбрать "Изменение поля Цена" или "Изменение поля Количество".

photo

 

3. Использование данных из другой таблицы

Если возникает необходимость работать с данными не только из текущей таблицы, но и из других, то мы просто указываем поле, по которому происходит связь таблиц и поле из связанной таблицы, информацию из которого мы хотели бы перенести в текущую таблицу. В стандартной конфигурации примером может послужить вычисление в таблице "Работа с клиентом", по которому информация о телефоне переносится из карточки контрагента

$line['Телефон'] = $line['Компания']['Телефон'];

И в поле "Вычислять при условии" нужно указать "Сохранение в таблице"

photo

Подобное вычисление может работать и в обратную сторону, когда согласно записи в подтаблице определенное значение будет переноситься в основную таблицу. Например, так

$line['Компания']['Телефон'] = $line['Новый телефон'];

Согласно этому вычислению, в родительскую таблицу "Компания" в поле "Телефон" будет внесено значение из поля "Новый телефон" подчиненной таблицы. Вычисление при этом заноситься в подтаблицу.

Также может возникнуть ситуация, когда необходимо подсчитать результат определенного выражения в подтаблице, а затем внести его в родительскую таблицу. Таким примером в стандартной конфигурации является ситуация, когда в поле "Сумма" таблицы "Счета" необходимо внести результат сложения сумм из "Позиций счета". Это вычисление выглядит следующим образом:

// Получаем сумму содержимого полей "Сумма" таблицы "Позиции счета", где поле "Счет" равно номеру счета.
$sqlQuery = "SELECT sum(f810) as summa FROM ".DATA_TABLE."74 WHERE status=0 AND f807='".$line['Счет']['ID']."'";
$res = sql_query($sqlQuery); 
$row = sql_fetch_array($res);
$summa = $row['summa']; 
// Заносим полученную сумму в поле "Сумма" родительской таблицы, обращаясь через поле связи "Счет"

$line
['Счет']['Сумма'] = $summa ;  

В этом вычислении:

f810 — поле "Сумма" в таблице "Позиции счета",

74 — id таблицы "Позиции счета",

f807 — поле связь указывающее на счет в таблице "Позиции счета".

 

В случае необходимости скопировать данные из записи во все записи подтаблицы, используется следующий код. Например, нам необходимо в подтаблицу внести наименование компании, на которую выписан счет. В таком случае добавим в родительскую таблицу следующее вычисление:

$sqlQuery = "UPDATE ".DATA_TABLE."74 SET f850='".$line['Компания']."' WHERE f807='".$line['ID']."'";
sql_query($sqlQuery);

В этом вычислении:

74 — id таблицы "Позиции счета",

f807 — поле связь указывающее на счет в таблице "Позиции счета".

f850 - поле, в которое будет вносится название компании

 

4. Отмена действий

В версии 1.9.5 появилась возможность написания вычисления, по которому будут отменяться действия пользователей, такие как изменения полей и удаление строк из таблицы.

Например, если нам нужно, чтобы было невозможно редактировать поле "Название", мы вносим следующее вычисление:

$line['Название'] = $event['changed']['478']['old'];

Настройки вычисления следующие:

photo

Для того, чтобы невозможно было удалить из таблицы строку, необходимо внести следующее вычисление: 

global $cancel_delete;
$cancel_delete=1;

где приcвоением переменной "$cancel_delete"  значения 1, мы запрещаем удаление строки.

При этом, в поле "Вычислять при условии" указываем значение "Удаление в таблице"

photo

Начиная с версии 2.0.2 появилась возможность добавлять условие для срабатывания вычислений на восстановление записей в таблице. Таким образом, если например, вычисление высчитывает сумму по записям в подтаблице и записывает это значение в поле в основной записи, то логичным будет пересчитывать данную сумму при добавлении записи, изменении поля, по которому считается сумма, при удалении записи и при восстановлении записи. Если планируется импорт в данную подчиненную таблицу, то также необходимо включить срабатывание этого вычисления при импорте.  

photo

5. Добавление записи в таблицу

Для автоматического добавления записи в произвольную таблицу можно использовать функцию insert_query. Функция insert_query, во-первых, позволяет работать с внешними именами полей, а не с внутренними, типа "f235", во-вторых, автоматически заполняются служебные поля и значения по умолчанию, и в-третьих, автоматом запускаются имеющиеся вычисления в таблице (на события изменения полей). 

Алгоритм использования функции такой:
1. Заполняем массив полей нужными нам данными
2. Добавляем новую запись через функцию insert_query

 Пример:

$data['Имя'] = "Петр";
$data
['Фамилия'] = "Иванов";
insert_query
($data, "Сотрудники");

Примечание: функция insert_query возвращает id добавленной записи, который можно записать в переменную и затем использовать в последующей обработке.

К примеру, доработка вышеприведенного кода:
$data['Имя'] = "Петр";
$data
['Фамилия'] = "Иванов";
$new_id
= insert_query($data, "Сотрудники");
send_template
(35, "id=$new_id"); // отсылаем приглашение сотруднику

 

Пример создания записи в связанной таблице (полю связи присваеваем ID текущей записи):
if ($line['Статус'] == "Заказывает") 
{

$data
['Заказчик'] = $ID;
$data
['E-mail'] = $line['E-mail'];
insert_query
($data, "Портреты");
}

 

Если необходимо копировать поле типа файл, необходимо создать текстовое поле с настройкой "Отображать HTML теги". Затем сформировать ссылку в этом поле. Например, поле из которого Вы копируете данные имеет ID 222, а номер таблицы, из которой копируется файл имеет номер 111. Тогда в вычислении строка с ссылкой будет выглядеть так:
$data['Готовый эскиз'] = ".$line['Готовый эскиз']."'>".$line['Готовый эскиз']."";
 
Чтобы отображалось превью файла типа изображения, нужно сделать так
$data['Готовый эскиз'] = ".$line['Готовый эскиз']."'>.$line['Готовый эскиз']."&show=1&w=100&h=100' alt='' />";

 

6. Обновление записи

Для обновления произвольной записи можно воспользоваться функцией update_query. Функция update_query во многом аналогична функции insert_query, но в отличии от нее, служит для обновления, а не добавления записей. Соотвественно, третьим аргументом функции необходимо указывать, какие именно записи требуется обновить.

$data['Компания'] = "Восток";
$data
['Дата'] = date("Y-m-d H:i:s");
update_query($data, "Контрагенты", "`id`=8"); // Обновит поля "Компания" и "Дата" в таблице "Контрагенты" для строки с id=8.
 

 

7. Удаление записи

// Удаление строки из таблицы "Контрагенты" с id=8
delete_query
("Контрагенты", "`id`=8");

Функция delete_query аналогична функциям insert_query и update_query, но в отличии от них, массив данных для ее использования передавать не нужно.

 

8. Вычисление при копировании записи

В этом случае можно использовать событие на сохранение записи, добавив проверку переменной $_REQUEST['copy_line']. Если она заполнена - значит это не обычное сохранение, а сохранение при копировании. В этой же переменной хранится и id оригинальной записи (которую копируем), благодаря чему можно использовать ее поля. К примеру, требуется решение такой задачи: "Необходимо, чтобы при копировании заявки, например, с номером 1000 создавалась заявка с номером 1000/1, если копируем второй раз, то с номером 1000/2". В итоге получаем такой фрагмент кода:

if ($_REQUEST['copy_line']) // проверка копирования
{ 
// получаем id оригинальной записи   $orig_line_id = intval($_REQUEST['copy_line']);
// получаем саму оригинальную запись   $orig_line = data_select_array($table_id, "id=",$orig_line_id);
// получаем новый номер: "оригинальный номер/1"   $new_number = $orig_line['f111']."/1";
// присваем следующий номер, если уже есть такой   for ($i = 2; data_select_array($table_id, "f111='",$new_number,"'"); $i++)   {
$new_number = $orig_line['f111']."/".$i;
}
  $line['f111'] = $new_number; }

Подсветка вычисляемых полей

Начиная с версии 2.0.3 появилась возможность выделять цветом поля, заполняемые автоматически. Данная функция доступна в режимах редактирования и добавления записи.

photo

Для этого необходимо отметить опцию «Подсветка вычисляемых полей» в свойствах нужной таблицы.

photo

По умолчанию данная опция включена во всех таблицах конфигурации. При наведении курсора на поле, выделенное как заполняемое с помощью вычислений, будет отображена всплывающая подсказка.

photo

Поля в подтаблице, заполняемые вычислениями, также выделяются цветом.

photo

Это удобно, когда поле не рассчитано на редактирование. Выделение цветом подскажет пользователю, что данное поле будет заполнено автоматически при выполнении требуемых условий, которые можно описать в справке к полю.

Использование переменной $user

Иногда появляется необходимость использования данных текущего пользователя в вычислениях. Для этого необходимо использовать переменную $user, являющуюся массивом. Ниже приведено соответствие переменных и значений, которым они соответствуют:

$user['login'] - Логин пользователя;
$user['password']- Пароль пользователя. Стоит учесть, что пароль находится в хешированном виде;
$user['fio'] - ФИО пользователя;
$user['e_mail'] - E-mail пользователя;
$user['phone'] - Телефон пользователя (указывается в поле СМС настроек пользователя);
$user['group_id'] - Группа доступа пользователя;
$user['lang'] - Установленный язык пользователя;
$user['time_zone'] - Часовой пояс пользователя;
$user['last_time'] - Время последнего логина в программу;
$user['last_ip'] - IP с которого в последний раз подключался пользователь.

Уведомления после важных действий

В программе "Клиентская база" имеется функционал уведомлений после важных действий, например, сохранения/удаления записей, запуска рассылки.

photo

Для вызова подобных уведомлений в вычислениях можно использовать функцию display_notification($mess, $type), где первым параметром передается сообщение, а вторым тип: 1 - зеленые, 2 - красные, 3 — желтые.

Отключить все уведомления после важных действий можно в настройках пользователя.

Обновление кода вычислений для корректной работы с версией 2.0.8 и выше

В связи прекращением поддержки модуля MySQL в новых версиях PHP, был произведен переход на модуль MySQLi. Если после обновления программы у Вас возникли проблемы с работой некоторых вычислений, внесите изменения в них согласно следующей инструкции. 

1. Подключитесь к базе данных, используемых вашей программы. Это можно сделать как с помощью своих программ для работы с базой данных (phpmyadmin, adminer), так и с помощью встроенного скрипта edit_sql. Если Вы планируете использовать встроенных скрипт, то просто наберите в адресной строке браузера *адрес программы*/edit_sql.php, где вместо *адрес программы* укажите соответствующее значение.

photo

2. Для предварительной оценки количества записей выполните следующие запросы. Сделать запросы можно, перейдя в раздел SQL запрос и выполнив запросы следующего вида

SELECT COUNT(*) FROM `cb_calc` WHERE `calculate` LIKE '%mysql_%';

SELECT COUNT(*) FROM `cb_cron` WHERE `command` LIKE '%mysql_%';

SELECT COUNT(*) FROM `cb_reports` WHERE `code` LIKE '%mysql_%';

Важно: Префикс таблицы базы данных (в примере установлен префикс "cb_") необходимо поменять на тот, который используется в Вашей программе

photo photo

3. Если записи нашлись, то стоит внести в них изменения. Для этого отберем записи в которых нужно внести изменения. Сделать это можно с помощью запросов

Таблица calc поле calculate - SELECT * FROM `cb_calc` WHERE `calculate` LIKE '%mysql_%';

Таблица cron поле command - SELECT * FROM `cb_cron` WHERE `command` LIKE '%mysql_%';

Таблица reports поле code - SELECT * FROM `cb_reports` WHERE `code` LIKE '%mysql_%';

photo

4. После того, как будут выведены все подходящие записи, нажимаем рядом с каждой из них на значение в поле id и изменяем использовавшиеся в коде переменные на переменные программы.

photo 

Список соответствия переменных:

Обычные переменные Переменные программы
mysql_query sql_query
mysql_insert_id sql_insert_id
mysql_fetch_assoc sql_fetch_assoc
mysql_error sql_error
mysql_close sql_close
mysql_fetch_array sql_fetch_array
mysql_fetch_row sql_fetch_row
mysql_num_rows sql_num_rows
mysql_numrows sql_num_rows
mysql_free_result sql_free_result
mysql_real_escape_string sql_real_escape_string
mysql_escape_string sql_real_escape_string
mysql_affected_rows sql_affected_rows

Обычные переменные

photo

Переменные программы

photo

5. После внесения изменений нажмите на кнопку "Сохранить".

Данная документация написана для версии 1.9.5 и выше. Описание вычислений для более ранних версий вы можете найти в соответствующих разделах:

Вычисления для версий программы ниже 1.9.5

Примеры вычислений для версий программы ниже 1.9.5

При переходе с более ранних версий на версию 1.9.5 все вычисления, которые были внесены ранее, будут автоматически конвертированы.

Смотрите также:

Рекомендации по оформлению PHP кода

Подсветка вычисляемых полей

Часто задаваемые вопросы



comments powered by HyperComments

+ сегодня

компаний уже выбрали Клиентскую базу!
Узнайте, почему.

  • компания
  • компании
  • компаний
  • выбрала
  • выбрали
  • выбрали

Создайте собственный аккаунт прямо сейчас! Бесплатно! Создать аккаунт