Добавлено: Ср Сен 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 вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.
Добавлено: Ср Сен 01, 2010 3:21 am Заголовок сообщения:
olimp писал(а):
Зачем после каждой итеррации сохранять документ ?
Не нужно конечно. Исправил.
olimp писал(а):
Если нужно пройтись по всем строкам проводки, правильнее использовать Op.TRansList(1).EnumTrans вместо цикла. Для документа с большим количеством строк дает выигрыш в разы.
Согласен.
И все-таки странно!
Расходные накладные, которые автор топика стремится так лихо переделать,
это документ, в котором четко написано сколько чего и на какую сумму отгружено.
Документ этот распечатывается в двух экземплярах, на них ставят подписи и печати обоих сторон.
И хранится по одному экземпляру у поставщика и получателя.
В результате действий автора, у его фирмы, как минимум, появится задолженность перед всеми покупателями.
Не считая того, что данные в базе перестанут соответствовать данным в первичных, бумажных документах.
Хотя, похоже, для него это не имеет значения...
Добавлено: Ср Сен 01, 2010 9:11 am Заголовок сообщения:
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
Спасибо за интерес к чужим проблемам и желание помочь новичку.
Добавлено: Ср Сен 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 Вам не избежать.
Добавлено: Чт Сен 02, 2010 9:54 am Заголовок сообщения:
samarin писал(а):
Ув nikman, чистка проводится до распечатывания этих самых расходных накладных, т.е заказчик получает уже исправленный вариант документа, пусть и без некоторого количества заказаного товара, но ведь и оплата производится по факту, а не заранее. Так что тут проблем не должно возникать.
Мои рекомендации - пересмотрите сам процесс, не трогайте программу!!! Не вникая даже в особенности бизнеса вашей организации, думаю, что сам процесс - крайне нелогичен и проблемы с процессом будут возникать и далее.
Добавлено: Пт Сен 03, 2010 5:09 pm Заголовок сообщения:
Цитата:
Мои рекомендации - пересмотрите сам процесс, не трогайте программу!!! Не вникая даже в особенности бизнеса вашей организации, думаю, что сам процесс - крайне нелогичен и проблемы с процессом будут возникать и далее.
Спасибо за дельные советы. Программа, как таковая, не пригодилась(но опыт и "понимание", хоть и основ программирования под акцент, пригодится). Нашел функцию "контроль остатков" - теперь товар в минус не уходит.Но как известно беда не приходит одна )) - теперь страдают логисты, так как не видят недостающего товара и сколько этого товара не хватило для заказа в дальнейшем больше. Теперь предстоит разобраться как решить и эту проблему
Добавлено: Сб Сен 11, 2010 1:41 am Заголовок сообщения:
samarin писал(а):
Спасибо за дельные советы. Программа, как таковая, не пригодилась(но опыт и "понимание", хоть и основ программирования под акцент, пригодится). Нашел функцию "контроль остатков" - теперь товар в минус не уходит.Но как известно беда не приходит одна )) - теперь страдают логисты, так как не видят недостающего товара и сколько этого товара не хватило для заказа в дальнейшем больше. Теперь предстоит разобраться как решить и эту проблему
Для того, чтобы анализировать заказы, их нужно учитывать., т.е. первоначально вбиваются заказы, на каких-нибуть забалансовых счетах без списания. На основе заказов формируются накладные - уже со списанием. Имея исходные данные, уже можно обрабатывать данные.
И опять же, неверная организация работы. Логист на то и логист, чот-бы не допускать недостачи, а не ждать пока красным полезет. Логисту, к примеру, можно построить отчет, который показывает сколько товара осталось, скорость реализовалось, и какой запаз в днях.
Добавлено: Чт Сен 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
Добавлено: Чт Сен 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
Заполняет проводку пару минут, нужно подождать.
Добавлено: Чт Сен 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. Тогда разница в сотые или тысячные доли секунды погоды не сделает, а код будет короче и понятней.
Добавлено: Пт Сен 28, 2012 8:15 am Заголовок сообщения:
olimp писал(а):
Oleksandr писал(а):
Это чисто гипотетически. Такие задачи вряд ли могут возникнуть.
Какие задачи, такие и результаты.
А еще проще и в сотни раз быстрее - малюсенький запрос в базу
Если в Акценте нужно что-то считать в цикле по 5000 строк, значит (скорее всего) ошибка изначально в подходе. И дело тут не только и не столько в скорости работы вбскрипта, а в том, что загрузка каждого объекта сопровождается микротранзакциями. Естественно Trans.Sum загружается всем скопом, но если надо прийтись, например, по Trans.Entity.Name - все, аллес.
Я когда-то написал даже класс, который заменяет Operation со всеми вложенными объектами, включая параметры, факты и т.д. При необходимости загрузить (например) Op.Trans(1,1).Params("Long1") это можно сделать без загрузки операции и проводок.
А еще я в некоторых случаях кеширую параметры и факты объектов (по крайней мере в 7.0 они загружаются КАЖДЫЙ РАЗ при загрузке и обращении к параметрам/фактам аналитик и ОУ). Была одна задача на чистой математике, где часть данных хранилась в параметрах пары десятков аналитик. Так вот, самым узким местом оказались не логарифмы и циклы, а именно эти тысячи микротранзакций. И неискушенный программист не может понять, в чем проблема: процессор простаивает, памяти море, сервер едва шевелится, а ждать надо несколько минут. Зато сетевухи пашут...
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах