如何检查度量组是否与维度组匹配






4.79/5 (8投票s)
本文介绍了如何检查度量值组是否与维度组映射。
引言
在过去的几个月里,我一直致力于一个仪表板应用程序,其中 ADOMD 是数据源。 我们的应用程序包含大量图表、网格、地图和其他一些 UI 控件。 我们使用 MDX 查询来生成应用程序中使用的部件。 众所周知,在每个仪表板应用程序中,数据必须是正确和准确的,然后我们才能在图表、网格、地图等中获得正确的视觉效果。 因此,必须检查数据是否正确,并且我们必须避免不必要的服务器调用以获取数据。
背景
几天前,我正在使用 High Map 中的气泡地图。 根据地图,我们需要准确指定经度和纬度,数据不能出错。 这里我们将使用一个映射函数来检查维度组和度量值组是否被映射。 这将确保数据是正确的,如果没有此检查,我们的 MDX 查询可能会一直运行。 这肯定会让最终用户关闭我们的应用程序并搜索另一个应用程序。 所以我的想法是,如果度量值组和维度组未映射,则给出一个消息,以避免长时间运行查询。
我们要怎么做?
我们将执行以下步骤。
- 一个 ajax 调用,用于传递需要检查过程的信息
- 一个控制器函数,我们在其中创建一个 adomd 连接对象并将信息传递给模型类
- 一个模型类,我们在其中使用所需的参数构建并运行查询
最后一步将为您提供一个信息,说明给定的度量值组是否与维度组映射。
使用代码
所以让我们现在开始编码吧。
正如我们之前讨论的那样,首先我们需要一个 ajax 调用,对吧?
1.一个 Ajax 调用
以下是我们的 ajax 调用实现。
var cubeName = '';
var measureGroupName = '';
var dimensionGroupName = '';
var serverName = 'My server name';
var databaseName = 'My database name';
cubeName = 'My cube name';
measureGroupName = sessionStorage.getItem("measureGroupName");
dimensionGroupName = sessionStorage.getItem("dimensionGroupName");
var checkMeasuresMapped = {
cubeName: cubeName,
measureGroupName: measureGroupName,
dimensionGroupName: dimensionGroupName,
serverName: serverName,
databaseName: databaseName
};
$.ajax({
async: ajaxAsync,
url: '../CheckMeasureGroupMapping/',
type: 'POST',
dataType: 'json',
data: JSON.stringify(checkMeasuresMapped),
contentType: "application/json; charset=utf-8",
success: function(data) {
if (data.indexOf("Error") > -1) {
$('#btnCreate').css('enabled', 'false');
$('#Preview').html('
<p style="color:red;">Error : ' + data.replace('Error', '') + '</p>
');
} else if (data == "Mapped") {
//Condition satisfied, write your codes here
ajaxAsync = true;
} else {
$('#Preview').html('
<p style="color:red;">Warning : The given measure is not mapped with the dimension. Please check.</p>
');
}
},
error: function(xhrequest, ErrorText, thrownError) {
console.log(ErrorText + "," + thrownError);
$('#Preview').html('
<p style="color:red;">Error : ' + ErrorText + '</p>
');
}
});
请注意,我已经传递了所有需要的信息。 我们将列出它们是什么。
I. Cube 名称
II. 度量值组名称
III. 维度组名称
IV. 服务器名称
V. 数据库名称
一旦您完成了 ajax 实现,您将在我们的控制器中获得信息,对吧? 这就是 ajax 调用的工作方式 J. 如果您不熟悉 ajax 调用,请参考以下链接。
2.控制器函数
我希望您都完成了 ajax 实现,现在我们将继续进行下一部分。 请参考下面的代码。
///
<summary>
///This method is used to find whether the given measure is mapped to the dimension
///
<param name="cubeName">
</param>
///
<param name="measureGroupName">
</param>
///
<param name="dimensionGroupName">
</param>
///
</summary>
[HandleError]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CheckMeasureGroupMapping(string cubeName, string measureGroupName, string dimensionGroupName, string serverName, string databaseName)
{
try
{
DataTable dt = new DataTable();
dt = adomdConn.CheckMeasureGroupMapping(cubeName, measureGroupName, dimensionGroupName, serverName, databaseName);
if (dt.Rows.Count < 1)
{
return Json("The given measure is not mapped with the dimension. Please check.", JsonRequestBehavior.AllowGet);
}
else
{
return Json("Mapped", JsonRequestBehavior.AllowGet);
}
}
catch (AdomdErrorResponseException ex)
{
string errrorText = "Query Error" + System.Web.HttpUtility.HtmlEncode(ex.Message);
return Json(errrorText, JsonRequestBehavior.AllowGet);
}
}
这里 CheckMeasureGroupMapping 是我们的 ActionResult,我们正在将信息传递给我们的模型类,如果我们的条件得到满足,则上述函数将在数据表中返回行。 通过该数据表的行数,我们可以得出结论 J
3.模型函数
现在我们处于最后一部分,当我们得到模型类中所需的参数时,是时候构建查询并将其运行到 ADOMD 服务器了。 所以下面是执行相同操作的函数。
public DataTable CheckMeasureGroupMapping(string cubeName, string measureGroupName, string dimensionGroupName, string serverName, string databaseName)
{
try
{
string query = string.Empty;
string queryBefore = string.Empty;
queryBefore = "SELECT [MEASUREGROUP_NAME] AS [MEASUREGROUP],[MEASUREGROUP_CARDINALITY],[DIMENSION_UNIQUE_NAME] AS [DIM],[DIMENSION_GRANULARITY] AS [DIM_KEY],[DIMENSION_CARDINALITY],[DIMENSION_IS_VISIBLE] AS [IS_VISIBLE],[DIMENSION_IS_FACT_DIMENSION] AS [IS_FACT_DIM] FROM $system.MDSCHEMA_MEASUREGROUP_DIMENSIONS WHERE [CUBE_NAME] = {cubeName} AND [MEASUREGROUP_NAME] ={measureGroupName} AND [DIMENSION_UNIQUE_NAME]={dimensionGroupName}";
query = queryBefore.Replace("{cubeName}", "'" + cubeName + "'").Replace("{measureGroupName}", "'" + measureGroupName + "'").Replace("{dimensionGroupName}", "'" + dimensionGroupName + "'");
StringBuilder sbConnectionString = new StringBuilder();
sbConnectionString.Append("Provider=MSOLAP;data source=");
sbConnectionString.Append(serverName + ";initial catalog=" + databaseName + ";Integrated Security=SSPI;Persist Security Info=False;");
using (AdomdConnection conn = new AdomdConnection(sbConnectionString.ToString()))
{
conn.Open();
using (AdomdCommand cmd = new AdomdCommand(query, conn))
{
DataTable dt = new DataTable();
AdomdDataAdapter da = new AdomdDataAdapter(cmd);
da.Fill(dt);
return dt;
}
}
}
catch (AdomdErrorResponseException ex)
{
throw;
}
}
正如您都可以看到,下面是用于查找给定度量值组是否与维度组映射的查询。
SELECT [MEASUREGROUP_NAME] AS [MEASUREGROUP],[MEASUREGROUP_CARDINALITY],[DIMENSION_UNIQUE_NAME] AS [DIM],[DIMENSION_GRANULARITY] AS [DIM_KEY],[DIMENSION_CARDINALITY],[DIMENSION_IS_VISIBLE] AS [IS_VISIBLE],[DIMENSION_IS_FACT_DIMENSION] AS [IS_FACT_DIM] FROM $system.MDSCHEMA_MEASUREGROUP_DIMENSIONS WHERE [CUBE_NAME] = {cubeName} AND [MEASUREGROUP_NAME] ={measureGroupName} AND [DIMENSION_UNIQUE_NAME]={dimensionGroupName}";
我们正在使用这些参数运行此查询,并将结果返回给我们的控制器。
最后
最后,我们将按照我们在 ajax 调用中显示的方式检查条件。
if (data.indexOf("Error") > -1) {
$('#btnCreate').css('enabled', 'false');
$('#Preview').html('
<p style="color:red;">Error : ' + data.replace('Error', '') + '</p>
');
} else if (data == "Mapped") {
//Condition satisfied, write your codes here
ajaxAsync = true;
} else {
$('#Preview').html('
<p style="color:red;">Warning : The given measure is not mapped with the dimension. Please check.</p>
');
}
所以我们已经完成了这个需求。
祝您编码愉快
关注点
ADOMD,ADOMD 度量值,ADOMD 维度,ADOMD 度量值组,ADOMD 维度组,映射度量值组和维度组。
结论
我希望您喜欢我的文章。 请分享您的宝贵反馈。 这意义重大 J
附加参考
- https://codeproject.org.cn/Articles/879184/Ways-to-Convert-Microsoft-ADOMD-Data-Source-to-JSO
- https://codeproject.org.cn/Tips/881023/Convert-CellSet-to-HTML-Table-and-from-HTML-to-J
- https://codeproject.org.cn/Tips/880555/Convert-Microsoft-ADOMD-Cell-Set-to-JSON
输出
如果给定的度量值组未与度量值组映射,您将在预览区域中获得以下输出。
历史
第一个版本:2015 年 5 月 4 日