Страница 1 из 1
Прокомментируйте код по ТХО
Добавлено: 12 июл 2010, 13:37
Иван
Доброго времени суток!
Прокомментируйте пожалуйста следующий код у документа акт на пересортицу:
Код: Выделить всё
if(wTXOGetField('SPSOPR','PRMC',&SoprDoc[Рез:СпНаклАкта])=1,TxoSetKau(4,160,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])) ,TxoSetKau(4,161,coTXOGetField('SPSOPR','CMCUSL',&SoprDoc[Рез:СпНаклАкта])))
Как я понимаю, в спецификации берется поле PRMC и если оно =1, то в режиме 0 МЦ проставляется, иначе в режиме 1. Получается, что этот код отрабатывается два раза?
Re: Прокомментируйте код по ТХО
Добавлено: 12 июл 2010, 15:10
edward_K
ну почему 2 раза. если 1 - это то что внизу, если 0 - то что посередине. Предполагается что обработка отдельно пробежит верхную и нижную часть.
Проводка видимо 10 - 10, по дебету режим 0 , по кредиту режим 1?
Re: Прокомментируйте код по ТХО
Добавлено: 12 июл 2010, 15:26
Иван
ну да 10 10, спасибо за ответ...
вроде как в программировании предполагается один проход вот и интересно стало... вроде как условие взаимоисключающее, а ТХО нормально срабатывает.
А вот список формул, которые под проводками, сколько раз и в какой последовательности отрабатывают?
Re: Прокомментируйте код по ТХО
Добавлено: 12 июл 2010, 16:46
edward_K
LaaLaa вам лучше ответит. Я думаю там нечто сложное чтобы выйти на итоговую сумму.
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 15:47
LaaLaa
Иван писал(а):А вот список формул, которые под проводками, сколько раз и в какой последовательности отрабатывают?
Много раз в по кругу и по сложной схеме пока все не сосчитаются и пока дебет с кредитом не сойдется

как то так.
Вот вам другая задача: Буратине дали три яблока. Два он съел. Сколько яблок осталось у Буратины? Думаете одно?
Ответ: Ничего подобного. Никто же не знает сколько у него уже было яблок до этого… Мораль - обнуляйте переменные
Код который приведен в первом посте не имеет смысла рассматривать без остальных формул и параметров этой ТХО. Также важно к какому типу документа эта ТХО будет применяться.
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 15:50
LaaLaa
Полную расшифровку расчета вы можете получить если включите в настройках протокол расчетов ТХО, 4-отладочный уровень.
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 19:08
Иван
документ - акт на пересортицу
мне необходимо сделать так, чтобы в дебете проводки по аналитике материалы - был материал из нижней спецификации, а в кредите - из верхней.
Сейчас ТХО настроена так:
две проводки: 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[Рез:СпНаклАкта]))
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 19:49
LaaLaa
А сколько у вас в документах "акт на пересортицу" обычно строк в нижней спецификации и верхней ? Как вы хотите сопоставить каждую конкретную строку нижней спецификации каждой конкретной строке верхней спецификации в случае если строк несколько? И в случае если строк несколько и они не совпадают не по суммам не количеству наименований ?
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 20:00
Иван
у нас обычно так происходит: например, были какие-то трубы, их тупо переводят в лом или бывает бензин в литрах, делают тонны...
поэтому обычно каждой верхней строчке соответствует одна нижняя. Необходимо, чтобы в порядке какой стоит в спецификации так и загонять в проводки.
Re: Прокомментируйте код по ТХО
Добавлено: 13 июл 2010, 21:24
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.
Re: Прокомментируйте код по ТХО
Добавлено: 14 июл 2010, 13:38
Иван
ок спасибо за код, будем пробовать...
