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

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

Функция GetExperience() рассчитывает и форматирует строку о стаже работы сотрудника на основе даты получения диплома.

Она выводит количество лет с правильным суффиксом (через вспомогательную функцию YearsWithSuffix) и указывает временной интервал от даты диплома до сегодняшнего дня.

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

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

Входные параметры

  • (') -

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

Алгоритм

NormProcessing()

Function NormProcessing(ByVal min  As String, ByVal max As String) As String
	Dim result As String = ""
	
	Dim hasMin As Boolean = Not String.IsNullOrEmpty(min) AndAlso min <> "0"
	Dim hasMax As Boolean = Not String.IsNullOrEmpty(max) AndAlso max <> "0"
	
	If hasMin And hasMax Then
		result = min & "-" + max
	Else If hasMin Then
		result = "≥" & min
	Else If hasMax Then
		result = "≤" & max
	Else 
		result = "-"
	End If
	
	Return result
End Function

Входные параметры

  • (') -

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

Алгоритм

RemoveTagsSimple()

Function RemoveTagsSimple(ByVal input As String) As String
	Dim tags() As String = {"<span>", "</span>", "<sub>", "</sub>", "<sup>", "</sup>"}
	Dim txt As String = input
    
	For Each tag As String In tags
		txt = Replace(txt, tag, "", , , CompareMethod.Text)
	Next
    
	Return txt
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

Входные параметры

  • (') -

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

Алгоритм