Hi all,
I am handling numbers of transactions per time. I need to build up a table with rows for each device and each transaction type ("indicators"). There should be one column for every hour (0-23), all filtered for a given date.
This code gives me the total of all trx according to the given filter data.
But how can I set a filter for each hour i=0..23 to just sum up
SingleTrxSumFields.Number WHERE SingleTrxSumFields.Hour == i
in the columns 4..27???
RelationCollection relations = new RelationCollection();
relations.Add(GeraetestammdatenEntity.Relations.SingleTrxSumEntityUsingDevId);
PredicateExpression filter = new PredicateExpression();
filter.Add(SingleTrxSumFields.DevId == levelId);
filter.Add(SingleTrxSumFields.Year == year);
filter.Add(SingleTrxSumFields.Month == month);
filter.Add(SingleTrxSumFields.Day == day);
ResultsetFields fields = new ResultsetFields(5);
fields.DefineField(GeraetestammdatenFields.DevId, 0);
fields.DefineField(GeraetestammdatenFields.Equipmentnummer, 1);
fields.DefineField(GeraetestammdatenFields.Typ, 2);
fields.DefineField(SingleTrxSumFields.IndikatorEf, 3);
[b]
fields.DefineField(SingleTrxSumFields.Number, 4, AggregateFunction.Sum);
[/b]
IGroupByCollection groupByClause = new GroupByCollection();
groupByClause.Add(fields[0]);
groupByClause.Add(fields[1]);
groupByClause.Add(fields[2]);
groupByClause.Add(fields[3]);
DataTable dynamicList = new DataTable();
TypedListDAO dao = new TypedListDAO();
dao.GetMultiAsDataTable(fields, dynamicList, 0, null, filter,
relations, true, groupByClause, null, 0, 0);
I tried this alternative, but the aggregate function ignores the settings in the filter (so sums up on all devices and all year, month, days...
RelationCollection relations = new RelationCollection();
relations.Add(GeraetestammdatenEntity.Relations.SingleTrxSumEntityUsingDevId);
PredicateExpression filter = new PredicateExpression();
filter.Add(SingleTrxSumFields.DevId == levelId);
filter.Add(SingleTrxSumFields.Year == year);
filter.Add(SingleTrxSumFields.Month == month);
filter.Add(SingleTrxSumFields.Day == day);
ResultsetFields fields = new ResultsetFields(28);
fields.DefineField(GeraetestammdatenFields.DevId, 0);
fields.DefineField(GeraetestammdatenFields.Equipmentnummer, 1);
fields.DefineField(GeraetestammdatenFields.Typ, 2);
fields.DefineField(SingleTrxSumFields.IndikatorEf, 3);
[b]
int next = 4;
for (int i = 0; i < 24; i++)
{
int col = i + next;
fields.DefineField(SingleTrxSumFields.Number, col, i.ToString());
ScalarQueryExpression exp =
new ScalarQueryExpression(
SingleTrxSumFields.Number.SetAggregateFunction(AggregateFunction.Sum),
SingleTrxSumFields.Hour == i);
fields[col].ExpressionToApply = exp;
}
[/b]
IGroupByCollection groupByClause = new GroupByCollection();
groupByClause.Add(fields[0]);
groupByClause.Add(fields[1]);
groupByClause.Add(fields[2]);
groupByClause.Add(fields[3]);
DataTable dynamicList = new DataTable();
TypedListDAO dao = new TypedListDAO();
dao.GetMultiAsDataTable(fields, dynamicList, 0, null, filter,
relations, true, groupByClause, null, 0, 0);
Trying to fix this, I added the filter information to the ScalarQueryExpression.
Now the DevId filter settings & the hour filter settings were perfect, but the indicator is ignored, which I can not explain or understand at all...
like last example ...
int next = 4;
for (int i = 0; i < 24; i++)
{
int col = i + next;
fields.DefineField(SingleTrxSumFields.Number, col, i.ToString());
ScalarQueryExpression exp =
new ScalarQueryExpression(
SingleTrxSumFields.Number.SetAggregateFunction(AggregateFunction.Sum),
new PredicateExpression(filter)
.Add(new PredicateExpression(SingleTrxSumFields.DevId == fields[0]))
.Add(new PredicateExpression(SingleTrxSumFields.IndikatorEf == fields[3]))
.Add(new PredicateExpression(SingleTrxSumFields.Hour == i))
);
fields[col].ExpressionToApply = exp;
}
...
I am running out of ideas... can anyone help me???
Thanks in advance!!!
Anja