• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Суммирование материалов по операциям в карте

Автор Александр Волков, 30.08.16, 15:19:46

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Александр Волков

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

У класса operation есть функция «До вставки» ClassBeforeFill.

У меня есть функция для блока подстановок «До заполнения» SubstStart. Эта функция выводит каждый материал один раз и складывает нормы рахода, по всем операциям. А нужно, чтобы для каждой операции материалы складывались отдельно.
Я пытаюсь из этой функции сделать функцию для ClassBeforeFill.
Конечно, вместо цикла по всем объектам дерева
for i=0 to (ovec.vrObjectsCount-1)
я делаю цикл по всем объектам операции и по всем объектам переходов (к которым прикреплены материалы):
set VO = obj.vrObjectsVector
  set it = VO.vrCreateIterator("",obj,true)
 
  do while it.vrNext
'Итератор по переходам
    set VO_op = obj.vrObjectsVector
    set it_po_oper = VO_op.vrCreateIterator("",obj,true)
    do while it_po_oper.vrNext
     
      set obj1 = it_po_oper.vrGetObject
     
      if obj1.vrClass.vrName="sub_material" then
        CheckObj obj1, "lossfunc"
      elseif obj1.vrClass.vrName="sog" then
        CheckObj obj1, "lossfunc"
      elseif obj1.vrClass.vrName="svr_cable" then
        CheckObj obj1, "calc_loss"
      elseif obj1.vrClass.vrName="svr_electrod" then
        CheckObj obj1, "calc_loss"
      elseif obj1.vrClass.vrName="svr_shield" then
        CheckObj obj1, "calc_loss"
      end if
    loop

if obj.vrClass.vrName="sub_material" then
      CheckObj obj, "lossfunc"
    elseif obj.vrClass.vrName="sog" then
      CheckObj obj, "lossfunc"
    elseif obj.vrClass.vrName="svr_cable" then
      CheckObj obj, "calc_loss"
    elseif obj.vrClass.vrName="svr_electrod" then
      CheckObj obj, "calc_loss"
    elseif obj.vrClass.vrName="svr_shield" then
      CheckObj obj, "calc_loss"
    end if
loop

Рабочая функция «До заполнения» для блока подстановок, по аналогии с которой я пытаюсь сделать функцию «До вставки» для фильтра operations:

dim b_doc
dim ovec

function SubstStart(start_y, subst, obj, items)
  ' start_y - начало вставки
  ' subst - этот блок подстановок
  ' obj - определяющий объект технологии (dse или operation для операционных шаблонов), items - сюда записывать добавляемые объекты

  set ovec = rptBuilder.rModel.vrGetObjVector
  set b_doc = rptBuilder.rActiveBuild
 
 
  for i=0 to (ovec.vrObjectsCount-1)
    set obj = ovec.vrItem(i)
    if obj.vrClass.vrName="sub_material" then
      CheckObj obj, "lossfunc"
    elseif obj.vrClass.vrName="sog" then
      CheckObj obj, "lossfunc"
    elseif obj.vrClass.vrName="svr_cable" then
      CheckObj obj, "calc_loss"
    elseif obj.vrClass.vrName="svr_electrod" then
      CheckObj obj, "calc_loss"
    elseif obj.vrClass.vrName="svr_shield" then
      CheckObj obj, "calc_loss"
    end if
  next

  ' -1 (завершить эту подстановку)
  ' 0 (OK)
  StartSubst = 0
end function

function CheckObj(obj,loss_attr)
  '$DEFINE obj as IVObject;
  set check_attr = nothing
  on error resume next
  set check_attr = obj.vrClass.vrnClassValueItem(loss_attr)
  if check_attr is nothing then
    exit function
  end if
  on error goto 0

  show_str = cstr(obj.vrExecuteFunction("showme"))
  prev_id = cstr(b_doc.rVariable(show_str))
  if prev_id="" then
    prev_id = obj.vrObjStrID
    b_doc.rVariable(show_str) = prev_id
  else
    curr_loss = cdbl(obj.vrExecuteFunction(loss_attr))
    mark_this_obj = true
    if curr_loss>0.0 then
      set prev_obj = ovec.vrGetObjByStrID(prev_id)
      prev_loss = cdbl(prev_obj.vrExecuteFunction(loss_attr))
      if prev_loss=0.0 then
        b_doc.rMarkAsPrinted prev_obj,false
        mark_this_obj = false
        prev_id = obj.vrObjStrID
        b_doc.rVariable(show_str) = prev_id
      end if
    end if
    if mark_this_obj then
      b_doc.rMarkAsPrinted obj,false
    end if
   end if
  prev_loss = cdbl(b_doc.rVariable(prev_id)) + cdbl(obj.vrExecuteFunction(loss_attr))
  b_doc.rVariable(prev_id) = prev_loss
end function

Я так понял, что функция CheckObj, каким-то образом маркирует материалы, как уже напечатанные, которые совпадают по имени с тем материалом, который в нее передается. Но я не понимаю, как это происходит.
И как сделать так, чтобы маркировались только материалы, которые находятся в текущей операции?
Перепробовал все, что смог придумать – ничего не помогло.

tur

Такой функционал есть в комплектовании операции, посмотрите как реализована эта функция в конфигураторе Вертикали.