Scripts: различия между версиями
Sidminik (обсуждение | вклад) Нет описания правки |
Sidminik (обсуждение | вклад) |
||
| Строка 8: | Строка 8: | ||
==GetOrDash()== | ==GetOrDash()== | ||
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 | |||
==ConcatFields()== | ==ConcatFields()== | ||
Версия от 07:58, 4 марта 2026
Общие сведения
Раздел Scripts предназначен для добавления программной логики непосредственно в файл макета отчета.
Это позволяет отчету быть самодостаточным: код из раздела выполняется в процессе формирования отчета.
Внутри раздела можно создавать собственные вспомогательные функции для выполнения сложных вычислений прямо «на лету».
GetOrDash()
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
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())- все накопленные в списке элементы склеиваются в одну строку через указанный разделитель.
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); - записывается инициал имени с точкой;
- если отчество существует, к строке добавляется его инициал с точкой;
- в конце через пробел добавляется фамилия;
- функция возвращает итоговую строку.