Перейти к содержанию

Scripts: различия между версиями

Материал из Химсофт Вики
Нет описания правки
Строка 8: Строка 8:


==GetOrDash()==
==GetOrDash()==
Функция <code>GetOrDash()</code> - предназначена для обработки пустых значений (<code>NULL</code>, пустые строки, пробелы) в ячейках отчета.


Она гарантирует, что вместо пустого места в таблице всегда будет отображаться визуальный маркер <code>-<-code> (''дефис''), что улучшает читаемость документа.
<syntaxhighlight lang="vb">
Public Function GetOrDash(field As Object) As String
Public Function GetOrDash(field As Object) As String
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
If field Is Nothing OrElse IsDBNull(field) OrElse String.IsNullOrEmpty(field.ToString().Trim()) Then
Строка 16: Строка 20:
Return field.ToString()
Return field.ToString()
End Function
End Function
</syntaxhighlight>
===Входные параметры===
*<code>field</code> (''Object'') - данные из поля набора данных (принимает любой тип данных, так как параметр объявлен как <code>Object</code>).
===Выходные данные===
* Возвращает строковое представление данных, если поле содержит значимую информацию.
* Возвращает строку "-" (дефис), если входной параметр:
** Равен Nothing (не инициализирован).
** Равен DBNull.Value (пустое значение из базы данных).
** Является пустой строкой "".
** Содержит только пробелы (благодаря методу .Trim()).


==ConcatFields()==
==ConcatFields()==

Версия от 08:02, 4 марта 2026

Общие сведения

Раздел Scripts предназначен для добавления программной логики непосредственно в файл макета отчета.

Это позволяет отчету быть самодостаточным: код из раздела выполняется в процессе формирования отчета.

Внутри раздела можно создавать собственные вспомогательные функции для выполнения сложных вычислений прямо «на лету».

GetOrDash()

Функция GetOrDash() - предназначена для обработки пустых значений (NULL, пустые строки, пробелы) в ячейках отчета.

Она гарантирует, что вместо пустого места в таблице всегда будет отображаться визуальный маркер -<-code> (дефис), что улучшает читаемость документа.

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).

Выходные данные

  • Возвращает строковое представление данных, если поле содержит значимую информацию.
  • Возвращает строку "-" (дефис), если входной параметр:
    • Равен Nothing (не инициализирован).
    • Равен DBNull.Value (пустое значение из базы данных).
    • Является пустой строкой "".
    • Содержит только пробелы (благодаря методу .Trim()).

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);
  • записывается инициал имени с точкой;
  • если отчество существует, к строке добавляется его инициал с точкой;
  • в конце через пробел добавляется фамилия;
  • функция возвращает итоговую строку.