Форум профессиональных мебельщиков PROMEBELclub

Форум профессиональных мебельщиков PROMEBELclub (https://промебельклуб.рф/forum/index.php)
-   Базис-мебельщик. Скрипты (https://промебельклуб.рф/forum/forumdisplay.php?f=273)
-   -   Обсуждение скриптов в Системе Базис (https://промебельклуб.рф/forum/showthread.php?t=13614)

Letos 28.05.2018 09:30

Цитата:

Сообщение от wizardpnz (Сообщение 456794)
вот что нашёл может у кого то быстрее получится
https://www.npmjs.com/package/node-firebird

Заглядывался на этот модуль, но он асинхронный. А у Базиса с асинхронностью в скриптах проблемы - даже банальный fs.writeFile() асинхронный не работает после того, как основное тело скрипта выполнилось. Сейчас рассматриваю вариант от Igor_482: http://promebelclub.ru/forum/showthr...068#post379068, но он более замороченный, на мой взгляд.

wizardpnz 28.05.2018 10:21

Letos, посмотри http://www.cyberforum.ru/nodejs/thre...l#post12428359

все выходные ломал голову

Letos 28.05.2018 11:40

Цитата:

Сообщение от wizardpnz (Сообщение 456867)
Letos, посмотри http://www.cyberforum.ru/nodejs/thre...l#post12428359

все выходные ломал голову

Насчет Promise ничего не могу сказать - старался избегать их.
А по поводу того вопроса такое решение может помочь:

Код:

var funcResult;
Firebird.attach(options, function(err, db) {
 
    if (err)
        throw err;
 
    db.query('select *  from MATERIAL', function(err, result) {
      funcResult = result;
      db.detach();
    });
 
  });

НО: и attach и query - асинхронные функции, которые выполняются "в фоне", и когда они выполнятся - неизвестно, поэтому это решение "грязное", ибо может породить кучу ошибок (большая вероятность того, что если в следующей после attach строке будет обращение к funcResult, то его еще не успеют присвоить). Результат (result) лучше всего обрабатывать там, где он пришел (в функции, которая является параметром функции query).

И еще: в обработчиках событий асинхронность уже не работает. Вот простой пример:
Код:

var b = Action.Properties.NewBool('b');
b.OnValueChange = ()=>{
    require('timers').setTimeout(function (msg){
        alert(msg);
    }, 1000, 'hello, world!');   
}

require('timers').setTimeout(function (msg){
    alert(msg);
}, 3000, 'hello, world!');
// alert(345);
Action.Continue();

По коду:
1. Создается булевое свойство.
2. Ему назначается обработчик в котором таймер: через секунду алертом вывести сообщение.
3. В основном теле таймер: через 3 секунды алертом вывести сообщение (примечание - на эти 3 секунды Базис виснет, но скрипт работу продолжает.)
4. Если раскомментарить алерт, то при выполнении скрипта можно увидеть, что 3 секунды таймера отсчитываются асинхронно "в фоне", а скрипт продолжает работу и вызывает алерт.
5. Вызов Action.Continue(), чтобы скрипт продолжил работать дальше.

По итогам:
1. Таймер в основном цикле отрабатывает.
2. Если у булевого свойства поменять значение, то таймер уже не сработает.
Отсюда вывод, что асинхронные функции работают только в основном теле скрипта. Но даже там они могут представлять опасность обычному пользователю. Вот потенциально опасный скрипт:
Код:

require('timers').setInterval(function (msg){
    alert(msg);
}, 3000, 'hello, world!');

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

Letos 28.05.2018 12:01

Цитата:

Сообщение от wizardpnz (Сообщение 456794)
вот что нашёл может у кого то быстрее получится
https://www.npmjs.com/package/node-firebird

wizardpnz, этот вариант пакета не рассматривался?
https://www.npmjs.com/package/firebird

Он вроде синхронный, думаю, постабильнее будет (и помедленнее, скорее всего. По крайней мере для чистого NodeJS).

wizardpnz 28.05.2018 16:44

я не смог его подключить через npm

собственно расскажу что я делаю
собираю в цикле объекты со сцены и записываю это в excel лист
и столкнулся с тем что нужны также данные из базы материалов
смог записать данные из базы в эксель внутри промиса
копаю дальше)))
расковырял где лежит соответствия материалов и их свойства из базы материалов

ATTEND_MAT_MAT таблица соответствий
MATERIAL таблица материалов вес цена артикул
MATERIAL_ADVANCE доп свойства материалов размер толщина и тд

выводит массу детали умножает площадь на массу из базы материалов
надо nodejs и установить модуль node-firebird и базис 10

Код:

var Firebird = require('node-firebird');


var options = {};
 
options.host = '127.0.0.1';
options.port = 14357;
options.database = 'D:/BAZIS10.fdb';//с кириллицей не разобрался
options.user = 'SYSDBA';
options.password = 'masterkey';
options.lowercase_keys = false; // set to true to lowercase keys
options.role = null;            // default
options.pageSize = 4096;        // default when creating database
 

Model.forEachPanel(function(panel) {



  MaterialName = panel.MaterialName;
  MaterialArt = "";
  if (MaterialName.indexOf("\r") > 0) {
      MaterialArt = MaterialName.split("\r")[1];
      MaterialName = MaterialName.split("\r")[0]
  };

  panelS = panel.Contour.Width * panel.Contour.Height * 0.000001;
  panelS = panelS.toFixed(3)





Firebird.attach(options, function(err, db) {
 
  if (err) throw err;
 
db.query("select * from MATERIAL WHERE NAME_MAT = '" + MaterialName + "' AND ARTICLE = '" + MaterialArt + "'", function(err, result) {
    db.detach();
    system.log(MaterialName + ' ' + panelS * result[0].WEIGHT);
  });

});

});

system.log("+");

делаем всё что нужно внутри асинхронной функции

Uncle 28.05.2018 17:00

Цитата:

Сообщение от wizardpnz (Сообщение 456906)
выводит массу детали умножает площадь на массу из базы материалов

Это уже должно работать? То есть в окне редактора скриптов в Базисе этот текст можно вставить, сохранить и будет работать?

wizardpnz 28.05.2018 17:05

теперь можно сделать базис смету свою)))

Uncle 28.05.2018 17:37

Цитата:

Сообщение от wizardpnz (Сообщение 456906)
надо nodejs и установить модуль node-firebird

Что это ? Где его взять? Куда положить?... Или все вышеизложенное обсуждение вариантов решения задачи - это так, такой себе "междусобойчик" гуру скрипта?

Letos 29.05.2018 10:42

Цитата:

Сообщение от Uncle (Сообщение 456909)
Это уже должно работать?

Оформил скрипт от wizardpnz в "портативную версию". Вот Ссылка на гугл диск. Как им пользоваться:
1. Скачать и распаковать в нужную папку.
2. В файле db.js у переменной options.database изменить значение на путь к нужной базе.
3. Запустить db.js.
В папке node_modules хранятся дополнительные модули для работы скрипта. Nodejs устанавливать не нужно

Tehnik 29.05.2018 19:08

Цитата:

Сообщение от Letos (Сообщение 456946)
Оформил скрипт

Скрипты с нодами зто не для БМ9, да?


Текущее время: 14:37. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
© 2007-2023 PROMEBEL