Страница 1 из 2

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

Добавлено: 05 ноя 2013, 16:22
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 строки вывести?
Изображение

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

Добавлено: 05 ноя 2013, 17:02
Den
Дак у тебя sMc, которую ты указываешь в качестве имени создаваемого объекта посредством cfsCreateObject - переменная. Ясен перец одно и тоже значение будет казать.
в логической таблице нужно для этого просто указать вычисляемое поле.

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

Добавлено: 05 ноя 2013, 17:13
zna
Уже понял, пробую forward- функцию смастерить

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

Добавлено: 05 ноя 2013, 17:26
zna
Да, всё получилось. Вот так бывает: напишешь в форум, глядишь на свой вопрос- и решение приходит :D Изображение
Спасибо за ответ, Дэн!

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

Добавлено: 06 ноя 2013, 11:38
Masygreen
хороший тон, выкладывать решение ...

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

Добавлено: 06 ноя 2013, 13:59
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;}
...

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

Добавлено: 13 мар 2014, 10:52
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;
 }

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

Добавлено: 13 мар 2014, 11:43
Den
Попробуйте сделать проверку поля в панели
...

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

....
end; //Window win1
Panel specClaim table Claim;
  HandleEvent
     cmCheckField:....                           
  end;
end;

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

Добавлено: 13 мар 2014, 12:04
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;
 }
не "убивайте" обработку других полей!

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

Добавлено: 13 мар 2014, 12:16
edward_K
cmCheckField - табличное событие. Писать нужно либо в событии панели таблицы либо что правильней в TableEvent
Но вопрос - зачем вам менять руками? может лучше событие cmPick?

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

Добавлено: 13 мар 2014, 13:24
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 подойдёл ли для такого действия?

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

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


}
проше навернео просто claim.name вывести - но вы должны его в select проверить как оно связано со спецификацией

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

Добавлено: 13 мар 2014, 14:16
zna
Отлично, получилось через переменную ExprFieldValue! :-)
Приплюсовал.

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

Добавлено: 07 апр 2014, 16:31
zna
Ещё вопросик по Bookings, не обойдите вниманием:
открыл заявку на редактирование (интерфейс Win1), помечаю записи по Insert. Хочется считать оные записи в свою временную таблицу. Вариантов, как я понимаю, два: pick и маркер. Таблица pick вроде есть во view, но прочитать записи не получилось. Остаётся маркер, но в документации по Bookings о нём информации нет. Просьба подсказать, кто знает..

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

Добавлено: 07 апр 2014, 17:41
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 чистится.