Добавление переключателя pickButton для внешнего атрибута
Модераторы: m0p3e, edward_K, Модераторы
Добавление переключателя pickButton для внешнего атрибута
Здравствуйте!
В интерфейсе конфигуратором нужно добавить поле, связанное с внешним атрибутом, с переключателем pickButton (т.е., по нажатию кнопки значение должно меняться с "нет" на "да" или наоборот). Аналогичное поведение, например, в окне лицевого счёта сотрудника имеет поле "назначать аванс". Как такое сделать?
В интерфейсе конфигуратором нужно добавить поле, связанное с внешним атрибутом, с переключателем pickButton (т.е., по нажатию кнопки значение должно меняться с "нет" на "да" или наоборот). Аналогичное поведение, например, в окне лицевого счёта сотрудника имеет поле "назначать аванс". Как такое сделать?
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Добавление переключателя pickButton для внешнего атрибут
Поле то добавишь, с пимпочкой выбора. Тока 1:1 как в л/с не сделать одним лишь конфигуратором. т.к. это быстрее всего там просто вычисляемое поле в л/с
Какое то подобие можно сделать если тока атрибут ссылочный делать. Но этот вариант, если вы проволите параллель с л/с, вам судя по всему не подойдет.
Какое то подобие можно сделать если тока атрибут ссылочный делать. Но этот вариант, если вы проволите параллель с л/с, вам судя по всему не подойдет.
Re: Добавление переключателя pickButton для внешнего атрибут
Вычисляемое поле сделать можно - докомпиляцией добавить. Как с ним потом работать, как с переключателем?Den писал(а):Тока 1:1 как в л/с не сделать одним лишь конфигуратором. т.к. это быстрее всего там просто вычисляемое поле в л/с
Добавил конфигуратором вычисляемое поле: ButtonType = inWithHistory, Protect = False, Strings = "нет, да". Однако выбранное значение не запоминается.
-
- Местный житель
- Сообщения: 1844
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
- Контактная информация:
Re: Добавление переключателя pickButton для внешнего атрибут
Я думал задача конфигуратором одним извернуться ) Но тогда вообще он зачем если в докомпиляции можно все описать и код вычисления доработать. Ничего сложного же вроде
Аля :
Аля :
Код: Выделить всё
#include ExtAttr.Vih
Interface test_perekl
var oExAttr : iExtAttr;
create view
var
atr_ :comp;
as select
if( oExAttr.ValueExistsID(word(1418),Katorg.nrec,atr_) ,
if(oExAttr.SGetAttrID(word(1418),Katorg.nrec,atr_)='+','Да',
if(oExAttr.SGetAttrID(word(1418),Katorg.nrec,atr_)='-','Нет','--'
)
)
,'Не задан'
)
(fieldname=some_atr)
from katorg
;
Procedure ChangValue(Flag : string);
{
oExAttr.SSetAttrID(word(1418),Katorg.nrec,atr_,if(oExAttr.ValueExistsID(word(1418),Katorg.nrec,atr_)=False,'-',if(oExAttr.SGetAttrID(word(1418),Katorg.nrec,atr_)='+','-','+')));
}
Browse Brw1;
table katorg;
fields
katorg.name 'name' : [30],protect;
some_atr 'atribut' : [7],protect,pickbutton;
end;
HandleEvent
CmInit: atr_:=oExAttr.CreateAttr(word(1418),'_test_atr_',word(0));
CmPick:{
if curfield=#some_atr
{
ChangValue(some_atr);
ReScanPanel(curtable);
}
}
end;
end.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Добавление переключателя pickButton для внешнего атрибут
1. Для начала атрибуте должен быть числовой, а лучше переключатель - если есть.
2. При добавлении нужно указать нужный тип поля Зависимый переключатель, и указать число элементов. Ну а потом еще элементы переименовать и все.
3. Я когда не лень комбинирую - alter + cnf, поскольку без перекрытия формата попасть в нужное место для разных размеров шрифтов через функции установки свойств объекта сложновато.
2. При добавлении нужно указать нужный тип поля Зависимый переключатель, и указать число элементов. Ну а потом еще элементы переименовать и все.
3. Я когда не лень комбинирую - alter + cnf, поскольку без перекрытия формата попасть в нужное место для разных размеров шрифтов через функции установки свойств объекта сложновато.
Re: Добавление переключателя pickButton для внешнего атрибут
1. Сделал числовой.
2. Это ж радиокнопки получаются.
3. Я тоже.
2. Это ж радиокнопки получаются.
3. Я тоже.
-
- Местный житель
- Сообщения: 555
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Добавление переключателя pickButton для внешнего атрибут
Здравствуйте.
Решила написать в эту тему. Вообще о работе с ВА типа переключатель удалось мало чего найти на форуме. А надо работать именно с ВА этого типа.
Очень надеюсь на Вашу помощь.
Пишу Alter интерфейса M_UP:: NAKL502 (накладные на приход ГП).
В частности надо добавить в список НПГ новый столбец с ВА к табл.Katsopr типа переключатель. И этот же ВА добавить в режиме редактирования НПГ в верхнюю панель. Сделала это.
Все работает, если после закрытия интерфейса редактирования НПГ переходим в список НПГ, переходим к нужной НПГ, открываем ее на редактирование и меняем или нет переключатель.
Но есть проблема, когда в режиме редактирования НПГ перехожу к другой НПГ по PgUp / PgDn. В этом случае переключатель не показывает корректное состояние: состояние должно измениться, т. к. изменилась позиция НПГ и значение переключателя должно соответствовать значению ВА для измененной позиции НПГ.
Как этого добиться? Какое событие и где надо обработать, чтобы решить проблему?
Ниже исходник.
Решила написать в эту тему. Вообще о работе с ВА типа переключатель удалось мало чего найти на форуме. А надо работать именно с ВА этого типа.
Очень надеюсь на Вашу помощь.
Пишу Alter интерфейса M_UP:: NAKL502 (накладные на приход ГП).
В частности надо добавить в список НПГ новый столбец с ВА к табл.Katsopr типа переключатель. И этот же ВА добавить в режиме редактирования НПГ в верхнюю панель. Сделала это.
Все работает, если после закрытия интерфейса редактирования НПГ переходим в список НПГ, переходим к нужной НПГ, открываем ее на редактирование и меняем или нет переключатель.
Но есть проблема, когда в режиме редактирования НПГ перехожу к другой НПГ по PgUp / PgDn. В этом случае переключатель не показывает корректное состояние: состояние должно измениться, т. к. изменилась позиция НПГ и значение переключателя должно соответствовать значению ВА для измененной позиции НПГ.
Как этого добиться? Какое событие и где надо обработать, чтобы решить проблему?
Ниже исходник.
Код: Выделить всё
#Component "M_UP"
//Список НПГ:
//-Browser SELECTNAKL. В список НПГ добавление новой колонки 'Проба'
//с ВА 'Наличие пробы' типа переключатель к табл.KatSopr.
//-Интерфейс EDITSOPR - редактирование НПГ. Screen SCRHEADER.
//В верхней панели НПГ добавление PanelRadioButton с ВА 'Наличие пробы'
//к KatSopr с 2 кластерами и меткой.
Alter interface NAKL502;
Var cAttrNalPr : Comp;
var1 : iExtAttr;
aself : Longint;
cur_o, cont_i, aObjType : String;
st : Integer;
aSelf1_Pr, aSelf2_Pr : Longint;
flagCh, flagE : Boolean;
cRB : Comp;
//Получение значения ВА типа переключатель
Function GetAttrValueS( wTabl_: Word; cRec_: Comp; cAttrnam_: Comp ): Word;
Var res_ : Word;
{
res_:= 0;
If Getfirst AttrVal Where (( wTabl_ == AttrVal.Wtable and cRec_ == AttrVal.Crec and cAttrnam_ == AttrVal.cAttrNam )) = tsOk
res_:= Word( AttrVal.Vcomp );
GetAttrValueS:= res_;
} //GetAttrValueS
Create view
as select
If(( var1.ValueExistsID( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ) = False ), 'Нет'
, If( GetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr )= 1, 'Да', 'Нет' ))
( Fieldname=CheckNalPr ) // для Browse списка НПГ
, If(( var1.ValueExistsID( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ) = False ), 0
, GetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ))
( Fieldname=CheckNalPr1 ) // для редактирования НПГ
;
//Установка значения ВА типа переключатель
Function SetAttrValueS( wTabl_: Word; cRec_: Comp; cAttrnam_: Comp; cRB_: Comp ): Boolean;
Var res_ : Boolean;
{
res_:= False;
If Getfirst AttrVal Where (( wTabl_ == AttrVal.Wtable and cRec_ == AttrVal.Crec and cAttrnam_ == AttrVal.cAttrNam )) = tsOk
{
AttrVal.Vcomp:= cRB_;
If Update Current AttrVal = tsOk
res_:= True;
}
else // нет записи в AttrVal
{
ClearBuffer( #AttrVal );
AttrVal.Atl_LastDate:= Cur_Date;
AttrVal.wTable:= wTabl_;
AttrVal.cRec:= cRec_;
AttrVal.cAttrnam:=cAttrnam_;
AttrVal.vComp:= cRB_;
If Insert current AttrVal = tsOk
res_:= True;
}
SetAttrValueS:= res_;
} // func SetAttrValueS
// Изменение последовательности столбцов в списке НПГ.
Procedure ChangeObjIndex;
{
cfsSetProp( 'c_SELECTNAKL_KATPODR_SF.NAME_Из_подразделения', 'Index', Integer(6) );
cfsSetProp( 'c_SELECTNAKL_KATPODR_SI.NAME_Куда', 'Index', Integer(7) );
cfsSetProp( 'c_SELECTNAKL_KATNAZNASELECT.NAME_Назначение', 'Index', Integer(8) );
cfsSetProp( 'c_SELECTNAKL_SUM_S_Сумма', 'Index', Integer(9) );
cfsSetProp( 'c_SELECTNAKL_VALUT_S_Валюта', 'Index', Integer(10) );
cfsSetProp( 'c_SELECTNAKL_NAM_ZAKAZ_Заказ', 'Index', Integer(11) );
cfsSetProp( 'c_SELECTNAKL_SBDNOM_ДО', 'Index', Integer(12) );
cfsSetProp( 'c_SELECTNAKL_KATSOPRSELECT.NAME_Наименование', 'Index', Integer(13) );
cfsSetProp( 'c_SELECTNAKL_KATSOPRSELECT.DOPR_Дата_оприходования', 'Index', Integer(14) );
cfsSetProp( 'c_SELECTNAKL_NALPOS_Сырьё', 'Index', Integer(15) );
cfsSetProp( 'c_SELECTNAKL_П', 'Index', Integer(16) );
cfsSetProp( 'c_SELECTNAKL_IMAGEONARCHIVE_А', 'Index', Integer(17) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'Index', Integer(5) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'DefaultWidth', Integer(8) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'NoAutoSize', True );
} // proc ChangeObjIndex
// Работа с ВА в окне редактирования НПГ
Procedure CreateObjInNPG;
{
// Получить параметры объекта. 1-ый параметр - входящий, остальные - возвращаемые. Рез-т - код ошибки выполнения
st:= cfsGetObjInfo(
'SCRHEADER' , // Имя объекта, инфо о котором надо получить
cur_o , // строка с именем объекта
aself , // указатель объекта
cont_i , // имя группы, в которую вставлен объект
aObjType // имя типа объекта
);
If st = 0 // cfOk
{
// Создание и регистрация объекта.
// Пар-ры: 1 - имя типа создаваемого объекта, 2 - указатель объекта (контейнер), куда вставляется объект,
// 3 - Уникальное имя объекта, 4 - создание и регистрация объекта и вставка его в контейнер, 5 - указатель на созданный объект.
//------ Объект ВА "Наличие пробы" типа переключатель
st:= cfsCreateObject( 'PanelRadioButton', aself, 'CheckNalPr1', False, aself2_Pr );
If st = 0
{
cfsSetProp( aself2_Pr, 'Visible', True );
cfsSetProp( aself2_Pr, 'Protect', False );
cfsSetProp( aself2_Pr, 'Skip', False );
cfsSetProp( aself2_Pr, 'HelpLine', 'Наличие пробы' );
cfsSetProp( aself2_Pr, 'Left', 14 );
cfsSetProp( aself2_Pr, 'Top', 11.5 );
cfsSetProp( aself2_Pr, 'Width', 7.8 );
cfsSetProp( aself2_Pr, 'Height', 1 );
flagCh:= If( CheckNalPr1=0, False, True );
st:= cfsCreateObject( 'ClusterItem', aself2_Pr, 'ci_'
+ 'CheckNalPr1' + '_New_Cluster_Item_1', False, aself1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Нет' );
cfsSetProp( aself1_Pr, 'Visible', True );
cfsSetProp( aself1_Pr, 'Skip', False );
cfsSetProp( aself1_Pr, 'Index', 0 );
cfsSetProp( aself1_Pr, 'DataIndex', 0 );
cfsSetProp( aself1_Pr, 'Checked', flagCh );
cfsSetProp( aself1_Pr, 'ModifiedState', False );
}
st:= cfsCreateObject( 'ClusterItem', aself2_Pr, 'ci_'
+ 'CheckNalPr1' + '_New_Cluster_Item_2', False, aself1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Да' );
cfsSetProp( aself1_Pr, 'Visible', True );
cfsSetProp( aself1_Pr, 'Skip', False );
cfsSetProp( aself1_Pr, 'Index', 1 );
cfsSetProp( aself1_Pr, 'DataIndex', 1 );
cfsSetProp( aself1_Pr, 'Checked', not flagCh );
cfsSetProp( aself1_Pr, 'ModifiedState', False );
}
}
// метка и ее св-ва
st:= cfsCreateObject ( 'label', aself, 'lbCheckNalPr1', False, aSelf1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Наличие пробы' );
cfsSetProp( aself1_Pr, 'Left', 1 );
cfsSetProp( aself1_Pr, 'Top', 12 );
cfsSetProp( aself1_Pr, 'Width', 13 );
cfsSetProp( aself1_Pr, 'Height', 1 );
}
} // cfOk
} // proc CreateObjInNPG
ExtendFormats SELECTNAKL;
Browse SELECTNAKL;
Table KATSOPRSELECT;
Fields
CheckNalPr 'Проба' :[ 8 ], Protect, Skip;
end;
TableEvent
Table KATSOPRSELECT;
cmPositionChanged:
{
// Message( 'cmPositionChanged' ); //попадаю сюда
Inherited::HandleEvent( cmPositionChanged );
RescanPanel( #KATSOPRSELECT );
} // cmPositionChanged
end; // TableEvent
Window EDITSOPR EscClose;
HandleEvent // window
cmInit:
{
Case Inherited::HandleEvent( cmInit ) of
heAbort : Abort;
heStop : Exit;
end;
} // cmInit
end; // HandleEvent
end; // window
HandleEvent // for interface
cmInit :
{
// Message('cmInit'); //не попадаю сюда
Case Inherited::HandleEvent( cmInit ) of
heAbort : Abort;
heStop : Exit;
end;
} // cmInit
cmOnVipLoad:
{
flagE:= False;
cAttrNalPr:= var1.AttrID( coKatSopr, 'Наличие пробы' ); // Nrec ВА к KatSopr
//Message( 'cmOnVipLoad' ); // попадаю сюда
If Inherited:: HandleEvent( cmOnVipLoad ) != heOk then
{
Abort;
Exit;
}
ChangeObjIndex;
CreateObjInNPG;
} // cmOnVipLoad
cmCheckField:
{
//Message( 'cmCheckField' ); // попадаю сюда
Case CurField of
#CheckNalPr1:
{
//нужна эта проверка, иначе при 1-ом открытии списка НПГ у текущей
//записи меняется значение ВА
If flagE = False
flagE:= True
else
{
cRB:= If( CheckNalPr1 = 0, Comp( 1 ), Comp( 0 ) );
If SetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr, cRB ) {}
Set CheckNalPr1;
RescanPanel( #KatSoprSelect );
}
}
end; // case
} // cmCheckField
end; // HandleEvent for interface
end. // interface
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Добавление переключателя pickButton для внешнего атрибут
В режиме редактирования у вас таблица KatSopr - по ней и нужно тянуть переключатель.
Чем вас не устраивают стандартные функции? по работе с ВА?
я обычно юзаю так
word(doGetAttrID( ... )) (Fieldname = )
Comp не есть хорошо - это все таки ссылочный атрибут на какой нибудь справочник.
Найдите в frm
C_ExtClass\vip\ExtAttrClass\ExtAttrClassInfo.vih
-обратите внимание, что объект static
Можно сделать так любой объект, только если хотите чтобы он по Ctrl+F4 вызвался или в фасте через compilevip то нужно еще в событие старта галактики добавить регистрацию.
Чем вас не устраивают стандартные функции? по работе с ВА?
я обычно юзаю так
word(doGetAttrID( ... )) (Fieldname = )
Comp не есть хорошо - это все таки ссылочный атрибут на какой нибудь справочник.
Найдите в frm
C_ExtClass\vip\ExtAttrClass\ExtAttrClassInfo.vih
-обратите внимание, что объект static
Можно сделать так любой объект, только если хотите чтобы он по Ctrl+F4 вызвался или в фасте через compilevip то нужно еще в событие старта галактики добавить регистрацию.
-
- Местный житель
- Сообщения: 555
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Добавление переключателя pickButton для внешнего атрибут
edward_K, спасибо за ответ.
До работы с указанным интерфейсом я использовала стандартные ф-ции по работе с ВА, и проблем не было. Сейчас я также сначала пробовала использовать их (doGetAttrId(…), coGetAttrId(…), sGetAttrId(…)) с приведением типов, но с ними ничего не получилось, даже в Browse. При анализе инфо по ВА в Attrval оказалось, что реально из набора полей для хранения значений атрибутов разных типов заполняется только Attrval.Vcomp. В стандартном интерфейсе заполнения ВА у нужного мне наименования ВА слева стоит «St», как будто тип ВА строковый, и заполнить ВА в этом интерфейсе нельзя, получаю сообщение «Изменение атрибута доступно только в конфигураторе». Сейчас у пользователей заполнение ВА делается в сконфигурированном интерфейсе после загрузки скрипта. Хотелось избавиться от скрипта с помощью Alter. Только когда написала извлечение ВА непосредственно из Attrval, получила то, что было нужно. Т.е. мне пришлось ориентироваться на способ хранения у нас значений ВА типа переключатель. С другими типами ВА стандартные ф-ции работают без проблем.
До работы с указанным интерфейсом я использовала стандартные ф-ции по работе с ВА, и проблем не было. Сейчас я также сначала пробовала использовать их (doGetAttrId(…), coGetAttrId(…), sGetAttrId(…)) с приведением типов, но с ними ничего не получилось, даже в Browse. При анализе инфо по ВА в Attrval оказалось, что реально из набора полей для хранения значений атрибутов разных типов заполняется только Attrval.Vcomp. В стандартном интерфейсе заполнения ВА у нужного мне наименования ВА слева стоит «St», как будто тип ВА строковый, и заполнить ВА в этом интерфейсе нельзя, получаю сообщение «Изменение атрибута доступно только в конфигураторе». Сейчас у пользователей заполнение ВА делается в сконфигурированном интерфейсе после загрузки скрипта. Хотелось избавиться от скрипта с помощью Alter. Только когда написала извлечение ВА непосредственно из Attrval, получила то, что было нужно. Т.е. мне пришлось ориентироваться на способ хранения у нас значений ВА типа переключатель. С другими типами ВА стандартные ф-ции работают без проблем.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Добавление переключателя pickButton для внешнего атрибут
Я по старинке запихиваю в double. Есть проблемы - пишите в ТП. Тип переключатель не так давно появился - года 3 как.
-
- Местный житель
- Сообщения: 555
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Добавление переключателя pickButton для внешнего атрибут
В Attrnam запись с наименованием нужного ВА имеет Attrtype=6, т. е. переключатель, и дата ее последней модификации относится к 2009 г., когда настраивали функционал Галактики. Уже тогда шло заполнение Attrval.Vcomp. Других ВА типа переключатель в таблице нет.
В Gloconst.inc:
cgAttrType_Switch = 6; // 6 - Переключатель, доступен только для конфигуратора
Этот тип был как минимум в 2015 г. (сохранился старый inc), а вот типы 7, 8, 9 (boolean, datetime, longint) появились позже.
Но это небольшое отступление.
Главное, что Ваш совет помог! Сделала:
-в вычисляемом выражении заменила KatSoprSelect.Nrec на Katsopr.Nrec:
- добавила после Window EDITSOPR EscClose;
-в обработчике cmCheckField заменила KatSoprSelect.Nrec на KatSopr.Nrec
edward_K, огромное спасибо за помощь!
И отдельное спасибо Денису )
В Gloconst.inc:
cgAttrType_Switch = 6; // 6 - Переключатель, доступен только для конфигуратора
Этот тип был как минимум в 2015 г. (сохранился старый inc), а вот типы 7, 8, 9 (boolean, datetime, longint) появились позже.
Но это небольшое отступление.
Главное, что Ваш совет помог! Сделала:
-в вычисляемом выражении заменила KatSoprSelect.Nrec на Katsopr.Nrec:
Код: Выделить всё
If(( var1.ValueExistsID( coKatSopr, KatSopr.Nrec, cAttrNalPr ) = False ), 0
, GetAttrValueS( coKatSopr, KatSopr.Nrec, cAttrNalPr ))
( Fieldname=CheckNalPr1 ) // для редактирования НПГ
Код: Выделить всё
TableEvent
Table KATSOPR;
cmPositionChanged:
{
Inherited::HandleEvent( cmPositionChanged );
RescanPanel( #KATSOPR );
} // cmPositionChanged
end; // TableEvent
edward_K, огромное спасибо за помощь!
И отдельное спасибо Денису )