Почему обнуляется переменная?

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

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

Ответить
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Почему обнуляется переменная?

Сообщение Nikos »

Добрый день. Есть такой интерфейс:

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

interface orgcube 'Сопоставление каталогов контрагентов', cyan, EscClose;
show at (,,115,50);

create view 
var
  tek_User	: string;
as select *
from KATORG, CUBEKATAL
where ((
	1		== CUBEKATAL.WTABLE
and	tek_User	== CUBEKATAL.USERNAME
and	KATORG.CORPOIN	== CUBEKATAL.ID
));

browse brCor 'Соответствие контрагентов' (,,sci1Esc);
table KATORG;
fields
  KATORG.UNN  'ИНН'		:[15];
  KATORG.NAME 'Наименование'	:[40];
  CUBEKATAL.CODE 'ИНН'		:[15],protect,pickbutton;
  CUBEKATAL.NAME 'Наименование'	:[40],protect,pickbutton;
end;

TableEvent table KATORG
  cmUpdateRecord:
  {
    update current KATORG;
  }
end;

HandleEvent
  cmpick:
  {
    case CurField of
      #CUBEKATAL.CODE, #CUBEKATAL.NAME:
      {
        RunInterface('GetCubeOrg',tek_User, KATORG.CORPOIN);
      }
    end;
  }
  cmDel:
  {
    case CurField of
      #CUBEKATAL.CODE, #CUBEKATAL.NAME:
      {
        update current KATORG set KATORG.CORPOIN := 0;
      }
    end;
  }
  cminit:
  {
    tek_User := sGetTune('USER.OWNNAME');
  }
end;
end.
Все хорошо работает до тех пор, пока не нажать на кнопку DEL. В этом случае переменная tek_User обнуляется (пустая строка). Не подскажите почему?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1. Username используйте прямо в запросе
2. для удаления нужно использовать cmDelOnProtect и в конце rescanpanel(#katorg)
3. а cube это что за прога?
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

1. Изменил вьюху:

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

create view 
var
  tek_User	: string;
as select *
from KATORG, CUBEKATAL
where ((
	1		== CUBEKATAL.WTABLE
and	sGetTune('USER.OWNNAME')	== CUBEKATAL.USERNAME
and	KATORG.CORPOIN	== CUBEKATAL.ID
));
Результата нет. Точнее tek_User теперь не обнуляется, но такое ощущение, что обнуляется sGetTune('USER.OWNNAME') - после нажатия на DEL все связи исчезают с экрана, хотя они остаются (при повторном открытии интерфейса все соответствия на месте, кроме того, на котором нажал DEL).
2. cmDelOnProtect не помогает - результат ничем не отличается
3. КУБ - сторонняя программа. Требуется организовать экспорт первичных документов из Галактики в нее.
Что еще можно попробовать? Возможно, дело в типе? KATORG.CORPOIN - это LongInt
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

а rescanpanel(#katorg) что не помогает? У вас просто проблема с прорисовкой. по идее он должен перерисоавть интерфейс аналогично переоткрытию - вы по ctrl+F4 то проверяли прежде чем заявляить, что переменная сбрасывается?
тип KATORG.CORPOIN при условии, что он совпадает с CUBEKATAL.ID или имеет достаточную длину не важен. в галке часто string вяжут с comp -и ничего работатет.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Проверял все, до чего мог додуматься. Если поставить rescanpanel(#katorg), то при нажатии DEL с экрана исчезают все связи! Причем исчезают как с вариантом
and tek_User == CUBEKATAL.USERNAME
так и с
and sGetTune('USER.OWNNAME') == CUBEKATAL.USERNAME
А переменную tek_User я выводил на экран с помощью Message - После нажатия DEL она пустая, а до нажатия нормальная.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Nikos
ReReadRecord(#katorg) пробовали?
Попробуйте еще модифицировать не сам KatOrg, а его псевдоним
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Пробовал и с ReReadRecord(#katorg) и сейчас попробовал с псевдонимом - результат не изменился.
Проблема точно не с прорисовкой. Т.к. при вызове
RunInterface('GetCubeOrg',tek_User, KATORG.CORPOIN);
в интерфейс переменная приходин нулевая, а до DEL нормальная.
Пришлось поле сделать nodel, а чистить связь через F8. В таком варианте:
cmDelete:
{
update current KATORG set KATORG.CCUBE := 0;
}
работает все нормально. Можно, конечно, оставить и так, но мне просто интересно - почему же она обнуляется!!!
Может, в синтаксисе что-то не так написал? Вот работающий вариант:

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

interface orgcube 'Сопоставление каталогов контрагентов', cyan, EscClose;
show at (,,115,50);

create view 
var
  tek_User	: string;
as select *
from KATORG, CUBEKATAL
where ((
	1		== CUBEKATAL.WTABLE
and	tek_User	== CUBEKATAL.USERNAME
and	KATORG.CORPOIN	== CUBEKATAL.ID
));

browse brCor 'Соответствие контрагентов' (,,sci138Esc);
table KATORG;
fields
  KATORG.UNN  'ИНН'		:[15],protect,nodel;
  KATORG.NAME 'Наименование'	:[40],protect,nodel;
  CUBEKATAL.CODE 'ИНН'		:[15],protect,pickbutton;
  CUBEKATAL.NAME 'Наименование'	:[40],protect,pickbutton;
end;

TableEvent table KATORG
  cmUpdateRecord:
  {
    update current KATORG;
  }
end;

HandleEvent
  cmpick:
  {
    case CurField of
      #CUBEKATAL.CODE, #CUBEKATAL.NAME:
      {
        RunInterface('GetCubeOrg',tek_User, KATORG.CORPOIN);
      }
    end;
  }
  cminit:
  {
    tek_User := sGetTune('USER.OWNNAME');
  }
  cmDelete:
  {
    update current KATORG set KATORG.CORPOIN := 0;
  }
end;
end.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

А вообще, это нормальное поведение Атлантиса - по нажатию Del заносить в поле(tek_User), на которое зацеплен классификатор (CUBEKATAL) значение по умолчанию. Чистить поле, одним словом. Только nodel в примере следует вешать на поля CUBECATAL, а не на KATORG.
А еще - использовать cmDelete для очистки поля - это как-то странно. Это ж команда удаления записи! И для Атлантиса она много значит, он ее как родную любит. Лучше пусть поле по Del чистится. Люди к этому привыкли, не нужно их сбивать с толку.
Виталий
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

Так я тоже хочу сделать, чтоб через DEL поле очищалось, понимаю, что по F8 очищать - это не совсем верно, но не получается! Если переменная и должна чиститься, то как правильно делать? В стандартных интерфейсах все красиво работает...
Вот такой вариант ближе других похож на правду:

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

interface orgcube 'Сопоставление каталогов контрагентов', cyan, EscClose;
show at (,,115,50);

create view 
var
  tek_User	: string;
as select *
from KATORG, CUBEKATAL
where ((
	1		== CUBEKATAL.WTABLE
and	tek_User	== CUBEKATAL.USERNAME
and	KATORG.CCUBE	== CUBEKATAL.ID
));

browse brCor 'Соответствие контрагентов' (,,sci13Esc);
table KATORG;
fields
  KATORG.UNN  'ИНН'		:[15],protect;
  KATORG.NAME 'Наименование'	:[40],protect;
  CUBEKATAL.CODE 'ИНН'		:[15],protect,pickbutton,nodel;
  CUBEKATAL.NAME 'Наименование'	:[40],protect,pickbutton,nodel;
end;

TableEvent table KATORG
  cmUpdateRecord:
  {
    update current KATORG;
  }
end;

HandleEvent
  cmDelOnProtect:
  {
    update current KATORG set KATORG.CCUBE := 0;
    ReReadRecord(#KATORG);
  } 
  cmpick:
  {
    case CurField of
      #CUBEKATAL.CODE, #CUBEKATAL.NAME:
      {
        RunInterface('GetCubeOrg',tek_User, KATORG.CCUBE);
      }
    end;
  }
  cminit:
  {
    tek_User := sGetTune('USER.OWNNAME');
  }
end;
end.
Но в нем DEL работает на полях таблицы KATORG, а пользователи привыкли, чтоб работало на поле с PickButton.
(что поле CORPOIN изменилось на CCUBE не имеет значение, это я добавил)
LaaLaa

Сообщение LaaLaa »

В вашем случае, наверно надо как то так:

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

interface orgcube 'Сопоставление каталогов контрагентов', cyan, EscClose;
show at (,,115,50);

create view
var
  tek_User   : string;
as select *
from KATORG, CUBEKATAL
where ((
   1      == CUBEKATAL.WTABLE
and   tek_User   == CUBEKATAL.USERNAME
and   KATORG.CCUBE   == CUBEKATAL.ID
));

browse brCor 'Соответствие контрагентов' ;
table KATORG;
fields
  KATORG.UNN  'ИНН'      (,,sci1Esc) :[15],protect,nodel;
  KATORG.NAME 'Наименование'  (,,sci1Esc) :[40],protect,nodel;
  CUBEKATAL.CODE 'ИНН'      (,,sci13Esc):[15],protect,pickbutton;
  CUBEKATAL.NAME 'Наименование'  (,,sci13Esc) :[40],protect,pickbutton;
end;

TableEvent table KATORG
  cmUpdateRecord:
  {
    update current KATORG;
  }

  cmDelOnProtect:
  {
    set KATORG.CCUBE := 0;
  }

  cmPick:
  {
    case CurField of
      #CUBEKATAL.CODE, #CUBEKATAL.NAME:
      {
        RunInterface('GetCubeOrg',tek_User, KATORG.CCUBE);
      }
    end;
  }
end;

HandleEvent
  cminit:
  {
    tek_User := sGetTune('USER.OWNNAME');
  }
end;

end.
События cmDelOnProtect и cmPick обрабатывать лучше в табличном обработчике. Кроме того, если не ошибаюсь, явная обработка cmDelOnProtect отключит стандартный системный обработчик и поле tek_User не будет автоматом обнуляться. А поле KATORG.CCUBE сохраниться в базу когда придет cmUpdateRecord.

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

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

- включить отладчик
  [DEBUG] 
    EnableVipDebugger=on
  затем
    Ctrl+Shift+F12

- когда зайдете в отладку интерфейса кнопка "окно просмотр логов"

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

Сообщение Den »

LaaLaa писал(а): ...События cmDelOnProtect и cmPick обрабатывать лучше в табличном обработчике...
cmPick вроде всегда был был интерфейсным событием ?
LaaLaa

Сообщение LaaLaa »

Den писал(а):cmPick вроде всегда был был интерфейсным событием ?
как бы да, но в табличный обработчик тоже оно приходит.
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

LaaLaa, сделал как Вы посоветовали - результата нет, переменная обнуляется.
Screw
Слесарь-системщик
Сообщения: 304
Зарегистрирован: 29 мар 2005, 17:49
Откуда: р.Беларусь, Унитарное предприятие "ТОП СОФТ"
Контактная информация:

Сообщение Screw »

Я, видимо, не совсем понял суть проблемы и, похоже, дал неверный совет. Если целью ставится запретить Атлантису автоматом чистить все поля, по которым CUBEKATAL цепляется как классификатор, то в предложенном LaaLaa примере нужно в обработчик cmDelOnProtect добавить abort (или stop - поэкспериментируйте с вариантами). Это будет для Атлантиса сигналом прервать стандартную обработку события, в результате переменная tek_user не будет очищена.
Виталий
Nikos
Местный житель
Сообщения: 577
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Томск

Сообщение Nikos »

С abort все получилось.
Всем большое спасибо за помощь!
Ответить