项目是建立一个框架,由用户自定义子项目内容,并生成相应报表。
需求这样的:
一、框架提供数据库中所有可用字段(名称、类型、约束);
二、用户申请建立一个新子项目。
1、定义子项目名称;
2、定义子项目的所要用的数据:字段名称、字段的数据源(可是常量、变量、数据引用、公式);
3、常量直接输入值,变量为其它已经定义的常量和变量的表达式,数据引用为数据库提供的字段,公式为前三者的组合表达式;
4、用户定义子项目在网页中的界面:位置(left,top)、大小(width,height)、显示控件(textbox,checkbox,button,radio,select,image)、控件样式等;
5、用户定义子项目生成的报表:报表标题、表头字段、表格内容、汇总项等。
三、系统生成该项目,在页面显示结果。
1、生成web页面;
2、在生成的页面中响应用户操作结果,包括用户操作数据的保存;
3、根据用户的操作生成相应报表,并提供导出excel下载。
四、用户可根据需要修改和调整子项目的内容。
目前需要解决的问题:
1、数据库该如何设计?
2、如何实现用户自定义的界面?
3、如何实现用户自定义的报表?
3、如何响应生成的页面中的事件响应?
请用aspx.net完成。java和php我不会,见谅!
4个问题。200分。我只能发100分的帖子,明天加分!
需求这样的:
一、框架提供数据库中所有可用字段(名称、类型、约束);
二、用户申请建立一个新子项目。
1、定义子项目名称;
2、定义子项目的所要用的数据:字段名称、字段的数据源(可是常量、变量、数据引用、公式);
3、常量直接输入值,变量为其它已经定义的常量和变量的表达式,数据引用为数据库提供的字段,公式为前三者的组合表达式;
4、用户定义子项目在网页中的界面:位置(left,top)、大小(width,height)、显示控件(textbox,checkbox,button,radio,select,image)、控件样式等;
5、用户定义子项目生成的报表:报表标题、表头字段、表格内容、汇总项等。
三、系统生成该项目,在页面显示结果。
1、生成web页面;
2、在生成的页面中响应用户操作结果,包括用户操作数据的保存;
3、根据用户的操作生成相应报表,并提供导出excel下载。
四、用户可根据需要修改和调整子项目的内容。
目前需要解决的问题:
1、数据库该如何设计?
2、如何实现用户自定义的界面?
3、如何实现用户自定义的报表?
3、如何响应生成的页面中的事件响应?
请用aspx.net完成。java和php我不会,见谅!
4个问题。200分。我只能发100分的帖子,明天加分!
整个系统的模型可以用Xml的形式定义,容易扩展,内容包括
业务名:对应业务中文名,英文名对应数据库表名;
字段名:中文--用以列表显示,英文--和数据库里的字段对应,类型---对应UI的表单显示样式;
视图配置:定义列表上可以显示的导航,查询,字段等,也定义表单上可以显示的列意义所有可能的操作按钮
2:给予用户修改 视图配置 的能力,页面展现时根据视图配置生成页面,
完全用服务器端控件生成表单还是用类似Extjs的框架看个人需求
4:如果用服务器端控件实现事件,就事先定义好所有的事件处理过程,让显示在页面上的按钮自己回调实现
如果用用Js实现事件的处理,可以在有一个针对按钮的配置,内容就是能执行的代码(谁叫js是解释执行呢),
然后根据视图上的配置,将按钮的配置代码动态的插入到页面上
个人的一些体会,只是一个简单的过程,真正的实现就复杂多了
关键是你让用户去做的一些事情,本来应该是DBA和架构师做的!要知道,到最底层的用户,他们能做的事情,就是你给它一个文本框,让他向里头输点东西.如果有两个文本框,就得千叮咛万嘱咐地告诉他这个是用来输这个的,那个是用来输那个的,即使这样,他输过后,你还得在后台检验他输得对不对.如果有一个下拉列表,那要叮嘱的就不是一句话,而是一本书了!别指望做出一个普适的东西,能做,微软老早就做了.
利用XML配置搞定的不只是报表,还可以解决增删改。
http://blog.csdn.net/jsyhello
回来实施无论你做出来多么灵活一个框架
假设可以自定义数据库字段,表结构,可执行数据语句,
页面布局,按钮事件,报表
……
……
如果你给企业上这样一整套系统,仍要有一个强大的实施维护团队,如果用户都是实施工程师这个问题就不用考虑你的这个思路还是比较好,而且现在有很多大公司做的也很好,这个东西不要在费力气了,如果有个强大的团队可以做一整套出来适合国内现有企业模式的软件,这样可能从推广,实施上都会有很多利先找个这方面的软件,如ERP实施,或是其它,然后自己用一用,动手实施一下,相信有一周的时间,你会理解
为什么有很多人都觉得这个想法有问题
你会得到的!
项目开始时候根据模板生成内容,在这个基础上改动
目前进度如下:
1.用web编辑器(最简版本,不是ewebeditor或ckediter)完成用户界面的生成,当然是静态的。
用户事件目前只能完成最简单的。如提交和上传数据。动态数据界面还正在探索中。
2.页面数据根据用户操作更新模块,目前正在解决中。
目前最头疼的是表达式分解。
如:[应付款]=[商品数量]*[商品价格]*[折扣]-[预付款]
我目前没有高效的方法把表达式中的变量给分解出来,分别求值后,再放入表达式进行运算。
我没学过编译原理,让大家见笑了。
希望大家多帮忙。
公式吗自己定义,还可以自定义函数,然后把公式中的变量用实际数字代替。计算的时候可以使用类似下面的函数: public static object Calc(string expression)
{
string className = "Calc";
string methodName = "Run";
expression = expression.Replace("/", "*1.0/"); // 创建编译器实例。
ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());
// 设置编译参数。
CompilerParameters paras = new CompilerParameters();
paras.GenerateExecutable = false;
paras.GenerateInMemory = true; // 创建动态代码。
StringBuilder classSource = new StringBuilder();
classSource.Append("public class " + className + "\n");
classSource.Append("{\n");
classSource.Append(" public object " + methodName + "()\n");
classSource.Append(" {\n");
classSource.Append(" return " + expression + ";\n");
classSource.Append(" }\n");
classSource.Append("}"); //System.Diagnostics.Debug.WriteLine(classSource.ToString()); // 编译代码。
CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString()); // 获取编译后的程序集。
Assembly assembly = result.CompiledAssembly; // 动态调用方法。
object eval = assembly.CreateInstance(className);
MethodInfo method = eval.GetType().GetMethod(methodName);
object reobj = method.Invoke(eval, null);
GC.Collect();
return reobj; }
请大家给个建议?
当前端展示的时候,读出这个html,再将html中的特殊标签替换成相应的展现控件。当然这些展现控制无非就是按钮、列表、输入框、Label这些东西。
3、如何实现用户自定义的报表?自定义的报表,那你就需要提供一个报表设计器了,允许用户上传制作好的报表模板。当展现报表时,你在代码中自动为不同的报表模板加载不同的数据即可。这里有一个难点,就是上传的报表如何验证有效性,可能报表中的字段,在数据库中根本就不存在。4、如何响应生成的页面中的事件响应?
我上面在2中说了,页面已经控件化了(自定义控件),每个控件的事件其实已经写好的,你在控件的代码中使用一些属性,可以指定这个控件所执行的业务请求是哪个项目或哪个业务表的就行了。反射实现添加、删除、修改操作。
写的比较粗,如果你还有疑问,可以加我QQ(7999450),给你一些指导。
自己定义一套标签系统。包括流程控制标签。
我的是用
{labelclass:labelid id="aaa" parm1="" parm2="" DS="DSaaa"/}
这样的单体标签
{labelclass:labelid id="bbb" parm1="" parm2="" DS="DSaaa"}
....
{/labelclass:labelid}
这样的双体标签,其中DS为数据源
{$CONST:clnstid$}
这样的常量
{CTRL:for value="0" step="1" breakvalue = "10"}
...
{/CTRL:for}
这样的控制标签
{FIELD:fieldname = "" FileLevl = "aaa" }
这样的数据字段控件
======================怎么可视化定制一个oracle表,基本上就很简单了,我在另一个项目里,就是把oracle管理器的界面抄一下。作成自己的web界面。然后拼sql串做的。不过在每个表名前都强制加了前缀。便于把这些表罗列出来,而又不暴露系统表。另外,在标签中的ds就是标签用到的数据源,这个数据源中定义一个select 语句,包括一些可替换的参数用{$valuename$}来表示,真用的时候,用label中的同名parm来传值即可。
不过大家的建议很好。结了,给分!