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

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

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


Функции, вынесенные в глобальную видимость через объект <code>Code</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>
| –
|-


==Rounding.RoundBase()==
| rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Maths.dll</code>
| <code>Rounding</code>
| <code>RoundBase</code>
|-
| <code>RoundMode</code>
| –
|-


Предназначена для гибкого округления числовых значений.  
| rowspan="6" | <code>Chemsoft.Triteia.ReportFunctions.Cells.dll</code>
| rowspan="3" | <code>Formatters</code>
| <code>ClearTags</code>
|-
| <code>SetMarginByDots</code>
|-
| <code>CollapseNumbers</code>
|-


В отличие от стандартных функций, она поддерживает работу с отрицательными разрядами и округление до значащих цифр.
| rowspan="3" | <code>Getters</code>
| <code>FieldOr</code>
|-
| <code>JoinFields</code>
|-
| <code>DateOr</code>
|-


===Входные параметры===
| rowspan="2" | <code>Chemsoft.Triteia.ReportFunctions.Events.dll</code>
*<code>value</code> (''Double'') - исходное число для обработки;
| <code>AfterData</code>
*<code>digits</code> (''Object'')
| <code>AlignCells</code>
**при <code>Mode = 1</code> - количество знаков после запятой (положительное) или до запятой (отрицательное);
|-
**при <code>Mode = 0</code> - количество значащих цифр;
| <code>KeyPressValidate</code>
*<code>mode</code> (''Object'') - режим работы:
| <code>BlockIfNotDigits</code>
**<code>1</code> (''ToDecimalPlace'') - десятичное округление;
|-
**<code>0</code> (''ToSignificantPlace'') - значащие цифры.


===Выходные параметры===
| rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Controls.dll</code>
*<code>String</code> - возвращает строковое представление числа.
| <code>ListControlDataFiller</code>
| <code>GetItemsArray</code>
|-


===Алгоритм===
| rowspan="2" | <code>CheckedListSynchronizer</code>
Функция работает по методу <code>Away From Zero</code> (округление от нуля).
| <code>HandleCheckboxChanged</code>
 
'''Режим 1''' (''десятичное округление''):
*вычисляется множитель;
*число умножается на множитель, округляется до целого и делится обратно;
*при положительном n результат форматируется с фиксированным количеством нулей после запятой.
 
'''Режим 0''' (''значащие цифры''):
*определяется порядок числа через десятичный логарифм;
*вычисляется масштабный коэффициент, чтобы оставить ровно <code>n</code> цифр;
*число масштабируется, округляется и возвращается в исходный порядок;
*результат преобразуется в компактную строку (удаляются лишние нули в конце).
 
===Примеры использования в дизайнере-конструкторе===
 
{|class="wikitable" style="margin:auto; background-color: #fff; width:100%"
|-
|-
!Исходное значение
| <code>HandleItemCheck</code>
!Синтаксис в соответствии с формулой <code>=Code.Rounding.RoundBase(x, n, m)</code>
!Результат
|-
|-
|style="text-align:right"|12345
 
|<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 2, 1)</syntaxhighlight>
| rowspan="3" | <code>Chemsoft.Triteia.ReportFunctions.Signatures.dll</code>
|style="text-align:right"|12345,00
| rowspan="3" | <code>PersonNameFormatter</code>
| <code>NameInit</code>
|-
|-
|style="text-align:right"|12345.00
| <code>InitName</code>
|<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 0, 1)</syntaxhighlight>
|style="text-align:right"|12345
|-
|style="text-align:right"|12345.01
|<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, -2, 1)</syntaxhighlight>
|style="text-align:right"|12300
|-
|style="text-align:right"|555.55
|<syntaxhighlight lang="vb">=Code.Rounding.RoundBase(ReportItems!variable.Value, 1, 0)</syntaxhighlight>
|style="text-align:right"|600
|-
|-
| <code>FullName</code>
|}
|}


===Предварительный вариант на VB.NET===
==Варианты подключения в основном классе отчета <code>ReportScript</code>==
<syntaxhighlight lang="vb">
 
Public Function RoundBase(ByVal xValue As Double, ByVal nDigits As Integer, ByVal mMode As Integer) As String
===Подключение пространства имен===
<syntaxhighlight lang="C#">
If xValue = 0 Then Return "0"
using Chemsoft.Triteia.ReportFunctions.Signatures;
</syntaxhighlight>
If mMode = 1 Then
 
' Округление до n знаков после запятой
В таком случае для использования в выражении перед именем функции требуется через точку указывать имя класса:
' В отличие от стандартной функции Math.Round(value, digits, MidpointRounding.AwayFromZero)
<syntaxhighlight lang="C#">
' может работать с отрицательными digits за счет сдвига
[PersonNameFormatter.FullName([Main.surname], [Main.name], [Main.patronimyc])]
' Вычисление множителя
Dim factor As Double = Math.Pow(10, nDigits)
' Свдиг запятой на расстояние множителя, округление до целого, обратный сдвиг
' Направление сдвига зависит от знака (+-) в nDigits
Dim result As Double = Math.Round(xValue * factor, 0, MidpointRounding.AwayFromZero) / factor
' Форматирование результата (либо до целого(0), либо по положительному nDigits)
Return result.ToString("F" & Math.Max(0, nDigits))
End If
If mMode = 0 Then
' Округление до n значащих цифр   
' Определение порядка числа (до запятой)
Dim scale As Double = Math.Pow(10, Math.Floor(Math.Log10(Math.Abs(xValue))) + 1 - nDigits)
' Свдиг запятой влево (уменьшение порядка числа), округление, сдвиг вправо (увеличение порядка числа)
Dim result As Double = Math.Round(xValue / scale, 0, MidpointRounding.AwayFromZero) * scale
' Форматирование результата в компактную строку (удаление лишних нулей, научная нотация)
Return result.ToString("G")
End If
' При некорректном значении режима mMode
Return ""
End Function
</syntaxhighlight>
</syntaxhighlight>


===Итоговый вариант на С#===
===Подключение класса===
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="C#">
public class Rounding
using static Chemsoft.Triteia.ReportFunctions.Signatures.PersonNameFormatter;
{
</syntaxhighlight>
    public string RoundBase(double value, int digits, RoundMode mode)
    {
        if (value == 0)
            return "0";


        double result;
В таком случае для использования в выражении требуется указывать только имя функции:
        switch (mode)
<syntaxhighlight lang="C#">
        {
[FullName([Main.surname], [Main.name], [Main.patronimyc])]
            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>
<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])]

Примечание

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