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

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 10 апр 2012, 13:31
edward_K
дело в том что туда записываются изменения сделанные в cmInit или во время работы фейса.
Поэтому их лучше убрать (с сохранением структуры для тех объектов что не убираете).
Опять же потом разработчик может убрать какие то объекты - зачем вам потом заострять на них внимание.
Что касается пропадания поля, то скорей всего рес с вашей докомпиляцией подключен с приоритетом больше чем у конфигурационного файла.

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 10 апр 2012, 13:47
savov
Вот так все заработало ( без конфигуратора)

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

 #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.

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 28 апр 2012, 17:21
savov
edward_K писал(а):Что касается самого конфигуратора то уже пишу раз 10. Я всегда выгружаю в скрипт cnf, убираю мусор и компилю vip-ом после vip в один и тот же рес.
Какая запись должна быть в проекте?
#make ".cnf"?
У меня орет на cnf. что выход за границу коллекции и падает с рантаймом

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 28 апр 2012, 19:32
edward_K
обычно такое бывает когда в одном файле несколько фейсов. Кроме того нужно убрать весь мусор, добавленный не вами.
На какой то версии атлантиса не собирался фейс договора - но вроде как уже починили.

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:18
zna
Подкину-ка я дровишек в эту познавательную тему..
"Улучшаю" интерфейс 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:
Изображение,
что естественно, поскольку в момент инициализации интерфейса "не определена текущая область ввода и корневая таблица" (цитата из доки). Вопрос: что делать, чтобы вновь добавленное поле заполнилось правильно?

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:25
savov
Рабочий код фейса, который к договору приписывает есть или нет прикрепленный файл с текстом

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

    #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: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:33
BlazeBio
zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:37
zna
BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:46
BlazeBio
zna писал(а):
BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? Потому что сейчас в вашем коде берётся первый попавшийся nrec из таблицы basedoc и просто переприсваивается значение поля ZakNar.

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:48
zna
Да, всё, дошло до жирафа.. :grin:

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

create view
  var BaseDocNrec : comp;
      MyFieldNum :   longint;
  (ZakNar) as basedoc.nrec
  from mnplan, basedoc
;
Cпасибо, savov, +1

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 16:56
zna
BlazeBio писал(а): ...
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? ...
Поподробней чуток можно идею описать?

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 25 сен 2012, 17:20
BlazeBio
Что-то вроде этого ;-)

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

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;

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 26 сен 2012, 08:30
zna
Cпасибо BlazeBio, всё понятно, +1 :)

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 09 ноя 2012, 07:30
Алексей
А есть ли какая то возможность добавить поле в браузер не в конец, а в середину?
К примеру есть 10 полей в браузере, я хочу на 4-ю позицию.
Указываю index=4 но она всё равно пишет в конец. Не хочется из-за этой мелочи ЦНФ городить... и так же не хочется прописывать индексы остальным вручную :)
хочется типа указал 4-я, а остальные поля что от 4-го индекса и дальше сами автоматом перестроились :)

ну и ширину колонки не получается задать, вроде указал DefaultWidth - а тоже не сработало...

Re: Как добавить колонку с вычисляемым полем в браузер

Добавлено: 09 ноя 2012, 08:14
zna
Ширина колонки устанавливается параметром

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

cfsSetProp ( Field_Nom, cfpDefWidth, word(12));