Страница 1 из 1
Добавлено: 11 июл 2007, 16:13
Wisdom
Пишеться собственный анализатор данных из архивов.
Для этого надо вычитывать данные из архива на локальном компьютере, и потом самим их интрепретировать. Запросы идут по времени (больше такого то и меньше такого то, по названию ОРС и даже иногда по значению записи)
Я никогда не работал с вашими компонентами работы с архивами, и у меня проблема с документацией. Но это пол беды.
Основная проблема состоит в том, что для отладки сего приложения нужно создать большую базу значений, а они как выесняеться не пишуться в архив если не пришли через деконт, а были просто записаны с локальной машины (_user_item->WriteToItemA(val);)
1. Дайте пожалуйста документацию по компонентам билдера для работы с архивами (лучьше с примерами).
2. Есть какие нибудь средства наполнить архив фиктивными данными?
Добавлено: 13 июл 2007, 13:35
Wisdom
товарищи!
не молчите.
метод научного тыка для ваших компонентов не срабатывает!!!
скажите что мне делать!!
завтра срок сдачи!
Ладно, хрен с ними с фиктивными данными.
Как мне считать всю информацию об объекта с названием N1 из архива за время от T1 до T2?
Вот так я получаю список каких то объектов:
Код: Выделить всё
TdepArcPar * p = new TdepArcPar;
for(int i = 0; i < count; i++)
{
depArcStorage1->ListPar->Get_Items(i, p);
}
Но там нет ни даты ни значения!
Есть название и код.
Как добраться до значения и как отправить в архив конкретный запрос я не понял.
depArcStorage позволяет сортировать по некоторым показателям, но нужных полей там все равно нет.
Добавлено: 13 июл 2007, 17:21
Dino
Посмотрите, пожалуйста, пример
Вам потребуется загрузить архив с ftp:
http://www.dep.ru/downloads/pub/ArcComp ... -03-07.rar
В нем:
Папка depArc содержит компоненты (исходные тексты для среды Delphi 7), которые требуется инсталировать в Delphi 7.
Папка Help содержит файл помощи, в котором есть описание API доступа к хранилищу(пока неполное).
Папка Example1 содержит пример работы с данными компонентами.
Добавлено: 16 июл 2007, 18:31
Wisdom
ой как сложно.....
будем разбираться.
Добавлено: 17 июл 2007, 07:47
Сергей
А почему только для DELPHI? ведь ваши компоненты разоаботаны для CBuilder? нельзя ли пример выложить и на CBulder?
Добавлено: 17 июл 2007, 10:34
Dino
Компоненты можно собрать как для среды программирования Delphi, так и C++Builder. Пример надо переписывать для С++Builder`а. Как только перепишем - выложим на фтп. Вообще ОО Паскаль не сложнее С++, если захотеть - то во всем можно разобраться.
Добавлено: 29 май 2008, 16:28
Wisdom
Ещё один вопрос по старой теме.
Более предметный.
Код: Выделить всё
_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]?
Добавлено: 29 май 2008, 16:41
Wisdom
Стоит ли предположить, что они идут таблицей?
то есть
Код: Выделить всё
int par_index = i - list_ref_par->Count * ( i/list_ref_par->Count);
Storage->ListPar->FindById(
list_ref_par->Items[par_index]->IdPar
, par);
в данном случае будет работать?
Как, как мне провести связь между значением и параметром?
Добавлено: 02 июн 2008, 22:24
Dino
Да, тут не все так тривиально.
У класса 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;
}
Добавлено: 03 июн 2008, 13:46
Wisdom
Спасибо большое, заработало