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

Пользовательские функции: различия между версиями

Материал из Химсофт Вики
 
(не показана 41 промежуточная версия этого же участника)
Строка 1: Строка 1:
==Общие сведения==
==Перечень доступных библиотек, классов и функций==


Раздел <code>Scripts</code> предназначен для добавления программной логики непосредственно в файл макета отчета.
{|class="wikitable" style="margin:auto; background-color: #fff;"
|- style="background:#f8f9fa; font-weight:bold; text-align:center;"
! style="width:40%;" | Файл подключаемой библиотеки /<br>пространство имен (без приставки <code>.dll</code>)
! style="width:30%;" | Класс
! style="width:30%;" | Функция
|-


Это позволяет отчету быть самодостаточным: код из раздела выполняется в процессе формирования отчета.
| rowspan="2" | <code>Chemsoft.Triteia.ReportClasses.dll</code>
| <code>IdNameItemDto</code>
| –
|-
| <code>DoubleIdNameItemDto</code>
| –
|-


Внутри раздела можно создавать собственные вспомогательные функции для выполнения сложных вычислений прямо «на лету».
| rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Maths.dll</code>
| <code>Rounding</code>
| <code>RoundBase</code>
|-
| <code>RoundMode</code>
| –
|-


==Rounding.RoundBase()==
| rowspan="6" | <code>Chemsoft.Triteia.ReportFunctions.Cells.dll</code>
| rowspan="3" | <code>Formatters</code>
| <code>ClearTags</code>
|-
| <code>SetMarginByDots</code>
|-
| <code>CollapseNumbers</code>
|-


===Предварительный вариант на VB.NET===
| rowspan="3" | <code>Getters</code>
<syntaxhighlight lang="vb">
| <code>FieldOr</code>
Public Function RoundBase(ByVal xValue As Double, ByVal nDigits As Integer, ByVal mMode As Integer) As String
|-
| <code>JoinFields</code>
If xValue = 0 Then Return "0"
|-
| <code>DateOr</code>
If mMode = 1 Then
|-
' Округление до n знаков после запятой
 
' В отличие от стандартной функции Math.Round(value, digits, MidpointRounding.AwayFromZero)
| rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Events.dll</code>
' может работать с отрицательными digits за счет сдвига
| <code>AfterData</code>
| <code>AlignCells</code>
' Вычисление множителя
|-
Dim factor As Double = Math.Pow(10, nDigits)
| <code>KeyPressValidate</code>
| <code>BlockIfNotDigits</code>
' Свдиг запятой на расстояние множителя, округление до целого, обратный сдвиг
|-
' Направление сдвига зависит от знака (+-) в nDigits
 
Dim result As Double = Math.Round(xValue * factor, 0, MidpointRounding.AwayFromZero) / factor
| rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Controls.dll</code>
| <code>ListControlDataFiller</code>
' Форматирование результата (либо до целого(0), либо по положительному nDigits)
| <code>GetItemsArray</code>
Return result.ToString("F" & Math.Max(0, nDigits))
|-
End If
 
| rowspan="2" | <code>CheckedListSynchronizer</code>
If mMode = 0 Then
| <code>HandleCheckboxChanged</code>
' Округление до n значащих цифр   
|-
| <code>HandleItemCheck</code>
' Определение порядка числа (до запятой)
|-
Dim scale As Double = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(xValue))) + 1 - nDigits)
 
| rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Signatures.dll</code>
' Свдиг запятой влево (уменьшение порядка числа), округление, сдвиг вправо (увеличение порядка числа)
| rowspan="3" | <code>PersonNameFormatter</code>
Dim result As Double = Math.Round(xValue / scale, 0, MidpointRounding.AwayFromZero) * scale
| <code>NameInit</code>
|-
' Форматирование результата в компактную строку (удаление лишних нулей, научная нотация)
| <code>InitName</code>
Return result.ToString("G")
|-
End If
| <code>FullName</code>
|}
' При некорректном значении режима mMode
 
Return ""
==Варианты подключения в основном классе отчета <code>ReportScript</code>==
 
End Function
===Подключение пространства имен===
<syntaxhighlight lang="C#">
using Chemsoft.Triteia.ReportFunctions.Signatures;
</syntaxhighlight>
</syntaxhighlight>


===Итоговый вариант на С#===
В таком случае для использования в выражении перед именем функции требуется через точку указывать имя класса:
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="C#">
public class Rounding
[PersonNameFormatter.FullName([Main.surname], [Main.name], [Main.patronimyc])]
{
</syntaxhighlight>
    public string RoundBase(double value, int digits, RoundMode mode)
    {
        if (value == 0)
            return "0";


        double result;
===Подключение класса===
        switch (mode)
<syntaxhighlight lang="C#">
        {
using static Chemsoft.Triteia.ReportFunctions.Signatures.PersonNameFormatter;
            case RoundMode.ToDecimalPlace:
                double factor = Math.Pow(10, digits);
                result = Math.Round(value * factor, 0, MidpointRounding.AwayFromZero) / factor;
                return result.ToString("F" + Math.Max(0, digits));
            case RoundMode.ToSignificantPlace:
                double scale = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(value))) + 1 - digits);
                result = Math.Round(value / scale, 0, MidpointRounding.AwayFromZero) * scale;
                return result.ToString("G");
            default:
                throw new ArgumentOutOfRangeException(nameof(mode), "Некорректный режим округления");
        }
    }
   
    public string RoundBase(double value, int digits, int mode) => RoundBase(value, digits, (RoundMode)mode);
}
</syntaxhighlight>
</syntaxhighlight>


===Пример использования в дизайнере-конструкторе===
В таком случае для использования в выражении требуется указывать только имя функции:
<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(Fields!variable.Value, 2, 1)</syntaxhighlight>
<syntaxhighlight lang="C#">
[FullName([Main.surname], [Main.name], [Main.patronimyc])]
</syntaxhighlight>
 
<div style="background-color: #e7f3ff; border-left: 5px solid #2196f3; padding: 15px; margin: 10px 0;">
'''Примечание'''
 
Даже если функция используется только в выражениях и не используется во вкладке кода, она все-равно должна быть обязательно подключена во вкладке кода одним из двух способов!
</div>

Текущая версия от 10:13, 20 октября 2026

Перечень доступных библиотек, классов и функций

Файл подключаемой библиотеки /
пространство имен (без приставки .dll)
Класс Функция
Chemsoft.Triteia.ReportClasses.dll IdNameItemDto –
DoubleIdNameItemDto –
Chemsoft.Triteia.ReportFunctions.Maths.dll Rounding RoundBase
RoundMode –
Chemsoft.Triteia.ReportFunctions.Cells.dll Formatters ClearTags
SetMarginByDots
CollapseNumbers
Getters FieldOr
JoinFields
DateOr
Chemsoft.Triteia.ReportFunctions.Events.dll AfterData AlignCells
KeyPressValidate BlockIfNotDigits
Chemsoft.Triteia.ReportFunctions.Controls.dll ListControlDataFiller GetItemsArray
CheckedListSynchronizer HandleCheckboxChanged
HandleItemCheck
Chemsoft.Triteia.ReportFunctions.Signatures.dll PersonNameFormatter NameInit
InitName
FullName

Варианты подключения в основном классе отчета ReportScript

Подключение пространства имен

using Chemsoft.Triteia.ReportFunctions.Signatures;

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

[PersonNameFormatter.FullName([Main.surname], [Main.name], [Main.patronimyc])]

Подключение класса

using static Chemsoft.Triteia.ReportFunctions.Signatures.PersonNameFormatter;

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

[FullName([Main.surname], [Main.name], [Main.patronimyc])]

Примечание

Даже если функция используется только в выражениях и не используется во вкладке кода, она все-равно должна быть обязательно подключена во вкладке кода одним из двух способов!