Поиск типовых маршрутов, в которых используются выбранные блоки.

15 0

В какой-то момент может возникнуть необходимость определить, в каких типовых маршрутах используются конкретные блоки.

Поиск таких типовых маршрутов можно произвести с помощью следующего сценария:

DEL = ', ' 
Blocks = CreateStringList() 

// Выбрать блоки для поиска 
Ref = References.SYSREF_ROUTE_BLOCKS.GetComponent() 
AddWhereID = Ref.AddWhere(Ref.Requisites(SYSREQ_STATE).SQLFieldName & " = 'Д'") 
Ref.Open 
View = Ref.CreateView(Ref.MainViewCode) 
View.MultiSelection = TRUE 
View.ViewMode = vmSelect 
Form = Ref.ComponentForm 
Form.ShowModal 
if Form.Result == mrOK 
  Index = 0 
  RecordCount = View.SelectedRecordCount 
  while Index < RecordCount 
    Blocks.Add(View.SelectedRecordsID(Index)) 
    Index = Index + 1 
  endwhile 
endif 
Ref.Close 
Ref.DelWhere(AddWhereID) 

if Blocks.Count > 0 
  // Определить названия блоков 
  Blocks.Delimiter = DEL 
  Blocks.DelimitedText = SQL(Format(" 
                                     select t.%s 
                                     from dbo.%s t 
                                     where t.xRecID in (%s)"; 
                                     ArrayOf(Ref.Requisites(SYSREQ_CODE).SQLFieldName; Ref.TableName; Blocks.DelimitedText));; DEL) 
endif 
Ref = nil 

ResList = CreateList() 
if Blocks.Count > 0 
  Query = CreateQuery() 
  Query.CommandText = " 
                       select 
                       t.Kod as Kod, 
                       t.NameAn as Name, 
                       s.SearchCondition as Text 
                       from 
                       MBVidAn r 
                       inner join 
                       MBAnalit t on t.Vid = r.Vid and t.xRecStat = '+' and t.Sost = 'Д' 
                       inner join 
                       MBText s on s.SrcRecID = t.Analit 
                       where 
                       r.Kod = 'ТМТ'" 
  Query.Open 
  Progress = CreateProgress(; Query.RecordCount; TRUE;; 2) 
  Progress.Show 
  XMLDoc = CreateObject("MSXml.DomDocument") 
  foreach Record in Query 
    Name = Record.Fields('Name').AsString 
    Progress.Text = 'Типовой маршрут ' & Name 
    XMLDoc.LoadXML(Record.Fields('Text').AsString) 
    
    // Перебрать все имена блоков 
    foreach BlockName in Blocks 
      Path = Format("/Settings/Blocks/Block[@Type='%s']"; BlockName) 
      if not VarIsClear(XMLDoc.SelectSingleNode(Path)) 
        if ResList.IndexOfName(BlockName) <> -1 
          List = ResList.ValueByName(BlockName) 
        else 
          List = CreateStringList() 
        endif 
        
        List.Add(Record.Fields('Kod').AsString & TAB & Name) 
        
        ResList.SetVar(BlockName; List) 
      endif 
    endforeach 
    Progress.Next 
  endforeach 
  Progress.Hide 
  XMLDoc = nil 
  Query.Close 
endif 

ResultText = CreateStringList() 
ResultText.Delimiter = CR 

while ResList.Count > 0 
  ResultText.Add('Блок ' & ResList.Names(0)) 
  List = ResList.Values(0) 
  List.Delimiter = CR & TAB 
  ResultText.Add(TAB & List.DelimitedText) 
  ResList.Delete(0) 
endwhile 

EditText(ResultText.DelimitedText) 

 

После запуска данного сценария появится окно с выбором блоков типовых маршрутов:


После выбора необходимых блоков произойдёт поиск типовых маршрутов.

Для удобного копирования названий типовых маршрутов, вывод результатов происходит в режиме редактирования текста:

Пока комментариев нет.

Авторизуйтесь, чтобы написать комментарий