Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как реализовать вывод формулы подсчета из б/д. (https://javascript.ru/forum/misc/56047-kak-realizovat-vyvod-formuly-podscheta-iz-b-d.html)

YegorSSS 27.05.2015 14:09

как реализовать вывод формулы подсчета из б/д.
 
Помогите, пожалуйста! Мне нужно реализовать такую задачу. В б/д находится разные формулы подсчета, например:
a*(b+c*d).
Переменные a,b,c и d задаются в полях формы. Как сделать, чтобы эти данные подсчитывались по разным формулам?

laimas 27.05.2015 14:26

SELECT field_a * (field_b + field_c * field_d) result

laimas 27.05.2015 16:12

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

Если с хранимыми процедурами не получится, то можно в поле хранить не формулу, а ссылку на функцию ее выполняющую, которая будет выполнена после выборки из базы. Например, в таблице 5 полей из которых первые четыре, это значения переменных a, b, c, d, а пятое ссылка на функцию "name_1":
$func = array(
    'name_1' => function($v) {
        return $v[0] * ($v[1] + $v[2] * $v[3]);
    }
);
$q = mysql_fetch_row(mysql_query('SELECT * FROM table_name'));
echo $func[$q[4]](array_slice($q, 0, 4));

kostyanet 27.05.2015 16:55

Цитата:

Сообщение от YegorSSS
В б/д находится разные формулы подсчета, например:
a*(b+c*d).

Текстом что ли? Ну тогда заменяйте по именам полей на значения и считайте eval'ом.

Опять же как взять имена полей из формулы в тексте. Ну если там как в примере, то регой выкинуть всё что не текст и разбив на букавки отрендерить поля с именами по буковкам. Потом replace значений и eval.

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

YegorSSS 27.05.2015 17:00

Спасибо, сделал таким способом:
<script>
  function formul(a, b, c, d){ 
         return <?= mysql_fetch_row(mysql_query('SELECT formula FROM table_name')) ?>;
  }
</script>

Это вставил в код страницы, потом вызвал и подставил данные из формы.

laimas 27.05.2015 17:04

То есть это надо выполнять обязательно на клиенте? Ну тогда уж отдавать ему объект описывающий данные для формул, а не return <?= mysql_fetch_row....

рони 27.05.2015 17:05

YegorSSS,
:)
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>
<form action="http://">
<label for="">a = <input type="text"></label>
<label for="">b = <input type="text"></label>
<label for="">c = <input type="text"></label>
<label for="">d = <input type="text"></label>
<p></p>
</form>
<script>
 var f = ["a*(b+c*d)", "a+b+c+d", "(a+b)*(c+d)", "a+b", "++a"],
    inp = document.querySelectorAll("input"),
    p = document.querySelector("p"),
    factory = function(a) {
        return new Function(a.match(/\w+/g), "return " + a)
    },
    fn = function(a) {
       return  a.value = +a.value || 0;
    },
    res, arr;
document.forms[0].onchange = function() {
    arr = Array.prototype.map.call(inp, fn);
    res = "";
    f.forEach(function(a) {
        var b = 0,
            c = a.replace(/\w+/g, function() {
                return arr[b++]
            });
        res += a + " => " + c + " => " + factory(a).apply(this, arr) + "<br>"
    });
    p.innerHTML = res
};
</script>
</body>

</html>

kostyanet 27.05.2015 17:05

Цитата:

Сообщение от laimas
должен выполняться как хранимая процедура,

Заколебетесь хранить. Шли бы на sql.ru выпендриваться, чтоб ваш выпендреж там спецы обломали. Нашли тут благодарных профанов и впариваете им теории всего.

Хранимые процедуры нужны там, где клиент не детерминирован или скорее скомпилирован. Напрягите извилину. Есть 1 база и 100 клиентов, разных, готовых, ну какие-то там приложения на десктопе или на сервере через терминал - не важно. Важно что вы не можете взять и дописать им всем модельку подсчета чего-нить с какой-нить таблицы. Это невозможно. Тогда вы, как инженер баз данных - пишите процедуру прямо в самой базе данных и у всех чпок - считается-выбирается-сохраняется-реплицируется и тп - как полагается.

А нахрена козе баян для сайта на каком-нить php и js, где за час можно сгенерить сотню моделей и все будет работать как доктор прописал.

Кстати на моем федеральном хостинге нельзя создать ни вьюху ни хранимку. Потому что и не надо.

kostyanet 27.05.2015 17:09

Цитата:

Сообщение от YegorSSS
Это вставил в код страницы

Это называется модель и вы ее генерите. Остается еще рендер так же генерить и все будет чики-пуки.

laimas 27.05.2015 17:10

Згинь гнида шелудивая, бабку свою будешь удивлять своим "гениальными словами", для меня ты пустышка. Не дай бог еще раз попадешься под руку,изловлю щенка, сниму штаны и набью морду. )


Часовой пояс GMT +3, время: 19:52.