修正DataLog查IO数据不正确的问题。
This commit is contained in:
parent
4c7aa1ef93
commit
679ce9d0c5
|
@ -482,7 +482,7 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 根据左侧选项查询数据
|
||||
/// 根据DataLog界面左侧项目树中选择的项目查询数据
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private static DataSet SearchDataBaseAsync(
|
||||
|
@ -498,78 +498,109 @@ namespace MECF.Framework.UI.Client.CenterViews.DataLogs.DataHistory
|
|||
// 遍历模组
|
||||
foreach (var module in modules)
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
//! 因为数据库中按天拆表,无法一次性查询数据,需使用UNION合并多表查询,因此此处按天拼接SQL表达式
|
||||
// 最终SQL表达式结构为:
|
||||
// (select xx from date1.xx) union (select xx from date2.xx) union (select xx from date3.xx)
|
||||
// where time between xxx and xxx
|
||||
// order by time asc
|
||||
var ts = dateRange.Diff;
|
||||
for (var day = 0; day <= ts.Days; day++)
|
||||
// 如果当前根节点下没有被选中的终端节点,则忽略
|
||||
if (module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null)
|
||||
continue;
|
||||
|
||||
if (module.ToString() != "IO")
|
||||
{
|
||||
// 检查表名是否存在,否则SQL执行出错。
|
||||
var tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{module}";
|
||||
if (module.ToString() == "IO")
|
||||
{
|
||||
var node = module.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected);
|
||||
tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{node}";
|
||||
}else if (module.ToString() != "PM1")
|
||||
{
|
||||
tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.System";
|
||||
}
|
||||
|
||||
if (CheckTableExists(tblName))
|
||||
// 如果不是IO节点,则根节点名即为数据库名=
|
||||
var dt = SearchSingleDbTable(module, dateRange, cancellation, progressReporter);
|
||||
if (dt != null)
|
||||
ds.Tables.Add(dt);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果节点名是IO,则数据库使用IO.[二级节点名]作为表名,例如IO.PM1\IO.PM2\IO.TM\IO.System
|
||||
var subNodes = module.ChildNodes;
|
||||
|
||||
foreach (var subNode in subNodes)
|
||||
{
|
||||
if (subNode.ChildNodes.FirstOrDefault(x => (bool)x.HasTerminalSelected) == null)
|
||||
continue;
|
||||
|
||||
sql.Append("select \"time\" AS InternalTimeStamp");
|
||||
var selectedParams = module.Flatten(true)
|
||||
.Where(x => x.IsSelected == true);
|
||||
|
||||
// 添加待查询的列
|
||||
foreach (var item in selectedParams)
|
||||
{
|
||||
sql.Append("," + $"\"{item}\"");
|
||||
}
|
||||
|
||||
sql.Append($" from \"{tblName}\" ");
|
||||
|
||||
if (day < ts.Days)
|
||||
sql.Append(" UNION ");
|
||||
var dt = SearchSingleDbTable(subNode, dateRange, cancellation, progressReporter);
|
||||
if (dt != null)
|
||||
ds.Tables.Add(dt);
|
||||
}
|
||||
}
|
||||
|
||||
// 所有表名不可用,可能是日期范围错误
|
||||
if (sql.Length <= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
sql.Append(
|
||||
$" where \"time\" between {dateRange.Start.Ticks} and {dateRange.End.Ticks} order by InternalTimeStamp asc");
|
||||
|
||||
progressReporter?.Report(new ProgressUpdatingEventArgs(20, 100,
|
||||
$"Querying {dateRange}..."));
|
||||
|
||||
if (cancellation?.Token.IsCancellationRequested == true)
|
||||
return null;
|
||||
|
||||
// 查询数据并将返回的结果存储在DataSet中
|
||||
var dataTable = QueryDataClient.Instance.Service.QueryData(sql.ToString());
|
||||
|
||||
if (cancellation?.Token.IsCancellationRequested == true)
|
||||
return null;
|
||||
|
||||
//! 返回的 DataTable 可能不存在,原因是上述代码自动生成的表明可能不存在。
|
||||
if (dataTable == null)
|
||||
continue;
|
||||
dataTable.TableName = module.Name;
|
||||
ds.Tables.Add(dataTable);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return ds;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// IO节点在数据库中的表名比较特殊,需要特殊处理。
|
||||
/// </summary>
|
||||
/// <param name="module"></param>
|
||||
/// <param name="dateRange"></param>
|
||||
/// <param name="cancellation"></param>
|
||||
/// <param name="progressReporter"></param>
|
||||
/// <returns></returns>
|
||||
private static DataTable SearchSingleDbTable(TreeNode module, DateRangeHelper dateRange,
|
||||
CancellationTokenSource cancellation = null,
|
||||
IProgress<ProgressUpdatingEventArgs> progressReporter = null)
|
||||
{
|
||||
var sql = new StringBuilder();
|
||||
//! 因为数据库中按天拆表,无法一次性查询数据,需使用UNION合并多表查询,因此此处按天拼接SQL表达式
|
||||
// 最终SQL表达式结构为:
|
||||
// (select xx from date1.xx) union (select xx from date2.xx) union (select xx from date3.xx)
|
||||
// where time between xxx and xxx
|
||||
// order by time asc
|
||||
var ts = dateRange.Diff;
|
||||
for (var day = 0; day <= ts.Days; day++)
|
||||
{
|
||||
var tblName = $"{dateRange.Start.AddDays(day):yyyyMMdd}.{module}";
|
||||
|
||||
// 检查表名是否存在,否则SQL执行出错。
|
||||
if (CheckTableExists(tblName))
|
||||
{
|
||||
|
||||
sql.Append("select \"time\" AS InternalTimeStamp");
|
||||
var selectedParams = module.Flatten(true)
|
||||
.Where(x => x.IsSelected == true);
|
||||
|
||||
// 添加待查询的列
|
||||
foreach (var item in selectedParams)
|
||||
{
|
||||
sql.Append("," + $"\"{item}\"");
|
||||
}
|
||||
|
||||
sql.Append($" from \"{tblName}\" ");
|
||||
|
||||
if (day < ts.Days)
|
||||
sql.Append(" UNION ");
|
||||
}
|
||||
}
|
||||
|
||||
// 所有表名不可用,可能是日期范围错误
|
||||
if (sql.Length <= 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
sql.Append(
|
||||
$" where \"time\" between {dateRange.Start.Ticks} and {dateRange.End.Ticks} order by InternalTimeStamp asc");
|
||||
progressReporter?.Report(new ProgressUpdatingEventArgs(20, 100,
|
||||
$"Querying {dateRange}..."));
|
||||
|
||||
if (cancellation?.Token.IsCancellationRequested == true)
|
||||
return null;
|
||||
|
||||
// 查询数据并将返回的结果存储在DataSet中
|
||||
var dataTable = QueryDataClient.Instance.Service.QueryData(sql.ToString());
|
||||
|
||||
if (cancellation?.Token.IsCancellationRequested == true)
|
||||
return null;
|
||||
|
||||
//! 返回的 DataTable 可能不存在,原因是上述代码自动生成的表明可能不存在。
|
||||
if (dataTable == null)
|
||||
return null;
|
||||
|
||||
dataTable.TableName = module.Name;
|
||||
return dataTable;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 渲染图表。
|
||||
/// </summary>
|
||||
|
|
Loading…
Reference in New Issue