Страница 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
Да, всё получилось. Вот так бывает: напишешь в форум, глядишь на свой вопрос- и решение приходит
Спасибо за ответ, Дэн!
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 чистится.