Перейти к содержимому


Вопрос по вычислениям


Сообщений в теме: 246

#181 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Октябрь 2012 - 16:58

$line['Закрыл заявку'] = $user['id'];

На форуме писали неоднократно, странно что не нашли. Поясняю - в переменной $user хранятся данные текущего пользователя. Переменная глобальна, доступна из любых вычислений. Об этом кстати есть и в документации: http://clientbase.ru...6/calculations/

#182 teacs

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 25 Октябрь 2012 - 20:26

Спасибо, заработало.
Пробовал $line['Закрыл заявку'] = $user['current']; и не срабатывало..
Документацию и форум первым делом читаю.

Сообщение отредактировал teacsrem: 25 Октябрь 2012 - 20:26


#183 f-jeka

    Активный участник

  • Пользователи
  • PipPipPip
  • 196 сообщений

Отправлено 10 Ноябрь 2012 - 04:59

В таблице счета вычисление суммы происходят по следующему сценарию

Цитата

$sqlQuery = "SELECT sum(f810*f811) as summa FROM ".DATA_TABLE."74 WHERE status=0 AND f807=$ID";
$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['Сумма'] = $row['summa'];
Я добавил дополнительные поля по которым тоже нужно сделать вычисления. Как узнать какой у них номер? То есть что нужно прописать вместо f810 ?

#184 Гость_Roman_*

  • Гости

Отправлено 10 Ноябрь 2012 - 07:08

Можно зайти в настройки конфигурации и в нужной таблице войти в поле. В адресной строке браузера можно будет увидеть номер поля.

#185 f-jeka

    Активный участник

  • Пользователи
  • PipPipPip
  • 196 сообщений

Отправлено 10 Ноябрь 2012 - 23:12

Просмотр сообщенияRoman (10 Ноябрь 2012 - 07:08) писал:

Можно зайти в настройки конфигурации и в нужной таблице войти в поле. В адресной строке браузера можно будет увидеть номер поля.
Спасибо! Нашел!

#186 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 11 Ноябрь 2012 - 13:50

Есть доп. днйствие во всплывающем окне. Прикрепленное изображение: 1.jpg В нем есть текстовые поля и кнопки для отправки данных. Среди кнопок есть кнопка для удаления объекта (см. рисунок). Если, находясь в любом текстовом поле, нажать ОК, то это воспринимается как нажатие кнопки удаления объекта и отрабатывает соответствующий программный код.
Коллеги, подскажите, как избавиться от этого. Кнопка создана через <button>.

Сообщение отредактировал arsenal: 11 Ноябрь 2012 - 14:04


#187 Гость_Roman_*

  • Гости

Отправлено 12 Ноябрь 2012 - 08:39

<button onclick="del_object(); return false">Кнопка</button>


#188 arsenal

    Активный участник

  • Пользователи
  • PipPipPip
  • 448 сообщений

Отправлено 13 Ноябрь 2012 - 17:25

На всякий случай уточню: под ОК я подразумеваю клавишу "ENTER" на клавиатуре.
Мой код имеет следующий вид
<button id='del_ob' name='del_ob' value='ДА'>Кнопка</button>
Обрабтки событий на кнопке нет. В php я проверяю значение
if ($_REQUEST['del_ob']=="ДА")
	   {
		.......
	   }
Если я что-то ввел в текстовое поле и нажал "ENTER", то почему-то это воспринимается как клик на кнопке, которая первая выводится в форме.

Сообщение отредактировал arsenal: 13 Ноябрь 2012 - 17:31


#189 Гость_Roman_*

  • Гости

Отправлено 13 Ноябрь 2012 - 17:36

Попробуйте перехватить событие onkeyup на форме.
<form onkeyup="this.submit(); return false">


#190 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 13 Ноябрь 2012 - 22:28

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


есть варианты какие-нибудь?

в голове пока вроде тупой, но относительно рабочий вариант (не проверял еще)
Спец поле для старого значения, которое будет меняться в конце выполнения скрипта

Поле1 со связью
Поле2 со значением из поля со связью

произошло сохранение таблицы
Действия:
изменили Значение поля 1
Сохранили таблицу
Вычисление при сохранении таблицы
1) Взяли значение поля2
2) Вычисления с полем 2
3) Значени поля 1 + вычисления с полем 1
4) Изменили поле 2 на текущее значение


может есть какой-то более изящный вариант?

Сообщение отредактировал UmaCat: 13 Ноябрь 2012 - 22:38


#191 Гость_Roman_*

  • Гости

Отправлено 14 Ноябрь 2012 - 07:49

Все старые значения полей при сохранении хранятся в виде $event['changed']['770']['old'] , где 770 - ид Вашего поля. Возможно, этот вариант Вам больше подойдёт.

#192 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 14 Ноябрь 2012 - 08:19

Просмотр сообщенияRoman (14 Ноябрь 2012 - 07:49) писал:

Все старые значения полей при сохранении хранятся в виде $event['changed']['770']['old'] , где 770 - ид Вашего поля. Возможно, этот вариант Вам больше подойдёт.
а если в процессе редактирования дважды и более изменить поле что будет в этой переменной $event['changed']['770']['old']?
Вошли в редактирование
Значение поля 1
Выбрали значение 2
Подумали и выбрали значение 3
Все в процессе редактирования записи

В $event['changed']['770']['old'] будет значение 1 или 2 ?

решил реализовать свой первоначальный вариант

Вычисление идет при сохранении таблицы
105 - таблица где все хранится
f1321 - основное поле где хранится запись (имя Gate-In REF). Связано с полем другой таблицы (129) с таким же названием
GIRPrevoiusForCalc - поле (f1660) где хранится предыдущее (старое) значение. Связь с тем же полем Gate-In REF из другой таблицы (105).


//поиск по полю f1321 таблицы 105 таких же значений (Старых) как в поле GIRPrevoiusForCalc 
$sqlQuery = "SELECT count(`f1321`) AS gateinold FROM `".DATA_TABLE."105` WHERE (`status`<>'2' AND `f1321`='" . $line['GIRPrevoiusForCalc']['ID'] . "')";
$result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
$row = mysql_fetch_assoc($result);

//echo "<script>alert('Количество ".$row['gateinold']."')</script>"; // расчитывает правильно
//проблемная строка. Не работает. Надо во внешней таблице найти старое значение и записать туда подсчитанное количество старых значений
$line['GIRPrevoiusForCalc']['Used places']=$row['gateinold'];
 
//здесь стандартно и работает. Ищет правильно
$sqlQuery = "SELECT count(`f1321`) AS gateinquant FROM `".DATA_TABLE."105` WHERE (`status`<>'2' AND `f1321`='" . $line['Gate-In REF']['ID'] . "')";
$result = mysql_query($sqlQuery) or user_error(mysql_error() . "<br>" . $sqlQuery . "<br>", E_USER_ERROR);
$row = mysql_fetch_assoc($result);

//echo "<script>alert('Количество ".$row['gateinquant']."')</script>";  //считает правильно
$line['Gate-In REF']['Used places']=$row['gateinquant']; // записывает правильно
 
//записывает текущее значение в поле для хранения значений
$line['GIRPrevoiusForCalc']=$line['Gate-In REF'];

Не срабатывает первый блок. Причем вычисление идет верно. но почему-то во внешнюю таблицу не записывает значение. При этом второй аналогичный блок срабатывает корректно и значение записывает для своего ID.
может что-то не правильно в коде?
$line['GIRPrevoiusForCalc']['Used places']=$row['gateinold'];
Первая часть поле в котором ЕЩЕ старое значение и по нему надо в поле Used Places записать подсчитанное количество.

Сообщение отредактировал UmaCat: 14 Ноябрь 2012 - 09:31


#193 UmaCat

    Активный участник

  • Пользователи
  • PipPipPip
  • 122 сообщений

Отправлено 14 Ноябрь 2012 - 14:38

подскажите где ошибка?

$sqlQueryU ="UPDATE `".DATA_TABLE."129` SET `f1606`='".$row['gateinold']."' WHERE `id`='".$znachen."'";
mysql_query($sqlQueryU);

сам вроде нашел
$sqlQueryU ="UPDATE `".DATA_TABLE."129` SET `f1606`=".$row['gateinold']." WHERE `id`='".$znachen;
mysql_query($sqlQueryU);

Сообщение отредактировал UmaCat: 14 Ноябрь 2012 - 14:40


#194 ZeroCooL

    Участник

  • Пользователи
  • PipPip
  • 17 сообщений
  • Пол:Мужчина

Отправлено 09 Февраль 2013 - 13:34

Добрый день.

Тема большая, но перепробовал многие варианты из нее и никак.
для того, чтобы разобраться с вычислениями, создал

Есть таблица "Клиенты" (table=151):
| ФИО (field=2001, текстовое, уникальное) | Email | Телефон | ... | Баланс (field=2211) | Заметки (field=2051) |

Подчиненная таблица "Счета" (table=161)
| Номер | Тип счета | ФИО клиента (field=2141, Связь с полем ФИО) | Сумма счета (field=2171) | ... |

Задача: При добавлении счета или при изменении старых пересчитывать баланс текущего клиента.

Решение - доп вычисление в таблице "Счета" по сохранению или по изменению.
Вот как пробовал:
$sqlQuery = "SELECT sum(f2171) as summa FROM ".DATA_TABLE."161 WHERE status<>2 AND f2141=$ID";
$res = mysql_query($sqlQuery);
$row = mysql_fetch_array($res);
$line['ФИО клиента']['Баланс'] = $row['summa'];
$line['ФИО клиента']['Заметки'] = $line['ФИО клиента']['ФИО']; // Добавлено для проверки записи в нужную ячейку
Тогда в заметки пишется ФИО, на которого выставлен счет, а в Баланс записывается "0.00" (хотя счетов много и сумма должна быть).

В чем может быть заковыка?

#195 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 09 Февраль 2013 - 16:29

Запрос неверный.

$sqlQuery = "SELECT sum(f2171) as summa FROM ".DATA_TABLE."161 WHERE status<>2 AND f2141=".$line['ФИО клиента']['ID'];


#196 ZeroCooL

    Участник

  • Пользователи
  • PipPip
  • 17 сообщений
  • Пол:Мужчина

Отправлено 09 Февраль 2013 - 17:07

Просмотр сообщенияCbCoder (09 Февраль 2013 - 16:29) писал:

Запрос неверный.

$sqlQuery = "SELECT sum(f2171) as summa FROM ".DATA_TABLE."161 WHERE status<>2 AND f2141=".$line['ФИО клиента']['ID'];
Отлично, спасибо. Теперь механизм связей становится яснее )

#197 andibrag

    Прежде, чем задать вопрос, продумайте свое решение.

  • Активный пользователь
  • PipPipPip
  • 1 356 сообщений
  • Пол:Мужчина
  • Город:Санкт-Петербург

Отправлено 15 Март 2013 - 14:03

Посредством функции insert_query($data,'таблица') создается запись со значениями. В таблице есть событие на изменение поля (поле_1), которое выполняется, если одно из полей (поле_2) имеет определенное значение.
Каков механизм процесса? В какой момент отработает событие на изменение поля? После внесения всех значений или после внесения значения в поле_1, с которым связано событие?
$data['поле_2']='значение' объявляется раньше, чем $data['поле_1']. Правда, не уверен, что это должно иметь значение. Или порядок переменных в массиве $data все же актуален?
Так долго бьюсь над этой проблемой и никак не могу отследить логики. Запись создается, поля заполняются, события тоже отрабатывают. Но если есть условие связанное с другим полем - ничего не работает. Где подвох?

Творческая группа "ТАВР".

www.TAVR.pro Художественная ковка, металлоконструкции.

www.СтолМет.рф Складные столы, стулья и системы для их хранения


#198 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 15 Март 2013 - 14:35

Загляните в functions2.php и посмотрите там логику работы. Даю такой совет, т.к. считаю что вы достаточно продвинутый специалист, и вам лучше самому разобраться, чем использовать посредника в виде меня.

#199 f-jeka

    Активный участник

  • Пользователи
  • PipPipPip
  • 196 сообщений

Отправлено 01 Май 2013 - 20:25

При привязке счет-фактуры к счету происходит вычисление которое добавляет позиции из счета в счет-фактуру:
$line['На кого'] = $line['По счету']['На кого'];
  $line['Кол-во'] = $line['По счету']['Кол-во'];
  $line['Сумма'] = $line['По счету']['Сумма'];
  $line['Оплачено'] = $line['По счету']['Оплачено'];
  $line['Остаток'] = $line['По счету']['Остаток'];
  $line['Наша компания'] = $line['По счету']['Наша компания'];

  $poz_sch_s = data_table("Позиции счета","`Счет`='".$line['По счету']['ID']."' AND `status`<>'2'","all");

  foreach ($poz_sch_s as $poz_sch)
    {
	  $poz_sf['Счет-фактура'] = $line['ID'];
	  $poz_sf['Описание'] = $poz_sch['Описание'];
	  $poz_sf['Ед. изм'] = $poz_sch['Ед. изм'];
	  $poz_sf['Цена'] = $poz_sch['Цена'];
	  $poz_sf['Кол-во'] = $poz_sch['Кол-во'];
	  $poz_sf['Сумма'] = $poz_sch['Сумма'];
	  $poz_sf['Тип'] = $poz_sch['Тип'];
	  $poz_sf['Позиция номенклатуры'] = $poz_sch['Позиция номенклатуры'];
	  insert_query($poz_sf, "Позиции счет-фактуры");
    }
Хочу сделать то же самое для накладной. Делаю по аналогии, убрав не нужные мне поля, оставив только поля с позициями:
$poz_sch_s = data_table("Позиции счета","`Счет`='".$line['По счету']['ID']."' AND `status`<>'2'","all");

  foreach ($poz_sch_s as $poz_sch)
    {
		  
	  $poz_nk['Ед. изм'] = $poz_sch['Ед. изм'];
	  $poz_nk['Цена'] = $poz_sch['Цена'];
	  $poz_nk['Кол-во'] = $poz_sch['Кол-во'];
	  $poz_nk['Сумма'] = $poz_sch['Сумма'];
	  
	  $poz_nk['Товар'] = $poz_sch['Позиция номенклатуры'];
	  insert_query($poz_nk, "Позиции накладной");
    }
Данная конструкция не добавляет позиции счета в накладную. Не могу найти ошибку. Подскажите, пожалуйста, почему не работает?

#200 Гость_Roman_*

  • Гости

Отправлено 03 Май 2013 - 12:14

В позициях Вы не заполняете поле связи с накладной. Обратите внимание на пример с счёт-фактурой:
$poz_sf['Счет-фактура'] = $line['ID'];
Здесь заполняется поле связи на основную запись. Необходимо сделать тоже самое и в накладной. Позиции у Вас, скорее всего, создались, просто не привязаны ни к одной накладной.





Количество пользователей, читающих эту тему: 3

0 пользователей, 3 гостей, 0 анонимных