
0
Работа с базой данных
Как в скрипте работать с базой данных? Необходимо прочитать значение канала в определенный момент времени
Сервис поддержки клиентов работает на платформе UserEcho
Сервис поддержки клиентов работает на платформе UserEcho
КаналКомбо привязан к выпадающему списку в котором вбит список каналов. На выходе ошибка DB_CHANNEL_NOTFOUND = 3;
В чем может быть проблема?
Если можно текст всего скрипта пришлите, сюда или на почту.
time:TDateTime;
stream: TMemoryStream;
val:double;
i:word;
str1,str2:string;
Begin
str1:=ReadValue('I?ai');
str2:='Node1.Item1';
stream := TMemoryStream.create;
i:=StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'),str1,stream);
GetValueFromStream(stream,time,val);
SaveToTxtFile('c:\test.txt',str1+' - '+inttostr(i)+' - '+DateTimeToStr(time)+' - '+FloatToStr(val));
stream.free;
stream := TMemoryStream.create;
i:=StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'),str2,stream);
GetValueFromStream(stream,time,val);
SaveToTxtFile('c:\test.txt',str2+' - '+inttostr(i)+' - '+DateTimeToStr(time)+' - '+FloatToStr(val));
stream.free;
stream := TMemoryStream.create;
i:=StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'),'Node1.Item1',stream);
GetValueFromStream(stream,time,val);
SaveToTxtFile('c:\test.txt',inttostr(i)+' - '+DateTimeToStr(time)+' - '+FloatToStr(val));
stream.free;
end.
Node1.Item1 - 3 - 30.12.1899 - 0
0 - 0 - 30.07.2014 14:40:00 - 39
0 - 30.07.2014 14:40:00 - 39
Последние две строчки нормальные. Только str2 почему-то 0
Немного "приберемся" в скрипте.
var time: TDateTime; stream: TMemoryStream; val:double; i:word; str1,str2:string; begin str1 := ReadValue('I?ai'); str2 := 'Node1.Item1'; stream := TMemoryStream.create; try // шаг 1 i := StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'), str1, stream); GetValueFromStream(stream, time, val); SaveToTxtFile('c:\test.txt',str1 + ' - ' + inttostr(i) + ' - ' + DateTimeToStr(time) + ' - ' + FloatToStr(val)); // шаг 2 stream.clear; i := StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'), str2, stream); GetValueFromStream(stream, time, val); SaveToTxtFile('c:\test.txt', str2 + ' - ' + inttostr(i) + ' - ' + DateTimeToStr(time) + ' - ' + FloatToStr(val)); // шаг 3 stream.clear; i := StreamReadFromDatabase(StrToDateTime('30.07.14 14:40:00'),StrToDateTime('30.07.14 14:40:10'),'Node1.Item1',stream); GetValueFromStream(stream,time,val); SaveToTxtFile('c:\test.txt', inttostr(i) + ' - ' + DateTimeToStr(time) + ' - ' + FloatToStr(val)); finally stream.free; end; end.
Теперь давайте разбираться str1 := ReadValue('I?ai')- в str1 - имя канала? str2 := 'Node1.Item1' - Node1.Item1 это имя канала? На каком шаге происходит сбой?
Во втором шаге передаем точно такое же имя канала из строчки str2. Все работает. Только непонятно почему str2 становится равен 0;
В третьем шаге все нормально.
str1 := ReadValue('I?ai') канал привязан к выпадающему списку, тип string;
Node1.Item1 - имя канала
в str1 - на момент чтения из БД, точно есть имя канала? Виртуальный канал к которому привязан этот скрипт выполняется по кругу, или запускается по событию?
т.е. после чтения из БД переменная str2 становится равной 0?
0 - 0 - 30.07.2014 14:40:00 - 39
0 - 30.07.2014 14:40:00 - 39
Вот отладочный файл по 3 шагам
Проблему устранили, был баг при работе с StreamReadFromDatabase, имя канала нельзя было передавать в виде переменной. Исправили, в ближайшем релизе это исправление будет.
Из под скрипта доступа к калькулятору расходов к сожалению нет.
При использовании GetValueFromStream(Stream, dtDate, dValue)
не могу получить временную метку из переменной dtDate
получаю только лишь даты следующего вида:
01.01.1900
30.12.1899
14.01.1900
16.01.1900 и т.д.
что я делаю не так?
мне требуется вычислить временной промежуток между двумя временными метаками
С уважением, Кондратенко Анатолий
Новочеркасск
Пришлите текст скрипта, я посмотрю. Возможно не верно выполняете вычисления.
но кнопке вызывается этот скрипт
int StatistikaExcel(TDateTime dtBegin, TDateTime dtEnd)
{
string stroka, cellname, spisokStolb="BCDEFGHIJKLMNOPRST";
int count=0, i, iReturn=1, per=0;
int flagData=0, nomerData=1, kolData=0;
double sumData=0, dValue;
TTime beginTime, endTime;
TMemoryStream Stream;
word error;
TDateTime dtDate;
if(dtBegin>dtEnd)
{
ShowMessageBox("—", "Начальная дата больше конечной. Исправьте эту ситуацию!", 3);
return 0;
}
if(dtBegin==dtEnd)
{
ShowMessageBox("—", "Начальная дата равна конечной. Исправьте эту ситуацию!", 3);
return 0;
}
if(ReadValue("Протокол") == -2)
{
WriteValue("Протокол дата начала сигнальный",0);
WriteValue("Протокол дата конца сигнальный",0);
return 0;
}
Stream = TMemoryStream.Create;
nameCanal = "Канал с данными";
error = StreamReadFromDatabase(dtBegin, dtEnd, nameCanal, Stream);
// открываем шаблон файла и сохраняем его с именем "Протокол+текущая дата"
if(Excel.OpenTemplate("d:\\Протоколы\\protokol_1.xls") == 0)
{
nameFile = "d:\\Протоколы\\Протокол "+copy(DateTimeToStr(dtBegin),1,10)+".xls";
Excel.Save(nameFile);
Excel.Close;
}
else {error = 33;}
if((error == 0) && (Excel.OpenTemplate(nameFile) == 0))
{
Excel.Cell["B7"] = DateTimeToStr(dtBegin);
Excel.Cell["B8"] = 123;
while (GetValueFromStream(Stream, dtDate, dValue))
{
if(dValue>0)
{
// что-то с времеными метками
stroka = DateTimeToStr(dtDate);
ShowMessageBox("time", stroka, 3);
if(dValue>1) // почему-то попадаются положительные данные бесконечно малой величины
{
if(flagData==0){beginTime=dtDate;}
endTime=dtDate;
sumData=sumData+dValue;
kolData=kolData+1;
flagData=1;
}
}
else if((dValue==0)&&(flagData==1))
{
cellName = copy(spisokStolb,nomerData,1)+"12";
Excel.Cell[cellName] = sumData/kolData;
cellName = copy(spisokStolb,nomerData,1)+"13";
Excel.Cell[cellName] = TimeToStr(endTime-beginTime);
nomerData = nomerData + 1;
sumData=0;
kolData=0;
flagData=0;
}
}
Excel.Save(nameFile);
Excel.Close;
}
else { ShowMessageBox("—", "Ошибка считывания базы!", 1); iReturn=0; }
Stream.free;
WriteValue("Протокол дата начала сигнальный",0);
WriteValue("Протокол дата конца сигнальный",0);
return iReturn;
}
Ок. На первый взгляд все верно. Такое поведение наблюдается по всей базе или за какой то определенный период?
Если можно назвать ее базой
Просто для отработки скрипта сформировал виртуальый канал и записал в него кусок реального канала (где-то около пяти часов)
Ок. На почту часовой архив БД скиньте, посмотрим что внутри записано.
Скачал с сайта последнюю версию free
Теперь всё работает как надо
С уважением, Кондратенко Анатолий
Добрый день. Помогите пожалуйста разобраться. Есть скрипт, который должен считать "моточасы" и сохранять в БД:
{Pascal Script}
Var
H: Integer;
Begin
If ReadValue('Счётчик') = 5 then H := H+1;
WriteValue('Моточасы', H);
SaveValueToDB('Моточасы');
end.
Будьте добры, объясните как перед выполнением скрипта считывать последнее значение переменной "моточасы" из БД. Спасибо.