Добавление переключателя pickButton для внешнего атрибута

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

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

Ответить
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Добавление переключателя pickButton для внешнего атрибута

Сообщение RAJAH »

Здравствуйте!
В интерфейсе конфигуратором нужно добавить поле, связанное с внешним атрибутом, с переключателем pickButton (т.е., по нажатию кнопки значение должно меняться с "нет" на "да" или наоборот). Аналогичное поведение, например, в окне лицевого счёта сотрудника имеет поле "назначать аванс". Как такое сделать?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение Den »

Поле то добавишь, с пимпочкой выбора. Тока 1:1 как в л/с не сделать одним лишь конфигуратором. т.к. это быстрее всего там просто вычисляемое поле в л/с
Какое то подобие можно сделать если тока атрибут ссылочный делать. Но этот вариант, если вы проволите параллель с л/с, вам судя по всему не подойдет.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение RAJAH »

Den писал(а):Тока 1:1 как в л/с не сделать одним лишь конфигуратором. т.к. это быстрее всего там просто вычисляемое поле в л/с
Вычисляемое поле сделать можно - докомпиляцией добавить. Как с ним потом работать, как с переключателем?
Добавил конфигуратором вычисляемое поле: ButtonType = inWithHistory, Protect = False, Strings = "нет, да". Однако выбранное значение не запоминается. :-(
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение Den »

Я думал задача конфигуратором одним извернуться ) Но тогда вообще он зачем если в докомпиляции можно все описать и код вычисления доработать. Ничего сложного же вроде
Аля :

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


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

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение edward_K »

1. Для начала атрибуте должен быть числовой, а лучше переключатель - если есть.
2. При добавлении нужно указать нужный тип поля Зависимый переключатель, и указать число элементов. Ну а потом еще элементы переименовать и все.
3. Я когда не лень комбинирую - alter + cnf, поскольку без перекрытия формата попасть в нужное место для разных размеров шрифтов через функции установки свойств объекта сложновато.
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение RAJAH »

1. Сделал числовой.
2. Это ж радиокнопки получаются.
3. Я тоже.
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение Irina_ »

Здравствуйте.
Решила написать в эту тему. Вообще о работе с ВА типа переключатель удалось мало чего найти на форуме. А надо работать именно с ВА этого типа.
Очень надеюсь на Вашу помощь.
Пишу 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
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение edward_K »

В режиме редактирования у вас таблица KatSopr - по ней и нужно тянуть переключатель.
Чем вас не устраивают стандартные функции? по работе с ВА?
я обычно юзаю так
word(doGetAttrID( ... )) (Fieldname = )
Comp не есть хорошо - это все таки ссылочный атрибут на какой нибудь справочник.
Найдите в frm
C_ExtClass\vip\ExtAttrClass\ExtAttrClassInfo.vih
-обратите внимание, что объект static
Можно сделать так любой объект, только если хотите чтобы он по Ctrl+F4 вызвался или в фасте через compilevip то нужно еще в событие старта галактики добавить регистрацию.
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение Irina_ »

edward_K, спасибо за ответ.
До работы с указанным интерфейсом я использовала стандартные ф-ции по работе с ВА, и проблем не было. Сейчас я также сначала пробовала использовать их (doGetAttrId(…), coGetAttrId(…), sGetAttrId(…)) с приведением типов, но с ними ничего не получилось, даже в Browse. При анализе инфо по ВА в Attrval оказалось, что реально из набора полей для хранения значений атрибутов разных типов заполняется только Attrval.Vcomp. В стандартном интерфейсе заполнения ВА у нужного мне наименования ВА слева стоит «St», как будто тип ВА строковый, и заполнить ВА в этом интерфейсе нельзя, получаю сообщение «Изменение атрибута доступно только в конфигураторе». Сейчас у пользователей заполнение ВА делается в сконфигурированном интерфейсе после загрузки скрипта. Хотелось избавиться от скрипта с помощью Alter. Только когда написала извлечение ВА непосредственно из Attrval, получила то, что было нужно. Т.е. мне пришлось ориентироваться на способ хранения у нас значений ВА типа переключатель. С другими типами ВА стандартные ф-ции работают без проблем.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение edward_K »

Я по старинке запихиваю в double. Есть проблемы - пишите в ТП. Тип переключатель не так давно появился - года 3 как.
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Добавление переключателя pickButton для внешнего атрибут

Сообщение Irina_ »

В Attrnam запись с наименованием нужного ВА имеет Attrtype=6, т. е. переключатель, и дата ее последней модификации относится к 2009 г., когда настраивали функционал Галактики. Уже тогда шло заполнение Attrval.Vcomp. Других ВА типа переключатель в таблице нет.
В 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 ) // для редактирования НПГ
- добавила после Window EDITSOPR EscClose;

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

TableEvent
   Table KATSOPR;
    cmPositionChanged:
    {
      Inherited::HandleEvent( cmPositionChanged );
      RescanPanel( #KATSOPR );
    } // cmPositionChanged
 end; // TableEvent
-в обработчике cmCheckField заменила KatSoprSelect.Nrec на KatSopr.Nrec

edward_K, огромное спасибо за помощь!
И отдельное спасибо Денису )
Ответить