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

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

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

edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

дело в том что туда записываются изменения сделанные в cmInit или во время работы фейса.
Поэтому их лучше убрать (с сохранением структуры для тех объектов что не убираете).
Опять же потом разработчик может убрать какие то объекты - зачем вам потом заострять на них внимание.
Что касается пропадания поля, то скорей всего рес с вашей докомпиляцией подключен с приоритетом больше чем у конфигурационного файла.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение 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.
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение savov »

edward_K писал(а):Что касается самого конфигуратора то уже пишу раз 10. Я всегда выгружаю в скрипт cnf, убираю мусор и компилю vip-ом после vip в один и тот же рес.
Какая запись должна быть в проекте?
#make ".cnf"?
У меня орет на cnf. что выход за границу коллекции и падает с рантаймом
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

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

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

Сообщение 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:
Изображение,
что естественно, поскольку в момент инициализации интерфейса "не определена текущая область ввода и корневая таблица" (цитата из доки). Вопрос: что делать, чтобы вновь добавленное поле заполнилось правильно?
savov
Местный житель
Сообщения: 589
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж ОАО Верофарм. Воронеж

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

Сообщение 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.
Может поможет
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

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

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

Сообщение zna »

BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

zna писал(а):
BlazeBio писал(а): zna, а для чего вы присваиваете basedoc.nrec переменной ZakNar?
Для простоты изложения проблемы. В рабочем коде это поле будет заполняться наименованием присоединённого производственного заказа.
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? Потому что сейчас в вашем коде берётся первый попавшийся nrec из таблицы basedoc и просто переприсваивается значение поля ZakNar.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

Да, всё, дошло до жирафа.. :grin:

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

create view
  var BaseDocNrec : comp;
      MyFieldNum :   longint;
  (ZakNar) as basedoc.nrec
  from mnplan, basedoc
;
Cпасибо, savov, +1
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

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

Сообщение zna »

BlazeBio писал(а): ...
Так мб вам просто обработать присваение значения полю через функцию, которая возвращает значение в select? ...
Поподробней чуток можно идею описать?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

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

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

Сообщение zna »

Cпасибо BlazeBio, всё понятно, +1 :)
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

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

Сообщение Алексей »

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

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

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

Сообщение zna »

Ширина колонки устанавливается параметром

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

cfsSetProp ( Field_Nom, cfpDefWidth, word(12));  
Ответить