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

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

Материал из Химсофт Вики
Нет описания правки
Строка 213: Строка 213:
</syntaxhighlight>
</syntaxhighlight>


==FormatFIO()==
==FormatFio()==


<syntaxhighlight lang="vb">
<syntaxhighlight lang="vb">
Function FormatFIO(surname As String, name As String, patronymic As String, mode As Integer) As String
Function FormatFio(surname As String, name As String, patronymic As String, mode As Integer) As String
Dim f = Trim(surname)
Dim f = Trim(surname)
Dim i = Trim(name)
Dim i = Trim(name)

Версия от 06:35, 5 марта 2026

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

Раздел 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