В какой-то момент может возникнуть необходимость определить, в каких типовых маршрутах используются конкретные блоки.
Поиск таких типовых маршрутов можно произвести с помощью следующего сценария:
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)
После запуска данного сценария появится окно с выбором блоков типовых маршрутов:
После выбора необходимых блоков произойдёт поиск типовых маршрутов.
Для удобного копирования названий типовых маршрутов, вывод результатов происходит в режиме редактирования текста:
Авторизуйтесь, чтобы написать комментарий