Прокомментируйте код по ТХО

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

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

Ответить
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Прокомментируйте код по ТХО

Сообщение Иван »

Доброго времени суток!
Прокомментируйте пожалуйста следующий код у документа акт на пересортицу:

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

if(wTXOGetField('SPSOPR','PRMC',&SoprDoc[Рез:СпНаклАкта])=1,TxoSetKau(4,160,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])) ,TxoSetKau(4,161,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])))
Как я понимаю, в спецификации берется поле PRMC и если оно =1, то в режиме 0 МЦ проставляется, иначе в режиме 1. Получается, что этот код отрабатывается два раза?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прокомментируйте код по ТХО

Сообщение edward_K »

ну почему 2 раза. если 1 - это то что внизу, если 0 - то что посередине. Предполагается что обработка отдельно пробежит верхную и нижную часть.
Проводка видимо 10 - 10, по дебету режим 0 , по кредиту режим 1?
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Re: Прокомментируйте код по ТХО

Сообщение Иван »

ну да 10 10, спасибо за ответ...
вроде как в программировании предполагается один проход вот и интересно стало... вроде как условие взаимоисключающее, а ТХО нормально срабатывает.
А вот список формул, которые под проводками, сколько раз и в какой последовательности отрабатывают?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Прокомментируйте код по ТХО

Сообщение edward_K »

LaaLaa вам лучше ответит. Я думаю там нечто сложное чтобы выйти на итоговую сумму.
LaaLaa

Re: Прокомментируйте код по ТХО

Сообщение LaaLaa »

Иван писал(а):А вот список формул, которые под проводками, сколько раз и в какой последовательности отрабатывают?


Много раз в по кругу и по сложной схеме пока все не сосчитаются и пока дебет с кредитом не сойдется :) как то так.

Вот вам другая задача: Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины? Думаете одно?
Ответ: Ничего подобного. Никто же не знает сколько у него уже было яблок до этого… Мораль - обнуляйте переменные


Код который приведен в первом посте не имеет смысла рассматривать без остальных формул и параметров этой ТХО. Также важно к какому типу документа эта ТХО будет применяться.
LaaLaa

Re: Прокомментируйте код по ТХО

Сообщение LaaLaa »

Полную расшифровку расчета вы можете получить если включите в настройках протокол расчетов ТХО, 4-отладочный уровень.
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Re: Прокомментируйте код по ТХО

Сообщение Иван »

документ - акт на пересортицу
мне необходимо сделать так, чтобы в дебете проводки по аналитике материалы - был материал из нижней спецификации, а в кредите - из верхней.
Сейчас ТХО настроена так:
две проводки: 1)сумма стоит 0* &SP_[Напр:Приход] , в ДТ аналитика материалы стоит режим 0, в КТ аналитика материалы стоит режим 1
2) сумма &SP_[Напр:Расход] , аналитика также
Алгоритмы расчетов такие:
&1 if(wTXOGetField('SPSOPR','PRMC',&SoprDoc[Рез:СпНаклАкта])=1,TxoSetKau(4,160,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])) ,TxoSetKau(4,161,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])))
&2 TxoSetKau(4,161,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта]))
LaaLaa

Re: Прокомментируйте код по ТХО

Сообщение LaaLaa »

А сколько у вас в документах "акт на пересортицу" обычно строк в нижней спецификации и верхней ? Как вы хотите сопоставить каждую конкретную строку нижней спецификации каждой конкретной строке верхней спецификации в случае если строк несколько? И в случае если строк несколько и они не совпадают не по суммам не количеству наименований ?
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Re: Прокомментируйте код по ТХО

Сообщение Иван »

у нас обычно так происходит: например, были какие-то трубы, их тупо переводят в лом или бывает бензин в литрах, делают тонны...
поэтому обычно каждой верхней строчке соответствует одна нижняя. Необходимо, чтобы в порядке какой стоит в спецификации так и загонять в проводки.
LaaLaa

Re: Прокомментируйте код по ТХО

Сообщение LaaLaa »

Понятно, т.е у вас количество строк всегда сходится и суммы списанного и начисленного тоже сходятся. Алгоритм который выше привели будет действительно давать результат похожий на правду только для случая когда в документе только одна строка сверху и одна снизу. Для нескольких строк он работать не будет.

Рекомендую запрограммировать нужный вам расчет на ТХО API. Ниже приведен алгоритм ReSort из стандартной Галактики. Но он отдельно обрабатывает верхнюю и нижнюю части акта вместе их скрещивать не умеет. Но думаю по образцу вы сможете создать нехитрый код по скрещиванию двух половинок акта. :-)

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

#include TxoApi.vih

VipInterface Txo_ReSort
  Implements ObjTxoIdentPlugin
  #ifdef Atl51
  Licensed(Free)
  #end
;

//******************************************************************************
#doc
Назначение:
  ТХО для актов на пересортицу МЦ (используется как объектный)
#end
//******************************************************************************

Interface Txo_ReSort (,hcTXOWVIPParam);

create view
var
  CurSoprDoc        : comp;
  Param_Direct      : word;    // направление 0=[МЦ:Спис] 1=[МЦ:Прих]
  Param_FilterFlag  : word;    // Фильтры
  Param_MaskGrNal   : string;  // [ГрНал:"маска"] - маска описывает допустимое множество групп налогов
as select
  *
from
  KatSopr    (readonly), // накладная
  SpSopr     (readonly), // спецификация накладной
  KauReff    KauReffMC  (readonly),
  KatMC      (readonly),
  KatParty   (readonly),
  SpDocNal   (readonly),
  GrNal      (readonly),
  GrNal      GrNalMC    (readonly),
  GrNal      Pick_GrNal (readonly)
where
((
  CurSoprDoc       == KatSopr.Nrec      and
  CurSoprDoc       == SpSopr.cSopr      and
  Param_Direct     == SpSopr.prMC       and // 0=[МЦ:Спис] 1=[МЦ:Прих]
  SpSopr.cMcUsl    == KatMC.Nrec        and
  coKatMC          == KauReffMC.coTable and
  SpSopr.cMCUsl    == KauReffMC.cRec    and
  SpSopr.cParty    == KatParty.Nrec     and
  SpSopr.VidSopr   == SpDocNal.cSpDoc   and
  SpSopr.NRec      == SpDocNal.TipDoc   and
  0                == SpDocNal.cNalog   and
  SpDocNal.cGrNal  == GrNal.Nrec        and
  KatMc.cGrNal     == GrNalMC.Nrec
));

const
  idVipInfo   = '&VIP[Obj:"ReSort"]';
  idVipTag    = 'ReSort';

  flGrNal     =  1;
end;


function GetInfo : string;
{
   GetInfo := 'Обработка спецификации актов на пересортицу МЦ';
}

function IsMode(flConst : word) : boolean;
{ IsMode := ((Param_FilterFlag and flConst) <> 0);
}

procedure SetFilter(flConst : word);
{ Param_FilterFlag := (Param_FilterFlag or flConst);
}

function ParamGen : string;
{  var s : String;
   s := '';

   PackFields;
   if (Param_Direct = 0)
     s := s + '[МЦ:Спис]';
   else
     s := s + '[МЦ:Прих]';
   if (isMode(flGrNal))
     s := s + '[ГрНал:"' + trim(Param_MaskGrNal) + '"]';
   ParamGen := s;
}

window winParam 'Параметры идентификатора' EscClose, DoAccept;
show at (,,65,9);
screen scParam;
table KatSopr;
fields
  idVipInfo+ParamGen : Skip, {Font={Bold=true;Color=ColorMark}}, Centered;
  Param_Direct : [LIST 0 'МЦ для списания', 1 'МЦ для оприходования'], protect;
  Param_FilterFlag  ('Фильтры',,sci1EnEsc) : NoProtect;
  Param_MaskGrNal   ('Задайте маску фильтра (#, ?, [abc], [!xyz])',,sci13EnEsc) : NoProtect, NoStatic, PickButton;
<<
  .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 `Направление` .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  [.] Фильтр по группам налогов` .@@@@@@@@@@@@@@@@@@@@@@@@@@@

  Данный алгоритм позволяет получить сумму по спецификации
  акта на пересортицу МЦ.
  Циклическая обработка возможна по аналитике: МЦ, Группы МЦ,
  Внешние КАУ из каталога МЦ, Партии МЦ и Группы партий МЦ.
>>
end;

procedure MyCheckField;
{
  if (isMode(flGrNal))
    SetFieldOption(#Param_MaskGrNal, ofSelectable)
  else
    ClearFieldOption(#Param_MaskGrNal, ofSelectable);
}

HandleEvent
  cmInit :
    {
       Param_Direct      := 0; //значание параметра по умолчанию
       Param_FilterFlag  := 0;
       Param_MaskGrNal   := '';
       SetWindowTitle(winParam, 'Параметры '+idVipInfo);
       MyCheckField;
    }
  cmPick :
    {
       case CurField of
         #Param_MaskGrNal :
         {
            var cGrNal : comp;
            cGrNal := 0;
            if (RunInterface('GetGrNal', cGrNal, 0) = cmDefault)
              if (GetFirst fastfirstrow Pick_GrNal where ((cGrNal == Pick_GrNal.Nrec)) = tsOk)
                set Param_MaskGrNal := Pick_GrNal.Kod;
         }
       end;
       MyCheckField;
    }
end;
end;

TableEvent table KatSopr
  cmCheckField : MyCheckField;
end;

function ParamMaster : string;
{  ParamMaster := '';
   if( RunWindowModal(winParam)=cmDefault )
   {  PackFields;
      ParamMaster := ParamGen;
   }
}
// разбор параметров
procedure ParamParser(hTxo : longint);
{
   Param_Direct      := 0; //значание параметра по умолчанию
   Param_FilterFlag  := 0;
   Param_MaskGrNal   := '';

   var i : Longint;

   for(i:=1; i<=TxoParamCount(hTxo); i:=i+1)
   {  case TxoParamName(hTxo,i) of
        'ГРНАЛ'  : { SetFilter(flGrNal);   Param_MaskGrNal   := TxoParamValue(hTxo,i); }
        'МЦ'     : {
                     case TxoParamValue(hTxo,i) of
                       'СПИС' : Param_Direct := 0;
                       'ПРИХ' : Param_Direct := 1;
                       else   TxoDebugMsg(hTxo, idVipTag, 'Ошибка разбора параметра ['+TxoParamName(hTxo,i)+':'+TxoParamValue(hTxo,i)+']');
                    end;
        }
      end;
      TxoDebugMsg(hTxo, idVipTag, 'Param '+string(i)+' of '+string(TxoParamCount(hTxo))+' ['+TxoParamName(hTxo,i)+':'+TxoParamValue(hTxo,i)+']');
   }
}

function TestMasks : boolean;
{
  TestMasks := false;
  var s : string;

  s := '';
  if (isMode(flGrNal))
  {
    // группа налогов к спецификации накладной
    if(getfirst fastfirstrow SpDocNal = tsOk)
    {
      if(getfirst fastfirstrow GrNal = tsOk)
        s := GrNal.Kod;
    }
    else // группа налогов из МЦ
    {
      if(getfirst fastfirstrow KatMc = tsOk)
        if(getfirst fastfirstrow GrNalMC = tsOk)
           s := GrNalMC.Kod;
    }
    if (not MatchesMask(s,Param_MaskGrNal) ) exit;
  }
  TestMasks := true;
}

procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);
{
   /////////////////////////////////////////////////////////////////////////
   CurSoprDoc := buf.cSoprDoc;

   TxoAllowRecallStoreCycles(hTxo);

   /////////////////////////////////////////////////////////////////////////
   // разбор параметров
   ParamParser(hTXO);

   /////////////////////////////////////////////////////////////////////////
   if( buf.TiDkGal = cgDoc_0630 )
   if( getfirst KatSopr = tsOk )
      _loop SpSopr
      {
          if (not TestMasks) continue;

          TxoBodyClear(hTxo);
          TxoBodyAddKau(hTxo, wFlKau_Auto, cgKau_KatMc, SpSopr.cMcUsl);
          //Для извлечения SpSopr.Nrec при помощи SoprDoc
          TxoBodyAddKau(hTxo, wFlKau_Auto, wFlCycle_SpSopr, SpSopr.NRec);

          if(getfirst fastfirstrow KatMc = tsOk)
            TxoBodyAddKau(hTxo, wFlKau_Auto, cgKau_GroupMC, KatMc.cGroupMC);
         _loop KauReffMC
            TxoBodyAddKau(hTxo, wFlKau_KauReffMC, KauReffMC.wKau, KauReffMC.cKau);
          TxoBodyAddKau(hTxo, wFlKau_Auto, cgKau_KatParty, SpSopr.cParty);
          if(getfirst fastfirstrow KatParty = tsOk)
            TxoBodyAddKau(hTxo, wFlKau_Auto, cgKau_GroupParty, KatParty.cGroupParty);

          TxoBodySetSum(hTxo, SpSopr.Price*SpSopr.KolFact, 0, SpSopr.KolFact);
          TxoBodySetSumVal(hTxo, SpSopr.VPrice*SpSopr.KolFact, SpSopr.cVal);
          TxoBodyInsert(hTxo);
      }
}
end.
Иван
Местный житель
Сообщения: 200
Зарегистрирован: 28 апр 2009, 13:19
Откуда: Новороссийск

Re: Прокомментируйте код по ТХО

Сообщение Иван »

ок спасибо за код, будем пробовать... :cool:
Ответить