Пишеться собственный анализатор данных из архивов.
Для этого надо вычитывать данные из архива на локальном компьютере, и потом самим их интрепретировать. Запросы идут по времени (больше такого то и меньше такого то, по названию ОРС и даже иногда по значению записи)
Я никогда не работал с вашими компонентами работы с архивами, и у меня проблема с документацией. Но это пол беды.
Основная проблема состоит в том, что для отладки сего приложения нужно создать большую базу значений, а они как выесняеться не пишуться в архив если не пришли через деконт, а были просто записаны с локальной машины (_user_item->WriteToItemA(val);)
1. Дайте пожалуйста документацию по компонентам билдера для работы с архивами (лучьше с примерами).
2. Есть какие нибудь средства наполнить архив фиктивными данными?
Работа с архивами
товарищи!
не молчите.
метод научного тыка для ваших компонентов не срабатывает!!!
скажите что мне делать!!
завтра срок сдачи!
Ладно, хрен с ними с фиктивными данными.
Как мне считать всю информацию об объекта с названием N1 из архива за время от T1 до T2?
Вот так я получаю список каких то объектов:
Но там нет ни даты ни значения!
Есть название и код.
Как добраться до значения и как отправить в архив конкретный запрос я не понял.
depArcStorage позволяет сортировать по некоторым показателям, но нужных полей там все равно нет.
не молчите.
метод научного тыка для ваших компонентов не срабатывает!!!
скажите что мне делать!!
завтра срок сдачи!
Ладно, хрен с ними с фиктивными данными.
Как мне считать всю информацию об объекта с названием N1 из архива за время от T1 до T2?
Вот так я получаю список каких то объектов:
Код: Выделить всё
TdepArcPar * p = new TdepArcPar;
for(int i = 0; i < count; i++)
{
depArcStorage1->ListPar->Get_Items(i, p);
}
Но там нет ни даты ни значения!
Есть название и код.
Как добраться до значения и как отправить в архив конкретный запрос я не понял.
depArcStorage позволяет сортировать по некоторым показателям, но нужных полей там все равно нет.
Посмотрите, пожалуйста, пример
Вам потребуется загрузить архив с ftp:
http://www.dep.ru/downloads/pub/ArcComp ... -03-07.rar
В нем:
Папка depArc содержит компоненты (исходные тексты для среды Delphi 7), которые требуется инсталировать в Delphi 7.
Папка Help содержит файл помощи, в котором есть описание API доступа к хранилищу(пока неполное).
Папка Example1 содержит пример работы с данными компонентами.
Вам потребуется загрузить архив с ftp:
http://www.dep.ru/downloads/pub/ArcComp ... -03-07.rar
В нем:
Папка depArc содержит компоненты (исходные тексты для среды Delphi 7), которые требуется инсталировать в Delphi 7.
Папка Help содержит файл помощи, в котором есть описание API доступа к хранилищу(пока неполное).
Папка Example1 содержит пример работы с данными компонентами.
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150
Компоненты можно собрать как для среды программирования Delphi, так и C++Builder. Пример надо переписывать для С++Builder`а. Как только перепишем - выложим на фтп. Вообще ОО Паскаль не сложнее С++, если захотеть - то во всем можно разобраться.
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150
Ещё один вопрос по старой теме.
Более предметный.
Я знаю, что это не правильно, объясните мне как сделать правильно.
Нужно для вычитываемых данных узнать код.
Ну то есть провести связь между данным и параметром.
Как мне узнать что это за параметр из архива я рассматриваю, итерируясь по depArcPeriodicAnalogViewRead->Items[i]?
Более предметный.
Код: Выделить всё
_di_IdepArcListViewGroupRefParRead list_ref_par =
depArcPeriodicAnalogViewRead->ListViewGroupRefParRead;
int count_row = depArcPeriodicAnalogViewRead->Count;
for(int i = 0; i < count_row; i++)
{
TdepArcPar * par;
Storage->ListPar->FindById(
list_ref_par->Items[i]->IdPar
, par);
String name = par->Code;
TDateTime time = depArcPeriodicAnalogViewRead->Items[i]->DateTime;
double value = depArcPeriodicAnalogViewRead->Items[i]->DataRecord->Value;
}
Я знаю, что это не правильно, объясните мне как сделать правильно.
Нужно для вычитываемых данных узнать код.
Ну то есть провести связь между данным и параметром.
Как мне узнать что это за параметр из архива я рассматриваю, итерируясь по depArcPeriodicAnalogViewRead->Items[i]?
Стоит ли предположить, что они идут таблицей?
то есть
в данном случае будет работать?
Как, как мне провести связь между значением и параметром?
то есть
Код: Выделить всё
int par_index = i - list_ref_par->Count * ( i/list_ref_par->Count);
Storage->ListPar->FindById(
list_ref_par->Items[par_index]->IdPar
, par);
в данном случае будет работать?
Как, как мне провести связь между значением и параметром?
Да, тут не все так тривиально.
У класса TdepArcPeriodicAnalogViewRead есть интерфейс
_di_IdepArcListViewGroupRefParRead, который после вычитывания данных из хранилища представляет собой как бы группу ссылок на запрошенные параметры, с указанием есть ли для каждого параметра данные в выборке. У каждого элемента TdepArcViewGroupRefParRead из _di_IdepArcListViewGroupRefParRead есть поле IndexDataColumn типа int, которое указывает позицию в массиве TdepArcPeriodicAnalogDataRecord. Если IndexDataColumn равно -1, то для праметра в выборке нет данных.
Пример, который был ранее написан для Delphi недавно был написан также и для C++Builder. (http://www.dep.ru/downloads/pub/depArc_11-01-08.rar)
Из примера:
У класса TdepArcPeriodicAnalogViewRead есть интерфейс
_di_IdepArcListViewGroupRefParRead, который после вычитывания данных из хранилища представляет собой как бы группу ссылок на запрошенные параметры, с указанием есть ли для каждого параметра данные в выборке. У каждого элемента TdepArcViewGroupRefParRead из _di_IdepArcListViewGroupRefParRead есть поле IndexDataColumn типа int, которое указывает позицию в массиве TdepArcPeriodicAnalogDataRecord. Если IndexDataColumn равно -1, то для праметра в выборке нет данных.
Пример, который был ранее написан для Delphi недавно был написан также и для C++Builder. (http://www.dep.ru/downloads/pub/depArc_11-01-08.rar)
Из примера:
Код: Выделить всё
void TForm1::ReadPeriodicAnalog(TStrings* const aStrData, const TdepArcEnumTypeArc aTypeArc,
const TDateTime aBeginDate, const TDateTime aEndDate,
const AnsiString& aNameGroup, const TdepArcEnumTypePeriod aTypePeriod,
const int aPeriod)
{
_di_IdepArcListPar list_par = Storage->ListPar;
TdepArcPeriodicAnalogViewRead* view_read = new TdepArcPeriodicAnalogViewRead(this);
view_read->Storage = Storage;
view_read->NameViewGroup = aNameGroup;
view_read->TypePeriod = aTypePeriod;
view_read->Period = aPeriod;
view_read->ReadBetweenDateTime(aBeginDate, aEndDate);
int count_row = view_read->Count;
_di_IdepArcListViewGroupRefParRead list_ref_par = view_read->ListViewGroupRefParRead;
int count_par = list_ref_par->Count;
int l = 0;
DynamicArray<TdepArcViewGroupRefParRead*> ref_par_array;
for (int i=0; i<count_par; i++) {
TdepArcViewGroupRefParRead* ref_par = list_ref_par->Items[i];
if (ref_par->IndexDataColumn == -1)
depArcFreeStruct(ref_par);
else {
l++;
ref_par_array.set_length(l);
ref_par_array[l - 1] = ref_par;
}
}
count_par = l;
AnsiString str;
for (int i=0; i<count_par; i++) {
int id_par = ref_par_array[i]->IdPar;
TdepArcPar* par;
list_par->FindById(id_par, par);
try {
if (par)
str += " " + par->Name;
else
throw Exception(AnsiString("Не найден параметр с Id = ") + IntToStr(id_par));
}
__finally {
depArcFreeStruct(par);
}
}
aStrData->Add(AnsiString(" ") + str);
str = "";
for (int i = 0; i<count_row; i++) {
TdepArcPeriodicAnalogDataRow* data_row = view_read->Items[i];
str = IntToStr(i + 1) + " " + DateTimeToStr(data_row->DateTime) + " ";
for (int j=0; j<count_par; j++) {
TdepArcViewGroupRefParRead* ref_par = ref_par_array[j];
if (ref_par->IndexDataColumn != -1) {
TdepArcPeriodicAnalogDataRecord* data_record = &data_row->DataRecord[ref_par->IndexDataColumn];
if (data_record->HasData)
str += " " + FormatFloat("000.000", data_record->Value);
else
str += " NO_DATA";
}
}
depArcFreeStruct(data_row->DataRecord);
aStrData->Add(str);
depArcFreeStruct(data_row);
}
for (int i=0; i<count_par; i++)
depArcFreeStruct(ref_par_array[i]);
delete view_read;
}
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150