Skip to content

Commit 665b2b4

Browse files
committed
fix EvilBeaver#1580.5: Итог по колонке с указанными типами
1 parent dcab8b6 commit 665b2b4

File tree

2 files changed

+74
-13
lines changed

2 files changed

+74
-13
lines changed

src/OneScript.StandardLibrary/Collections/ValueTable/ValueTable.cs

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ public int IndexOf(IValue row)
217217
return _rows.IndexOf(tableRow);
218218

219219
return -1;
220-
}
221-
220+
}
221+
222222
/// <summary>
223223
/// Сумма значений всех строк указанной колонки
224224
/// </summary>
@@ -227,25 +227,51 @@ public int IndexOf(IValue row)
227227
/// Число - Индекс колонки для суммирования
228228
/// КолонкаТаблицыЗначений - Колонка для суммирования
229229
/// </param>
230+
/// <remarks>
231+
/// Если в колонке установлен тип и он единственный,
232+
/// то при суммировании будет попытка преобразования значения к типу Число.
233+
/// <br/>Если колонке не присвоены типы
234+
/// или в колонке несколько типов и среди них есть тип Число,
235+
/// то в суммироваться будут только значения типа Число
236+
/// <br/>Если в колонке несколько типов и среди них нет типа Число, то результатом будет Неопределено.
237+
/// </remarks>
230238
/// <returns>Число</returns>
231239
[ContextMethod("Итог", "Total")]
232240
public IValue Total(IValue columnIndex)
233241
{
234242
var Column = Columns.GetColumnByIIndex(columnIndex);
235243
bool has_data = false;
236-
decimal Result = 0;
244+
decimal result = 0;
237245

238-
foreach (var row in _rows)
239-
{
240-
var current_value = row.Get(Column);
241-
if (current_value.SystemType == BasicTypes.Number)
242-
{
243-
has_data = true;
244-
Result += current_value.AsNumber();
246+
var types = Column.ValueType.Types();
247+
if (types.Count() == 1) // единственный тип
248+
{
249+
foreach (var row in _rows)
250+
{
251+
try
252+
{
253+
result += row.Get(Column).AsNumber();
254+
has_data = true;
255+
}
256+
catch (RuntimeException)
257+
{ }
258+
}
259+
}
260+
else if (types.Count() == 0 // нет типов
261+
|| types.Any(x => ((BslTypeValue)x).TypeValue == BasicTypes.Number)) // среди типов есть Число
262+
{
263+
foreach (var row in _rows)
264+
{
265+
var current_value = row.Get(Column);
266+
if (current_value.SystemType == BasicTypes.Number)
267+
{
268+
result += current_value.AsNumber();
269+
has_data = true;
270+
}
245271
}
246272
}
247-
248-
return has_data ? ValueFactory.Create(Result) : ValueFactory.Create();
273+
274+
return has_data ? ValueFactory.Create(result) : ValueFactory.Create();
249275
}
250276

251277
/// <summary>

tests/valuetable.os

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@
6464
ВсеТесты.Добавить("ТестДолжен_Проверить_СкопироватьКолонки_СПустымСпискомКолонок");
6565
ВсеТесты.Добавить("ТестДолжен_Проверить_Скопировать_СПустымСпискомКолонок");
6666

67+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_Строка");
68+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_СтрокаЧисло");
69+
ВсеТесты.Добавить("ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_СтрокаДата");
70+
6771
Возврат ВсеТесты;
6872

6973
КонецФункции
@@ -1081,4 +1085,35 @@
10811085
юТест.ПроверитьРавенство(ТЗ2.Количество(), 2);
10821086
юТест.ПроверитьРавенство(ТЗ2.Колонки.Количество(), 1);
10831087
юТест.ПроверитьРавенство(ТЗ2.Колонки[0].Имя, "Тест");
1084-
КонецПроцедуры
1088+
КонецПроцедуры
1089+
1090+
Процедура ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_Строка() Экспорт
1091+
ТЗ = Новый ТаблицаЗначений();
1092+
ТЗ.Колонки.Добавить("Тест", Новый ОписаниеТипов("Строка"));
1093+
ТЗ.Добавить().Тест = -3;
1094+
ТЗ.Добавить().Тест = "7";
1095+
ТЗ.Добавить().Тест = "ц5";
1096+
1097+
юТест.ПроверитьРавенство(ТЗ.Итог("Тест"), 4);
1098+
КонецПроцедуры
1099+
1100+
Процедура ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_СтрокаЧисло() Экспорт
1101+
ТЗ = Новый ТаблицаЗначений();
1102+
ТЗ.Колонки.Добавить("Тест", Новый ОписаниеТипов("Строка,Число"));
1103+
ТЗ.Добавить().Тест = -3;
1104+
ТЗ.Добавить().Тест = "7";
1105+
ТЗ.Добавить().Тест = "ц5";
1106+
1107+
юТест.ПроверитьРавенство(ТЗ.Итог("Тест"), -3);
1108+
КонецПроцедуры
1109+
1110+
Процедура ТестДолжен_ПроверитьИтогПоКолонкеСОписаниемТипов_СтрокаДата() Экспорт
1111+
ТЗ = Новый ТаблицаЗначений();
1112+
ТЗ.Колонки.Добавить("Тест", Новый ОписаниеТипов("Строка,Дата"));
1113+
ТЗ.Добавить().Тест = -3;
1114+
ТЗ.Добавить().Тест = "7";
1115+
ТЗ.Добавить().Тест = "ц5";
1116+
1117+
юТест.ПроверитьРавенство(ТЗ.Итог("Тест"), Неопределено);
1118+
КонецПроцедуры
1119+

0 commit comments

Comments
 (0)