ОФИЦИАЛЬНЫЙ ФОРУМ ГРУППЫ КОМПАНИЙ «ТЕХНОКОМ»

ОФИЦИАЛЬНЫЙ ФОРУМ ГРУППЫ КОМПАНИЙ «ТЕХНОКОМ» (http://forum.tk-chel.ru/index.php)
-   Система «АвтоГРАФ»: Программное обеспечение (http://forum.tk-chel.ru/forumdisplay.php?f=4)
-   -   OLE - расчет полей (http://forum.tk-chel.ru/showthread.php?t=1842)

kzz1C 18.04.2012 07:15

OLE - расчет полей
 
Здравствуйте! Хочу выгрузить данные расчета полей по 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

Цитата:

Сообщение от kzz1C (Сообщение 29082)
Автограф.ExportListToFile(Временны й,"fields","",1,1);

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

kzz1C 18.04.2012 07:38

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

programmer 18.04.2012 07:49

Цитата:

Сообщение от kzz1C (Сообщение 29082)
Автограф.TripIndex = 1; //Это важно (!!!),

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



Цитата:

Сообщение от kzz1C (Сообщение 29082)
1. Надо ли запускать процедуру WaitForComputing перед WaitForFieldsComputing?

Нет



Цитата:

Сообщение от kzz1C (Сообщение 29082)
2. Надо ли создавать файл dbf перед тем, как выгружать туда поля?

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



Цитата:

Сообщение от kzz1C (Сообщение 29082)
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

Цитата:

Сообщение от kzz1C (Сообщение 29088)
Автограф.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,
Цитата:

Сообщение от programmer (Сообщение 29085)
Это была ошибка (ложная проверка индекса рейса, который никак не относится к обр. полей), она уже исправлена. Так что TripIndex можно не задавать после WaitForFieldsComputing.

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

kzz1C 18.04.2012 12:28

storm,спасибо, уважаемый, сейчас попробую.

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

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

storm 18.04.2012 12:36

Цитата:

Сообщение от kzz1C (Сообщение 29117)
все равно та же фигня.

какая?

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

Цитата:

Сообщение от SK (Сообщение 29139)
AG.WaitForFieldsComputing(ТабТС.ГрФайл, ТабТС.СерНом,ТCПериодНач,ТС ПериодКон,"GSM",Ширина,0);

А в документации у вас другой порядок аргументов (не Ширина,Сенсор, а Сенсор,Ширина). Впрочем, сейчас попробую.

kzz1C 04.05.2012 09:20

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

programmer 04.05.2012 09:43

kzz1C, исправим


Текущее время: 20:36. Часовой пояс GMT.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot