Scripts
Общие сведения
Раздел Scripts предназначен для добавления программной логики непосредственно в файл макета отчета.
Это позволяет отчету быть самодостаточным: код из раздела выполняется в процессе формирования отчета.
Внутри раздела можно создавать собственные вспомогательные функции для выполнения сложных вычислений прямо «на лету».
GetOrDash()
Функция GetOrDash() - предназначена для обработки пустых значений (NULL, пустые строки, пробелы) в ячейках отчета.
Она гарантирует, что вместо пустого места в таблице всегда будет отображаться визуальный маркер - (дефис), что улучшает читаемость документа.
Public Function GetOrDash(field As Object) As String
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
Return "-"
End If
Return field.ToString()
End Function
Входные параметры
field(Object) - данные из поля набора данных (принимает любой тип данных, так как параметр объявлен какObject).
Выходные данные
String- строковое представление данных, если поле содержит значимую информацию;-(дефис) - если входной параметр:- равен
Nothing(не инициализирован); - равен
DBNull.Value(пустое значение из базы данных); - является пустой строкой
""; - содержит только пробелы (метод
.Trim()).
- равен
GetOr()
Public Function GetOr(field As Object,
Optional swap As String = "",
Optional pref As String = "",
Optional suf As String = "") As String
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrWhiteSpace(field.ToString()) Then
Return swap
End If
Return pref & field.ToString().Trim() & suf
End Function
ConcatFields()
Функция ConcatFields() - предназначена для объединения нескольких текстовых значений в одну строку с использованием заданного разделителя.
Public Function ConcatFields(separator As String, ParamArray fields() As Object) As String
If fields Is Nothing Then Return "-"
Dim list As New System.Collections.Generic.List(Of String)
For Each f As Object In fields
If f Is Nothing Then Continue For
Dim elem As String = f.ToString().Trim()
If String.IsNullOrEmpty(elem) Then Continue For
list.Add(elem)
Next
If list.Count = 0 Then
Return "-"
Else
Return String.Join(separator, list.ToArray())
End If
End Function
Входные параметры
separator(String) - символ или текст, который будет стоять между элементами (например - запятая, или пробел, или перенос на следующую строку);ParamArray fields()(Object) - список аргументов любого количества, перечисляется через запятую (также можно передать массив).
Выходные данные
String- одна строка из объединенных элементов.-(дефис) - если данных нет.
Алгоритм
If fields Is Nothing Then Return "-"- если массив аргументов вообще не передан, функция сразу возвращает дефис;Dim list As New System.Collections.Generic.List(Of String)- создается временный список для хранения "чистых" строковых элементов;For Each f As Object In fields- цикл по каждому полученному на входе значению;If f Is Nothing Then Continue For- если текущий элемент пуст (null), он пропускается;Dim elem As String = f.ToString().Trim()- значение переводится в строковый элемент и очищается от лишних пробелов по краям;If String.IsNullOrEmpty(elem) Then Continue For- если после удаления пробелов строковый элемент оказался пустым, он пропускается;list.Add(elem)- корректный строковый элемент добавляется в итоговый список;If list.Count = 0 Then Return "-"- если после проверки всех элементов список пуст (все было null или пробелы), возвращается дефис;Return String.Join(separator, list.ToArray())- все накопленные в списке элементы склеиваются в одну строку через указанный разделитель.
GetExperience()
Public Function GetExperience(diplomDate As Object) As String
If IsDBNull(diplomDate) OrElse diplomDate Is Nothing Then
Return "-"
End If
Return YearsWithSuffix(diplomDate) & vbLF & Format(diplomDate, "dd.MM.yyyy") & " - по текущую дату"
End Function
YearsWithSuffix()
Функция YearsWithSuffix() - предназначена для формирования строки, содержащей количество лет и правильное грамматическое окончание существительного «год» (год, года, лет) на основе разницы между переданной датой и текущим моментом.
Public Function YearsWithSuffix(inputDate As Date) As String
Dim yearsDiff As Long = DateDiff(DateInterval.Year, inputDate, Now())
Dim resultDate As Long = yearsDiff
Dim resultString As String = yearsDiff.ToString()
If (resultDate > 20) Then
resultDate = resultDate Mod 10
End If
Select Case resultDate
Case 1
resultString &= $" год"
Case 2 To 4
resultString &= $" года"
Case Else
resultString &= $" лет"
End Select
Return resultString
End Function
Входные параметры
inputDate(Date) - дата, от которой ведется отсчет.
Выходные данные
String- разница лет до текущего момента с текстом-суффиксом "21 год", "25 лет", "34 года".
Алгоритм
- вычисляется полное количество лет между
inputDateи текущей датойNow()с помощью функцииDateDiff; resultDate- техническая переменная для определения логики окончания;resultString- строковое представление числа лет;- обработка исключений (20+ лет) - если число больше 20, применяется операция
Mod 10(остаток от деления на 10), чтобы привести числа вроде 21, 22, 25 к виду 1, 2, 5 для подбора окончания; Select Case- блок выбора окончания;Case 1- если число (или его остаток) равно 1, добавляется словогод;Case 2 To 4- если число (или его остаток) в диапазоне от 2 до 4 включительно, добавляется словогода;Case Else- в остальных случаях (для 0, 5–19 и специфических остатков) добавляется словолет;- возврат итоговой склеенной строки.
FormatAsInitialsSurname()
Функция преобразует полное имя (например, "Иванов Иван Иванович") в формат «Инициалы Фамилия» (И.И. Иванов). Она корректно обрабатывает лишние пробелы и работает как с именами из двух слов, так и из трёх.
Public Function FormatAsInitialsSurname(fullName As String) As String
Dim trimmedName As String = fullName.Trim()
Dim nameParts() As String = trimmedName.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
If nameParts.Length < 2 Then
Return fullName
End If
Dim surname As String = nameParts(0)
Dim firstNameInitial As Char = nameParts(1)(0)
Dim middleNameInitial As Char? = Nothing
If nameParts.Length >= 3 Then
middleNameInitial = nameParts(2)(0)
End If
Dim result As String = $"{firstNameInitial}."
If middleNameInitial.HasValue Then
result &= $"{middleNameInitial}."
End If
result &= $" {surname}"
Return result
End Function
Входные параметры
fullName(String) - исходная строка, содержащая полные ФИО (ожидается формат «Фамилия Имя» или «Фамилия Имя Отчество»).
Выходные данные
String- строка в формате И.О. Фамилия; если во входной строке меньше двух слов, функция вернет исходный текст без изменений.
Алгоритм
trimmedName- удаляет случайные пробелы в начале и конце строки;- строка разбивается на массив
nameParts; используетсяRemoveEmptyEntries, чтобы лишние пробелы между словами не создавали пустых элементов; - если в массиве меньше 2 слов (нет либо фамилии, либо имени), функция сразу прекращает работу и возвращает входную строку;
- первое слово записывается как фамилия (
surname); - берется первый символ второго слова — инициал имени (
firstNameInitial); - если есть третье слово, берется его первый символ — инициал отчества (
middleNameInitial); - записывается инициал имени с точкой;
- если отчество существует, к строке добавляется его инициал с точкой;
- в конце через пробел добавляется фамилия;
- функция возвращает итоговую строку.
GetNorms()
Public Function GetNorms(lowLimit As Double, upLimit As Double) As String
If upLimit <> 0 Then
Return "не менее " & lowLimit & vbLF & "не более " & upLimit
End If
If lowLimit <> 0 Then
Return "не менее " & lowLimit
End If
Return ""
End Function
FormatFIO()
Function FormatFIO(surname As String, name As String, patronymic As String, mode As Integer) As String
Dim f = Trim(surname)
Dim i = Trim(name)
Dim o = Trim(patronymic)
Dim i_init = ""
Dim o_init = ""
If Len(i) > 0 Then i_init = Left(i, 1) & "."
If Len(o) > 0 Then o_init = Left(o, 1) & "."
Dim result = ""
Select Case mode
Case 0 ' Фамилия Имя Отчество
result = Trim(f & " " & i & " " & o)
Case 1 ' Фамилия И.О.
result = Trim(f & " " & i_init & o_init)
Case 2 ' И.О. Фамилия
result = Trim(i_init & o_init & " " & f)
End Select
Return GetOrDash(result)
End Function