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


Вычисления в подчиненой таблице

вычисления подчиненая таблица

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

#1 Zver

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

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

Отправлено 25 Апрель 2012 - 08:56

Можно ли в подчиненой таблице "прикрутить" вычисления.

Пример:
Есть таблица "Счет" с полями (Контрагент, номер договора и т.д.). Вторая таблица "Позиции счета" с полями (номер счета, наименование товара, кол-во, цена, сумма). Соответственно вторая таблица подчинена первой и отображается внизу.
Надо при изменении поля цена вычислять поле сумма. А если редактировать сумму то вычислять цену.

#2 CbCoder

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

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

Отправлено 25 Апрель 2012 - 09:01

Просмотр сообщенияZver (25 Апрель 2012 - 08:56) писал:

Можно ли в подчиненой таблице "прикрутить" вычисления.
А почему нет то? Чем подчиненная в этом смысле хуже основной?

#3 Zver

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

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

Отправлено 25 Апрель 2012 - 09:03

function onchange_1743()
{ // Функция по событию "изменение поля"
var a = $("#value1743").val(); // Цена
var b = $("#value1742").val(); // Кол-во
if (isFloat(a) && isFloat( B) && a > 0 && b > 0) {$("#value1744").val(a * B)}
}
addHandler(document.getElementById("value1743"), "onchange", onchange_1743);

не работает

Сообщение отредактировал Zver: 25 Апрель 2012 - 09:07


#4 CbCoder

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

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

Отправлено 25 Апрель 2012 - 09:11

То что вы написали - это не вычисления, а Javascript. В подчиненной таблице он вообще не желателен, там совершенно иная структура html кода. Используйте обычные вычисления на изменение полей.

#5 Zver

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

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

Отправлено 25 Апрель 2012 - 10:12

Оказывается от подчиненой таблицы даже JavaScript не подгружается.
На сколько я понял редактировать эти поля ни как не получится?

#6 Zver

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

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

Отправлено 25 Апрель 2012 - 10:15

Просмотр сообщенияCbCoder (25 Апрель 2012 - 09:11) писал:

Используйте обычные вычисления на изменение полей.
Эти вычисления происходят потом. Уже на стороне сервера. И когда мне приходят два значения Цена и Сумма не нулевые и не пропорциональные Количеству, как мне определить какому полю верить.. А хочется что бы система была гибкая. Хочешь вносишь Цену, хочешь Сумму.


Просмотр сообщенияCbCoder (25 Апрель 2012 - 09:11) писал:

То что вы написали - это не вычисления, а Javascript. В подчиненной таблице он вообще не желателен, там совершенно иная структура html кода. Используйте обычные вычисления на изменение полей.

Я и забыл что это слово зарезервировано. :-) Имел ввиду автоматические расчеты при редактировании полей.

Прилагаю скриншот.

Прикрепленные изображения

  • Прикрепленное изображение: Изображение1.png

Сообщение отредактировал Zver: 25 Апрель 2012 - 10:39


#7 CbCoder

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

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

Отправлено 25 Апрель 2012 - 13:40

Цитата

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

Цитата

И когда мне приходят два значения Цена и Сумма не нулевые и не пропорциональные Количеству, как мне определить какому полю верить
Что значит "верить", не понял?

Цитата

А хочется что бы система была гибкая. Хочешь вносишь Цену, хочешь Сумму.
Кто мешает? Делаете два вычисления - одно на вычисление Суммы по изменению Цены, другое - на вычисление Цены по изменению Суммы. Это два разных события. Очевидно, вы путаете с событием "сохранение записи" - оно в данном случае не актуально для подтаблиц.

Цитата

Я и забыл что это слово зарезервировано. :-) Имел ввиду автоматические расчеты при редактировании полей.
По умолчанию под "вычислениями" подразумеваются вычисления на PHP, происходящие на стороне сервера, т.к. хронологически они появились значительно раньше в программе и терминология уже устоялась. Вычисления на JavaScript зовутся просто "JavaScript".

#8 arsenal

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

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

Отправлено 17 Август 2012 - 14:07

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

#9 arsenal

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

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

Отправлено 21 Август 2012 - 06:38

Просмотр сообщенияarsenal (17 Август 2012 - 14:07) писал:

В подчиненной таблице есть вычисление при удалении записи. Если заходишь непосредственно в таблицу, то оно работает. Если удалять запись в этой подчиненной таблице в режиме просмотра родительской записи, то вычисление не срабатывает. Так и должно быть?
up

#10 arsenal

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

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

Отправлено 22 Август 2012 - 16:02

Просмотр сообщенияarsenal (17 Август 2012 - 14:07) писал:

В подчиненной таблице есть вычисление при удалении записи. Если заходишь непосредственно в таблицу, то оно работает. Если удалять запись в этой подчиненной таблице в режиме просмотра родительской записи, то вычисление не срабатывает. Так и должно быть?
Можно получить хоть какой-то ответ на этот вопрос?

#11 CbCoder

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

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

Отправлено 22 Август 2012 - 16:50

Ваш вопрос на проверке пока.

#12 arsenal

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

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

Отправлено 23 Август 2012 - 06:40

Возник еще один вопрос.
В подчиненной таблице есть поле "Заключительный документ". Запись с пометкой "Закл. док." должна быть только одна. Для этого создаю вычисление, которое срабатывает при изменении поля "Закл. док." Если в какой-то записи выбрали "Закл. док" = "ДА", то вычисление сбрасывает эту отметку у других записей. Также это вычисление меняет значение поля в родительской записи.
Вычисление работает, но отметки "Закл. док." у других записей в подчиненной таблице пропадают только при принудительном обновлении страницы через F5. А изменения в родительской записи отображаются сразу.
Можно ли как-то сделать, чтобы данные в подчиненной таблице то же обновлялись в режиме реального времени?
Вот код вычисления
if ($line['Наименование']['Название']=="Счет-фактура" && $line['зак-док']=="ДА")
   {
    // Выбираем запись в таблице "Документация" с названием="Счет-фактура"
    $sqlQuery = "SELECT * FROM `".DATA_TABLE."90` WHERE `status`='0' AND `f972`='Счет-фактура'";
    $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
    $row_sf = mysql_fetch_assoc($result);
   
    // Выбираем запись в таблице "Процентовки" с названием="Счет-фактура" и заключительный элемент="ДА" и это не текущая запись
    $sqlQuery = "SELECT * FROM `".DATA_TABLE."101` WHERE `status`='0' AND `f1487`='".$row_sf['id']."' AND `f1486`='".$line['Договор']['raw']."' AND `f1503`='ДА' AND `id`<>'$ID'";
    $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
    while($row_sf = mysql_fetch_assoc($result))
	   {
	    $data['зак-док']="";
	    update_query($data, "Процентовки", "id=".$row_sf['id']);
	   }
    $line['Договор']['Дата закрытия'] = $line['Дата'];
   }


#13 CbCoder

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

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

Отправлено 23 Август 2012 - 08:51

На настоящий момент - нельзя. В реальном времени срабатывают только обновления полей через $line, изменения через update_query, как в вашем коде, не отслеживаются. Хотя, не исключено, что в будущем это тоже будет работать.

#14 arsenal

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

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

Отправлено 23 Август 2012 - 09:31

Пробовал в конце кода вставлять
echo "<script>location.href='".$config['site_root']."/view_line2.php?table=84&line=$ID'</script>"; // Перезагружаем родительское окно
чтобы принудительно обновить страницу. Но не обновляется. Мало того и обновление через $line перестает срабатывать.
Все таки можно как-то сделать принудительное обновление страницы?

Сообщение отредактировал arsenal: 24 Август 2012 - 10:10


#15 Гость_Roman_*

  • Гости

Отправлено 24 Август 2012 - 10:36

Чтобы скрипт сработал, необходимо добавить в таблицу поле типа текст с галочкой "Отображать HTML-теги", запретить его редактирование. А в Ваше вычисление в конце вставить не вывод, а просто присвоение. Например, новое поле называется "Script".

$line['Script'] =  "<script>location.href='".$config['site_root']."/view_line2.php?table=84&line=$ID'</script>";

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

#16 arsenal

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

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

Отправлено 24 Август 2012 - 10:56

Т.е. нужно сделать два вычисления. Одно - вышеописанное при изменении поля, другое - при отображении записи для обнуления этого поля. Верно?

#17 Гость_Roman_*

  • Гости

Отправлено 24 Август 2012 - 11:04

Да, всё верно.

#18 arsenal

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

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

Отправлено 24 Август 2012 - 11:57

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

#19 Гость_Roman_*

  • Гости

Отправлено 24 Август 2012 - 13:00

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

#20 arsenal

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

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

Отправлено 25 Август 2012 - 07:44

Не зная, правильно ли я праверил, но вот что получается
Поле с JS назвается "Код". Если включить обнуление поля (для наглядности обнуляю не пустой строкой, а словом "пусто"), то код такойПрикрепленное изображение: 1.jpg.
Если отключить обнуление поля, то происходит зацикливание. Код в поле такойПрикрепленное изображение: 2.jpg
Вычисление имеет следующий вид
if ($line['Наименование']['Название']=="Счет-фактура" && $line['зак-док']=="ДА")
   {
    // Выбираем запись в таблице "Документация" с названием="Счет-фактура"
    $sqlQuery = "SELECT * FROM `".DATA_TABLE."90` WHERE `status`='0' AND `f972`='Счет-фактура'";
    $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
    $row_sf = mysql_fetch_assoc($result);
   
    // Выбираем запись в таблице "Процентовки" с названием="Счет-фактура" и заключительный элемент="ДА" и это не текущая запись
    $sqlQuery = "SELECT * FROM `".DATA_TABLE."101` WHERE `status`='0' AND `f1487`='".$row_sf['id']."' AND `f1486`='".$line['Договор']['raw']."' AND `f1503`='ДА' AND `id`<>'$ID'";
    $result = sql_query($sqlQuery) or user_error(mysql_error()."<br>".$sqlQuery."<br>", E_USER_ERROR);
    while($row_sf = mysql_fetch_assoc($result))
	   {
	    $data['зак-док']="";
	    update_query($data, "Процентовки", "id=".$row_sf['id']);
	   }
    $line['Договор']['Дата закрытия'] = $line['Дата'];
    $line['Код'] = "<script>location.href='".$config['site_root']."/view_line2.php?table=84&line=".$line['Договор']['ID']."'</script>";
   }
elseif ($line['Наименование']['Название']=="Счет-фактура" && $line['зак-док']!="ДА")
   {
    $line['Договор']['Дата закрытия'] = "";   
   }

Что не так?





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

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