Странности Vip TXO

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

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

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

Странности Vip TXO

Сообщение savov »

Доброго времени суток.
Столкнулись с большой странностью в работе VIP ТХО.
Есть 2 базы. Одна Воронежская. другая Белгородская. Версия Галактики одинаковая, СУБД Oracle 8, но в Белгородской клиент Оракла 10.

До последнего времени ТХО работала там и там, но пришлось поменять условия в запросе. И вот уже 4 дня наблюдаю сказочную картину.
Код

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

VipInterface TXO_FNTXOAll implements ObjTxoIdentPlugin;
//Interface TXO_Factnota;
Interface TXO_FNTXOAll;

var _hTxo      : longint;                       // нужны, чтобы можно было использовать сведения о разноске
var _buf       : TTxoApiInfoDoc;                // в процедуре ParamParser
var sum        : double;
var piExAttr   : iExtAttr;
var CurTiDkGal : word;
var CurSoprDoc : comp;
var CurKodPlan : String;
var KAU        : String;
var CurPlan    : Comp;
var NumberKAU  : String;
var NumberKAU2 : String;
var NumberKAU3 : String;
var NumberKau4 : String;
var groupe     : String;
var VidSkidki  : String;
var FactNota   : Double;
var UslKrnota  : double;
var sumfact    : Double;
var NrecKau, NrecKau62, NrecKau622    : Comp;
var NrecS      : Comp;
var nrecSpsopr : Comp;
var NKau       : Word;
var NameKauS   : String;
var sMyOrg     : String;
var nrecSopr   : Comp;
var NrecMC     : Comp;

var wMarkFilters          : word;         // маска фильтров
var    liMrk_Org          : longint ;  // идентификаторы собственных маркеров
var    isMrk_Org          : boolean ;  // чекеры активности фильтров
var    i                  : Integer;
var    CmpItem            : Comp;
var    err                : boolean;
var SchO, SchK : String;
var  dtBegDate, dtFinDate  : date;


var  _Org_Name, _Org_UNN  : string ;    // Обозначения фильтров на II листе

create view 
as select
  oborot.sumob, oborot.SchetO, oborot.SchetK, oborot.datob,Oborot.kauos[1],Oborot.kauos[2],Oborot.kauos[3],
  Oborot.kauos[4], katmc.barkod, spsopr.nrec, spdocnal.Nalog, oborot.csoprdoc, katsopr.nrec
from
  oborot, spkau, spsopr, katmc, spdocnal
where
((
  SchO == oborot.Scheto    and
  Schk == oborot.SchetK    
// and  (oborot.datob >=dtBegDate and oborot.datob<=dtFinDate)
  and oborot.kauos[2]==spkau.nrec
  and oborot.csoprdoc==katsopr.nrec
  and katsopr.nrec==spsopr.csopr
  and (katsopr.dsopr >=dtBegDate and katsopr.dsopr<=dtFinDate)
  and SpSopr.nRec   == SpDocNal.cSpDoc
            and (      SpDocNal.TipDoc = SpSopr.VidSopr
                  and  SpDocNal.cDoc  =  SpSopr.cSopr   )
  and spsopr.cmcusl==katmc.nrec
)) and (spkau.name='Не является доходом (расходом)')and (oborot.kauos[3]=spsopr.cmcusl) and (substr(katsopr.descr,1,2)<>'AT'); 



// подключаем функции для работы с типами документов (isKatSoprTO, isKatSoprFROM, ...)
#INCLUDE FunTipDoc.vpp

Create view tPlan
as Select planssch.kod from planssch
where((CurPlan==planssch.nrec));

Create view tKau as Select SpKau.Nrec
from SpKau where
((NKau==SpKau.KODGRKAU and
KAU==SpKau.Name));

Create view vtMyOrg as
  Select KatOrg.Name
  From KatOrg
Where (( coGetTune('MYORG') /== KatOrg.Nrec ))
;

Create  View TKauN as Select SpKau.Name
from SpKau Where ((Nrecs==SpKau.nrec));

Create view vtOrg  as
  select KatOrg.nrec, KatOrg.UNN, KatOrg.Name, tblOrg.*
  from  KatOrg, tblOrg
  where (( tblOrg.cRec /== KatOrg.nrec ))
  ;
Create View TKat as Select Spsopr.nrec, Spsopr.cmcusl
from Spsopr
where((Nrecsopr==Spsopr.csopr)) and Spsopr.cmcusl=NrecMC;
! -----------------------------------------------------------------------
Function GetInfo : string;
  {
    GetInfo := 'Скидка по накладным (Проводки ТОЛЬКО через процент в ТХО) ' ;
  }

Function ParamMaster : string ;
  {  Message('Настройка: Счет Д <режим0> Счет К <режим1> '#13+
              'В параметрах надо указать системныe номерa КАУ <Виды деятельности, 90>,<Налоговый учет, 90,91>,'#13+
              '<Виды деятельности, 62>, <Ставка> &VIP_[Obj:"Nota"][par1:"NomerKau"][par2:"NomerKau2"][par3:"NomerKau3"][par3:"NomerKau3"]');
              ParamMaster:='';
  }

Procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);
{

// ограничения на разносимый документ    
   TXOAllowRecallStoreCycles(hTXO);
Message('Этот вариант',0);
   CurTiDkGal := buf.TiDkGal;
   CurSoprDoc := buf.cSoprDoc;
   CurPlan := buf.cPlansSch;

   if (TPlan.getFirst planssch = tsOK)
	{
          CurkodPlan:=TPlan.planssch.kod;
	}

  if (vtMyOrg.GetFirst KatOrg = tsOK)
  { sMyOrg   := vtMyOrg.KatOrg.Name ;
  }


   SchO:= CurKodPlan+'90';
   SchK:=CurKodPlan+'62';
   KAU:='Внереализационные доходы (расходы)';

    _hTxo      := hTxo        ;
    _buf       := buf         ;


    //==========================================================================
    //=======  Наложение и обработка фильтров ==================================
    //==========================================================================

    isMrk_Org   := FALSE;
    // Запускаем интерфейс ввода параметров отчета (периода выборки и фильтров)
    RunInterface(  F_TxoApi::NotaFactDocFilters
                      ,  dtBegDate
                      ,  dtFinDate
                      ,  wMarkFilters
                      ,  Groupe
                      ,  FactNota
     );

    Groupe:=Ltrim(Rtrim(String(Groupe)));
    VidSkidki:=Ltrim(Rtrim(String(VidSkidki)));
    // Зачищаем таблицы фильтров, снимаем все ограничения с вьюх
    delete all from tblOrg;
    NumberKau:=TxoParamValue(hTxo,1);
    NumberKau2:=TxoParamValue(hTxo,2);
    NumberKAU3:=TxoParamValue(hTxo,3);
    NumberKAU4:=TxoParamValue(hTxo,4);

    // Инициализируем необходимые маркеры, заполняем таблицы фильтров, включаем ограничения во вьюхах.
    //------------------------------------------------------------------------------------------------
    if( (wMarkFilters AND _Org  ) = _Org   )
      then { liMrk_Org   := InitMarker(szMrk_Org,8,10,10) ;
             isMrk_Org   := TRUE ;
             // Заполняем таблицу фильтров по Контрагентам, исходя из значений маркера
             for( i:=0; i<=GetMarkerCount(liMrk_Org)-1; inc(i) ) {
               if( GetMarker( liMrk_Org, i, cmpItem ) )
                 then { vtOrg.insert tblOrg
                                 set tblOrg.crec    := cmpItem
                        ;
                 } // then
             } // for
             if( vtOrg.GetFirst tblOrg = tsOK )
               do { vtOrg.tblOrg.UNN  := vtOrg.KatOrg.UNN;
                    vtOrg.tblOrg.Name := vtOrg.KatOrg.Name;
                    vtOrg.update current tblOrg;
               } while vtOrg.GetNext tblOrg = tsOK;
      } // _Org
    //---------------------------------------------------------------


   // заполнить нециклическую аналитику
   if (getfirst oborot = tsOk)
   {
       NKau:=Word(NumberKau2); 
       if (TKau.getFirst SpKau = tsOK)
	      {
          NrecKau:=TKau.SpKau.nrec; 
	      }
   // построить выгрузку циклов
   _loop Oborot 
   {
            NrecS:=Oborot.kauos[1];
            if (TKauN.getFirst SpKau = tsOK)
            	{
                   NameKauS:=TKauN.SpKau.name;
            	}

            if (Pos('Реализация',NameKauS)>0)
            {
                   NameKauS:='Реализация готовой продукции';
            }

            if (Pos('Экспорт',NameKauS)>0)
            {
                   NameKauS:='Экспорт';
            }

            NKau:=Word(NumberKau3);
            Kau:=NameKauS;
            if (TKau.getFirst SpKau = tsOK)
	    {
                   NrecKau62:=TKau.SpKau.nrec;
            }

      cmpItem:=oborot.KAUOS[4];
      nrecspsopr:=spsopr.nrec;
      NrecMC:=oborot.KAUOS[3];
      NrecSopr:=oborot.csoprdoc;

      if (double(SpDocNal.Nalog)=20) then {KAU:='НДС 20%'}
      else if (double(SpDocNal.Nalog)=18) then {KAU:='НДС 18%'} 
      else if (double(SpDocNal.Nalog)=10) then {KAU:='НДС 10%'}
      else if (double(SpDocNal.Nalog)=0) then {KAU:='НДС 0%'}; 
  
      NKau:=Word(NumberKau4);
      if (TKau.getFirst SpKau = tsOK)
	 {
              NrecKau622:=TKau.SpKau.nrec;
         }
      if (Groupe='1') then
      {
        if (substr(katmc.barkod,1,9)='109-93120') then
        {
      // очистить промежуточный буффер
          TxoBodyClear(hTxo);
          UslKrNota:=0;
      // закачать значение КАУ
          UslKrnota:=piExAttr.doGetAttr( 1110, NRECSPSOPR, 'Кредит-нота(условная)' );    // Кредит-нота

          if (vtorg.getfirst tblOrg where ((cmpItem==tblOrg.crec)) = tsOK)
          {

// формируем Д 90-01 - Кр 62-03
            TxoBodyAddSchet(hTxo,wFlKau_Mode0,SchO,'01');
            TxoBodyAddSchet(hTxo,wFlKau_Mode1,SchK,'03');

            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau)  , Oborot.kauos[1]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau2)  , Oborot.kauos[2]);
      // закачать суммы

            TxoBodySetSum(hTxo, -FactNota*oborot.sumob/UslKrNota,0, 0); 

      // добавить в выгрузку
            TxoBodyInsert(hTxo);

// формируем проводку Д62-01 - Кр 90-01
            TxoBodyAddSchet(hTxo,wFlKau_Mode0,SchK,'01');
            TxoBodyAddSchet(hTxo,wFlKau_Mode1,SchO,'01');
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1,  Word(NumberKau)  , Oborot.kauos[1]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1,  Word(NumberKau2)  , NrecKau);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau3)  , NrecKau62);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau4)  , NrecKau622);
      // закачать суммы
            sumfact:=FactNota*oborot.sumob/UslKrNota;
            TxoBodySetSum(hTxo, -sumfact,0, 0); 
      // добавить в выгрузку
            TxoBodyInsert(hTxo);
          }
        }
      }
      else
      {
        if (substr(katmc.barkod,1,9)<>'109-93120') then
        {
      // очистить промежуточный буффер
          TxoBodyClear(hTxo);
          UslKrNota:=0;
      // закачать значение КАУ
          UslKrnota:=piExAttr.doGetAttr( 1110, NRECSPSOPR, 'Кредит-нота(условная)' );    // Кредит-нота

          if (vtorg.getfirst tblOrg where ((cmpItem==tblOrg.crec)) = tsOK)
          {

// формируем Д 90-01 - Кр 62-03
            TxoBodyAddSchet(hTxo,wFlKau_Mode0,SchO,'01');
            TxoBodyAddSchet(hTxo,wFlKau_Mode1,SchK,'03');

            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau)  , Oborot.kauos[1]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau2)  , Oborot.kauos[2]);
      // закачать суммы

            TxoBodySetSum(hTxo, -FactNota*oborot.sumob/UslKrNota,0, 0);  
      // добавить в выгрузку
            TxoBodyInsert(hTxo);

// формируем проводку Д62-01 - Кр 90-01
            TxoBodyAddSchet(hTxo,wFlKau_Mode0,SchK,'01');
            TxoBodyAddSchet(hTxo,wFlKau_Mode1,SchO,'01');

            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatOrg , cmpItem);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_KatMC  , Oborot.kauos[3]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0, cgKau_Dogovor, Oborot.kauks[2]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1,  Word(NumberKau)  , Oborot.kauos[1]);
            TxoBodyAddKau(hTxo,  wFlKau_Mode1,  Word(NumberKau2)  , NrecKau);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau3)  , NrecKau62);
            TxoBodyAddKau(hTxo,  wFlKau_Mode0,  Word(NumberKau4)  , NrecKau622);
      // закачать суммы

            sumfact:=FactNota*oborot.sumob/UslKrNota;

            TxoBodySetSum(hTxo, -sumfact,0, 0);  


      // добавить в выгрузку
            TxoBodyInsert(hTxo);
          }
        }
      }
   }

  }

  } // Procedure StoreCycles

handleevent
end;

END.
Так вот ЭТОТ код работает в Белгородской базе на ура!
Но виснет в Воронежской базе, причем не доходит даже до Message('Этот вариант',0); т.е. сразу после запуска на экране унылая надпись : "Формируются типовые проводки" и все на веки вечные!.
Стоит переделать код, а именно: добавить неименованную вьюху с выбором , например, kated, а неименованную в данном варианте кода назвать именем и везде указать это имя , как код начинает работать в Воронеже, но перестает работать в Белгороде, причем перестает работать участок кода

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

 if( (wMarkFilters AND _Org  ) = _Org   )
      then { liMrk_Org   := InitMarker(szMrk_Org,8,10,10) ;
             isMrk_Org   := TRUE ;
             // Заполняем таблицу фильтров по Контрагентам, исходя из значений маркера
             for( i:=0; i<=GetMarkerCount(liMrk_Org)-1; inc(i) ) {
               if( GetMarker( liMrk_Org, i, cmpItem ) )
                 then { vtOrg.insert tblOrg
                                 set tblOrg.crec    := cmpItem
                        ;
                 } // then
             } // for
Не возвращает GetMarkerCount(liMrk_Org)! :eek: То есть и неработоспособность разная, в этом случае не виснет все, а отрабатывает программа, но проводки не формируются из-за того, что маркер не возвращается. В чем может быть загвоздка и как ее победить???
LaaLaa

Re: Странности Vip TXO

Сообщение LaaLaa »

http://www.dba-oracle.com/t_oracle_clie ... elease.htm

Клиент 10 сервер 8
Вы както не вписываетесь в матрицу совместимости ораклов.
LaaLaa

Re: Странности Vip TXO

Сообщение LaaLaa »

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

Re: Странности Vip TXO

Сообщение edward_K »

1. Не хорошо писать за скобками условия
лучше уж внутри (( )) как and () после условий == нужной таблы - так быстрее
2. Есть же профайлер - как в оракле, так и в галактике. Я галактическим так уже находил как что , что зацилились при работе с внешним классификатором.
3. Как правило такое застревание может быть на формировании 1 выборки в фейсе - посмотрите сапортом. И не важно - поименованная она или нет - если нет, то насколько помню она получает в автомате имя фейса.
4. Все допвью можно объединить в одно - чем проще тем надежней.
Ответить