Суммирование при циклической обработке в ТХО

ПНР и сопровождение

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

Ответить
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Суммирование при циклической обработке в ТХО

Сообщение spark »

Добрый день!

Давно терзает этот вопрос, но раньше всячески обходил его стороной. Можно ли используя циклическую обработку получать не по проводке на каждую строчку, а общую проводку?

Вот откуда вопрос вырос сейчас:
Необходимо привязав к накладной ТХО получить две проводки - одну по позициям с партиями у которых задана валюта и одну по позициям с партиями без валют.
Использую для этого следующие алгоритмы:
&1 = coTXOGetField('SPSOPR','CPARTY',&SoprDoc[Рез:СпНаклАкта])
&2 = coTXOGetField('KATPARTY','CVALPAR',&1)
Алгоритм в НДЕ = if(&2>0,&NP_,0)

Таким образом я получаю на каждую позицию накладной отдельную проводку, но мне нужна общая, потому что аналитик никаких по счету не ведется.
Может есть какие-нибудь команды, которые схлопывают одинаковые проводки, суммируя их? Или может мою задачу можно решить другим путем? Просто не нашел как еще можно добраться до валюты партии...
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Суммирование при циклической обработке в ТХО

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

по-моему аналитики по валютам нет... если только через ТХО Апи. там можно все :)
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение spark »

Алексей писал(а):по-моему аналитики по валютам нет... если только через ТХО Апи. там можно все :)
Да... ТХО Апи это вариант который подходит к любым задачам... В принципе и опыт написания небольшой есть, но ради такой пустяшной задачи городить ТХО Апи... =)
Seybukan
Местный житель
Сообщения: 1357
Зарегистрирован: 29 мар 2005, 17:49
Откуда: СПб, ЭП-Аудит
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение Seybukan »

Можно и без ТХО API обойтись. Через одно место, но все же можно:
Сделайте забалансовый счет с аналитикой по сопроводительным документам, пользовательской по валютам.
Делайте проводки на забалансовый счет. Потом обрабатывайте OBOROT-ом или PAT-том. И будет вам одна проводка.
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение spark »

Seybukan писал(а):Можно и без ТХО API обойтись. Через одно место, но все же можно:
Сделайте забалансовый счет с аналитикой по сопроводительным документам, пользовательской по валютам.
Делайте проводки на забалансовый счет. Потом обрабатывайте OBOROT-ом или PAT-том. И будет вам одна проводка.
Громоздко конечно, но за отличную идею спасибо! =)
Seybukan
Местный житель
Сообщения: 1357
Зарегистрирован: 29 мар 2005, 17:49
Откуда: СПб, ЭП-Аудит
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение Seybukan »

Голь на выдумку хитра. :)
LaaLaa

Re: Суммирование при циклической обработке в ТХО

Сообщение LaaLaa »

Лучше на VIP алгоритм сделайте, ну или уломайте Plinda опубликовать его версию SQL-алгоритма http://www.tyumbit.ru/gal_forum/viewtop ... =4&t=10956
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Суммирование при циклической обработке в ТХО

Сообщение edward_K »

проще самому сделать :). Идея то простая. Правда, могет быть тробла если с первасива переходили на mssql и в базе есть случайные nrec.
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение spark »

LaaLaa писал(а):Лучше на VIP алгоритм сделайте, ну или уломайте Plinda опубликовать его версию SQL-алгоритма http://www.tyumbit.ru/gal_forum/viewtop ... =4&t=10956
Пока сделаем через параллельный план счетов с сворачиванием итога через OBOROT. VIP оставим в загашнике пока эта монструозная ТХО не начнет тупить. =)

Жаль что в системе нет такой банальной функции стандартно... но видимо не очень востребовано.
spark
Местный житель
Сообщения: 478
Зарегистрирован: 19 окт 2005, 13:38
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение spark »

edward_K писал(а):проще самому сделать :). Идея то простая. Правда, могет быть тробла если с первасива переходили на mssql и в базе есть случайные nrec.
Какие такие случайные nrec'и?? С этого места можно поподробней? я записываю... ;-)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Суммирование при циклической обработке в ТХО

Сообщение edward_K »

очень длинные 4.......... я столкнулся с тем что прямые запросы к субд иногда умудряются криво обработаться, вроде и запрос то простой, и полей нет с типом comp - а тем не менее не все данные тянутся. В детали пока не вдавался.
Dmitry_Sol
Постоянный гость
Сообщения: 76
Зарегистрирован: 07 июн 2007, 12:32
Откуда: Витебск
Контактная информация:

Re: Суммирование при циклической обработке в ТХО

Сообщение Dmitry_Sol »

Тоже столкнулся с проблемой суммирования проводок в ТХО.
Пришлось написать TXO API для суммирования однотипных проводок.
Может кому пригодится.
После сборки, в перечне алгоритмов появится TxoCalcIdent.
Нужно создать новую строку в хозоперации, и выбрать &VIP[Obj:"TXOCALCIDENT"]

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

#include TxoApi.vih
#include ShowKau.vpp

// Указываем, что наш интерфейс реализует расчет идентификатора ТХО
#component "F_TXOAPI"
VipInterface Txo_TxoCalcIdent implements F_TXOAPI::ObjTxoIdentPlugin;
#component "F_TXOAPI"
// Простой интерфейс для обработки накладной
Interface Txo_TxoCalcIdent;

// Логическая таблица, описывает стуктуру накладной
create view DemoView
var
  CurTiDkGal : word;
  CurSoprDoc : comp;
  P1         : String;
  P2         : String;
as select
  *
from
  Oborot,
  Oborot OborotTemp(memory),
  Oborot Oborot1;
;


function GetInfo : string;
{
   GetInfo := 'Объединение однотипных проводок';
}

function ParamMaster : string;
{
   Message(''#3'здесь должен быть вызов окошка, чтобы помочь пользователю'#13+
           ''#3'заполнить строку дополнительных параметров идентификатора:'#13+
           ''#3'[Param1:"xxx"][Param2:"yyy"]');
   ParamMaster := '[Param1:"xxx"][Param2:"yyy"]';
}


procedure StoreCycles(hTxo : longint; buf : TTxoApiInfoDoc);
{
   CurTiDkGal := buf.TiDkGal;
   CurSoprDoc := buf.cSoprDoc;
	var isNew:boolean;
	isNew:=True;
   _loop Oborot where ((CurTiDkGal == Oborot.Tidk and CurSoprDoc==Oborot.cSoprDoc))
     {
		 //проверка однотипности проводки по счету,субсчету, КАУ1..6 и подразделению
		 _loop OborotTemp
			{
				isNew:=True;
				if   Oborot.Scheto = OborotTemp.Scheto and
				   Oborot.SubOsSch = OborotTemp.SubOsSch and
 				   Oborot.KauOs[1] = OborotTemp.KauOs[1] and
				   Oborot.KauOs[2] = OborotTemp.KauOs[2] and
				   Oborot.KauOs[3] = OborotTemp.KauOs[3] and
				   Oborot.KauOs[4] = OborotTemp.KauOs[4] and
				   Oborot.KauOs[5] = OborotTemp.KauOs[5] and
				   Oborot.KauOs[6] = OborotTemp.KauOs[6] and
				   Oborot.KodSpo   = OborotTemp.KodSpo   and
                   Oborot.SchetK   = OborotTemp.SchetK   and
				   Oborot.SubSchK  = OborotTemp.SubSchK  and
				   Oborot.KauKs[1] = OborotTemp.KauKs[1] and
				   Oborot.KauKs[2] = OborotTemp.KauKs[2] and
				   Oborot.KauKs[3] = OborotTemp.KauKs[3] and
				   Oborot.KauKs[4] = OborotTemp.KauKs[4] and
				   Oborot.KauKs[5] = OborotTemp.KauKs[5] and
				   Oborot.KauKs[6] = OborotTemp.KauKs[6] and
				   Oborot.KodSpK   = OborotTemp.KodSpK   and
				   Oborot.DatOb    = OborotTemp.DatOb    and
 				   Oborot.KodValut = OborotTemp.KodValut
				   {
					 isNew:=False;
				     break;
				   }
			}
		   if isNew
		    {
					   OborotTemp.buffer:=Oborot.buffer;
					   insert current OborotTemp;
			}
		    else
			{
		             OborotTemp.SumOb:=OborotTemp.SumOb+Oborot.SumOb;
			         OborotTemp.SumValut:=OborotTemp.SumValut+Oborot.SumValut;
		             update current OborotTemp;
			}
		 delete current Oborot;
	 }
   _loop OborotTemp
    {
		Oborot.buffer:=OborotTemp.buffer;
		insert current Oborot;
	}
}
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Суммирование при циклической обработке в ТХО

Сообщение edward_K »

Да уж - и сколько по времени сие пашет? Чем больше проводок накопили, тем все медленнее и медленнее.
Вообще тема для программирования.
А так можно на DSQL собрать
1. объявить временную таблу
table struct tmp_oboort = Oborot ; Я вообще то не поленился и прописал все поля - так запрос писать проще да заодно от массивов избавился + добавил поле со счетчиком чтобы потом не обрабатывать уже уникальные разрезы
2. Выгрузить в нее все поля из Oborot
Вот эти слегка по другому
,sum(SumOb) as SumOb
,sum(SumValut) as SumValut
,sum(Kol) as Kol
,sum(ConvSum) as ConvSum
,min(Nrec) as Nrec
остальные по вкусу. Порядок должен точно соотв. tmp_oboort. Поля без формул должны быть повторены в group by(Я теперь поля в select и в group by вывожу одной и той же функцией в которой некоторые поля для group by гашу
3. Выполнить запрос
4. Пробежаться по tmp_oborot.
пробежаться по Oborot по условию
там где Oborot.nrec совпал с tmp_oborot записать сумму и кол-во, остальные удалить.
+ скорость, меньше записей в журнал и так далее.
Решение есть и готовое.
Plinda
Сообщения: 14
Зарегистрирован: 16 сен 2010, 19:41

Re: Суммирование при циклической обработке в ТХО

Сообщение Plinda »

Чего мучаетесь...

SQLTXO - в стандартной поставке галактики с весны чтоль.

Топсофт реализовал кривовато первоначальную задумку, но вроде работает. Если не совсем понятно как работает, опишите необходимый алгоритм. На примере понятно лучше
Ответить