题外话先:早些时候一同事问我KPI到底是咋回事,我用标准的解释方法说了好几遍都没听懂,后来干脆直接跟他说------GDP,他叹了口气,委屈的说知道了.(GDP是公司近段时间提出的个人产值的指标,达到这个就保持你的工资,达不到就扣你20%工资,有啥概念还有比这更深入人心呢,唉,可恶的经济危机啊)

写此篇受到李兄很大的启发.一直以来就有用类似WPF来实现BI的想法,只是由于个人原因迟迟没有实现.不过最近看到WXWinter(冬)的工作流作品深受鼓舞.

为什么要wpf/silverlight for KPI or BI?笔者评估过很多工具或者第三方组件,都是纯asp.net control,他们在运行起来需要加载大量的javascript,容易导致浏览器死掉,而且还要区分浏览器类型和版本.通过flash或者silverlight这种方式多少可以避开这样的问题,而且展现形式要更灵活.

先写KPI,原因是发现这个实现起来相对来说要简单一些,本文最终完成的效果是这个样子的:

关于KPI的详细解释,请参考微软的这篇文档.这里简要按照个人的理解说一下一些用到的概念:

首先是”目标”,其实按照字面理解就可以,就是一个用来衡量的标准,””,就是实际是多少,这个值和目标做比较,在KPI应用中,通常没有达到的就显示个红灯以示警告,跟这个值差不多就显示一个黄灯,超过目标一个指定的范围就现实一个绿灯,这种通过红黄绿的标识可以理解为其中的”状态”.

明确以上的概念,那么在silverlight中显示KPI就不难了,实际上就是怎么把状态值显示成相关的图片.

首先,在silverlight中要面对数据通信的问题,silverlight不像WPF 桌面应用,客户端无法ADO.NET,更别提ADOMD.NET了,所以需要通过WebService或者其它的类似方案,在WebService里引用ADOMD.NET对Analysis Services进行操作.

查询的语法通常是如下的格式(SQLServer2005/2008通用的SSAS):

SELECT

{ KPIValue("Channel Revenue"),

KPIGoal("Channel Revenue"),

KPIStatus("Channel Revenue"),

KPITrend("Channel Revenue")

} ON Columns,

Descendants

( { [Date].[Fiscal].[Fiscal Year].&[2002],

[Date].[Fiscal].[Fiscal Year].&[2003],

[Date].[Fiscal].[Fiscal Year].&[2004]

}, [Date].[Fiscal].[Fiscal Quarter]

) ON Rows

FROM [Adventure Works]

查询的结果通常如下图所示:

为了大家能在下载后看到KPI效果图,本文省略服务编写的步骤(如果有必要会在续篇中详细说明),另外大家很可能没有对应版本的分析服务,所以本文的数据是简单的测试数据,大致如下:

List<People> source = new List<People>();

source.Add(new People { name = "北京市", value1 = 1532, value2 = 851, field1 = 1, field2 = 0, field3 = 0, field4 = 1 });

source.Add(new People { name = "上海市", value1 = 358, value2 = 1785, field1 = -1, field2 = 0, field3 = -1, field4 = 0 });

source.Add(new People { name = "深圳市", value1 = 2564, value2 = 3584, field1 = 1, field2 = 1, field3 = -1, field4 = 0 });

source.Add(new People { name = "天津市", value1 = 1256, value2 = 258, field1 = -1, field2 = -1, field3 = -1, field4 = -1 });

source.Add(new People { name = "长春市", value1 = 3112, value2 = 2586, field1 = 1, field2 = 1, field3 = 1, field4 = 0 });

source.Add(new People { name = "沈阳市", value1 = 1584, value2 = 1258, field1 = -1, field2 = -1, field3 = -1, field4 = 0 });

source.Add(new People { name = "青岛市", value1 = 3587, value2 = 1256, field1 = 0, field2 = 0, field3 = -1, field4 = 0 });

dgTest.ItemsSource = source;

没错,这里用到的就是Silverlight2中的DataGrid,这个控件是个很灵活的控件.实际上到silverlight这一层处理就很简单了,因为它接收的除了目标值等这样的信息外,KPI状态值如上所示就是简单的状态值.

接下来需要做绑定值的转换,通常单元格里接收到的值就是-1,0,1(当然也会有-1,-0.3,0,0.3,1这样的情况,本文只考虑三种情况),所以这里的问题是如何把这样的值转换成小红灯,小黄等或者小绿灯这样的控件.这样的图片来源很广泛,可以在素材网站里找,也可以用微软sqlserver下现成的,就像李兄在文中提到的.不过在silverlight下需要多做一个工作,就是把sqlserver带的这些gif图片转成jpg的,否则会出问题.Sqlserver中带了好几个样式,挑自己觉得好看的用fireworks这样的工具转一下就ok了.

关于值转换这里有一个跟webapp和winform程序都不大一样的地方,笔者认为也是最别扭的一个地方.按照之前的理解,把KPI状态显示封装成一个usercontrol,然后暴露出一个属性供DataGrid的模板列中传递绑定的值给它就可以了,然后usercontrol里获得这个值决定显示哪张图片.但在把绑定的值给usercontrol的这个属性的时候出现了莫名其妙的问题.还好在qq的wpf silverlight群10458228里得到高人的指点,用Converter.于是我在yahoo里搜索(中文网站上资料太少),按照其方法写了如下类.

public class KPIImageConverter : IValueConverter

{

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

{

int kpivalue = (int)value;

BitmapImage source=new BitmapImage();

switch (kpivalue)

{

case -1:

source.UriSource = new Uri("Images/KPI/stoplight_single0.jpg", UriKind.Relative);

break;

case 0:

source.UriSource = new Uri("Images/KPI/stoplight_single1.jpg", UriKind.Relative);

break;

case 1:

source.UriSource = new Uri("Images/KPI/stoplight_single2.jpg", UriKind.Relative);

break;

}

return source;

}

public object ConvertBack(object value,Type targetType,object parameter,CultureInfo culture)

{

//Visibility visibility = (Visibility)value;

//return (visibility == Visibility.Visible);

return null;

}

}

然后在页面里做如下声明:

<UserControl.Resources>

<SilverlightApplication1:KPIImageConverter x:Key="KPIValueConverter" />

</UserControl.Resources>

然后用DataGrid的模板列,这里的思路跟asp.net的差不多.

<data:DataGridTemplateColumn Header="帅哥产量状态" Width="80">

<data:DataGridTemplateColumn.CellTemplate>

<DataTemplate>

<StackPanel>

<Image Width="16" Height="16" Source="{Binding field1, Converter={StaticResource KPIValueConverter}}" />

</StackPanel>

</DataTemplate>

</data:DataGridTemplateColumn.CellTemplate>

</data:DataGridTemplateColumn>

基本上实现的时候步骤和需要注意的地方就是这些,特意在这里说明一下,好让更多碰到类似问题的朋友都能找到解决的方法.此文描述的方法适用于SQLServer2005和SQLServer2008中的Analysis Services.

最后,请注意crossdomain的问题,请看我之前关于此的描述:

http://www.cnblogs.com/aspnetx/archive/2008/04/19/1161734.html

总结:

总体来说WPF for BI是个不错的方案,不过让我感到奇怪的是国内外还没有见到有人做过相关的应用,多少可能是由于BI到底要render到什么程度很难找到一个标准,但确实不应该质疑WPF或者Silverlight的能力.

本文所提及的代码在这里下载.

相关资源:

微软的示例数据库,数据仓库,分析模型下载,有2000和 2005的:

http://www.codeplex.com/MSFTDBProdSamples

如何在SQLServer中定义和浏览KPI:

http://msdn.microsoft.com/zh-cn/library/ms166869(SQL.90).aspx

转载于:https://www.cnblogs.com/aspnetx/archive/2008/11/06/1327842.html

Silverlight for KPI相关推荐

  1. 学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式

    6 离线使用 在笔记第一部分的时候就提到如果要使用Bing Maps Silverlight Control 进行开发,需要申请一个key,不让会显示一个错误提示出来.但是在实际开发或使用过程中,使用 ...

  2. Silverlight WCF RIA服务(二十三)Silverlight 客户端 4

    DomainDataSource WCF RIA Services提供DomainDataSource控件来简化用户界面和域上下文中数据的交互.通过DomainDataSource,我们可以只是用声明 ...

  3. 中国挪动批改KPI查核制度将器重客户满意度

    飞象网讯(魏德龄/文)记者从相关动静处置解到,中国挪动2011年的KPI查核将大幅缩减,并消除数据业务.TD用户数和集体客户等目标,重点调高了利润和客户满意度目标,并加入了相关EVA财务目标查核. 去 ...

  4. 【Socket研究】~。~ Scoket开发蛋疼笔记 Silverlight

    客户端连接步骤[Silverlight] [注意] Silverlight 客户端 记得一定是异步连接. 一.连接步骤 1.实例一个Scoket 2.实例套接字 SocketAsyncEventArg ...

  5. Silverlight技术支持谷歌Android

    [计世网消息](刘清河 编译) 当苹果公司没有将Adobe公司的Flash技术集成到iPhone时,就好象已经为其竞争对手微软公司的Silverlight技术提供了一个可乘之机.然而,从目前出现的情况 ...

  6. 跨域部署Silverlight时需要注意的问题

    当我们的Silverlight程序(.xap)发布地址和网页发布地址处于不同服务器上(跨域状态)时,由于安全机制在Silverlight和Javascript调用时会出现一些问题,如:Silverli ...

  7. 创建Silverlight自定义启动画面

    每一款商业的Silverlight项目,为了体现项目个性化,都会有不同的界面设计,项目UI设计的第一步就是创建个性的自定义启动画面,本文将介绍如何创建Silverlight自定义启动画面,也就是经常说 ...

  8. silverlight数据库应用程序开发

    该解决方案使用的是"silverlight导航应用程序+Oracle数据库+WebService服务" 新建silverlight项目GH,同时会自动添加一个GH.Web,在GH. ...

  9. Silverlight:SSL教程

    在Silverlight与WCF进行通信的过程中,数据安全就成为了一个非常关键的因素,如果不作任何限制,那么数据被抓包篡改等情况都是对系统的潜在威胁.本文主要介绍通过SSL配置WCF进行通信. 对于W ...

  10. 兼容Silverlight4的实用的Silverlight可拖放工具类源代码

    开发日常的Silverlight应用程序时,常常要对一个域多个控件实现可拖放的MOUSE操作,在Silverlight中实现拖放的功能其实非常简单,但是为了提高程序功能代码的可复用性,程序员常常喜欢把 ...

最新文章

  1. WebStorm 运行Rect Native 项目
  2. 20162329 2017-2018-2《程序设计与数据结构》课程总结
  3. sidekiq安装及使用
  4. Jquery中进行post请求时同步与异步的区别(从实例入手学习)
  5. 实验吧——SQL注入 Write up(一)
  6. 武大计算机学院八零后博导张翔,走近名校新生状元 武大张翔:学贵有恒
  7. 计算机大学生个人特长范文,计算机大学生个人简历范文
  8. 信息化基础建设 工作流开发
  9. 为什么大部分的程序员成不了架构师?为什么?
  10. GitLab使用教程(详细)
  11. 计算机的kb和m之间的换算,g和兆的换算(G和M之间的换算)
  12. ​元宇宙与AI热度不减,Gartner 2023 年十大战略技术趋势完整解析
  13. python计算2的n次方编写_python中n次方怎么表示
  14. 分布式追踪不是银弹 | 正确使用分布式追踪和 APM 系统
  15. 牛腩新闻系统--.NET使用一般处理程序生成验证码
  16. unity使用Sprite Editor图片切割功能减少性能损耗
  17. 计算个人所得税(老版)
  18. 远程控制电脑软件有什么特别之处呢?
  19. 总结一下购买阿里云服务器的经验
  20. Linux Joystick driver v2.0.0

热门文章

  1. java file.listFiles()按文件名称、日期、大小排序
  2. docker容器启动失败解决办法
  3. bzoj2463: [中山市选2009]谁能赢呢?(博弈论)
  4. 23种设计模式及其应用场景
  5. 如何注册苹果开发者账号
  6. 第五章 多个消费者监听同一个队列
  7. 【转】请求处理机制其二:Django中间件的解析
  8. xgboost算法_xgboost算法学习心得
  9. 如何 给给软件开发 添加 代理_如何从“菜鸟码农”变成“一线架构师”?
  10. 公开课视频-《第01章 规划》-大企业云桌面部署实战-在线培训-视频(奉献)