Как добавить колонку с вычисляемым полем в браузер
Модераторы: m0p3e, edward_K, Модераторы
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить колонку с вычисляемым полем в браузер
дело в том что туда записываются изменения сделанные в cmInit или во время работы фейса.
Поэтому их лучше убрать (с сохранением структуры для тех объектов что не убираете).
Опять же потом разработчик может убрать какие то объекты - зачем вам потом заострять на них внимание.
Что касается пропадания поля, то скорей всего рес с вашей докомпиляцией подключен с приоритетом больше чем у конфигурационного файла.
Поэтому их лучше убрать (с сохранением структуры для тех объектов что не убираете).
Опять же потом разработчик может убрать какие то объекты - зачем вам потом заострять на них внимание.
Что касается пропадания поля, то скорей всего рес с вашей докомпиляцией подключен с приоритетом больше чем у конфигурационного файла.
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Как добавить колонку с вычисляемым полем в браузер
Вот так все заработало ( без конфигуратора)
Код: Выделить всё
#component 'L_DOGOVOR'
#include cfg_all.inc
const
cmShowText = 9899;
End;
Alter interface DOGOVOR;
overload end;
create view
(tt)
as select if(DocInfo.cdoc>0, 'Есть','Нет')
From Dogovor1, DocInfo
Where((root==Dogovor1.nrec and
dogovor1.nrec==docinfo.cdoc
));
var MyFieldNum : longint ;
var ifHaveText : String ;
HandleEvent
cmInit:
{
inherited::handleEvent(cmInit);
cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'tt', FALSE, MyFieldNum);
cfsSetProp ( MyFieldNum, cfpVisible,TRUE);
cfsSetProp ( MyFieldNum, cfpTitle, 'Текст');
cfsSetProp ( MyFieldNum, cfpFieldName,'tt_Текст(Текст)');
cfsSetProp ( MyFieldNum, cfpMaxLen, 18 );
cfsSetProp ( MyFieldNum, cfpProtect,true);
}
end;
end.
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Как добавить колонку с вычисляемым полем в браузер
Какая запись должна быть в проекте?edward_K писал(а):Что касается самого конфигуратора то уже пишу раз 10. Я всегда выгружаю в скрипт cnf, убираю мусор и компилю vip-ом после vip в один и тот же рес.
#make ".cnf"?
У меня орет на cnf. что выход за границу коллекции и падает с рантаймом
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Как добавить колонку с вычисляемым полем в браузер
обычно такое бывает когда в одном файле несколько фейсов. Кроме того нужно убрать весь мусор, добавленный не вами.
На какой то версии атлантиса не собирался фейс договора - но вроде как уже починили.
На какой то версии атлантиса не собирался фейс договора - но вроде как уже починили.
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Подкину-ка я дровишек в эту познавательную тему..
"Улучшаю" интерфейс L_BASEDOC::VSCHETB добавлением поля (ZakNar) в броузер BRVSCHET:
Поле добавилось нормально, но заполнилось оно nrec-ом последней записи корневой таблицы basedoc:
,
что естественно, поскольку в момент инициализации интерфейса "не определена текущая область ввода и корневая таблица" (цитата из доки). Вопрос: что делать, чтобы вновь добавленное поле заполнилось правильно?
"Улучшаю" интерфейс L_BASEDOC::VSCHETB добавлением поля (ZakNar) в броузер BRVSCHET:
Код: Выделить всё
#Component "L_BASEDOC"
#include Galnet.inc
end;
alter interface VSCHETb;
create view
var BaseDocNrec : comp;
MyFieldNum : longint;
(ZakNar) as select *, ZakNar
from mnplan, basedoc
;
HandleEvent
cmInit:
{ inherited::handleEvent(cmInit);
if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
{ Message(''#3'Ошибка установки контейнера L_BASEDOC::vschetb', Error); Exit;}
if isValidAll(tnBasedoc) then BaseDocNrec := BaseDoc.Nrec;//<-Похоже, здесь что-то не то,
else {message('Нет позиции BaseDoc!',error); exit;} //<-хотя ошибки не выдаётся
cfsCreateObject('Column', 'BRVSCHET', 'ZakNar', FALSE, MyFieldNum);
cfsSetProp ( MyFieldNum, cfpVisible,TRUE);
cfsSetProp ( MyFieldNum, cfpTitle, 'Заказ-наряд');
cfsSetProp ( MyFieldNum, cfpFieldName,'ZakNarТекст');
cfsSetProp ( MyFieldNum, cfpMaxLen, 30 );
cfsSetProp ( MyFieldNum, cfpProtect,true);
ZakNar := string(basedoc.nrec); //<-Здесь не присваивается текущий nrec
}
end;
Поле добавилось нормально, но заполнилось оно nrec-ом последней записи корневой таблицы basedoc:
,
что естественно, поскольку в момент инициализации интерфейса "не определена текущая область ввода и корневая таблица" (цитата из доки). Вопрос: что делать, чтобы вновь добавленное поле заполнилось правильно?
-
- Местный житель
- Сообщения: 589
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Воронеж ОАО Верофарм. Воронеж
Re: Как добавить колонку с вычисляемым полем в браузер
Рабочий код фейса, который к договору приписывает есть или нет прикрепленный файл с текстом
Может поможет
Код: Выделить всё
#component 'L_DOGOVOR'
#include cfg_all.inc
const
cmShowText = 9899;
End;
// Пример докомпиляции фейса с добавлением вычисляемого поля в броузер
Alter interface DOGOVOR;
overload end;
//Создаем вьюху, при этом вычисляемое поле пишем в скобках, после Select
//пишем собственно значение этого поля
create view
(tt)
// as select if(DocInfo.cdoc>0, 'Есть','Нет')
as select if((DocInfo.cdoc>0) and (not IsMemoText(tnDocinfo)), 'Есть','')
From Dogovor1, DocInfo
Where((root==Dogovor1.nrec and
dogovor1.nrec==docinfo.cdoc
));
var MyFieldNum : longint ;
var ifHaveText : String ;
HandleEvent
cmInit:
{
inherited::handleEvent(cmInit);
cfsSetCurrentContainer('L_DOGOVOR::DOGOVOR');
// Обращаем внимание, что в броузере могут быть не Column, а TreeColumn
cfsCreateObject('TreeColumn', 'BRDOGOVORSELECTMAIN', 'tt', FALSE, MyFieldNum);
// Прописываем необходимые для отображения поля свойства, лучше поглядеть их при конфигурации
cfsSetProp ( MyFieldNum, cfpVisible,TRUE);
cfsSetProp ( MyFieldNum, cfpTitle, 'Текст');
cfsSetProp ( MyFieldNum, cfpFieldName,'tt_Текст(Текст)');
cfsSetProp ( MyFieldNum, cfpMaxLen, 18 );
cfsSetProp ( MyFieldNum, cfpProtect,true);
}
end;
end.
Re: Как добавить колонку с вычисляемым полем в браузер
zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
Re: Как добавить колонку с вычисляемым полем в браузер
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? Потому что сейчас в вашем коде берётся первый попавшийся nrec из таблицы basedoc и просто переприсваивается значение поля ZakNar.zna писал(а):Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Да, всё, дошло до жирафа..
Cпасибо, savov, +1
Код: Выделить всё
create view
var BaseDocNrec : comp;
MyFieldNum : longint;
(ZakNar) as basedoc.nrec
from mnplan, basedoc
;
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Поподробней чуток можно идею описать?BlazeBio писал(а): ...
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? ...
Re: Как добавить колонку с вычисляемым полем в браузер
Что-то вроде этого
Код: Выделить всё
alter interface VSCHETb;// алтер для примера, подставите свой
var MyFieldNum:string;
//описание функции
function funcTest(basenrec : comp) : string; forward;
create view
(ZakNar)
as
funcTest(basedoc.nrec), //вызов функции
mnplan.*,basedoc.*
from mnplan, basedoc
;
//тело функции
function funcTest( basenrec : comp ) : string;
{
//ваш код
funcTest:=string('Наряд заказа');//здесь присваиваете то, что вам нужно
}
HandleEvent
cmInit:
{ inherited::handleEvent(cmInit);
if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)
{ Message(''#3'Ошибка установки контейнера L_BASEDOC::vschetb', Error); Exit;}
cfsCreateObject('Column', 'BRVSCHET', 'ZakNar', FALSE, MyFieldNum);
cfsSetProp ( MyFieldNum, cfpVisible,TRUE);
cfsSetProp ( MyFieldNum, cfpTitle, 'Заказ-наряд');
cfsSetProp ( MyFieldNum, cfpFieldName,'ZakNarТекст');
cfsSetProp ( MyFieldNum, cfpMaxLen, 30 );
cfsSetProp ( MyFieldNum, cfpProtect,true);
}
end;
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Cпасибо BlazeBio, всё понятно, +1
-
- Местный житель
- Сообщения: 2896
- Зарегистрирован: 24 июн 2005, 12:12
- Откуда: Иркутская область
Re: Как добавить колонку с вычисляемым полем в браузер
А есть ли какая то возможность добавить поле в браузер не в конец, а в середину?
К примеру есть 10 полей в браузере, я хочу на 4-ю позицию.
Указываю index=4 но она всё равно пишет в конец. Не хочется из-за этой мелочи ЦНФ городить... и так же не хочется прописывать индексы остальным вручную
хочется типа указал 4-я, а остальные поля что от 4-го индекса и дальше сами автоматом перестроились
ну и ширину колонки не получается задать, вроде указал DefaultWidth - а тоже не сработало...
К примеру есть 10 полей в браузере, я хочу на 4-ю позицию.
Указываю index=4 но она всё равно пишет в конец. Не хочется из-за этой мелочи ЦНФ городить... и так же не хочется прописывать индексы остальным вручную
хочется типа указал 4-я, а остальные поля что от 4-го индекса и дальше сами автоматом перестроились
ну и ширину колонки не получается задать, вроде указал DefaultWidth - а тоже не сработало...
-
- Местный житель
- Сообщения: 552
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Челябинск
- Контактная информация:
Re: Как добавить колонку с вычисляемым полем в браузер
Ширина колонки устанавливается параметром
Код: Выделить всё
cfsSetProp ( Field_Nom, cfpDefWidth, word(12));