Работа с архивами

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 11 июл 2007, 16:13

Пишеться собственный анализатор данных из архивов.
Для этого надо вычитывать данные из архива на локальном компьютере, и потом самим их интрепретировать. Запросы идут по времени (больше такого то и меньше такого то, по названию ОРС и даже иногда по значению записи)
Я никогда не работал с вашими компонентами работы с архивами, и у меня проблема с документацией. Но это пол беды.

Основная проблема состоит в том, что для отладки сего приложения нужно создать большую базу значений, а они как выесняеться не пишуться в архив если не пришли через деконт, а были просто записаны с локальной машины (_user_item->WriteToItemA(val);)

1. Дайте пожалуйста документацию по компонентам билдера для работы с архивами (лучьше с примерами).

2. Есть какие нибудь средства наполнить архив фиктивными данными?

Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 13 июл 2007, 13:35

товарищи!
не молчите.
метод научного тыка для ваших компонентов не срабатывает!!!

скажите что мне делать!!
завтра срок сдачи!

Ладно, хрен с ними с фиктивными данными.
Как мне считать всю информацию об объекта с названием N1 из архива за время от T1 до T2?

Вот так я получаю список каких то объектов:

Код: Выделить всё

TdepArcPar * p = new TdepArcPar;
for(int i = 0; i < count; i++)
{
      depArcStorage1->ListPar->Get_Items(i, p);
}

Но там нет ни даты ни значения!
Есть название и код.

Как добраться до значения и как отправить в архив конкретный запрос я не понял.
depArcStorage позволяет сортировать по некоторым показателям, но нужных полей там все равно нет.

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 13 июл 2007, 17:21

Посмотрите, пожалуйста, пример

Вам потребуется загрузить архив с ftp:
http://www.dep.ru/downloads/pub/ArcComp ... -03-07.rar

В нем:
Папка depArc содержит компоненты (исходные тексты для среды Delphi 7), которые требуется инсталировать в Delphi 7.
Папка Help содержит файл помощи, в котором есть описание API доступа к хранилищу(пока неполное).
Папка Example1 содержит пример работы с данными компонентами.
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150

Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 16 июл 2007, 18:31

ой как сложно.....
будем разбираться.

Сергей
Сообщения: 57
Зарегистрирован: 21 дек 2005, 15:43
Откуда: Ростов-на-Дону

Сообщение Сергей » 17 июл 2007, 07:47

А почему только для DELPHI? ведь ваши компоненты разоаботаны для CBuilder? нельзя ли пример выложить и на CBulder?

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 17 июл 2007, 10:34

Компоненты можно собрать как для среды программирования Delphi, так и C++Builder. Пример надо переписывать для С++Builder`а. Как только перепишем - выложим на фтп. Вообще ОО Паскаль не сложнее С++, если захотеть - то во всем можно разобраться.
С уважением Климов Александр

Компания ДЭП

г. Москва

(495) 995-00-12 доб. 150

Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 29 май 2008, 16:28

Ещё один вопрос по старой теме.
Более предметный.

Код: Выделить всё

_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]?

Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 29 май 2008, 16:41

Стоит ли предположить, что они идут таблицей?
то есть

Код: Выделить всё

           int par_index = i - list_ref_par->Count * ( i/list_ref_par->Count);
           Storage->ListPar->FindById(
                   list_ref_par->Items[par_index]->IdPar
                   , par);

в данном случае будет работать?

Как, как мне провести связь между значением и параметром?

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 02 июн 2008, 22:24

Да, тут не все так тривиально.
У класса 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

Аватара пользователя
Wisdom
Сообщения: 18
Зарегистрирован: 19 апр 2007, 17:18
Откуда: sigma avtomatika

Сообщение Wisdom » 03 июн 2008, 13:46

Спасибо большое, заработало