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

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

Материал из Химсофт Вики
 
(не показано 16 промежуточных версий этого же участника)
Строка 50: Строка 50:


===Входные параметры===
===Входные параметры===
*<code></code> ('''') -
*<code>field</code> (''Object'') - проверяемое поле (может быть числом, строкой или объектом базы данных);
*<code>swap</code> (''String'', необязательно) - значение «подмены», которое вернется, если поле пустое; по умолчанию — пустая строка;
*<code>pref</code> (''String'', необязательно) - префикс, который добавится перед значением;
*<code>suf</code> (''String'', необязательно) - суффикс, который добавится после значения.


===Выходные данные===
===Выходные данные===
*
*<code>String</code> - отформатированная строка с префиксом и суффиксом, либо значение <code>swap</code>;


===Алгоритм===
===Алгоритм===
*
*проверка на пустоту - функция проверяет объект <code>field</code> на три условия: равен ли он <code>Nothing</code>, является ли он <code>DBNull</code> (пустота из базы данных) или состоит ли он только из пробелов;
*обработка пустого значения - если хотя бы одно условие истинно, возвращается значение параметра <code>swap</code>;
*форматирование - если поле содержит данные, функция обрезает лишние пробелы по краям (<code>Trim</code>), добавляет к нему заданные префикс (<code>pref</code>) и суффикс (<code>suf</code>) и возвращает результат.


==ConcatFields()==
==ConcatFields()==
Строка 200: Строка 205:


===Входные параметры===
===Входные параметры===
*<code></code> ('''') -
*<code>lowLimit</code> (''Double'') - нижняя граница нормы;
*<code>upLimit</code> (''Double'') - верхняя граница нормы.


===Выходные данные===
===Выходные данные===
*
*<code>String</code> текстовое описание диапазона; возвращает пустую строку, если оба параметра равны нулю.


===Алгоритм===
===Алгоритм===
*
*проверка верхней границы - если <code>upLimit</code> не равен <code>0</code>, функция возвращает строку с обоими пределами (<code>не менее X, не более Y</code>), разделяя их переносом строки (<code>vbLF</code>);
*проверка нижней границы - если верхний предел равен <code>0</code>, но <code>lowLimit</code> не равен <code>0</code>, возвращается только нижний порог (<code>не менее X</code>);
*значение по умолчанию - если оба параметра равны <code>0</code>, функция возвращает пустую строку.


==NormProcessing()==
==NormProcessing()==
Строка 231: Строка 239:


===Входные параметры===
===Входные параметры===
*<code></code> ('''') -
*<code>min</code> (''String'') - строковое значение нижней границы;
*<code>max</code> (''String'') - строковое значение верхней границы.


===Выходные данные===
===Выходные данные===
*
*<code>String</code> - форматированная строка диапазона, либо символ прочерка (<code>-</code>).


===Алгоритм===
===Алгоритм===
*
*проверка наличия данных - определяются два флага (<code>hasMin</code> и <code>hasMax</code>); значение считается валидным, если оно не пустое и не равно строке <code>0</code>;
*выбор формата:
**если есть оба значения - возвращается диапазон через дефис (<code>min-max</code>);
**если есть только <code>min</code> - возвращается значение с символом «больше или равно» (<code>≥min</code>);
**если есть только max - возвращается значение с символом «меньше или равно» (<code>≤max</code>);
*значение по умолчанию - если оба входа пустые или равны <code>0</code>, возвращается дефис (<code>-</code>).


==RemoveTagsSimple()==
==RemoveTagsSimple()==
Строка 254: Строка 268:


===Входные параметры===
===Входные параметры===
*<code></code> ('''') -
*<code>input</code> (''String'') - исходная строка, содержащая HTML-подобные теги.


===Выходные данные===
===Выходные данные===
*
*<code>String</code> - очищенный текст без специфических тегов.


===Алгоритм===
===Алгоритм===
*
*определение списка - создается массив <code>tags</code>, содержащий конкретные строковые теги - <code><nowiki><span></nowiki></code>, <code><nowiki><sub></nowiki></code>, <code><nowiki><sup></nowiki></code> (открывающие и закрывающие);
*циклическая замена - функция перебирает каждый тег из списка и удаляет его из строки, заменяя на пустую строку;
*игнорирование регистра - используется метод <code>CompareMethod.Text</code>, что позволяет удалять теги независимо от того, написаны они заглавными или строчными буквами (например, удалит и <code><nowiki><span></nowiki></code>, и <code><nowiki><SPAN></nowiki></code>).


==FormatFio()==
==FormatFio()==
Строка 292: Строка 308:


===Входные параметры===
===Входные параметры===
*<code></code> ('''') -
*<code>surname</code> (''String'') - фамилия,
*<code>name</code> (''String'') - имя,
*<code>patronymic</code> (''String'') - отчество;
*<code>mode</code> (''Integer'') - режим форматирования (0, 1 или 2).


===Выходные данные===
===Выходные данные===
*
*<code>String</code> - ФИО в выбранном формате; если результат пуст, вызывается внешняя функция <code>GetOrDash</code> (возвращает прочерк).


===Алгоритм===
===Алгоритм===
*
*очистка - удаляются лишние пробелы из всех входящих строк (<code>Trim</code>);
*подготовка инициалов - для имени и отчества берутся первые буквы с точкой (i., o.), если соответствующие строки не пустые;
*Выбор формата (по mode):
**<code>0</code> - полное ФИО через пробел (Фамилия Имя Отчество);
**<code>1</code> - фамилия и инициалы слитно (Фамилия И.О.);
**<code>2</code> - инициалы и фамилия через пробел (И.О. Фамилия);
*финальная обработка - результат обрезается от лишних крайних пробелов и передается в <code>GetOrDash</code>.
 
==CollapseNumbers()==
Функция <code>CollapseNumbers()</code> свертывает массив чисел в компактную строку, заменяя последовательные числовые ряды диапазонами.
 
<syntaxhighlight lang="vb">
Public Function CollapseNumbers(inputNums As Object()) As String
If inputNums Is Nothing OrElse inputNums.Length = 0 Then Return ""
 
Dim nums(inputNums.Length - 1) As Integer
For i As Integer = 0 To inputNums.Length - 1
nums(i) = CInt(inputNums(i))
Next
Array.Sort(nums)
Dim result As String = ""
Dim index As Integer = 0
While index < nums.Length
Dim startNum As Integer = nums(index)
Dim endNum As Integer = startNum
 
While index + 1 < nums.Length AndAlso nums(index + 1) = nums(index) + 1
index += 1
endNum = nums(index)
End While
 
Dim currentStr As String = ""
 
If endNum - startNum = 0 Then
currentStr = startNum.ToString()
ElseIf endNum - startNum = 1 Then
currentStr = startNum.ToString() & ", " & endNum.ToString()
Else
currentStr = startNum.ToString() & "-" & endNum.ToString()
End If
 
If result = "" Then
result = currentStr
Else
result &= ", " & currentStr
End If
 
index += 1
End While
 
Return result
End Function
</syntaxhighlight>
 
===Входные параметры===
*<code>inputNums</code> (''Object()'') - массив объектов (чисел), которые нужно сгруппировать.
 
===Выходные данные===
*<code>String</code> - строка с перечисленными числами, где последовательные ряды заменены на диапазоны (например, <code>1, 2, 3, 5</code> превратится в <code>1-3, 5</code>).
 
===Алгоритм===
*подготовка - входные объекты преобразуются в массив целых чисел (Integer) и сортируются по возрастанию;
*поиск последовательностей - цикл проходит по массиву, определяя блоки идущих подряд чисел (где каждое следующее больше предыдущего на 1);
*форматирование группы:
**если число одиночное - записывается просто число;
**если в ряду два числа - записываются через запятую (<code>1, 2</code>);
**если в ряду три и более чисел - записываются через дефис как диапазон (<code>1-3</code>);
*сборка - все обработанные группы объединяются в одну строку через запятую с пробелом.


==AddIndents()==
==AddIndents()==
Добавление абзацев (на перспективу).
Добавление абзацев (на перспективу).


<syntaxhighlight lang="vb">
Public Function AddIndents(ByVal text As String) As String
Public Function AddIndents(ByVal text As String) As String
     If String.IsNullOrEmpty(text) Then Return ""
     If String.IsNullOrEmpty(text) Then Return ""
    ' Заменяем стандартный перенос строки на перенос с пробелами
 
     Dim indentedText As String = text.Replace(vbCrLf, vbCrLf & "    ")
     Dim indentedText As String = text.Replace(vbCrLf, vbLf & "    ")
     ' Добавляем отступ для самой первой строки
      
     Return "    " & indentedText
     Return "    " & indentedText
End Function
End Function
</syntaxhighlight>
===Входные параметры===
*<code>text</code> (''String'') - исходный многострочный текст.
===Выходные данные===
*<code>String</code> - текст, в котором каждая строка начинается с отступа (4 пробела).
===Алгоритм===
*проверка на пустоту - если входящая строка пустая или <code>Nothing</code>, возвращается пустая строка;
*обработка переносов - функция находит все стандартные символы переноса строки (<code>vbLf</code>) и заменяет их на перенос, за которым сразу следуют 4 пробела; это создает отступы для всех строк, кроме первой;
*обработка первой строки - в начало всей полученной строки принудительно добавляются 4 пробела, чтобы первая строка также имела отступ.

Текущая версия от 10:01, 23 марта 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

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

  • field (Object) - проверяемое поле (может быть числом, строкой или объектом базы данных);
  • swap (String, необязательно) - значение «подмены», которое вернется, если поле пустое; по умолчанию — пустая строка;
  • pref (String, необязательно) - префикс, который добавится перед значением;
  • suf (String, необязательно) - суффикс, который добавится после значения.

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

  • String - отформатированная строка с префиксом и суффиксом, либо значение swap;

Алгоритм

  • проверка на пустоту - функция проверяет объект field на три условия: равен ли он Nothing, является ли он DBNull (пустота из базы данных) или состоит ли он только из пробелов;
  • обработка пустого значения - если хотя бы одно условие истинно, возвращается значение параметра swap;
  • форматирование - если поле содержит данные, функция обрезает лишние пробелы по краям (Trim), добавляет к нему заданные префикс (pref) и суффикс (suf) и возвращает результат.

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

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

  • diplomDate (Object) - дата выдачи диплома.

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

  • String
    • - - если дата не указана;
    • многострочный текст, если дата есть; например:
5 лет
15.05.2018 - по текущую дату

Алгоритм

  • проверка на пустоту - является ли входное значение пустым (IsDBNull) или отсутствующим (Nothing); если данных нет, возвращается прочерк;
  • расчет лет - вызывается внешняя функция YearsWithSuffix(diplomDate), которая вычисляет разницу между текущей датой и датой диплома, добавив правильное окончание (год / года / лет);
  • форматирование даты - исходная дата преобразуется в стандартный формат дд.мм.гггг.;
  • сборка результата - все части склеиваются в одну строку, символ vbLF переносит информацию о датах на новую строку.

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

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

  • lowLimit (Double) - нижняя граница нормы;
  • upLimit (Double) - верхняя граница нормы.

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

  • String текстовое описание диапазона; возвращает пустую строку, если оба параметра равны нулю.

Алгоритм

  • проверка верхней границы - если upLimit не равен 0, функция возвращает строку с обоими пределами (не менее X, не более Y), разделяя их переносом строки (vbLF);
  • проверка нижней границы - если верхний предел равен 0, но lowLimit не равен 0, возвращается только нижний порог (не менее X);
  • значение по умолчанию - если оба параметра равны 0, функция возвращает пустую строку.

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

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

  • min (String) - строковое значение нижней границы;
  • max (String) - строковое значение верхней границы.

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

  • String - форматированная строка диапазона, либо символ прочерка (-).

Алгоритм

  • проверка наличия данных - определяются два флага (hasMin и hasMax); значение считается валидным, если оно не пустое и не равно строке 0;
  • выбор формата:
    • если есть оба значения - возвращается диапазон через дефис (min-max);
    • если есть только min - возвращается значение с символом «больше или равно» (≥min);
    • если есть только max - возвращается значение с символом «меньше или равно» (≤max);
  • значение по умолчанию - если оба входа пустые или равны 0, возвращается дефис (-).

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

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

  • input (String) - исходная строка, содержащая HTML-подобные теги.

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

  • String - очищенный текст без специфических тегов.

Алгоритм

  • определение списка - создается массив tags, содержащий конкретные строковые теги - <span>, <sub>, <sup> (открывающие и закрывающие);
  • циклическая замена - функция перебирает каждый тег из списка и удаляет его из строки, заменяя на пустую строку;
  • игнорирование регистра - используется метод CompareMethod.Text, что позволяет удалять теги независимо от того, написаны они заглавными или строчными буквами (например, удалит и <span>, и <SPAN>).

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

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

  • surname (String) - фамилия,
  • name (String) - имя,
  • patronymic (String) - отчество;
  • mode (Integer) - режим форматирования (0, 1 или 2).

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

  • String - ФИО в выбранном формате; если результат пуст, вызывается внешняя функция GetOrDash (возвращает прочерк).

Алгоритм

  • очистка - удаляются лишние пробелы из всех входящих строк (Trim);
  • подготовка инициалов - для имени и отчества берутся первые буквы с точкой (i., o.), если соответствующие строки не пустые;
  • Выбор формата (по mode):
    • 0 - полное ФИО через пробел (Фамилия Имя Отчество);
    • 1 - фамилия и инициалы слитно (Фамилия И.О.);
    • 2 - инициалы и фамилия через пробел (И.О. Фамилия);
  • финальная обработка - результат обрезается от лишних крайних пробелов и передается в GetOrDash.

CollapseNumbers()

Функция CollapseNumbers() свертывает массив чисел в компактную строку, заменяя последовательные числовые ряды диапазонами.

Public Function CollapseNumbers(inputNums As Object()) As String
	If inputNums Is Nothing OrElse inputNums.Length = 0 Then Return ""

	Dim nums(inputNums.Length - 1) As Integer
	For i As Integer = 0 To inputNums.Length - 1
		nums(i) = CInt(inputNums(i))
	Next
	Array.Sort(nums)
	
	Dim result As String = ""
	Dim index As Integer = 0
	
	While index < nums.Length
		Dim startNum As Integer = nums(index)
		Dim endNum As Integer = startNum

		While index + 1 < nums.Length AndAlso nums(index + 1) = nums(index) + 1
			index += 1
			endNum = nums(index)
		End While

		Dim currentStr As String = ""

		If endNum - startNum = 0 Then
			currentStr = startNum.ToString()	
		ElseIf endNum - startNum = 1 Then
			currentStr = startNum.ToString() & ", " & endNum.ToString()
		Else
			currentStr = startNum.ToString() & "-" & endNum.ToString()
		End If

		If result = "" Then
			result = currentStr
		Else
			result &= ", " & currentStr
		End If

		index += 1
	End While

	Return result
End Function

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

  • inputNums (Object()) - массив объектов (чисел), которые нужно сгруппировать.

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

  • String - строка с перечисленными числами, где последовательные ряды заменены на диапазоны (например, 1, 2, 3, 5 превратится в 1-3, 5).

Алгоритм

  • подготовка - входные объекты преобразуются в массив целых чисел (Integer) и сортируются по возрастанию;
  • поиск последовательностей - цикл проходит по массиву, определяя блоки идущих подряд чисел (где каждое следующее больше предыдущего на 1);
  • форматирование группы:
    • если число одиночное - записывается просто число;
    • если в ряду два числа - записываются через запятую (1, 2);
    • если в ряду три и более чисел - записываются через дефис как диапазон (1-3);
  • сборка - все обработанные группы объединяются в одну строку через запятую с пробелом.

AddIndents()

Добавление абзацев (на перспективу).

Public Function AddIndents(ByVal text As String) As String

    If String.IsNullOrEmpty(text) Then Return ""

    Dim indentedText As String = text.Replace(vbCrLf, vbLf & "    ")
    
    Return "    " & indentedText

End Function

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

  • text (String) - исходный многострочный текст.

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

  • String - текст, в котором каждая строка начинается с отступа (4 пробела).

Алгоритм

  • проверка на пустоту - если входящая строка пустая или Nothing, возвращается пустая строка;
  • обработка переносов - функция находит все стандартные символы переноса строки (vbLf) и заменяет их на перенос, за которым сразу следуют 4 пробела; это создает отступы для всех строк, кроме первой;
  • обработка первой строки - в начало всей полученной строки принудительно добавляются 4 пробела, чтобы первая строка также имела отступ.