Изменение литеры

Материал из Intermech Wiki
Перейти к навигации Перейти к поиску

Этот сценарий на языке VBScript позволяет изменить поле "Литера" в карточках отмеченных документов или объектов без взятия документов на редактирование.

В случае, если отмечены групповые документы, скрипт изменит литеру для всех вариантов исполнения изделия. Обратите внимание, что в этом примере не производится анализ литеры, которая была ранее присвоена изделию. При необходимости такого анализа - модифицируйте скрипт самостоятельно.

В этом примере также демонстрируется как можно при написании инструментов для Search использовать форму с прогресс-баром, отображающим ход выполнения скрипта. Эта форма позволяет также прервать выполнение скрипта, если пользователь нажмет кнопку "Отмена".

API-функции, позовляющие показывать форму с прогресс-баром были добавлены в обновления к Search 11 и 12 версии, начиная с 1.11.2010. Если у вас используется Search более старой версии - вам необходимо удалить строки в этом примере скрипта, в которых используются API-функции

  • procedure ShowProgressBarForm( const FormTitle: WideString; const Text1: WideString; const Text2: WideString; TotalParts: Integer);
  • function SetProgressBarData_and_CheckUserBreak( const Text1: WideString; const Text2: WideString; PartsComplete: Integer): Integer;
  • procedure CloseProgressBarForm;

Если у вас используется более ранняя версия Search и вы не удалите эти строки - это будет приводить к сбоям. Получить обновление, в котором уже имеются эти API-функции для Search 11 и 12 версии вы можете, обратившись в техподдержку Интермех cad@intermech.ru.


Ниже приводится код сценария:

newLitera = "О3"

call ChangeLetter

Sub ChangeLetter
  set SelItems = s4app.GetSelectedItems 'получение интерфейса отметок
  SelectedCount = SelItems.SelectedCount
  partsComplete = 0

  if SelectedCount > 0 then
    text2 = "Обработано 0 из "& SelectedCount
    s4app.ShowProgressBarForm "Изменение литеры", "Изменение литеры у отмеченных документов/объектов", text2, SelectedCount
    while Selitems.NextSelected <> 0 'цикл по отмеченным записям
      DocID = SelItems.ActiveDocID 'инвентарный номер отмеченного документа
      if DocID > 0 then
        s4app.OpenDocument(DocID) 'делаем документ текущим, чтобы можно было пользоваться функциями API для работы с ним
        s4app.OpenDocArticles( DocID )
        artCount = s4app.GetArticlesCount 'получаем количество вариантов исполнений изделия по данному документу
        for j = 0 to artCount-1 'цикл по вариантам исполнений
          ArtID = s4app.GetDocArticleID( j )
          if ArtID > 0 then
            s4app.OpenArticle( ArtID )
            oldLetter = s4app.GetFieldValue_Articles( "Литера" )
            if newLitera <> oldLetter then
              s4app.SetFieldValue_Articles "Литера", newLitera
            end if
          end if
        next
      else
        ArtID = SelItems.ActiveArtID
        if ArtID > 0 then
          s4app.OpenArticle( ArtID )
          oldLetter = s4app.GetFieldValue_Articles( "Литера" )
          if newLitera <> oldLetter then
            s4app.SetFieldValue_Articles "Литера", newLitera
          end if
        end if
      end if

      SelItems.InvertCurrent
      partsComplete = partsComplete + 1
      text2 = "Обработано " & partsComplete & " из " & SelectedCount
      UserBreak = s4app.SetProgressBarData_and_CheckUserBreak( "", text2, partsComplete )
      if UserBreak > 0 then
        s4app.CloseProgressBarForm
        exit sub
      end if
    Wend
    s4app.CloseProgressBarForm
  end if
end Sub