Докомпиляция интерфейса заявок BOOKINGS

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

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

zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Приветствую всех и прошу подсказать решение нехитрой, я думаю, проблемы. Добавил в оный интерфейс в спецификацию дополнительное поле "Наименование из сметы":

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

alter interface BOOKINGS;
Create view
var l02: longint;
    cur_obj, cont_inf, aObjType, sMc, sInfo: string;
as select * from KatMcSpec1;    // Дополнительная таблица
window win1;
cmInit:
{
 inherited::handleEvent(cmInit);// = heOk
  {
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
       {Message(''#3'Ошибка установки контейнера M_MNPLAN::BOOKINGS', Error); Exit;}
    if cfsCreateObject('TreeColumn', 'CLAIMTREE', 'sMc', False, l02) = cfErrCreateObjectError
       {Message(''#3'Ошибка создания TreeColumn', Error); Exit;}
        cfsSetProp(l02, cfpDefWidth, word(40));
        cfsSetProp(l02, cfpTitle, 'Наименование из сметы');
        cfsSetProp(l02, cfpIndex, word(8));
  }
}
cmFilterSave:     //Вызывается по Alt+B из строки спецификации заявки
{
  if(isValidNew(tnClaim)) then
    _loop Claim
      {
       sMc := 'Claim.Nrec = '+string(claim.nrec);   //Здесь непонятно, как в sMc передать nrec строки
      }
    else sInfo:=sInfo+'; Нет позиции Claim';
  rescanpanel(#claim);
  abort;
  exit;

}
end;
end;
end. 

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

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение Den »

Дак у тебя sMc, которую ты указываешь в качестве имени создаваемого объекта посредством cfsCreateObject - переменная. Ясен перец одно и тоже значение будет казать.
в логической таблице нужно для этого просто указать вычисляемое поле.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Уже понял, пробую forward- функцию смастерить
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Да, всё получилось. Вот так бывает: напишешь в форум, глядишь на свой вопрос- и решение приходит :D Изображение
Спасибо за ответ, Дэн!
Masygreen
Местный житель
Сообщения: 1089
Зарегистрирован: 04 сен 2008, 11:27
Откуда: Москва
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение Masygreen »

хороший тон, выкладывать решение ...
Время ведет!
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Решение простое: во вьюшку пишем переменную NameMcSpec, которая вычисляется через форвард- функцию

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

alter interface BOOKINGS;
function _NameMcSpec (cRec: comp): string; forward;
Create view
var l02: longint;
    cur_obj, cont_inf, aObjType, sMc, sInfo: string;
     wReturn : word;
(NameMcSpec) as select _NameMcSpec(claim.nrec), KatMcSpec1.*
from KatMcSpec1;
function _NameMcSpec  (cRec: comp): string;
  {
     _NameMcSpec := string(claim.nrec);
  }
window win1;
HandleEvent
cmInit:
{
 inherited::handleEvent(cmInit);// = heOk
  {
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
       {Message(''#3'Ошибка установки контейнера M_MNPLAN::BOOKINGS', Error); Exit;}
    if cfsCreateObject('TreeColumn', 'CLAIMTREE', 'NameMcSpec', False, l02) = cfErrCreateObjectError
       {Message(''#3'Ошибка создания TreeColumn', Error); Exit;}
...
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Ещё вопрос по этому интерфейсу: как изменить значение нового поля? Добавил в спецификацию объект TreeColumn, изменяю его, ловлю событие cmCheckField, но модификация не проходит. Сейчас имею:

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

alter interface BOOKINGS;
function _NameMcSpec (cRec: comp): string; forward;
Create view
(NameMcSpec) as select _NameMcSpec(claim.nrec), ...
function _NameMcSpec  (cRec: comp): string;
  {
     _NameMcSpec:= claim.name;
  }
window win1;
HandleEvent
cmInit:
{
 inherited::handleEvent(cmInit);
  {
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
       {Message(''#3'Ошибка установки контейнера M_MNPLAN::BOOKINGS', Error); Exit;}
    if cfsCreateObject('TreeColumn', 'CLAIMTREE', 'NameMcSpec', False, l02) = cfErrCreateObjectError then
       {Message(''#3'Ошибка создания TreeColumn', Error); Exit;}
    cfsSetProp(l02, cfpTitle, 'Примечание');
  }
}
end; //Handleevent win1
end; //Window win1
handleevent
cmCheckField:
 {
   case curfield of
     #NameMcSpec:
       {
        if isvalid(#claim) then cClaim := claim.nrec; 
        clearbuffer(#claim);
        if getfirst claim where((cClaim == claim.nrec)) = tsOk then update current claim set claim.name:= NameMcSpec; //Здесь NameMcSpec = ''
        }
   end;
 }
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение Den »

Попробуйте сделать проверку поля в панели
...

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

....
end; //Window win1
Panel specClaim table Claim;
  HandleEvent
     cmCheckField:....                           
  end;
end;
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение m0p3e »

и не забывайте, что перекрываете целиком событие!

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

handleevent
cmCheckField:
 {
   case curfield of
     #NameMcSpec:
       {
        if isvalid(#claim) then cClaim := claim.nrec; 
        clearbuffer(#claim);
        if getfirst claim where((cClaim == claim.nrec)) = tsOk then update current claim set claim.name:= NameMcSpec; //Здесь NameMcSpec = ''
        }
     else inherited::handleevent(cmCheckField);
   end;
 }
не "убивайте" обработку других полей!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение edward_K »

cmCheckField - табличное событие. Писать нужно либо в событии панели таблицы либо что правильней в TableEvent
Но вопрос - зачем вам менять руками? может лучше событие cmPick?
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Благодарю за подсказки. Перенёс обработку события в панель:

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

Panel specClaim table Claim;
HandleEvent
cmCheckField:
 {
   if inherited::handleEvent(cmCheckField) = heOk then
    {
     case curfield of
      #NameMcSpec:
       {
        if isvalid(#claim) then cClaim := claim.nrec;
        clearbuffer(#claim);
        if getfirst claim where((cClaim == claim.nrec)) = tsOk then update current claim set claim.name:= NameMcSpec;
       }
     end;
   }
 }
end;
end;
Проблема осталась: введённый текст не сохраняется в переменную NameMcSpec. Правильно ли эта переменная используется?
Смысл доработки в том, чтобы исполнитель ввёл руками текст в доп. поле и оно бы сохранилось в claim.name.
cmPick подойдёл ли для такого действия?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение edward_K »

Ну тогда вам нужно
TableEvent Table ??????????????; - основная табла спецификации
cmExprFieldChanged :
{ inherited :: handleEvent (cmExprFieldChanged);
case curfield of
#ваше_поле:
{ здесь чего то делаем с ExprFieldValue например update claim
}
end;


}
проше навернео просто claim.name вывести - но вы должны его в select проверить как оно связано со спецификацией
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Отлично, получилось через переменную ExprFieldValue! :-)
Приплюсовал.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение zna »

Ещё вопросик по Bookings, не обойдите вниманием:
открыл заявку на редактирование (интерфейс Win1), помечаю записи по Insert. Хочется считать оные записи в свою временную таблицу. Вариантов, как я понимаю, два: pick и маркер. Таблица pick вроде есть во view, но прочитать записи не получилось. Остаётся маркер, но в документации по Bookings о нём информации нет. Просьба подсказать, кто знает..
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Докомпиляция интерфейса заявок BOOKINGS

Сообщение m0p3e »

Вроде оно.

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

 cmMarkUnMark :
 {
   if (IsValid(#Pick))
   {
     delete current Pick;
   }
   else
   {
     ClearBuffer(#Pick);
     Pick.wList := cPickClaimInterf;
     Pick.cRec  := Claim.Nrec;
     insert current Pick;
   }
   RedrawCurrentAndGo(ClaimTree, true);
 }

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

cPickClaimInterf 		= 20002;  // для пометки позиций заявки
Но при закрытии окна Win1, похоже что Pick чистится.
Ответить