Всё об интерфейсе L_SOPRDOC::SOPRDOCB

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

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

Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение Zver »

Уважаемые форумчане,

Можете поделиться параметрами вызова этого интерфейса.
Нужно выбрать одну приходную (vidSopr = 101).
Программист-самоучка
RAJAH
Местный житель
Сообщения: 932
Зарегистрирован: 18 фев 2008, 12:49

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение RAJAH »

L_SoprDoc.chm говорит нам, что

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

Interface L_SOPRDOC::SoprDocB
Параметры
TYPESOPR : Word 
PNREC : Comp 
Почти наверняка TypeSopr=101 - это то, что вам нужно.
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение Zver »

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

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение zna »

Доброго дня всем. Понравилось многообещающее название этой темы, решил её развить своим вопросом. Есть приходная накладная, данный интерфейс, надо кое-что проверить перед удалением накладной. Попытался поймать события cmDelete, cmDeleteRecord и в НandleEvent, и в TableEvent- нет реакции. Увидел в консоли управления, что у этого интерфейса есть функция BeforeDeleteKatSopr- может, через неё проверку делать. Но как её перегрузить? Пытался так:

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

Alter interface SoprDoc
   Overload
    Function BeforeDeleteKatSopr (pNRec: Comp; isWarnings: Boolean; isVisual: boolean): Boolean;
   end; 
Имею недовольствоОшибка: При докомпиляции нельзя добавлять методы C:\Viper\Alter_SoprDocB\SoprDocB.vip
Похоже, эта функция не здесь реализована..
Далее, нашёл в документацииObjInterface L_SOPRDOC::ObjBeforeDelSopr
Интерфейс с методами обработки до удаления сопроводительного документа

Методы
Function BeforeDeleteKatSopr (pNRec : Comp; isWarnings : Boolean; isVisual : Boolean) : Boolean

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

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение zna »

Так прокатило:

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

Alter interface DelSopr;
   Overload
   Function BeforeDelete (pNRec : Comp; isWarnings : Boolean; isVisual : Boolean) : Boolean;
   end;
   function BeforeDelete (pNRec : Comp; isWarnings : Boolean; isVisual : Boolean) : Boolean;
   {
     message('DelSopr.BeforeDelete: pNRec = ' +string(pNRec));
   }
end.
И на F8 есть реакция, не там смотрел.. День невезения отменяется :-) Спасибо, Денис!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение edward_K »

1. ALTER obj смешно 8) . Это описание публичных свойств объекта, а не сам объект. Может быть тоже самое в VipInterface->Public.
2. Но если функция есть в описании объекта, то нужно писать как то так(это приказы в кадрах)
procedure IRPD_Base.EnableDisable;
где IRPD_Base - нужное описание объекта ObjInterface.
в случае наследников все зависит - функция может быть переопределена в наследнике в своем описании.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение zna »

Дак вот и непонятно, как функция из объектного интерфейса переопределена..Рано обрадовался :-( При тестировании DelSopr.BeforeDelete выяснил, что эта функция подключается не с первого момента, а перед ней какая-то ещё функция отрабатывает, которая выдаёт сообщение

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

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

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение zna »

Возможно, эта функция удаляет привязанный к накладной документ для учёта НДС

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

---------------------------
Подтверждение
---------------------------
С документом связан счет-фактура № 000220 от 01/06/2010.
Удалить счет-фактуру?
---------------------------
Да   Нет   
---------------------------
и далее удаляет ордера
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

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

edward_K писал(а):1. ALTER obj смешно 8) . Это описание публичных свойств объекта, а не сам объект. Может быть тоже самое в VipInterface->Public.
2. Но если функция есть в описании объекта, то нужно писать как то так(это приказы в кадрах)
procedure IRPD_Base.EnableDisable;
где IRPD_Base - нужное описание объекта ObjInterface.
в случае наследников все зависит - функция может быть переопределена в наследнике в своем описании.
Добрый день!
Понадобилось перекрыть public метод випИнтерфейса, потомка другого. У вас получилось?
Я сделал overload objInterface.method
Далее описал функию
Function objinterface.method

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

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение edward_K »

1. Для начала проверяется подключение ресурса.
Если вы поставили ему приоритет 500 - то это лотерея. Нужно побольше. но не попадать в диапазоны 1000-3000, 3003 - 3007. Я Советую 10000 и выше - чтобы наверняка перекрыть все. в том числе и DSK с конфигуратором, иначе не забывайте их чистить. В отчете о рабочей станции проверяем, что рес подключился и где то внизу.
2. Далее проверяем через сервис - утилиты - запуск внешнего интерфейса, что фейс в ресурсе есть и он отображается из нужного ресурса. Не видно - ищем параметр в секции Vip.
3. Если норм, то возможно вы не то перекрыли. В случае наследников/ наследников часто еще бывает, что они вызывают функции из собственной реализации по Inherited.
4. Надежное это посмотреть sil. Закрываем все, перезаходим, включаем лог, запускаем процесс, стопорим лог. Если все правильно сделали, то можете найти имя функции и из какого исходника она пошла ( в для ваших ресов может быть что то нужно добавить в cfg компилятора, стандартные большинство показывают).
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение Den »

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

#include RPD.vih
#component "Z_StaffOrders"

Alter Interface RPD_6;

 Overload 
       procedure IRPD_Base.SetRelation(Value: comp);
 end;


 procedure IRPD_Base.SetRelation(Value: comp);
 {
    Message('Call Overload Method in RPD_6');
    Inherited::SetRelation(Value);
 }

end.
Вполне появлется Message при открытиии в рантайм приказа обо очередном отпуске
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

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

Разобрался. Делал так же, как написал Den, только проверял, подключая ресурс на "горячую" . Есть самодельный интерфейс у нас.
Так вот, при таком способе методы объектов не обновлялись. Подключи в саппорте, стартанул Галактику - всё заработало.
Всем спасибо ;-)
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение Irina_ »

Здравствуйте.
Пишу Alter L_SOPRDOC::SOPRDOCB . В спецификацию приходной накладной добавила несколько столбцов с ВА вещественного типа. По событию cmExprFieldChanged табл.SpSopr при изменении значения вычисляемых полей заполняю ВА с помощью doSetAttrID(...). Столкнулась с проблемой. После изменения значений в каждом из новых столбцов получаю сообщение: «Пересчитать цену в валюте по курсу на … для документа …?». Если не ошибаюсь, то здесь отрабатывает настройка DOC.BUY.VALRUBCALC: "Настройки Галактики \ Логистика \ Документы \ Управление снабжением \ Пересчитывать суммы в валюте в документах по текущему курсу" в значении «по запросу». Можно ли и как сделать, чтобы указанное сообщение не появлялось при изменении значений в новых столбцах?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение edward_K »

Заведите переменную и поставьте ее в true
В case полей добавьт else и сбросьте эту переменную
Если она останется в true сделай е abort exit
Возможно сработал cmcheckfield или cmcheckrecord
Irina_
Местный житель
Сообщения: 554
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Всё об интерфейсе L_SOPRDOC::SOPRDOCB

Сообщение Irina_ »

Здравствуйте.
Эдуард, спасибо большое за ответ! Пришлось поковыряться. То запрос на пересчет цены стал выдаваться только после правки кол-ва, а на новые поля не выдавался. То перестал выдаваться и на кол-во. Потом не всегда удавалось закрыть инт-с редактирования накладной… В результате вроде добилась того, что проблему не наблюдаю ни при корректировке спецификации, ни при закрытии окна редактирования.
Ниже исходник. Правда пришлось убрать и Abort, и Exit. Возможно я не туда ставила, куда предполагали Вы.
На кол-ве срабатывал и cmCheckField, и cmCheckRecord, а на новых полях только 1-ый. Запрос на пересчет выдавался в cmCheckRecord.
Надеюсь, что я правильно написала оба указанных обработчика.

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

#include ExtAttrClassInfo.vih
#Component "L_SOPRDOC"
//Приходные накладные.
Alter interface SOPRDOCB;

Var cAttrNomAn, cAttrVlag : Comp;
      var1       : iExtAttrClassInfo;
      dExpr     : Double;
      flagCh, flagE, flagNewField : Boolean;

Create view
  as select
    If( ( var1.ExtAttr_ValueExistsID( coSpSopr, SpSopr.Nrec, cAttrNomAn ) = False ), ''
   , var1.doGetAttrID( coSpSopr, SpSopr.Nrec, cAttrNomAn ) )
   ( Fieldname=CheckNomAn )
   , If( ( var1.ExtAttr_ValueExistsID( coSpSopr, SpSopr.Nrec, cAttrVlag ) = False ), ''
   , var1.doGetAttrID( coSpSopr, SpSopr.Nrec, cAttrVlag ) )
   ( Fieldname=CheckVlag )
;

// Изменение последовательности столбцов в спецификации приходной накладной.
Procedure ChangeObjIndex1;
Var sObj_ : String;
{
  cfsSetProp( 'c_BRBYNAME_GRNAL.NAME_Группа_налогов', 'Index', Integer(25) );
  cfsSetProp( 'c_BRBYNAME_KDKOLOLD_Количество,_до_изменения', 'Index', Integer(26) );
  cfsSetProp( 'c_BRBYNAME_KDKOLNEW_Количество,_после_изменения', 'Index', Integer(27) );
  cfsSetProp( 'c_BRBYNAME_KDKOLDIFF_Количество,_разница', 'Index', Integer(28) );
  cfsSetProp( 'c_BRBYNAME_KDPRICEOLD_Цена_до_изменения', 'Index', Integer(29) );
  cfsSetProp( 'c_BRBYNAME_KDPRICENEW_Цена_после_изменения', 'Index', Integer(30) );
  cfsSetProp( 'c_BRBYNAME_KDPRICEDIFF_Цена_разница', 'Index', Integer(31) );
  cfsSetProp( 'c_BRBYNAME_KDSUMMAOLD_Стоимость_до_изменения', 'Index', Integer(32) );
  cfsSetProp( 'c_BRBYNAME_KDSUMMANEW_Стоимость_после_изменения', 'Index', Integer(33) );
  cfsSetProp( 'c_BRBYNAME_KDSUMMADIFF_Стоимость_разница', 'Index', Integer(34) );
  cfsSetProp( 'c_BRBYNAME_KDNALOGOLD_Налоги_до_изменения', 'Index', Integer(35) );
  cfsSetProp( 'c_BRBYNAME_KDNALOGNEW_Налоги_после_изменения', 'Index', Integer(36) );
  cfsSetProp( 'c_BRBYNAME_KDNALOGDIFF_Налоги_разница', 'Index', Integer(37) );
  cfsSetProp( 'c_BRBYNAME_FSUMPRICEWONDS_Стоимость_без_налогов', 'Index', Integer(38) );
  cfsSetProp( 'c_BRBYNAME_FSUMPRICEWNDS_Стоимость_с_налогами', 'Index', Integer(39) );
  cfsSetProp( 'c_BRBYNAME_FRPRICE_Цена_в_НДЕ', 'Index', Integer(40) );
  cfsSetProp( 'c_BRBYNAME_FSUMPRICENDE_Стоимость_в_НДЕ', 'Index', Integer(41) );
  cfsSetProp( 'c_BRBYNAME_FSUMPRICEWONDSNDE_Стоимость_без_налогов_в_НДЕ', 'Index', Integer(42) );
  cfsSetProp( 'c_BRBYNAME_FSUMNDS_Налоги_в_НДЕ', 'Index', Integer(43) );
  cfsSetProp( 'c_BRBYNAME_FSUMPRICEWNDSNDE_Стоимость_с_налогами_в_НДЕ', 'Index', Integer(44) );
  cfsSetProp( 'c_BRBYNAME_FRVPRICE_Цена_в_валюте', 'Index', Integer(45) );
  cfsSetProp( 'c_BRBYNAME_FSUMVPRICE_Стоимость_в_валюте', 'Index', Integer(46) );
  cfsSetProp( 'c_BRBYNAME_FSUMVPRICEWONDS_Стоимость_без_налогов_в_валюте', 'Index', Integer(47) );
  cfsSetProp( 'c_BRBYNAME_FSUMVNDS_Налоги_в_валюте', 'Index', Integer(48) );
  cfsSetProp( 'c_BRBYNAME_FSUMVPRICEWNDS_Стоимость_с_налогами_в_валюте', 'Index', Integer(49) );
  cfsSetProp( 'c_BRBYNAME_FSIMVOLV_Вал', 'Index', Integer(50) );
  cfsSetProp( 'c_BRBYNAME_FSERIALNUM_Серийный_номер', 'Index', Integer(51) );
  cfsSetProp( 'c_BRBYNAME_BOXNAME_Ячейка_хранения', 'Index', Integer(52) );
  cfsSetProp( 'c_BRBYNAME_SPSOPR.NVAGON_Номер_вагона', 'Index', Integer(53) );
  cfsSetProp( 'c_BRBYNAME_FNETTO_Вес_нетто', 'Index', Integer(54) );
  cfsSetProp( 'c_BRBYNAME_FTARA_Вес_тары', 'Index', Integer(55) );
  cfsSetProp( 'c_BRBYNAME_FBRUTTO_Вес_брутто', 'Index', Integer(56) );
  cfsSetProp( 'c_BRBYNAME_KATPARTY.KOD_Партия_код', 'Index', Integer(57) );
  cfsSetProp( 'c_BRBYNAME_KATPARTY.NAME_Партия_наименование', 'Index', Integer(58) );
  cfsSetProp( 'c_BRBYNAME_SPSOPR.NKVIT_Номер_ж/д_квитанции', 'Index', Integer(59) );
  cfsSetProp( 'c_BRBYNAME_TMPDOCOFGDSVAL1.VALUE_Документ1', 'Index', Integer(60) );
  cfsSetProp( 'c_BRBYNAME_TMPDOCOFGDSVAL2.VALUE_Документ2', 'Index', Integer(61) );
  cfsSetProp( 'c_BRBYNAME_TMPDOCOFGDSVAL3.VALUE_Документ3', 'Index', Integer(62) );
  cfsSetProp( 'c_BRBYNAME_NUMDOOSNV_ДО', 'Index', Integer(63) );
  cfsSetProp( 'c_BRBYNAME_FIMPORTSUBST_STATE_Страна_происхождения', 'Index', Integer(64) );
  cfsSetProp( 'c_BRBYNAME_FIMPORTSUBST_REPSECTION_Раздел_отчетности_по_импортозамещению', 'Index', Integer(65) );
  cfsSetProp( 'c_BRBYNAME_SALDTUNE.NAME_Объект_ЦУ', 'Index', Integer(66) );
  cfsSetProp( 'c_BRBYNAME_VSKAU1_КАУ_1', 'Index', Integer(67) );
  cfsSetProp( 'c_BRBYNAME_VSKAU2_КАУ_2', 'Index', Integer(68) );
  cfsSetProp( 'c_BRBYNAME_VSKAU3_КАУ_3', 'Index', Integer(69) );
  cfsSetProp( 'c_BRBYNAME_VSKAU4_КАУ_4', 'Index', Integer(70) );
  cfsSetProp( 'c_BRBYNAME_VSKAU5_КАУ_5', 'Index', Integer(71) );
  cfsSetProp( 'c_BRBYNAME_VSKAU6_КАУ_6', 'Index', Integer(72) );
  cfsSetProp( 'c_BRBYNAME_VSKAU7_КАУ_7', 'Index', Integer(73) );
  cfsSetProp( 'c_BRBYNAME_VSKAU8_КАУ_8', 'Index', Integer(74) );
  cfsSetProp( 'c_BRBYNAME_VSKAU9_КАУ_9', 'Index', Integer(75) );
  cfsSetProp( 'c_BRBYNAME_VSKAU10_КАУ_10', 'Index', Integer(76) );
  cfsSetProp( 'c_BRBYNAME_SMETAMY_Смета', 'Index', Integer(77) );
  cfsSetProp( 'c_BRBYNAME_SMETASPMY_Спецификация_сметы', 'Index', Integer(78) );
  cfsSetProp( 'c_BRBYNAME_PLJOBNAME_План_работ', 'Index', Integer(79) );
  cfsSetProp( 'c_BRBYNAME_FDGODN_Дата_окончания_срока_годности', 'Index', Integer(80) );

  sObj_:= 'c_BRBYNAME_CHECKNOMAN_Номер_анализа';
  cfsSetProp( sObj_, 'StatusCtx', scExtAttrDbl );
  cfsSetProp( sObj_, 'DefaultWidth', Integer(10) );
  cfsSetProp( sObj_, 'Index', Integer(23) );
  cfsSetProp( sObj_, 'PickButton', False );
  cfsSetProp( sObj_, 'DefaultPickButton', False );
  cfsSetProp( sObj_, 'Points', Integer(0) );
  cfsSetProp( sObj_, 'MaxLen', Integer(22) );

  sObj_:= 'c_BRBYNAME_CHECKVLAG_Влажность';
  cfsSetProp( sObj_, 'StatusCtx', scExtAttrDbl );
  cfsSetProp( sObj_, 'DefaultWidth', Integer(12) );
  cfsSetProp( sObj_, 'Index', Integer(24) );
  cfsSetProp( sObj_, 'PickButton', False );
  cfsSetProp( sObj_, 'DefaultPickButton', False );
  cfsSetProp( sObj_, 'Points', Integer(2) );
  cfsSetProp( sObj_, 'MaxLen', Integer(22) );

} // proc ChangeObjIndex1

//ExtendFormats BRSELECT;
//Browse BRSELECT;
//Table KATSOPR;

 TableEvent
   Table KATSOPR;
   cmPositionChanged:
    {
      Inherited::HandleEvent( cmPositionChanged );
      RescanPanel( #KATSOPR );
    } // cmPositionChanged

 end; // TableEvent

Window EDITSOPR EscClose;

ExtendFormats BRBYNAME;
Browse BRBYNAME;
Table SpSopr;
Fields
  CheckNomAn    'Номер'#13'анализа' :[ 10 ], noProtect;
  CheckVlag     'Влажность'         :[ 12 ], noProtect;
end;

 TableEvent
  Table SpSopr;
  cmPositionChanged:
    {
      Inherited::HandleEvent( cmPositionChanged );
    } // cmPositionChanged

  cmExprFieldChanged:
    {
      Inherited::HandleEvent( cmExprFieldChanged );
      Case CurField of
        #CheckNomAn:
          {
            dExpr:= Double( ExprFieldValue );
            If dExpr >= 0
              {
                var1.doSetAttrID( coSpSopr, SpSopr.Nrec, cAttrNomAn, dExpr );
                Set CheckNomAn;
                RescanPanel( #SpSopr );
              }
          }
        #CheckVlag:
          {
            dExpr:= Double( ExprFieldValue );
            If dExpr >= 0
              {
                var1.doSetAttrID( coSpSopr, SpSopr.Nrec, cAttrVlag, dExpr );
                Set CheckVlag;
                RescanPanel( #SpSopr );
              }
          }
      end; // case
    } // cmExprFieldChanged

  cmCheckField:
    {
//Message( 'cmCheckField' );
      Case CurField of
        #CheckNomAn, #CheckVlag : { flagNewField:= True; }
        else
          {
            flagNewField:= False;
          }
      end; // case
      If not flagNewField
        Inherited::HandleEvent( cmCheckField );
    } // cmCheckField

  cmCheckRecord:
    {
//Запрос на пересчет цены в валюте выдается здесь.
//Message( 'cmCheckRecord' + ', flagNewField=' + If( flagNewField, 'True', 'False' ) );
      Inherited::HandleEvent( cmCheckRecord );
    } // cmCheckRecord

 end; // TableEvent SpSopr

//-----------

 HandleEvent // EDITSOPR
  cmInit:
   {
     Case Inherited::HandleEvent( cmInit ) of
       heAbort :  Abort;
       heStop  :  Exit;
     end;
     PutCommand(cmValue47);
   } // cmInit

  cmValue47:
   {
     If flagE = False
       {
         ChangeObjIndex1;
         flagE:= True;
       }
   } // cmValue47

  cmClose:
   {
//Message( 'cmClose' );
     Inherited::HandleEvent( cmClose );
   } // cmClose
  end;  // HandleEvent for EDITSOPR
 end;   // Window EDITSOPR
//-----------

  HandleEvent // for interface
  cmInit :
    {
      Case Inherited::HandleEvent( cmInit ) of
        heAbort :  Abort;
        heStop  :  Exit;
      end;
      flagE:= False;
      cAttrNomAn:= var1.ExtAttr_ID( coSpSopr,  'Номер анализа' ); // Nrec ВА к SpSopr
      cAttrVlag:=  var1.ExtAttr_ID( coSpSopr,  'Влажность фактическая' ); // Nrec ВА к SpSopr
    } // cmInit
 end; // HandleEvent for interface
end.  // interface

Ответить