Просмотр полной версии : Поиск по отчету
День добрый!
Подскажите пожалуйста, есть возможность формирования отчета по заданному параметру.
У меня задача формировать отчет по номеру детали, либо номеру накладной, за весь период работы.
Пока вышел из положения формированием отчета за заданный период с сохранением в Эксель, а там поиск по нужному столбцу.
Не нашел подобных примеров, решения стандартными средствами.
Возможно поиск по архиву на С#, с поиском строки, получением метки времени и затем вывод данных по этой метки?
Спасибо!
SCADAMaster
30.05.2020, 10:25
Не совсем понятно что в итоге нужно.
Поиск по архиву через C# - есть:
https://insat.ru/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-obrabotka-arkhivov/
Можно вывести полный перечень всех деталей в отчет, и в нем сделать поиск.
Опишите сценарий работы который вы хотите получить.
День добрый!
Попробовал использовать данный скрипт (https://insat.ru/blog/fb-skript-c-i-ego-ispolzovanie-v-masterscada-obrabotka-arkhivov/)
Получаю последнее значение метки времени, а мне надо все значения.
Для этого надо создать отчет и настроить вывод данных?
Вытащил на отчет метку времени и номер детали.
Выводятся все значения за период.
bool? M=false;
public override void Execute()
{
if (Найти==true && M==false && Начало.HasValue && Конец.HasValue && Конец>Начало)
{
var NumInvoic = HostFB.InputGroup.GetPin("НомерНакладнойВх").TreePinHlp;
var N_Nakl=NumInvoic.DataArchiveItem;
//-------------------------------------------------------------//
var elem1 = HostFB.InputGroup.GetPin("Номер_детали1").TreePinHlp;
var k1=elem1.DataArchiveItem;
DateTime EndTime=Конец.Value.ToUniversalTime();
DateTime StartTime=Начало.Value.ToUniversalTime();
var mas1=k1.Read(StartTime, EndTime, false);
string Val1, ValNakl;
Val1=""; ValNakl="";
DateTime? TimeStamp=null;
//-----------------------------------------------------------//
foreach (var element in mas1)
{ //Val.HasValue==false ||
// if (Equals(Convert.ToString(element.Value),ПоискНомер ))
if (Equals(element.Value,ПоискНомер))
{//если равенство строк для НомерДетали1(также поиск для НомерДетали2,3,4,5)
Val1=Convert.ToString(element.Value);
TimeStamp=element.Time.ToLocalTime();//получаем метку времени
//---если нашли совпадение и получили метку времени
//ищем значение доп. переменных:
//номер_накладной; температура нагрева, выдержки; время нагрева, выдержки; время конец обработки
НомерДетВых=Val1; //найденое совпадение НомераДетали
МеткаВремени=TimeStamp; //
DateTime FindTime=TimeStamp.Value.ToUniversalTime();
var masNakl=N_Nakl.Read(FindTime, FindTime, true);
foreach (var elementmasNakl in masNakl)
{
ValNakl=Convert.ToString(elementmasNakl.Value);
НомерНакладнойВых=ValNakl;//получаем НомерНакладной по заданной метке времени
}//получаем остальные значения, формируем строку и пишем в файл/ отчет?
}
}
}
else МеткаВремени=null;
M=Найти;
}
Спасибо!
SCADAMaster
01.06.2020, 11:26
Что значит все значения? Их может несколько одинаковых с разной меткой времени?
Тогда скрипт не подходит - он может выводить только одно значение на выход. Если конечно можно ограничить количество выводимых значений, например в 10, то можно сделать 10 выходов скрипта.
Либо тогда используйте редактор отчетов - в нем можно таблицей вывести значения которые подходят под ваше условие.
Видеопримеры про редактор отчетов:
https://insat.ru/products/?category=1524
Документация:
https://insat.ru/products/?category=1525
Может несколько одинаковых с разной меткой времени?
Идет закладка в печь, оператор вводит номера деталей, их может быть до 5 шт.
НомерДетали1, НомерДетали2, НомерДетали3, НомерДетали4, ДетальНомер5.
И поиск надо сделать по всем.
Метка времени у всех будет разная.
Они могут повторятся в течении времени, уникально только номер накладной.
По заданию отчет должен формироваться по номеру накладной и по номеру детали.
Взял себе подработку на работе мало заданий)).
МастерСкада три месяца назад первый раз увидел.
Настроил отчеты по окончании обработки деталей ,формируются нормально.
А вот с поиском, застрял.
Поиск по совпадению с архивными данными НомерДетали1, НомерДетали2, НомерДетали3, НомерДетали4, ДетальНомер5, а также отдельно по номеру накладной можно сделать.
Мне надо что бы в отчет выводились все найденные совпадения по номеру детали и используя все найденые все метки времени выводить остальные данные:
5 выходных значений (найденных) НомерДетали№ и выходы ТемператураВыдержки, ВремяВыдержки, ВремяВыдержкиФакт, ВремяКонецОбработки(архивное).
Если возможно представляю размер кода.
По редактору отчетов.
По учебным видео, не соображу как использовать сравнение вводимой строки (НомерДеталиПоиск) для фильтрации вывода архивных данных в отчете.
Спасибо!
SCADAMaster
01.06.2020, 12:34
Так вкладка настроек Бэнда - Фильтр. Там можно выбрать режим Выражение и фильтровать по нескольким колонкам различными условиями.
Заработало!!!
В отчете в переменные (а не в данные, нашел ошибку!) добавил НомерНакладнойПоиск,
создал фильтр (Архив_MasterSCADA.Номер_Накладной==НомерНакладной Поиск).
И заработало, по номеру детали сделаю аналогично.
Примеры надо смотреть повнимательней, а обычно делаю это ночью и с перемоткой, вот и итог.
Огромное спасибо!
Добрый день!
Можно еще вопрос в теме, только по скриптам на C#?
При дублировании неработают скрипты.
Оригинал работает, делаю дублирование три разных скрипта, компилирую их.
Настраиваю связи, не работают???
Самый простой пример:
string[] NumberDet = new string[5];
public override void Execute()
{ //--------- разбор строки при любом изменении
for (int i=0;i<5;i++) NumberDet[i]="";//обнуляем
NumberDet=НомерДеталиВх.Split(new char[] {','},5);
if(NumberDet[0]!="")НомерДетВых1=NumberDet[0];
else НомерДетВых1="";
if(NumberDet[1]!="")НомерДетВых2=NumberDet[1];
else НомерДетВых2="";
if(NumberDet[2]!="")НомерДетВых3=NumberDet[2];
else НомерДетВых3="";
if(NumberDet[3]!="")НомерДетВых4=NumberDet[3];
else НомерДетВых4="";
if(NumberDet[4]!="")НомерДетВых5=NumberDet[4];
else НомерДетВых5="";
}
}
Спасибо!
SCADAMaster
03.06.2020, 09:49
Должно работать. Ничего такого в коде нет.
Значение на входе такое же? Пришлите проект и несколько скриншотов демонстрирующих проблему.
Должно работать. Ничего такого в коде нет.
Значение на входе такое же? Пришлите проект и несколько скриншотов демонстрирующих проблему.
49433
49434
SCADAMaster
03.06.2020, 10:59
На скришоте никакой проблемы нет. 4 элемента в строке - 4 значения на выходе. В чем проблема?
Пересобрал один скрипт заново, из библиотек оставил только:
using System;
using MasterSCADA.Script.FB;
using MasterSCADA.Hlp;
using FB;
using FB.FBAttributes;
using System.Linq;
Работает.
На скришоте никакой проблемы нет. 4 элемента в строке - 4 значения на выходе. В чем проблема?
В первом случае четвертое значеине 505, так как строка на 505.
Во втором случае разбор строки не происходит, входная строка состоящая из массива строк с разделением через "," заканчивается на 599
А в последнем случаи четвертая строка все также 505.
Спасибо.
49438
Добавил рабочий скрипт в библиотеку.
Вытащил его из библиотеки и все он не работает.
Также пробовал копировать его "рабочий" код.
Где то глюк, наверное у меня в глазах
Спасибо.
49438
Добавил рабочий скрипт в библиотеку.
Вытащил его из библиотеки и все он не работает.
Также пробовал копировать его "рабочий" код.
Где то глюк, наверное у меня в глазах
Спасибо.
Нашел, ошибка была в обнулении массива.
Причем в первом скрипте работает
//
string[] NumberDet0 = new string[5];
public override void Execute()
{ // разбор строки
for (int i=0;i<5;i++) NumberDet0[i]="";
//
В остальных придется менять на :
for (int i=0;i<Number.Length;i++) Number[i]="";//обнуляем
Так правильней будет.
Спасибо.
SCADAMaster
03.06.2020, 13:00
Напишите такой код
public override void Execute()
{
if (НомерДеталиВх==string.Empty) return;
string[] NumberDet0=НомерДеталиВх.Split(',');
for (int i=0;i<NumberDet0.Length;i++)
{
var Pin=HostFB.OutputGroup.GetPin("НомерДетВых"+(i+1)).TreePinHlp;
Pin.AddAssignValueTask(NumberDet0[i],null);
}
}
Напишите такой код
public override void Execute()
{
if (НомерДеталиВх==string.Empty) return;
string[] NumberDet0=НомерДеталиВх.Split(',');
for (int i=0;i<NumberDet0.Length;i++)
{
var Pin=HostFB.OutputGroup.GetPin("НомерДетВых"+(i+1)).TreePinHlp;
Pin.AddAssignValueTask(NumberDet0[i],null);
}
}
Спасибо!
Он тоже будет работать, если его еще доработать.
Он не обнуляет выхода скрипта, при уменьшении входной строки.
Оставил свой вариант, он для меня попроще, я пока только учу С#
Благодарю за помощь!
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot