Проблема с докомпиляцией интерфейса в 9.1

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Проблема с докомпиляцией интерфейса в 9.1

Сообщение KATZ »

Имеется докомпилированный интерфейс, добавляющий в список документов колонку с внешним атрибутом. В 8.1 всё работает "на ура". Пробую перенести его в 9.1: компилируется нормально, но при запуске вылетает по рантайму. Проблемная функция cfsCreateObject, падает на ней. Причем когда вызываю ее в режиме проверки (4-ый параметр == TRUE), то всё хорошо, возвращает 0. Тут же следом вызываю в режиме создания (с параметром FALSE) - и конец.

Версия 9.1 свежая, патчи почти последние. Кто-нибудь сталкивался с подобным? Проблема в программе или в моих неумелых руках?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение Den »

а других alter со вставкой посредством cfsCreateObject работают ?
Можно попробовать встроенным конфигуратором сделать такое поле внешнего атрибута и посмотреть в designer-е массив свойств у созданного объекта и сравнить с тем что в коде alter присваивается .
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение Алексей »

мы на 9-ку НЕ переходили, но я собирал альтеры, проверял, готовился к переходу. вроде ничего не падало.
может действительно со свойствами перемудрили?
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение KATZ »

Den писал(а):а других alter со вставкой посредством cfsCreateObject работают ?
Можно попробовать встроенным конфигуратором сделать такое поле внешнего атрибута и посмотреть в designer-е массив свойств у созданного объекта и сравнить с тем что в коде alter присваивается .
У меня только в одном интерфейсе колонка добавляется, в остальных докомпилируются обработчики событий, там cfsCreateObject не требуется. До модификации свойств дело не доходит, т. к. объект не получается создать.

Сделать через конфигуратор попробовал сразу же, как докомпиляция обломилась. Колонка нормально создается, имена и типы остались те же, что в 8.1.

На днях атлантис обновился до 5.5.17, может, с ним получится.
LaaLaa

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение LaaLaa »

KATZ писал(а):...докомпилированный интерфейс, добавляющий в список документов колонку с внешним атрибутом...при запуске вылетает по рантайму...проблемная функция cfsCreateObject...
Что конкретно передаете в cfsCreateObject в качестве пераметра. По идее там должен быть NREC атрибута. И в БД такой NREC тоже должен быть иначе не произойдет добавление колонки.
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение KATZ »

LaaLaa писал(а):Что конкретно передаете в cfsCreateObject в качестве пераметра. По идее там должен быть NREC атрибута. И в БД такой NREC тоже должен быть иначе не произойдет добавление колонки.
Передается NREC, как и положено. В конфигураторе вручную добавил колонку, выгрузил скрипт, проверил - всё совпадает. Атрибут в БД, естественно, есть. В 8.1 код работает. Свежий атлантис ничего не изменил.

Вот, собственно, исходник. Оставил минимум + добавил пояснения и отладочные сообщения. Суть - вставить колонку со строковым атрибутом в список договоров. Если кто-нибудь найдет время у себя попробовать и указать мне на ошибки, то достаточно будет только NREC атрибута сменить на реальный.

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

#component "L_DOGOVOR"

alter interface DOGOVOR;
HandleEvent
cmInit:
{
  Inherited::HandleEvent(cmInit);
  var lStatus, lMyObject: longint;
  lStatus:=cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' функции cfsSetCurrentContainer.', Error+OKButton);
    exit;
  }
  lStatus:=cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'ExtAttr: DOGOVOR1,4612070754798193775', TRUE, lMyObject);
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' пробной функции cfsCreateObject.', Error+OKButton);
    exit;
  }
  Message('Перед созданием.', 0); // это сообщение еще есть
  lStatus:=cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'ExtAttr: DOGOVOR1,4612070754798193775', FALSE, lMyObject);
  Message('После создания.', 0);  // этого сообщения уже нет
  if (lStatus<>0)
  {
    Message('Ошибка '+String(lStatus)+' функции cfsCreateObject.', Error+OKButton);
    exit;
  }
  /*
  Настройка свойств нового объекта, до которой дело не доходит
  */
}
end;
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение edward_K »

1.
Вместо
lStatus:=cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
лучше использовать
lStatus:=cfsSetCurrentContainer(cfsGetCurrentContainerSelf)
2.
Я предпочитаю для атрибутов вставлять вычисляемые поля - их можно по наименованию юзать.
Да и то - вставку для них длеать через cnf скрипт.

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

//===========================
(local_propis)
as select 
  piExtAttr.doGetAttr(coPersons,Persons.Nrec,'Нечто') //
....
TableEvent Table ??????;
  cmExprFieldChanged :
  { inherited :: handleEvent (cmExprFieldChanged); 
    case curfield of
    #local_propis:
    { piExtAttr.doSetAttr(coPersons,Persons.Nrec,'Нечто',double(ExprFieldValue))
    }
    end;
 }
end;

Есть объект для отображения и выбора списочного атрибута.
С датой чуть сложнее - чтобы не зависеть от региональных настроек делаю так StrToDate(TRIM(REPLACE(ExprFieldValue,'/','.')),'DD.MM.YYYY')
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение KATZ »

edward_K
Замечания полезные, но хотелось бы в имеющемся коде ошибку найти. Либо получить подтверждение от независимого эксперта, что это ошибка не моя, а "Галактики".

Может, кто-нибудь потратит 10-15 минут и попробует скомпилировать и запустить у себя на 9.1?
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение Den »

KATZ победил проблему или удалось выяснить ее причины ?
пробую аналогичный вариант на 5.5.17.0 - точь в точь такая же ситуация как у тебя...на 5,4,44 все ок без рантайма
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение KATZ »

Den писал(а):KATZ победил проблему или удалось выяснить ее причины ?
пробую аналогичный вариант на 5.5.17.0 - точь в точь такая же ситуация как у тебя...на 5,4,44 все ок без рантайма
Нет, не победил. При каждом обновлении L_Dogovor докомпилирую обработчик событий, а потом к результату добавляю колонку вручную через конфигуратор. Свежий атлантис 5.5.18 ничего не изменил.

И причины выяснить не удалось. Источник рантайма, понятное дело, - не код на VIPе, а EXE/DLL, причины в них только разработчики могут найти. А разработчик один раз отметился в теме банальным советом и более интереса не проявлял.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение edward_K »

Ну зачем же вручную - можно же раз добавить и выгрузить в скрипт. Собирать нужно в один рес - сначала докомпиляцию, потом cnf.
Глупый вопрос - а собираете точно на рабочей базе и том же exe? Просто если нет, то и раньше были проблемы при сборке без внешнего атрибута. А вообще поскольку у меня клиентов много, то я за добавление путем, как писал выше - так я не привязываюсь к базе, и более того - не нужно следить за наличием атрибута - он сам создается, ну разве что он будет ссылочный - тогда надо его все таки проверить и создать.
Падать еще может пр сборке с vih не соответствующим ресурсам - мне приходится держать vih отдельно под каждый тип exe клиента. Попробуйте собрать только вашу докомпиляцию.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение Den »

Ясно :)
Прокатывает кажись еще через ExtendFormats. По крайней мере у меня не упало.
LaaLaa

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение LaaLaa »

Сегодня потратил 50 минут. Скомпилировал пример KATZ. Подтверждаю пример KATZ корректный, функция cfsCreateObject действительно падает.

Жаль что кроме форума в техподдержку не написали.
По ночам мне спасть хочется, а не компилировать.
А на работе у меня сейчас другой проект не могу все отслеживать.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Проблема с докомпиляцией интерфейса в 9.1

Сообщение Den »

102.132431

Кстати, если добавляешь по аналогии не в бравсе а в скрин - то все работает
Ответить