Список форумов Акцент Акцент
официальный форум разработчика программы Акцент
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

чистка
На страницу Пред.  1, 2
 
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 7.0
Предыдущая тема :: Следующая тема  
Автор Сообщение
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Ср Сен 01, 2010 2:56 am    Заголовок сообщения: Ответить с цитатой

[quote="nikman"]
Код:
For i = 1 to Op.TransList(1).Rows
   With Op.Trans(1,i)
      if  .EntID = (id удаляемого) then
         .Qty = Round2(.Qty/10,0)
         .Sum = Round2(.Price * .Qty,2)
      end if
   end with
   Op.Save

Next

Зачем после каждой итеррации сохранять документ ?
Если нужно пройтись по всем строкам проводки, правильнее использовать Op.TRansList(1).EnumTrans вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Ср Сен 01, 2010 3:21 am    Заголовок сообщения: Ответить с цитатой

olimp писал(а):
Зачем после каждой итеррации сохранять документ ?
Не нужно конечно. Исправил.
olimp писал(а):
Если нужно пройтись по всем строкам проводки, правильнее использовать Op.TRansList(1).EnumTrans вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.
Согласен.

И все-таки странно!
Расходные накладные, которые автор топика стремится так лихо переделать,
это документ, в котором четко написано сколько чего и на какую сумму отгружено.
Документ этот распечатывается в двух экземплярах, на них ставят подписи и печати обоих сторон.
И хранится по одному экземпляру у поставщика и получателя.
В результате действий автора, у его фирмы, как минимум, появится задолженность перед всеми покупателями.
Не считая того, что данные в базе перестанут соответствовать данным в первичных, бумажных документах.
Хотя, похоже, для него это не имеет значения... Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Ср Сен 01, 2010 9:11 am    Заголовок сообщения: Ответить с цитатой

samarin писал(а):

ничего не происходит, накладная сохраняется, а товар уходит в минус только после перемещения. Этот минус потом и приходится возвращать к нулю вручную удаляя позиции


Может, это и есть проблема, либо особенность настройки, например, т.н. "Отложенное списание". Оператор набивает накладные, а в конце рабочего дня запускается, собственно, процесс списания.

Попытайтесь услышать бухгалтеров, которые участвовали в написании ТЗ для настройки (которая все же отличается от стандартных). Узнать бизнес процесс реализации.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
samarin
Гость





СообщениеДобавлено: Ср Сен 01, 2010 3:55 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
И все-таки странно!
Расходные накладные, которые автор топика стремится так лихо переделать,
это документ, в котором четко написано сколько чего и на какую сумму отгружено.
Документ этот распечатывается в двух экземплярах, на них ставят подписи и печати обоих сторон.
И хранится по одному экземпляру у поставщика и получателя.
В результате действий автора, у его фирмы, как минимум, появится задолженность перед всеми покупателями.
Не считая того, что данные в базе перестанут соответствовать данным в первичных, бумажных документах.
Хотя, похоже, для него это не имеет значения... Smile

Ув nikman, чистка проводится до распечатывания этих самых расходных накладных, т.е заказчик получает уже исправленный вариант документа, пусть и без некоторого количества заказаного товара, но ведь и оплата производится по факту, а не заранее. Так что тут проблем не должно возникать.

Цитата:
1. Лучше не беритесь, а пригласите специалиста. Smile
2. Обязательно сделайте резервную копию базы, перед тем как что-то запускать.
3. Желательно сделайто копию базы и потренируйтесь на ней сначала.
4. Лучше не делайте это напрямую через SQL-запросы.
В Вашем случае все можно сделать через объектную модель. Будет дольше, но надежнее.
5. Для начала сделайте для 1 товара за 1 день.
Если сделаете это -- сможете и расширить до перечня товаров за период.

поднял точную копию сервера на вмваре для избежания разных казусов. все будет обкатыватся там. Я так понял файл
Цитата:
Отчет RepDocList:
Код:
Dim rep
Dim i, op
Set rep = Workarea.CreateReport("RepDocList");

rep.Kind = acFolder
rep.KindID = (id папки)
rep.Build
rep.MakeSheet True

For i = 1 To rep.Count
Set Op = Workarea.Operation(rep.Item(i).ID)
.........
Next

нужно подключать как отчет. Что за id папки?
Что делать с файлом №2?
Цитата:
Код:
For i = 1 to Op.TransList(1).Rows
With Op.Trans(1,i)
if .EntID = (id удаляемого) then
.Qty = Round2(.Qty/10,0)
.Sum = Round2(.Price * .Qty,2)
end if
end with
Next
Op.Save

Спасибо за интерес к чужим проблемам и желание помочь новичку.
Вернуться к началу
nikman



Зарегистрирован: 10.03.2005
Сообщения: 786
Откуда: Украина, Донецк

СообщениеДобавлено: Ср Сен 01, 2010 5:09 pm    Заголовок сообщения: Ответить с цитатой

samarin писал(а):
Ув nikman, чистка проводится до распечатывания этих самых расходных накладных, т.е заказчик получает уже исправленный вариант документа, пусть и без некоторого количества заказаного товара, но ведь и оплата производится по факту, а не заранее. Так что тут проблем не должно возникать.
Теперь понятно. Раньше это казалось очень уж несуразным.
И все-таки мне кажется более правильным подобную обработку производить в реальном времени,
в момент формирования расходной накладной.
Это, как минимум, избавит вас от необходимости постоянно все переделывать.
Лучше всего заполнять документы по реальным остаткам.
samarin писал(а):
Я так понял файл
Цитата:
Dim rep
Dim i, op
Set rep = Workarea.CreateReport("RepDocList");
rep.Kind = acFolder
rep.KindID = (id папки)
rep.Build
rep.MakeSheet True
For i = 1 To rep.Count
Set Op = Workarea.Operation(rep.Item(i).ID)
.........
Next
нужно подключать как отчет.

Сначала сохранить в текстовом файле с расширением *.avb в папке Modules.
Потом, да, подключить как отчет на нужной папке.
samarin писал(а):
Что за id папки?

В свойствах, вверху, в квадратных скобках.
В данном случае ID папки = 616
Цитата:
Что делать с файлом №2?
Вообще-то вставить в первый, вместо многоточия. Но это ж далеко не все.
Вам нужно в отдельном цикле посчитать сначала общее кол-во.
Чтобы знать на какой процент надо уменьшать кол-во в документе.

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

Я набросал основные части, самостоятельного программирования на VBScript Вам не избежать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail AIM Address MSN Messenger
AllexL



Зарегистрирован: 10.03.2005
Сообщения: 434
Откуда: Donetsk

СообщениеДобавлено: Чт Сен 02, 2010 9:54 am    Заголовок сообщения: Ответить с цитатой

samarin писал(а):
Ув nikman, чистка проводится до распечатывания этих самых расходных накладных, т.е заказчик получает уже исправленный вариант документа, пусть и без некоторого количества заказаного товара, но ведь и оплата производится по факту, а не заранее. Так что тут проблем не должно возникать.

Мои рекомендации - пересмотрите сам процесс, не трогайте программу!!! Не вникая даже в особенности бизнеса вашей организации, думаю, что сам процесс - крайне нелогичен и проблемы с процессом будут возникать и далее.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
samarin
Гость





СообщениеДобавлено: Пт Сен 03, 2010 5:09 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
Мои рекомендации - пересмотрите сам процесс, не трогайте программу!!! Не вникая даже в особенности бизнеса вашей организации, думаю, что сам процесс - крайне нелогичен и проблемы с процессом будут возникать и далее.

Спасибо за дельные советы. Программа, как таковая, не пригодилась(но опыт и "понимание", хоть и основ программирования под акцент, пригодится). Нашел функцию "контроль остатков" - теперь товар в минус не уходит.Но как известно беда не приходит одна )) - теперь страдают логисты, так как не видят недостающего товара и сколько этого товара не хватило для заказа в дальнейшем больше. Теперь предстоит разобраться как решить и эту проблему
Вернуться к началу
Antalex



Зарегистрирован: 18.08.2006
Сообщения: 251
Откуда: Краматорск

СообщениеДобавлено: Сб Сен 11, 2010 1:41 am    Заголовок сообщения: Ответить с цитатой

samarin писал(а):
Спасибо за дельные советы. Программа, как таковая, не пригодилась(но опыт и "понимание", хоть и основ программирования под акцент, пригодится). Нашел функцию "контроль остатков" - теперь товар в минус не уходит.Но как известно беда не приходит одна )) - теперь страдают логисты, так как не видят недостающего товара и сколько этого товара не хватило для заказа в дальнейшем больше. Теперь предстоит разобраться как решить и эту проблему

Для того, чтобы анализировать заказы, их нужно учитывать., т.е. первоначально вбиваются заказы, на каких-нибуть забалансовых счетах без списания. На основе заказов формируются накладные - уже со списанием. Имея исходные данные, уже можно обрабатывать данные.
И опять же, неверная организация работы. Логист на то и логист, чот-бы не допускать недостачи, а не ждать пока красным полезет. Логисту, к примеру, можно построить отчет, который показывает сколько товара осталось, скорость реализовалось, и какой запаз в днях.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Oleksandr
Гость





СообщениеДобавлено: Чт Сен 27, 2012 1:09 pm    Заголовок сообщения: Ответить с цитатой

olimp писал(а):

Если нужно пройтись по всем строкам проводки, правильнее использовать Op.TRansList(1).EnumTrans вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.

Примерно в 2 раза. На вложенных циклах (вложенных вызовах EnumTrans) преимущество EnumTrans существеннее. Это если используются данные из проводок. Но если данные из проводок доставать не нужно (мало ли), то цикл отрабатывает примерно в 4 раза быстрее.

П.С. Если доставать в цикле данные из проводок (как у автора топика), то только так:
Код:
with op.translist(1)
 for i = 1 to .rows
  sum = sum + .item(i).sum
 next
end with

через op.trans(1, i).sum - еще в разы дольше
Вернуться к началу
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Чт Сен 27, 2012 1:43 pm    Заголовок сообщения: Ответить с цитатой

Oleksandr писал(а):
olimp писал(а):

Если нужно пройтись по всем строкам проводки, правильнее использовать Op.TRansList(1).EnumTrans вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.

Примерно в 2 раза. На вложенных циклах (вложенных вызовах EnumTrans) преимущество EnumTrans существеннее. Это если используются данные из проводок. Но если данные из проводок доставать не нужно (мало ли), то цикл отрабатывает примерно в 4 раза быстрее.


Я не знаю чем ты там меряешь и зачем работать со строками проводки, если данные из нее не нужны. Но вот тебе текст теста.
Специально вначале добавил строки в проводку, чтобы сравнение было более точным.
EnumTrans всегда быстрее цикла. Заметно это более всего, если делать присваивание свойствам проводки.

Код:

Option Explicit

Dim dStart, Sum
Dim Op, i

Set Op = Workarea.Createoperation

For i = 1 To 500000
   Op.Trans(1, i).Sum = i
Next

Sum = 0
dStart = Time

For i = 1 To 500000
   Sum = Sum + Op.Trans(1, i).Sum
Next

MsgBox DateDiff("s", dStart, Time)

Sum = 0
dStart = Time
Op.Translist(1).EnumTrans GetRef("Calc"), i
MsgBox DateDiff("s", dStart, Time)

Function Calc(Tr, ByRef prm)
   Calc = True
   Sum = Sum + Tr.Sum
End Function

На моей машине цикл проиграл Enumtrans со счетом 7:2
Заполняет проводку пару минут, нужно подождать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Oleksandr
Гость





СообщениеДобавлено: Чт Сен 27, 2012 3:57 pm    Заголовок сообщения: Ответить с цитатой

olimp писал(а):

Я не знаю чем ты там меряешь


Вот таким кодом. Для наглядности сделал вложенный вызов и двойной цикл:
Код:

Option Explicit

Dim op, op2, sum, i, j, t
Set op = workarea.OpenDocument (1681051) ' > 4500 проводок
Set op2 = workarea.OpenDocument (1681096) ' > 4500 проводок

' ENUM_TRANS
MsgBox "Старутем EnumTrans"
t = Now
op.transList(1).EnumTrans GetRef("EnumProc1"), sum
MsgBox "Время выполнения EnumTrans, c: " + CStr(DateDiff ("s", t, Now))
MsgBox sum

Function EnumProc1(Trans, ByRef Param)
  EnumProc1 = True ' продолжим обработку
  op2.transList(1).EnumTrans GetRef("EnumProc2"), param
End Function


Function EnumProc2(Trans, ByRef Param)
  EnumProc2 = True ' продолжим обработку
  Param = Param + trans.sum ' добавим к параметру сумму проводки
End Function


' ЦИКЛЫ
MsgBox "Старутем циклы"
sum = 0
t = Now
With op2.translist(1)
   For i = 1 To op.translist(1).Rows      
         For j = 1 To .Rows
            sum = sum + .item(j).sum
         Next
   Next
End With

MsgBox "Время выполнения циклами, c: " + CStr(DateDiff ("s", t, Now))
MsgBox sum

Время выполнения через EnumTrans - 50 сек; через циклы - 198 сек.

Если не трогать проводки:
Код:
  ' Param = Param + trans.sum ' добавим к параметру сумму проводки
Param = Param + 1

' sum = sum + .item(j).sum
sum = sum + 1

то результат: EnumTrans - 26 сек; Циклы - 5 сек.

olimp писал(а):

и зачем работать со строками проводки, если данные из нее не нужны.

Это чисто гипотетически. Такие задачи вряд ли могут возникнуть.
К примеру, нужно что-то поменять в каждой 200 проводке из 20000. Очень вероятно, что цикл отработает быстрее.
В обычном же случае EnumTrans конечно лучше. Разве что кол-во обрабатываемых проводок заведомо не превысит скажем 100. Тогда разница в сотые или тысячные доли секунды погоды не сделает, а код будет короче и понятней.
Вернуться к началу
olimp
Site Admin


Зарегистрирован: 10.03.2005
Сообщения: 2661

СообщениеДобавлено: Чт Сен 27, 2012 4:15 pm    Заголовок сообщения: Ответить с цитатой

Oleksandr писал(а):

Это чисто гипотетически. Такие задачи вряд ли могут возникнуть.

Какие задачи, такие и результаты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
kris



Зарегистрирован: 12.01.2006
Сообщения: 371

СообщениеДобавлено: Пт Сен 28, 2012 8:15 am    Заголовок сообщения: Ответить с цитатой

olimp писал(а):
Oleksandr писал(а):

Это чисто гипотетически. Такие задачи вряд ли могут возникнуть.

Какие задачи, такие и результаты.

А еще проще и в сотни раз быстрее - малюсенький запрос в базу Smile
Если в Акценте нужно что-то считать в цикле по 5000 строк, значит (скорее всего) ошибка изначально в подходе. И дело тут не только и не столько в скорости работы вбскрипта, а в том, что загрузка каждого объекта сопровождается микротранзакциями. Естественно Trans.Sum загружается всем скопом, но если надо прийтись, например, по Trans.Entity.Name - все, аллес.
Я когда-то написал даже класс, который заменяет Operation со всеми вложенными объектами, включая параметры, факты и т.д. При необходимости загрузить (например) Op.Trans(1,1).Params("Long1") это можно сделать без загрузки операции и проводок.
А еще я в некоторых случаях кеширую параметры и факты объектов (по крайней мере в 7.0 они загружаются КАЖДЫЙ РАЗ при загрузке и обращении к параметрам/фактам аналитик и ОУ). Была одна задача на чистой математике, где часть данных хранилась в параметрах пары десятков аналитик. Так вот, самым узким местом оказались не логарифмы и циклы, а именно эти тысячи микротранзакций. И неискушенный программист не может понять, в чем проблема: процессор простаивает, памяти море, сервер едва шевелится, а ждать надо несколько минут. Зато сетевухи пашут...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Акцент -> Акцент 7.0 Часовой пояс: GMT + 2
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group