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

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

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

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

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

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

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

Автоматическая нумерация операций?

Автор fatscrat, 21.02.14, 09:37:44

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

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

fatscrat

Подскажите, пожалуйста как в вертикали настроить автоматическую нумерацию операций?

Пример
1. Есть последовательность 5,10,15,20 итд....
2. В 10-ой оперпации пользователь вручую изменяет атрибут "Номер операции" на 10-50.
3. Нужно изменить номера остальных операций, чтобы в результате получилось 5, 10-50, 55, 60 итд.

Или другими словами: "Как заставить вертикаль автоматически перенумеровывать все операции при изменении атрибута "Номер операции"

tur

1. Откройте ТП
2. Настройка\Автонумерация
3. Настраиваите как Вам нужно (скриншот). Судя по Вашему посту нужно отключить галку "Использовать нумератор". Потому что такая нумерация как у Вас в примере возможна только руками или пишите функцию.
4. Если нужно для всех, то перезаписываете файлы на своей машине assembly.vtp (сборка) и detail.vtp (деталь) по пути C:\Program Files (x86)\ASCON\Vertical\Template и заменяете его на всех компьютерах. Или настраиваите это на каждой машине отдельно.

fatscrat

Дык в тои-то и дело, чт функция написана, но при вводе пользователем в атрибут "Номер операции" значения 10-50 последующие операции не песчитываются и их приходиться вводить в ручную. Это и нужно исправить.

Код функции:

function GetNumber(obj, prev_obj, numerator, num_generated)
  Dim val
  val = prev_obj.vrAttrByName("indexoper").vrValue
  Dim chPos
  chPos = InStrRev(oldVal, "-")
  val = Right(val, Len(val) - chPos)
  GetNumber = val + numerator.vsNumStep
end function

tur

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

А вопрос: 10-50 это случаем не номера операций которые нужно выполнить, а вы просто не добавляете эти операции в карту?

fatscrat

Ну у нас обычно так:

Техпроцесс на мех обработку:
1. Лазер
2. Сверлить
3. Сверлить
4. Слесарная
5-50 Сварка (по отдельному ТП в цехе таком-то)
55 Слесарная
60 Моечная
65 .........

Отдельный ТП в экселе, так что вместо 5-50 использовать ссылочную операцию неполучится.

tur

Тогда у Вас должно быть, например так:

005 Лазер
010 Сверлить
015 Сверлить
020 Слесарная
025 Выполнить операции № 5-50 из техпроцесса 12345-78  (обозначение или номер его)
030 Слесарная
035 Моечная
045 .........

fatscrat

мне нужно именно 5,10-50,55,60..... а для этого нужно заставить эту .... далее идут нехорошие слова .... программу  пересчитать все номера при изменении пользователем хотя бы одного атрибута "номер операции".
как-то так.

А как заставить вертикаль это зделать я не знаю.

function OnChange(sender, attr)
    номера операций обновитесь???
end function

Вячеслав

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

Например, Вы задали такие номера 1, 5, 10, 15, 20-40, 43, 48, 50, 55.
Если у вас в настройках будет указан шаг операций =5, то получите 5, 10, 15, 20, 25-45, 50, 55, 60, 65.


fatscrat

Упс. Напортачил я в своем третьем сообщении....
Попробую еще раз объяснить ситуацию:

Имеем следующую последовательность операций:
Лазерная
Сверлиьная
Дальнейшая обработка (по отдельному ТП)
Слесарная
..........
Моечная
Контрольная


Которые автоматически нумеруются так:
5 Лазерная
10 Сверлиьная
15 Дальнейшая обработка (по отдельному ТП)
20 Слесарная
..........
300 Моечная
305 Контрольная


Товарищ юзер в ручную изменяет атрибут "Номер операции" с 15 на 15-50 в результат плучаем:
5 Лазерная
10 Сверлиьная
15-50 Дальнейшая обработка (по отдельному ТП)
20 Слесарная
..........
300 Моечная
305 Контрольная


Т.Е. Нужно автоматически (без ведома самого пользователя) запустить нумератор еще раз который, основываясь на уже введенных значениях, изменит номера полследующих операций чтобы в результате получилось:
5 Лазерная
10 Сверлиьная
15-50 Дальнейшая обработка (по отдельному ТП)
55 Слесарная
..........
335 Моечная
340 Контрольная


Просто на текущий момент "чудо" программа никак не реагирует на изменение атрибута и чтобы получить требуемый результат юзеру приходится вручную запускать нумератор еще раз.

teplinskiy

Цитата: fatscrat от 21.02.14, 09:37:44
Подскажите, пожалуйста как в вертикали настроить автоматическую нумерацию операций?

Пример
1. Есть последовательность 5,10,15,20 итд....
2. В 10-ой оперпации пользователь вручую изменяет атрибут "Номер операции" на 10-50.
3. Нужно изменить номера остальных операций, чтобы в результате получилось 5, 10-50, 55, 60 итд.

Попробуйте проделать следующие шаги:
1) Отказаться от штатной "Автонумерации" для файла ТП: раздел главного меню "Настройка" -> "Автонумерация" -> cбросить флаг "Использовать нумератор". Этот шаг обязателен, так как "Автонумерация" нами будет производится иначе.

2) Создать в "Конфигураторе" у класса "operation" 2 целочисленных атрибута, например: "ind_op_min" и "ind_op_max", которые будут содержать значения номера(ов) операций.
Также советую после создания каждого атрибута на вкладке "Права пользователей" снять флаги "Видимости" у всех групп пользователей, так как отображение этих атрибутов избыточно.

3) Добавить/Изменить функцию "afterfirstlink" у класса "operation", дополнив ее следующим блоком:
  obj.vrAttrByName("ind_op_min").vrValue = 5
  obj.vrAttrByName("ind_op_max").vrValue = 5
     
  set DSE_obj_iter = obj.vrObjectsVector.vrCreateIterator("dse", obj, false) 
  if DSE_obj_iter.vrFirst then
    set DSE_obj = DSE_obj_iter.vrGetObject   
    set OPR_obj_iter = DSE_obj.vrObjectsVector.vrCreateIterator("operation", DSE_obj, true)

    do while OPR_obj_iter.vrNext
      set OPR_obj = OPR_obj_iter.vrGetObject   
      if OPR_obj.vrObjStrID = obj.vrObjStrID then
        if OPR_obj_iter.vrPrev then
          set OPR_obj_prv = OPR_obj_iter.vrGetObject
          obj.vrAttrByName("ind_op_min").vrValue = OPR_obj_prv.vrAttrByName("ind_op_max").vrValue + 5
          obj.vrAttrByName("ind_op_max").vrValue = OPR_obj_prv.vrAttrByName("ind_op_max").vrValue + 5         
        end if       
        exit do
      end if
    loop     
  end if

Эта функция работает для каждого нового добавленного объекта Операции в ВЕРТИКАЛи, поэтому в ней задаем начальные значения "Номера операции". Теперь именно она выполняет работу "Нумератора".

4) Изменить атрибут "indexoper" у класса "operation". Сделать его тип "Вещественным".
Далее добавить/изменить его функцию "Чтения" на следующую:
function indexoper_get(obj)
On Error Resume Next
  if obj.vrAttrByName("ind_op_min").vrValue < obj.vrAttrByName("ind_op_max").vrValue then
    indexoper_get = obj.vrAttrByName("ind_op_min").vrValue & "-" & obj.vrAttrByName("ind_op_max").vrValue
  else
    indexoper_get = obj.vrAttrByName("ind_op_min").vrValue
  end if 
end function

Далее добавить/изменить его функцию "Записи" на следующую:
function indexoper_set(obj, value)
  inStrIndx = InStr(1, value, "-", 1) 

  if inStrIndx > 0 then
    val_min = CInt(Left(value, inStrIndx - 1))
    val_max = CInt(Right(value, Len(value) - inStrIndx))
  else
    val_min = value
    val_max = value
  end if

  obj.vrAttrByName("ind_op_min").vrValue = val_min
  obj.vrAttrByName("ind_op_max").vrValue = val_max

  set DSE_obj_iter = obj.vrObjectsVector.vrCreateIterator("dse", obj, false) 
  if DSE_obj_iter.vrFirst then
    set DSE_obj = DSE_obj_iter.vrGetObject   
    set OPR_obj_iter = DSE_obj.vrObjectsVector.vrCreateIterator("operation", DSE_obj, true)

    val_diff = val_max - val_min
    boFlagCurrOper = False
    do while OPR_obj_iter.vrNext
      set OPR_obj = OPR_obj_iter.vrGetObject
     
      if boFlagCurrOper then         
        OPR_obj.vrAttrByName("ind_op_min").vrValue = OPR_obj.vrAttrByName("ind_op_min").vrValue + val_diff
        OPR_obj.vrAttrByName("ind_op_max").vrValue = OPR_obj.vrAttrByName("ind_op_max").vrValue + val_diff
      end if   

      if OPR_obj.vrObjStrID = obj.vrObjStrID then
        boFlagCurrOper = True
      end if
    loop     
  end if
end function


Данные настройки - это минимум.
Но эти настройки можно брать на вооружение и развивать собственный "Нумератор" далее.

fatscrat