0

Работа с базой данных

Rate216 10 лет назад в Редактор каналов обновлен 8 лет назад 0
Как в скрипте работать с базой данных? Необходимо прочитать значение канала в определенный момент времени
i:=StreamReadFromDatabase(a1,a1+m,ReadValue('КаналКомбо'),stream);

КаналКомбо привязан к выпадающему списку в котором вбит список каналов. На выходе ошибка DB_CHANNEL_NOTFOUND = 3;
В чем может быть проблема?
Добрый вечер.

i:=StreamReadFromDatabase(a1,a1+m,ReadValue('КаналКомбо'),stream);
КаналКомбо привязан к выпадающему списку в котором вбит список каналов. На выходе ошибка DB_CHANNEL_NOTFOUND = 3;
В чем может быть проблема?

Если можно текст всего скрипта пришлите, сюда или на почту.
var
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 это имя канала? На каком шаге происходит сбой?
В первом шаге пытаемся имя канала взять из выпадающего списка. Выдает ошибку 3.

Во втором шаге передаем точно такое же имя канала из строчки str2. Все работает. Только непонятно почему str2 становится равен 0;

В третьем шаге все нормально.


str1 := ReadValue('I?ai') канал привязан к выпадающему списку, тип string;
Node1.Item1 - имя канала
В первом шаге пытаемся имя канала взять из выпадающего списка. Выдает ошибку 3.

в str1 - на момент чтения из БД, точно есть имя канала? Виртуальный канал к которому привязан этот скрипт выполняется по кругу, или запускается по событию?


Во втором шаге передаем точно такое же имя канала из строчки str2. Все работает. Только непонятно почему str2 становится равен 0;

т.е. после чтения из БД переменная str2 становится равной 0?
Node1.Item1 - 3 - 30.12.1899 - 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 и т.д.

что я делаю не так?
мне требуется вычислить временной промежуток между двумя временными метаками

С уважением, Кондратенко Анатолий
Новочеркасск
День добрый, Анатолий.

При использовании 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.


Будьте добры, объясните как перед выполнением скрипта считывать последнее значение переменной "моточасы" из БД. Спасибо. 

Сервис поддержки клиентов работает на платформе UserEcho