PDA

Просмотр полной версии : OLE - расчет полей


kzz1C
18.04.2012, 07:15
Здравствуйте! Хочу выгрузить данные расчета полей по OLE в файл, чтобы потом разобрать его в 1С. Пробую следующим образом:


ДатаДляАвтографаНачПериод а = Формат(НачПериода,"ДФ='dd.MM.yy H:mm:ss'");
ДатаДляАвтографаКонПериод а = Формат(КонПериода,"ДФ='dd.MM.yy H:mm:ss");

//запускаем процедуру waitForFieldsComputing
WorkSensor = 1;
WorkWidth = ?(
ЗначениеЗаполнено(СтрокаТ анспортноеСредство.Ширина Инструмента),
СтрокаТранспортноеСредств о.ШиринаИнструмента,
ШиринаИнструментаПоУмолча нию); //устанавливается в значение 10

Автограф.WaitForFieldsComputing(
СтрокаТранспортноеСредств о.ГрФайл,
СтрокаТранспортноеСредств о.СерийныйНомер,
ДатаДляАвтографаНачПериод а,ДатаДляАвтографаКонПери да,"GSM",WorkSensor,WorkWidth);

Автограф.TripIndex = 1; //Это важно (!!!), хотя, признаю, что и не прописано в документации... сам получил ошибку без этой строчки и воспользовался помощью главного программера...
Временный = ПолучитьИмяВременногоФайл а()+".dbf";

Попытка
Автограф.ExportListToFile(Временны й,"fields","",1,1);
ТаблицаРейсовПолей = DBFвТаблицу(Временный);
Исключение
Сообщить("Не удалось экспортировать данные: "+ОписаниеОшибки());
КонецПопытки;
прим. - коммент "Это важно (!!!)" и далее - это комментарий Самцова Константина, он раньше пробовал ответить мне на этот вопрос.

Итог этого кода - это всегда "Не удалось экспортировать данные", описание ошибки - неизвестная ошибка (описаниеошибки(), по идее, возвращает текст исключения, которое вернул Ole-объект).
Поля в папке Fields лежат в виде полигонов, все поля отмечены для расчета в окне "Расчет полей". Сам расчет полей, если его вызывать из программы Автограф, проходит в целом успешно, выгрузка в файл xls отрабатывает корректно. Если выгружать по OLE в файлы dbf, csv, txt, получаю ошибку. Рейсы у данного ТС в эти дни есть, трек проходит по полигону. Лобовое стекло протирала, по колесу пинала.
Что я делаю не так?

1. Надо ли запускать процедуру WaitForComputing перед WaitForFieldsComputing?
2. Надо ли создавать файл dbf перед тем, как выгружать туда поля?
3. Полигоны, которые я получаю путем рисования в вашем редакторе, в программе GPSMapEdit выглядят как незамкнутые контуры. Это может играть какую-то роль?

zsergey
18.04.2012, 07:35
Автограф.ExportListToFile(Временны й,"fields","",1,1);
хз, я меня все работает, пробовал так (полей нет):
Автограф.ExportListToFile(Временны й,"over_speed",,0,1) //создать dbf-файл

kzz1C
18.04.2012, 07:38
zsergey,
Спасибо за ответ, уважаемый.
У меня не работают именно "fields". И именно они, как назло, крайне нужны :(

programmer
18.04.2012, 07:49
Автограф.TripIndex = 1; //Это важно (!!!),
Это была ошибка (ложная проверка индекса рейса, который никак не относится к обр. полей), она уже исправлена. Так что TripIndex можно не задавать после WaitForFieldsComputing.



1. Надо ли запускать процедуру WaitForComputing перед WaitForFieldsComputing?
Нет



2. Надо ли создавать файл dbf перед тем, как выгружать туда поля?
Нет. Но у Вас выполняется вызов ExportListToFile(Временный,"fields","",1,1);
где
Add = 1 – добавление записей к уже существующему файлу
CreateAlways = 1 – в случае ошибки создавать пустой файл
Попробуйте так ExportListToFile(Временный,"fields","",0,1);



3. Полигоны, которые я получаю путем рисования в вашем редакторе, в программе GPSMapEdit выглядят как незамкнутые контуры. Это может играть какую-то роль?
Нет. Вообще, попробуйте для начала просто выполнить расчёт из программы.

kzz1C
18.04.2012, 08:21
programmer, спасибо. Я там написала в первом посте, расчет из программы отрабатывает корректно (если его запускать в гуи, в самом окне Автографа, не по оле). По оле он вроде тоже отрабатывает без ошибок. Исключение вызывается на процедуре ExportListToFile.

Попробовала указать 0 в параметре Add, все равно "Ошибка при вызове метода контекста (ExportListToFile): Неизвестная ошибка". Что интересно, файл тоже не создается, хотя в параметре CreateAlways я поставила 1.
Посоветуете что-нибудь?

ДатаДляАвтографаНачПериод а = Формат(НачПериода,"ДФ='dd.MM.yy H:mm:ss'");
ДатаДляАвтографаКонПериод а = Формат(КонПериода,"ДФ='dd.MM.yy H:mm:ss");

WorkSensor = 1; WorkWidth = 10;

Если Автограф = Неопределено Тогда ИнициализироватьCOMОбъект(); КонецЕсли;

Автограф.WaitForFieldsComputing(
"ООО Вектор.ini",
153508,
ДатаДляАвтографаНачПериод а,ДатаДляАвтографаКонПери да,"GSM",WorkSensor,WorkWidth);

Временный = "D:\1.dbf";
Попытка
Автограф.ExportListToFile(Временны й,"fields","",0,1);
Исключение
Сообщить("Не удалось экспортировать данные: "+ОписаниеОшибки());
КонецПопытки;

storm
18.04.2012, 09:44
kzz1C,
попробуйте в блок Исключение добавить код
Автограф.PropertyName = "Last_Error";
Сообщить(Автограф.PropertyValue);
и напишите, какое сообщение у вас выведется

zsergey
18.04.2012, 09:57
Автограф.ExportListToFile(Временны й,"fields","",0,1);
Попробуйте убрать кавычки в третьем параметре.
Вот так: Автограф.ExportListToFile(Временны й,"fields", ,0,1)
СОМ-сервер может не правльно интерпретировать эти кавычки!

kzz1C
18.04.2012, 11:45
zsergey, спасибо, убрала.


storm, "Неверный индекс рейса (0)" )) Версия Автографа - 3.4.12 (1955 билд)
Попробовала установить tripIndex в 1, получила:

Ошибка при установке значения атрибута контекста (TripIndex)
Автограф.TripIndex = 1;
по причине:
Произошла исключительная ситуация (AutoGRAPH.AutoGRAPHAutomation): Неверный индекс рейса (1)

storm
18.04.2012, 11:53
kzz1C,
Это была ошибка (ложная проверка индекса рейса, который никак не относится к обр. полей), она уже исправлена. Так что TripIndex можно не задавать после WaitForFieldsComputing.

обновитесь до последней сборки(1960 билд, поставить можно через инсталляторы), там не нужно будет задавать номер рейса
а если выставлять рейсы, то вначале надо их рассчитать функцией WaitForComputing

kzz1C
18.04.2012, 12:28
storm,спасибо, уважаемый, сейчас попробую.

Добавлено через 29 минут
все равно та же фигня.

storm,вы не могли бы, чтобы я лучше понимала, привести полный работающий листинг какогонить модуля с участием процедуры расчета полей? Если не желаете флудить в теме, можно сбросить на nastya@adeptis.ru .

storm
18.04.2012, 12:36
все равно та же фигня.
какая?

csistra
18.04.2012, 13:25
фиговая :)
П.С. сорь не удержался

kzz1C
18.04.2012, 13:51
В общем, ошибку с индексом рейса я все равно получала, даже обновившись на 3.4.12, поэтому попробовала так:

НачПериода = Дата(2011,8,23,0,0,0);
КонПериода = Дата(2011,8,31,23,59,0);

// Вставить содержимое обработчика.
ДатаДляАвтографаНачПериод а = Формат(НачПериода,"ДФ='dd.MM.yy H:mm:ss'");
ДатаДляАвтографаКонПериод а = Формат(КонПериода,"ДФ='dd.MM.yy H:mm:ss'");

WorkSensor = 1; WorkWidth = 10;

Если Автограф = Неопределено Тогда ИнициализироватьCOMОбъект(); КонецЕсли;

Автограф.WaitForComputing(
"ООО Вектор.ini",
153508,
ДатаДляАвтографаНачПериод а,ДатаДляАвтографаКонПери да,"GSM",1);

Автограф.WaitForFieldsComputing(
"ООО Вектор.ini",
153508,
ДатаДляАвтографаНачПериод а,ДатаДляАвтографаКонПери да,"GSM",WorkSensor,WorkWidth);

Временный = "D:\1.dbf"; Автограф.TripIndex = 1;
Попытка
Автограф.ExportListToFile(Временны й,"fields","",0,1);
Исключение
Автограф.PropertyName = "Last_Error";
Сообщить("Не удалось экспортировать данные: "+ОписаниеОшибки()+Символы.П + "Сообщение Автографа: "+Автограф.PropertyValue);
КонецПопытки;


Ошибка: Не указан тип или вид списка записей.

Добавлено через 6 минут
Пробую без расчета рейсов:

Автограф.WaitForFieldsComputing(
"ООО Вектор.ini",
153508,
ДатаДляАвтографаНачПериод а,ДатаДляАвтографаКонПери да,"GSM",WorkSensor,WorkWidth);

Временный = "D:\1.dbf";
Попытка
Автограф.ExportListToFile(Временны й,"fields","",0,1);
Исключение
Автограф.PropertyName = "Last_Error";
Сообщить("Не удалось экспортировать данные: "+ОписаниеОшибки()+Символы.П + "Сообщение Автографа: "+Автограф.PropertyValue);
КонецПопытки;



Ошибка: Неверный индекс рейса (0).

SK
18.04.2012, 21:15
Пример. Машинки берутся из таблицы ТС.

Процедура ОтчетПоПолям()
ТабТС.ВыбратьСтроки();

ПроцВсе=0;
ВсегоТС=0;
ОбработаноТС=0;
Ширина = 8;
ФайлВыгрузки = "D:\!\FIELDS.DBF";

ТабТС.ВыбратьСтроки();
Пока ТабТС.ПолучитьСтроку() = 1 Цикл
Если ТабТС.Метка = "+" Тогда ВсегоТС = ВсегоТС + 1; КонецЕсли;
КонецЦикла;
ТабТС.ВыбратьСтроки();
Пока ТабТС.ПолучитьСтроку() > 0 Цикл
Если ТабТС.Метка = "" Тогда Продолжить; КонецЕсли;

ТСПериодНач=Формат(ДатаЧис ло(ВыбНачПериода),"Ч(0)2.0")+"."+Формат(ДатаМесяц(ВыбНачПе иода),"Ч(0)2.0")+"."+Строка(ДатаГод(ВыбНачПери да))+" 00:00:00";
ТСПериодКон=Формат(ДатаЧис ло(ВыбКонПериода),"Ч(0)2.0")+"."+Формат(ДатаМесяц(ВыбКонПе иода),"Ч(0)2.0")+"."+Строка(ДатаГод(ВыбКонПери да))+" 23:59:59";

// AG.SetGroupIndexByFileName(ТабТС.ГрФайл );
//AG.SetCarIndexByDevice(ТабТС.СерНом);

//AG.WaitForComputing(ТабТС.ГрФайл,Таб ТС.СерНом,ТСПериодНач,ТСПе иодКон,"GSM",1);


AG.WaitForFieldsComputing(ТабТС.ГрФайл, ТабТС.СерНом,ТСПериодНач,Т ПериодКон,"GSM",Ширина,0);
AG.TripIndex = 1;


AG.ExportListToFile(ФайлВыгрузки,"fields","",1,1);



ОбработаноТС=ОбработаноТС+ 1;
Форма.Проц.Заголовок(Строк (Окр(100/ВсегоТС*ОбработаноТС,0))+" %");


КонецЦикла;
Предупреждение("ГОТОВО");

КонецПроцедуры //ОтчетПоПолям()

Процедура ЗаполнитьТаблицуТС()
// Инициализируем таблицу групп ТС
ТабГрупп.УдалитьСтроки();

// Инициализируем таблицу ТС
ТабТС.УдалитьСтроки();
ЧислоГрупп=AG.GroupsNum; //Определяем число групп ТС
Если ЧислоГрупп>0 Тогда
Для х = 1 По ЧислоГрупп Цикл

AG.GroupIndex = х; //Передаем индекс (номер) группы в АГ

ГрЧислоТС = AG.GroupCarsNum; //Определяем число ТС в группе

Если ГрЧислоТС > 0 Тогда //Если кол-во ТС в текущей группе > 0 тогда выводим ТС группы, пустую группу - не выводим

ТабГрупп.НоваяСтрока();
ТабГрупп.Группа = AG.GroupName; //Название группы ТС
Для хх = 1 По ГрЧислоТС Цикл

AG.CarIndex = хх; //Передаем индекс (номер) ТС внутри группы в АГ
ТабТС.НоваяСтрока();
ТабТС.Метка = ""; //Метка выбора - снята
ТабТС.Группа = AG.GroupName; //Название группы ТС
ТабТС.СерНом = AG.CarDevice; //Сер. номер контроллера
ТабТС.Марка = AG.CarModel; //Марка ТС
ТабТС.НомерТС = AG.CarNumber; //Гос. номер ТС
ТабТС.ГрФайл = AG.GroupFileName; //Файл группы ТС (нужен для расчета)

КонецЦикла;

КонецЕсли;

КонецЦикла;
КонецЕсли;

КонецПроцедуры // ЗаполнитьТаблицуТС()

//************************************************** ************************************************** ************************
// Предопределенная процедура ПриОткрытии()
// Инициализируем форму, таблицы и начальные значения переменных, создаем COM-объект
//************************************************** ************************************************** ************************
Процедура ПриОткрытии()
ОчиститьОкноСообщений();
Форма.ИспользоватьСлой("Основной");

//Сообщить(AG.CurrentVersion); // Текущая версия ПО «АвтоГРАФ»

Форма.ИспользоватьЗакладк (1);
AG=СоздатьОбъект("AutoGRAPH.AutoGRAPHAutomation"); // Создаем COM-объект
ddd=AG.WaitForInitializing(); // Ждем окончания инициализации объекта

НепройденныеКТ = 1; // Устанавливаем чекбокс "Показывать отчет с непройденными КТ" в положение "Да"
ВыбНачПериода = ТекущаяДата(); // Устанавливаем начальную дату отчета на начало текущего дня
ВыбКонПериода = ТекущаяДата(); // Устанавливаем конечную дату отчета на конец текущего дня

// Инициализируем таблицу групп ТС
ТабГрупп.УдалитьСтроки();
ТабГрупп.НоваяКолонка("Группа",,,,"Группа (+/-)",20,,1);

// Инициализируем таблицу ТС
ТабТС.УдалитьСтроки();
ТабТС.НоваяКолонка("Метка",,,,"Х",3,,1);
ТабТС.НоваяКолонка("Группа",,,,"Группа",20,,1);
ТабТС.НоваяКолонка("СерНом",,,,"№ АГ",8,,1);
ТабТС.НоваяКолонка("Марка",,,,"Марка/Модель",30,,1);
ТабТС.НоваяКолонка("НомерТС",,,,"Рег. № ТС",20,,1);
ТабТС.НоваяКолонка("ГрФайл",,,,"Файл группы",20,,1);

ЗаполнитьТаблицуТС(); // Заполняем таблицу ТС и групп ТС
КонецПроцедуры //ПриОткрытии

kzz1C
19.04.2012, 06:17
AG.WaitForFieldsComputing(ТабТС.ГрФайл, ТабТС.СерНом,ТCПериодНач,ТС ПериодКон,"GSM",Ширина,0);
А в документации у вас другой порядок аргументов (не Ширина,Сенсор, а Сенсор,Ширина). Впрочем, сейчас попробую.

kzz1C
04.05.2012, 09:20
нашла еще баг (ну или какую-то мою недоработку) по расчету полей - порядок действий следующий.
На одном и том же экземпляре Автографа по OLE запускаю процедуру расчета по очереди для нескольких ТС - при этом, если результаты по данному ТС отсутствуют (т.е. оно не ездило по полям), а по предыдущему были, то выгружаются результаты по предыдущему ТС. Если запускать перед каждым расчетом новый экземпляр, то выгружается пустой dbf.

programmer
04.05.2012, 09:43
kzz1C, исправим