FORM HANDLER
Работа с ПО, которое реализуют стратегию PLM, связано с созданием/заполнением веб-форм. Например: при помощи форм осуществляется поиск нужной информации - пользователь выставляет фильтры для поиска и нажимает на кнопку "Search", после чего форма с фильтрами уходит на сервер. Для реализации этой и многих других процедур, существуют определенные инструменты.
Form Handler - класс для работы с формами в системе YuniquePLM. С помощью Handler можно создавать формы, получать SQL запросы, сохранять нужные данные.
Form Handler - класс библиотеки Yunique.Core.UI. С его помощью строятся многие формы в системе. Благодаря этому классу разработчик может быстро создавать конфигурируемые веб-формы по XML схеме.
Создание объекта класса Form Handler:
Using objXmlHandler As New Yunique.Core.UI.FormHandler  "создается объект класса Handler
       objXmlHandler.PreferredLanguage = UserProperties.PrefLang   "задается язык формы
       objXmlHandler.PageReadOnly = False "должна ли форма быть read only
       objXmlHandler.XmlFolder = strXMLPath   "указывается папка, из которой берутся XML файлы
       objXmlHandler.XmlFile = GridSearchSchemaFile "название XML файла
       objXmlHandler.DatabaseConnection = conConnection   "выставленное открытое соединение
После этого, с Handler-ом можно работать различными методами (get search controls, get edit controls): черпая информацию об объектах формы из XML схемы.
Схема-XML файл:
- главный тег <table>;
- дочерние теги <column>;
- внутри тега <column> могут быть теги: <validator> и <lookup table>.
В теге "table" есть различные атрибуты (ApiSQL, GridReadSQL, FormSQL), в которых содержатся запросы. Эти запросы используются классом, чтобы извлечь информацию для формы. Так как речь идет о формах, то обратить внимание стоит на FormSQL.
Для примера рассмотрим поле "Description" из формы поиска Style Folder. В схеме задается имя поля в базе данных: Name="Description", а также задается имя, которое должно быть видно на форме: alias="Description". Кроме этого, есть атрибуты "type" и "datatype". В нашем случае: Type= "textbox" (тип ввода); datatype ="string" (тип данных). К основным атрибутам также относятся: "visible", "enabled", "column" и "order".

Некоторые особенности имеют поля с атрибутом Type= "dropdownlist". В этих же полях присутствует атрибут "lookupquery", который содержит запрос, извлекающий некоторые данные для списка. Обязательно указываются атрибуты: "textfield" и "valuefield" - те поля, которые выбирает запрос из источника данных в качестве значений и текста выпадающего списка. Для выпадающих списков datatype = "query". Также, в теге "column" с выпадающим списком, содержится тег "LookupTable"- здесь указывается специальный XML-файл, который указывает какие данные извлекать из БД (* данный функционал не используется на страницах, но используется в API).
Создание форм с помощью Handler:
Using objXmlHandler As New Yunique.Core.UI.FormHandler
       objXmlHandler.PreferredLanguage = UserProperties.PrefLang
       objXmlHandler.PageReadOnly = False
       objXmlHandler.XmlFolder = strXMLPath
       objXmlHandler.XmlFile = GridSearchSchemaFile
       objXmlHandler.DatabaseConnection = conConnectionobjXmlHandler.AddPredefinedControlValue("DivisionID", _DivisionID)
objXmlHandler.AddPredefinedControlValue("SeasonYearID", _SeasonYearID)Dim colFields As New StringCollection   "создается string colection и добавляется в него строка
colFields.Add("pkiPOMLibraryID|" & "00000000-0000-0000-0000-000000000000")   "префикс pki=primary key; имя поля в БД; |& значение поляobjXmlHandler.ToSelectFields = colFields   "добавка к SQL запросу
Dim objControlHolder(3) As PlaceHolder   "делается верска (control holder-строка)
objControlHolder(0) = New PlaceHolder
objControlHolder(1) = New PlaceHolder
objControlHolder(2) = New PlaceHolderWhile objXmlHandler.GetSearchControls(Me.Request)  "вызывается getsearchcontrol intControlColumn = objXmlHandler.ControlColumn - 1
CreateStyleSearchControls(objXmlHandler, objControlHolder(intControlColumn))  "создается физический объект
  End While  plhSearchControl.Controls.Add(New LiteralControl("<table height='30' width='100%' bgcolor='#FFFFFF' border='0' cellspacing='0' cellpadding='0'>" & vbNewLine))   plhSearchControl.Controls.Add(New LiteralControl(vbTab & "<tr>" & vbNewLine))  "верстка (таблица)
  Dim intInd As Integer
  For intInd = 0 To 2
plhSearchControl.Controls.Add(objControlHolder(intInd))
  Next  plhSearchControl.Controls.Add(New LiteralControl(vbTab & "</tr>" & vbNewLine))
  plhSearchControl.Controls.Add(New LiteralControl("</table>" & vbNewLine))End Using
В системе YuniquePLM можно один выпадающий список фильтровать по другому в списку. Например: можно связать StyleType с Division. Реализуется это в XML файле:

Тег "column" с полем StyleType имеет атрибуты: "LinkedCol" и "lookupquery". У нас LinkedCol="DivisionID". Атрибут "lookupquery" содержит соответствующий запрос, который извлекает StyleTypeID в зависимости от выбранного DivisionID. Так, выбрав "Yunique Accessories" в Division, мы можем выбрать только "Accessory" в Style Type.

Использование Handler, что бы получить SQL запрос:
Using objXmlHandler As New Yunique.Core.UI.FormHandler
objXmlHandler.PreferredLanguage = UserProperties.PrefLang
objXmlHandler.XmlFolder = strXMLPath
objXmlHandler.XmlFile = GridSearchSchemaFile
objXmlHandler.DatabaseConnection = conConnection
Dim colFields As New StringCollection
Dim colDefault As New StringCollection
objXmlHandler.ToSelectDefault = colDefaultDim bParams As Boolean = False
While objXmlHandler.GetEditControls   "проход во всем редактируемым полям XML
  If objXmlHandler.ControlEnable = True Then
colFields.Add(objXmlHandler.ControlName + "|" & Request.Form.Item(objXmlHandler.ControlName))
  If Request.Form.Item(objXmlHandler.ControlName) <> String.Empty Then bParams = True   "добавляем все выбранные из запроса поля в StringColection
  End If
  End WhileDim strSql As String
  Dim nBodySet As Integer
  Try
nBodySet = CInt(Me._BodySet)
Catch ex As Exception
nBodySet = 1
  End TryIf bParams = True Then
strSql = objXmlHandler.GetSearchSqlCommand(colFields) & " AND POM NOT IN ( SELECT POM FROM pBodySpec WHERE BodyID = '" & Me._BodyID & "' and Bodyset = '" & CStr(nBodySet) & "' ) ORDER BY Sort, POM, PointMeasur "
  Else
strSql = objXmlHandler.GetSearchSqlCommand(colFields) & " WHERE POM NOT IN ( SELECT POM FROM pBodySpec WHERE BodyID = '" & Me._BodyID & "' and Bodyset = '" & CStr(nBodySet) & "' ) ORDER BY Sort, POM, PointMeasur "  "Генерация запроса.Все поля,находящиеся в ColFields,будут использованы в качестве фильтров.
  End If
  Return strSql
End Using
Использование Handler для сохранения данных:
Using objXmlHandler As New Yunique.Core.UI.FormHandler
objXmlHandler.PreferredLanguage = UserProperties.PrefLang
objXmlHandler.XmlFolder = strXMLPath
objXmlHandler.XmlFile = strXMLFile
objXmlHandler.DatabaseConnection = conConnection
objXmlHandler.ServerCulture = Me.strServerCulture
objXmlHandler.ClientCulture = Me.strClientCulture
objXmlHandler.ServerTimeZone = Me.strServerTimeZoneDim colFields As New StringCollection
colFields.Add("pkiBodyID|" + BodyID)   "задается конкретный вариант ID
While objXmlHandler.GetEditControls
  If objXmlHandler.ControlEnable = True Then
strRequestQueryStringValue = (Request.Form.Item(objXmlHandler.ControlName))
  If objXmlHandler.ControlType() = "checkbox" Then If strRequestQueryStringValue = "on" Then
colFields.Add(objXmlHandler.ControlName + "|1")
  Else
colFields.Add(objXmlHandler.ControlName + "|0")   "добавление данных
  End If
  Else
colFields.Add(objXmlHandler.ControlName + "|" + Request.Form.Item(objXmlHandler.ControlName))
  End If
  End If
  End While  colFields.Add("txtCUser|" & UserProperties.Fullname)   colFields.Add("txtCDate|" & SystemHandler.GetGMT)
  colFields.Add("txtMUser|" & UserProperties.Fullname)
  colFields.Add("txtMDate|" & SystemHandler.GetGMT)objXmlHandler.PerformSqlCommand(colFields, Yunique.Core.Data.SQLHelper.SqlOperationType.UPDATE)  "Выполнение SQL-команды. Значения полей, находящихся в ColFields, будут обновлены, за исключением поля с префиксом pki (pki-поле будет использовано в качестве фильтра в запросе)
End Using