Страница 1 из 1

Пример модификации содержания проводки в хозоперациях

Добавлено: 08 сен 2011, 14:01
edward_K
Пример модификации содержания проводки в хозоперациях с использованием TXOAPI.
Пример позволяет добавить значение внешнего атрибута к спецификации накладной в содержание проводки.

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

/*
 Модификация содержания проводки

*/
#Component "F_TxoApi"

#include TxoApi.vih

VipInterface Txo_SoderProv implements ObjTxoIdentPlugin
#ifdef ATL51
 licensed (FREE) 
#endif 

;

Interface Txo_SoderProv cacheable;
var
  i: longint ;
  w_table:word;
  tp_form:word;
create view  vTxo_PlPorAvizo
var
  CurSoprHoz : comp;
  CurSoprDoc : comp;
  CurDatOb : date;
  curTidk :longint  ;
  MyPlansNo:comp ;
  wattr_table :word ; // для вывода атрибутов по таблице
  wattr_nrec : comp ;
  w_cattr :comp;
 
as select katsopr.nrec 
from
 katsopr,spsopr
,attrnam 
,attrval
,planssch
,katmc,katusl
where
((
       CurSoprDoc  == Katsopr.nrec 
 and katsopr.nrec == spsopr.csopr
 and spsopr.cmcusl == katusl.nrec
 and spsopr.cmcusl == katmc.nrec
 //======================     
 and MyPlansNo == planssch.nrec // план счетов
 and CurSoprHoz == oborot.csoprhoz
 and MyPlansNo == oborot.cplanssch
 //=== для вывода анешних атрибутов по таблицам
 and w_cattr == attrnam.nrec
 and wattr_nrec == attrval.crec
 and wattr_table == attrval.wtable
 and attrnam.nrec ==attrval.cattrnam
));
Const
  idVipInfo        = '&VIP[Obj:"SoderProv"]';
  idVipTag         = 'PlPorAvizo';
end;
//**************************Наименование интерфейса
function GetInfo : string;
{
  GetInfo := 'Изменение содержания проводки';
}
//**************************выбор параметров
function ParamGen : string;
{  var s : String;
   s:='' ;
   s:='[ТБЛ:'+string(w_table)+']'
   s:=s+'[ТИП:'+string(tp_form)+']'
   if w_cattr>0
   { s:=s+'[АТТР:'+string(w_cattr)+']'
   }
   ParamGen := s;
}
//**************************Разбор параметров при обработке в ТХО
procedure ParamParser(hTxo : longint);
var 
!   s : String;
    i : Longint;
{  w_table:=0;w_cattr:=0;tp_form:=0;
   for(i:=1; i<=TxoParamCount(hTxo); i:=i+1)
   { 
     case TxoParamName(hTxo,i) of
     'ТБЛ'  : w_table :=word(TxoParamValue(hTxo,i)) ;
     'ТИП'  : tp_form :=word(TxoParamValue(hTxo,i)) ;
     'АТТР' : w_cattr :=comp(TxoParamValue(hTxo,i)) ;
     end ;
   }
   Rereadrecord ;

} //procedure ParamParser(hTxo : longint);

//**************************Окно Фейса
Window winParam 'Параметры идентификатора' (,,sci13Esc) EscClose, DoAccept;
Show at (10,1,90,28);
tabbedsheet top tabsMain;
Screen scInfo 'Параметры';
table attrnam;
Fields
   w_table:noprotect,pickbutton;
   tp_form: [list 0 'По сумме без ндс','По сумме c ндс','По ндс'],protect;
   attrnam.name :protect,pickbutton;
   buttons
        cmOk, default,, '',,;
        cmCancel,,, '',,;
<<
 Таблица  .@@@@@@@@@@@@@@@@
 Тип      .@@@@@@@@@@@@@@@@
 Атрибут  .@@@@@@@@@@@@@@@@@@@@@@@@@
 
   <.~П~родолжить.>                             <.Отмена.>
>>
End;
Screen scRejim 'Информация';
<<
 Включать в послденей проводке *0
 В основных проводках в содержании следует использовать ключ kauref
 Для режимов по спецификации в основных проводках
 необходимо заполнить наименованием МЦ или услуг 
>>
end;//Screen scInfo 'Режимы';
end; //tabbedsheet top tabsMain;
//===================
HandleEvent
  cmIdle:
    SetWindowTitle(winParam, 'Параметры'+idVipInfo+ParamGen);
  cmInit :
    {
      SetWindowTitle(winParam, 'Параметры'+idVipInfo+ParamGen);
      RescanPanel(#attrnam) ;
      MyPlansNo:=0 ;
   
    }
  cmDelonProtect:
  { case curfield of
    #Attrnam.name : 
    { w_cattr:=0;
      
    }
    end;
    RescanPanel(#attrnam) ;
  }  
  cmPick:
  { case curfield of
    #w_table:
    { runinterface(C_EXTCLASS::PICKTABLE,w_table)
    }
    #Attrnam.name : 
    {
      runinterface(C_EXTCLASS::PICKATTRNAM, w_cattr , w_table ) ;
    }  //#Attrnam.name : {
    end;
    RescanPanel(#attrnam) ;
  }  
  cmOk :
  { MyPlansNo:=1
    closewindow(winParam) ;
  }
End;
End; //Window winParam 'Параметры идентификатора' (,,sci13Esc) EscClose, DoAccept;


  

//**************************Мастер параметров
function ParamMaster : string;
{  ParamMaster := '';
   if( RunWindowModal(winParam)=cmDefault ) or MyPlansNo=1
   {  //PackFields;
      ParamMaster := ParamGen;
   }
}


//**************************ОСНОВНАЯ ПРОЦЕДУРА ОБРАБОТКИ ТХО
procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);
var 
   wstr,wstr1:string ;
   wsu :double  ;
{
  set CurSoprDoc := buf.cSoprDoc;
  set CurSoprHoz := buf.cSoprHoz;
  set CurDatOb := buf.DatOb;
  set CurTidk := buf.TidkGal;
  set MyPlansNo:= buf.cplanssch ;
  ParamParser(hTxo);
  TxoAllowRecallStoreCycles(hTxo);
  
  TxoDebugMsg(hTxo, 'SodProv','tp_form='+string(tp_form))
  TxoDebugMsg(hTxo, 'SodProv','w_table='+string(w_table))
  TxoDebugMsg(hTxo, 'SodProv','w_cattr='+string(w_cattr))
  wattr_table:=w_table
  case w_table of
  coSpSopr:
  { if getfirst katsopr=0 {}
    if getfirst attrnam=0 {}
    TxoDebugMsg(hTxo, 'SodProv','w_cattr='+attrnam.name)
    
    _loop spsopr
    { if spsopr.prmc=1
      { wstr:=if(getfirst fastfirstrow katmc=0,katmc.name,'')
      }
      if spsopr.prmc=2
      { wstr:=if(getfirst fastfirstrow katusl=0,katusl.name,'')
      
      }
      wsu:=0
      case tp_form of
      0: //спец. сумма без налога
      {  wsu:=SPSOPR.kolfact*spsopr.price-if(katsopr.vhodnal=1,spsopr.sumnds,0)
      }
      1: //спец. сумма c налога
      {  wsu:=SPSOPR.kolfact*spsopr.price+if(katsopr.vhodnal<>1,spsopr.sumnds,0)
      }
      2: //спец. сумма c налога
      {  wsu:=spsopr.sumnds;
      }
      end;
      TxoDebugMsg(hTxo, 'SodProv','позиция ='+wstr+', сумма '+string(wsu,0,2))
      wstr1:=''
      if w_cattr>0
      { wattr_nrec:=spsopr.nrec;
        if getfirst attrval=0
        {  wstr1:=attrval.vstring;
        }
      }//if w_cattr>0
      TxoDebugMsg(hTxo, 'SodProv','позиция ='+wstr+', сумма '+string(wsu,0,2)+',атрибут '+wstr1)
      _loop fullcache oborot where
      ((     CurSoprHoz == oborot.csoprhoz
         and MyPlansNo == oborot.cplanssch
         and ( pos(wstr,OBOROT.SODPR)>0 )
      ))
      { 
        TxoDebugMsg(hTxo, 'SodProv','оборот ='+OBOROT.SODPR+', сумма '+string(OBOROT.Sumob,0,2))
        if     trunc(wsu,0) <=oborot.sumob 
         and trunc(wsu,0)+1 >=oborot.sumob
        {   update current oborot set OBOROT.SODPR:=OBOROT.SODPR+' '+wstr1;
        }
      } //
    } //_loop spsopr
  
  } //coSpSopr:
  end;
} //procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);

HandleEvent
cmCheckField : 
{
  SetWindowTitle(winParam, 'Параметры'+idVipInfo+ParamGen);
  RescanPanel(#attrnam) ;

}
cmIdle:
{ SetWindowTitle(winParam, 'Параметры'+idVipInfo+ParamGen);
  RescanPanel(#attrnam) ;
}
end ;
end. //Конец основной процедуры