软件开发方法和装置转让专利

申请号 : CN201280057919.3

文献号 : CN104169871B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 艾买提·拉扎

申请人 : 艾买提·拉扎谢赫·阿夫扎尔·艾哈迈德

摘要 :

一个软件组件基于一个预定义规则集合且通过使用一个源对象、一个令牌值和一个参数而被构建,所述源对象存储于一个源对象容器中,所述源对象包括一个组件值和/或一个令牌值,其中所述源对象包括的所述组件值可能被关联到所述源对象包括的所述令牌值。为了构建所述软件组件,所述令牌值被处理,对所述令牌值的处理获得一个令牌结果,所述令牌结果被用于构建所述软件组件,所述参数可能也被用于对所述令牌值的处理和/或构建所述软件组件。

权利要求 :

1.一种通过计算机处理器创建用于构建源代码的数据令牌的方法,所述源代码由源代码生成器所构建,所述源代码生成器为计算机程序,所述源代码的构建基于预定义规则集合,所述预定义规则集合规定一个或多个源代码组件被集中在一起以构建所述源代码的方式,通过使用处理所述数据令牌所产生的令牌结果和一个组件值,所述组件值表示所述源代码中的一个源代码组件,所述方法包括:创建一个数据令牌规则集合,所述数据令牌规则集合规定一个方式,其中:

表示所述数据令牌的一个令牌值是可被创建的,

所述数据令牌的所述令牌值可被关联到所述组件值,以使得所述源代码生成器可确定一段计算机可执行逻辑需要被提供的地方,和通过使用一个参数,所述数据令牌的所述令牌值是可被处理的,所述参数用于产生所述令牌结果,所述令牌结果可被所述源代码生成器用于构建所述源代码;

参照一个源对象和一个不确定的源代码组件,所述组件值在源对象容器中是可识别的,所述不确定的源代码组件是在所述源代码的预定义规则集合中的的一个源代码组件,当生成所述源代码时,所述组件值不是利用计算机可实现的逻辑通过用户来确定;以及通过所述数据令牌规则集合,通过所述计算机处理器创建所述数据令牌的一个令牌值,从而使得所述数据令牌可被关联到一个源代码组件的组件值,所述源代码组件存储在一个源对象容器中,所述源对象容器可被所述源代码生成器用于构建所述源代码。

2.根据权利要求1所述的方法,其特征在于,一个令牌结果的使用确定一个组件值将不被用于构建所述源代码。

3.根据权利要求1所述的方法,其特征在于,一个令牌结果的使用确定:

一个或多个组件值将被改变,改变后的组件值将被用于构建所述源代码,一个或多个组件值将被用于创建另一个组件值,所述另一个创建的组件值将被用于构建所述源代码,或上述内容的组合。

4.根据权利要求1所述的方法,其特征在于,所述数据令牌的所述令牌值被嵌入到所述组件值中。

5.一种通过计算机处理器创建用于存储源对象的源对象容器的方法,所述源对象包括一个数据值,一个表示一个源代码的不确定的源代码组件的组件值,及一个与所述组件值相关联的令牌值,其中所述源对象用于基于预定义规则集合通过源代码生成器构建源代码,所述通过计算机处理器执行的方法包括:创建一个数据模型,所述数据模型用于创建所述源对象容器以按照如下方式存储一个源对象:所述源对象可通过使用所述数据值而从所述源对象容器中被识别或被获取,参照所述源对象和所述不确定的源代码组件,所述组件值在所述源对象容器中是可被识别的,所述不确定的源代码组件是在所述源代码的预定义规则集合中的的一个源代码组件,当生成所述源代码时,所述组件值不是利用计算机可实现的逻辑通过用户来确定;和数据令牌的所述令牌值可按照数据令牌规则集合所规定的一样被关联到所述组件值,所述数据令牌基于所述数据令牌规则集合而被创建;以及基于所述数据模型创建作为所述源对象容器的一个数据结构,

从而使得所述源代码生成器可通过使用所述创建的源对象容器构建所述源代码。

6.根据权利要求5所述的方法,其特征在于,所述源对象包括多个组件值和多个数据值,所述多个数据值用于维护所述多个组件值之间的一种期望的关系。

7.根据权利要求5所述的方法,其特征在于,所述源对象包括多个组件值和多个数据值,所述多个数据值用于维护所述多个组件值之间的一种期望的顺序。

8.根据权利要求5所述的方法,其特征在于,所述数据值指的是另一个组件值,所述另一个组件值存储于一个或多个:所述源对象,

另一个源对象,或

以上内容的组合。

9.一种基于预定义规则集合通过计算机处理器构建源代码的方法,所述源代码包括一个或多个被集中在一起的源代码组件,其中所述源代码组件由组件值表示,所述方法包括:创建一个数据令牌,

通过所述计算机处理器创建一个源对象容器,

创建一个源代码生成器,所述源代码生成器为用于构建所述源代码的计算机程序,所述计算机程序基于所述预定义规则集合和通过使用一个数据令牌构建所述源代码,其中所述数据令牌基于数据令牌规则集合被处理,创建一个源对象,所述源对象包括一个数据值,一个表示一个不确定的源代码组件的组件值,及一个令牌值,所述数据令牌的所述令牌值被关联到所述组件值,所述源对象存储在所述源对象容器中,所述不确定的源代码组件是在所述源代码的预定义规则集合中的的一个源代码组件,当生成所述源代码时,所述组件值不是利用计算机可实现的逻辑通过用户来确定,以及所述计算机处理器执行用于构造所述源代码的所述源代码生成器,所述源代码生成器基于所述预定义规则集合以及通过使用一个令牌结果和一个组件值构建所述源代码,所述令牌结果通过处理所述数据令牌的令牌值而获得,所述源代码生成器从所述源对象获取所述数据令牌的所述令牌值和所述组件值,并使用参数来处理所述数据令牌的所述令牌值以产生所述令牌结果,所述源代码生成器通过使用所述数据值从所述源对象容器获取所述源对象。

10.根据权利要求9所述的方法,其特征在于,所述源代码生成器对所述令牌结果的使用确定所述组件值是否将被用于构建所述源代码。

11.根据权利要求9所述的方法,其特征在于,所述令牌结果的使用确定:

一个或多个组件值将被改变,且改变后的组件值将被用于构建所述源代码,一个或多个组件值将被创建,且创建的组件值将被用于构建所述源代码,或上述内容的组合。

12.根据权利要求9所述的方法,其特征在于,所述数据令牌的令牌值被嵌入到所述组件值中。

13.一种通过计算机处理器基于软件源代码的预定义规则集合,根据用户输入的一个参数值生成软件源代码的方法,所述预定义规则集合包括所述软件源代码的一个源代码组件,其中所述源代码组件由一个组件值表示,并通过执行以下步骤实现:使用创建的存储的数据令牌及数据令牌规则集合,所述数据令牌规则集合规定了一个方式,通过所述方式表示所述数据令牌的作为令牌值的一个值是可被创建的,所述方式中所述令牌值可被关联到组件值,所述组件值代表所述软件源代码中的源代码组件;

使用存储的源对象,所述源对象包括一个组件值,所述组件值表示所述软件源代码的一个不确定的源代码组件,所述源对象还包括一个与所述组件值相关联的令牌值,其中所述不确定源代码组件是在所述软件源代码的所述预定义规则集合中的源代码组件,所述组件值不是通过使用计算机可实现的逻辑来确定,所述计算机可实现的逻辑是在生成所述软件的源代码时由用户确定;及通过确定计算机可实现的逻辑被提供的地方,及通过确定一个方式生成所述软件源代码,通过所述方式所述令牌值通过使用参数被处理以从所述源对象中检索数据令牌的令牌值和所述不确定源代码组件的组件值,以获取一个令牌结果,从而通过使用所述参数值,所述不确定源代码组件的组件值,由计算机可实现的逻辑确定的一个可确定的源代码组件的一个组件值,及所述令牌结果产生软件的源代码。

14.一种通过计算机处理器基于软件源代码的预定义规则集合生成软件源代码的方法,其中所述预定义规则集合包括所述软件源代码的一个源代码组件,所述源代码组件由一个组件值表示,所述方法包括:a.创建一个源对象容器,包括:

i.将所述源代码组件分类为一个不确定的源代码组件或一个可确定的源代码组件,其中所述不确定源代码组件是在所述软件源代码的所述预定义规则集合中的源代码组件,所述组件值不是通过使用计算机可实现的逻辑来确定,所述计算机可实现的逻辑是在生成所述软件的源代码时由用户确定,ii.定义一个数据令牌以及一个数据令牌规则集合,所述数据令牌由一个令牌值表示,iii.定义一个参数,所述参数由一个参数值表示,iv.基于所述预定义规则且通过使用所述不确定的源代码组件和所述数据令牌创建一个数据模型,所述数据模型足够用于存储一个源对象,所述源对象包括所述组件值和所述令牌值,以及v.通过计算机处理器通过创建一个源对象基于所述数据模型创建所述源对象容器,所述源对象包括所述组件值和所述令牌值,根据数据令牌规则集合将所述令牌值关联到所述组件值以创建所述源对象;

b.创建一个源代码生成器,所述源代码生成器的创建基于所述源对象容器、所述软件源代码的预定义规则、所述参数和所述数据令牌;以及c.通过计算机处理器执行所述源代码生成器以根据用户输入的所述参数值生产期望的源代码;所述源代码生成器使用所述源对象和所述参数值以生产所述期望的源代码。

15.一种通过计算机处理器基于软件源代码的预定义规则集合,根据用户输入的一个参数值生成软件源代码的方法,所述预定义规则集合包括所述软件源代码的一个源代码组件,其中所述源代码组件由一个组件值表示,并通过执行以下步骤实现:a.识别一个源对象,

b.从一个源对象容器获取所述源对象,所述源对象容器根据以下来创建:

i.将所述源代码组件分类为一个不确定的源代码组件或一个可确定的源代码组件,其中所述不确定源代码组件是在所述软件源代码的所述预定义规则集合中的源代码组件,所述组件值不是通过使用计算机可实现的逻辑来确定,所述计算机可实现的逻辑是在生成所述软件的源代码时由用户确定,ii.定义一个数据令牌以及一个数据令牌规则集合,所述数据令牌由一个令牌值表示,iii.定义一个参数,所述参数由一个参数值表示,iv.基于所述预定义规则且通过使用所述不确定的源代码组件和所述数据令牌创建一个数据模型,所述数据模型足够用于存储一个源对象,所述源对象包括所述组件值和所述令牌值,c.从所述源对象获取一个不确定的源组件的一个组件值,其中所述不确定源代码组件是在所述软件源代码的所述预定义规则集合中的源代码组件,所述组件值不是通过使用计算机可实现的逻辑来确定,所述计算机可实现的逻辑是在生成所述软件的源代码时由用户确定,d.处理一个令牌值以获得一个令牌结果,以及

e.基于所述软件源代码的所述预定义规则集合以及通过使用所述参数值、所述不确定的源代码组件的组件值、一个不确定的源代码组件的一个组件值和所述令牌结果构建所述软件源代码。

说明书 :

软件开发方法和装置

[0001] 相关申请的交叉引用
[0002] 本申请与美国编号为13/242,558、律师案卷号为2112.1002、名为“软件开发方法和装置”、由Ahmad Raza于2011年11月23日在美国专利商标局提交的专利申请相关并要求其优先权,并将其全部内容并入本文。

背景技术

[0003] 1.技术领域
[0004] 本发明涉及软件开发领域。
[0005] 2.相关技术
[0006] 软件开发包括新软件的开发、已开发软件维护和已开发软件质量保证。对已开发软件的维护包括对已开发软件的改变和/或修改,而对已开发软件的质量保证包括对已开发软件的测试和/或调试。.
[0007] 软件开发最大的障碍之一就是需要大量的资源(经常需要受限制的资源),即使对于一个小的计算机程序也是如此。而且,软件开发需要的资源数量按照计算机程序所需的特征数量呈指数级增长。而对于那些不能包含甚至一个错误和/或故障的计算机程序来说,其所需的资源数量就是天文数字了。
[0008] .如此同时,由于计算机处理能力的快速增长,对软件的期望和要求也越来越高。然而,由于受到可用资源的限制,例如,人力资源、资金资源、时间资源、技术资源等等,还没有技术可以让软件发挥它的全部潜能。
[0009] 为解除以上软件开发的严重障碍,很多的技术应运而生。但是至今没有一项技术有效地解决了这个问题。这些技术包括CASE工具、数据驱动程序开发、表驱动程序开发、面向对象程序开发、CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构),MDA(Model-Driven Architecture,模型驱动架构),RAD(Rapid Application Development,快速应用开发)、软件工厂等等。所有这些技术一定程度上都减少了软件开发需要的资源。这些技术也使得软件开发所需要的资源被更加有效地利用。同时,软件不断增加的复杂性与指数上升的功能需求早已经说明,不管软件这项技术的带来的好处有多少,都赶不上对软件的不断增长的要求。
[0010] 除了上述提到的技术外,还有许多的计算机程序和开发环境被用于减少软件开发过程中的资源需求。这些计算机程序和开发环境包括但不限于:MS-Visual Studio、GNAT编程工作室、IBM的Rational Application Developer、PowerBuilder、C++Builder、XCODE、NetBeans、DELPHI、拉撒路(LAZARUS)、水晶报表(CRYSTAL REPORTS、Microsoft Access、Oracle数据库和Microsoft SQL Server。虽然这些计算机程序或开发环境已经将一小部分机械的任务自动化,但是它们还未有效地减少软件开发所需的大量资源。
[0011] 例如,一个计算机软件需要包含几百张报表,这些报表需要基于Microsoft SQL Server数据库,具体而言,其基于Microsoft Access报表引擎以及信纸大小的纸张而设计。现有技术中,每一张报表以及对报表的查询操作都需要软件开发者进行编程。这项工作也许需要花费一个熟练的程序员几千个小时。如果相同的报表需要移植到ORACLE平台和水晶报表平台,且报表布局适用于A4纸张,则所需资源可能甚至比原始开发过程所需资源更高。
[0012] 巨大而无法满足的资源需求不仅关系到报表和报表查询的软件开发,而是关系到每一领域和方面的软件开发。尽管如此多的技术、环境和程序带来了成效,然而现有技术还是不能将软件开发所需的资源降低到期望的以及有效的水平。
[0013] 理想状态下,软件开发需要同时满足三个特征:功能最大化、确保高质量以及软件开发资源最小化。然而,现有技术未能成功地同时满足上述三个特征;每一项软件开发都需要牺牲上述三个特征中的一个甚至更多。

发明内容

[0014] 本发明的实施例可有效地解决上述提到的现有技术中的挑战:减少新软件开发、已开发软件维护和已开发软件质量保证所需要的资源(人力资源、技术资源、资金资源和时间资源)。
[0015] 本发明的一个实施例提供了一种新的软件开发方法,使得机器(例如计算机)可像人类软件开发一样工作。数据令牌被定义、创建并与源代码相关联以使得机器(例如计算机)能够执行软件开发(使得机器能够产生或构建更多的源代码、目标代码和/或对象)。
[0016] 本发明的另一个实施例提供一种简化软件开发所需的源代码的方法。在机器(例如计算机)执行软件开发时,源对象被创建并被用作源代码。
[0017] 本发明的另一个实施例提供一种创建用于存储源对象的源对象容器的方法。源对象容器使得源对象创建简单、易于处理且可重复利用。
[0018] 本发明的另一个实施例中提供一种将数据令牌和源对象关联的方法,该方法将数据令牌与源对象关联的方式使得计算机通过使用源对象和相关联的数据令牌来产生完整的源代码。
[0019] 本发明的实施例提供了诸多技术并带来了商业利润。例如,本发明的一个实施例可大幅减少软件开发所需的时间和资源。而本发明的另一个实施例可大幅的增加软件开发的可用特征和可选项。
[0020] 本发明方案的应用所带来的巨大好处可改变软件开发的构思和实施的方式。本发明的具有创造性的方案将创建新的无穷的可能并打开新的局面,涉及范围远超出查找、报表、数据录入表格、菜单、商业处理规则、帮助系统、异常处理系统等,这是现有技术不知道也不能想到的。
[0021] 对本领域技术人员来说,更多的优势将会很快显现。

附图说明

[0022] 本发明中的概念、原理、方法、说明书、实施例和主要特征结合以下所列的附图、附图说明以及对附图的详细说明进行阐述,但本发明不局限于这些附图、附图说明以及对附图的详细说明,其中相同的参考标号指代相似的元件。
[0023] 图1A为本发明的一个实施例的流程示意图。
[0024] 图1B为本发明的一个实施例的更详细的流程示意图。
[0025] 图2为本发明的一个实施例中构建一个示范性软件组件的流程示意图。
[0026] 图3为可执行本发明的一个实施例的包括计算机以及其它部件的计算系统环境示意图。
[0027] 图4A为根据本发明一个实施例选择的两个预定义规则集合的示意图。
[0028] 图4B至4K为根据本发明一个实施例选择的ACCESS SELECT QUERY(ACCESS选择查询语句)的预定义规则集合的语法示意图。
[0029] 图4L至4R为根据本发明一个实施例选择的ORACLE SELECT QUERY(ORACLE选择查询语句)的预定义规则集合的语法示意图。
[0030] 图4S为一些源组件的结构示意图,这些源组件被演示于图4B至4R中,且在本发明一个实施例中被分类为不确定的源组件。
[0031] 图4T一些源组件的结构示意图,这些源组件被演示于图4B至4R中,且在本发明一个实施例中被分类为可确定的源组件。
[0032] 图5A为本发明一个实施例定义的一部分数据令牌的结构示意图。
[0033] 图5B和5C为本发明一个实施例中的数据令牌的数据令牌规则集合的流程示意图。
[0034] 图6为本发明一个实施例定义的参数的结构示意图。
[0035] 图7A为本发明一个实施例中的数据模型的一部分属性(或可称为列或字段)的结构示意图,这些属性将被包括在源对象容器中以容纳图4S中演示的所有不确定的源组件中需要的源组件的组件值。
[0036] 图7B演示了本发明一个实施例中的一个示范性的数据模型,该数据模型足够用于创建源对象容器。
[0037] 图7C演示了本发明一个实施例中基于图7B的数据模型而创建的源对象容器。
[0038] 图8A至8P为本发明一个实施例中的软件组件构造者的流程示意图,该软件组件构建者在本文件中被称为“queryBuilder”。
[0039] 图8Q为本发明一个实施例中具体的数据令牌处理过程的流程示意图。
[0040] 图8R为本发明另一实施例中具体的数据令牌处理过程的流程示意图。
[0041] 图8S为queryBuilder使用的程序的流程示意图。
[0042] 图8T至8X为本发明一个实施例中数据令牌的流程示意图,这些数据令牌的处理逻辑演示在图5B和5C中。
[0043] 图9A至9O演示了本发明一个实施例中的一些源对象,这些源对象存储在源对象容器中,
[0044] 该源对象容器演示在图7C中。
[0045] 图10A至10Z演示了本发明一个实施例中的一些查询语句,这些查询语句由queryBuilder使用图9A至9O中演示的源对象构造。

具体实施方式

[0046] 1.定义
[0047] 文中所用到的一些词语在现有技术中不是通用的。本发明的论述使用了一些具有特定含义的词语。为了确保语义的清晰以及方便对说明书内容的理解,因此提供以下定义。然而,本发明的权利要求不局限于这些定义。
[0048] 数据值是包含一条信息并且在计算机可读存储介质中至少需要一个比特来表示的数据单元。任何可存储在计算机可读存储介质的内容都可认为是数据值。例如,数据值可包括但不限于:名称、年龄、时间、数字、文本字符串、对象、图像、音频、视频、信号、公式、源代码、目标代码、名称变量、值变量、字段名称、字母和数字字符、二进制数据、字母和数字数据、比特、短整型数据、长整型数据、NULL值和空值。
[0049] “软件组件”142指的是一种计算机编程语句的源代码、处理器(实体的和/或虚拟的)的目标代码、和/或至少是软件的一部分的一个对象,软件的该部分在软件或软件的一部分的执行过程中被用到,软件或软件的一部分被处理器所执行,或在虚拟化的情况下被另一个软件(计算机程序)所执行,该处理器为实体的(物理的)计算机处理器或为仿真器(虚拟的计算机处理器)。一个软件组件包括一个或多个源组件,源组件基于预定义规则集合140被集中在一起。软件组件所包括的源组件被至少一个数据值所表示。一个软件组件可包含一个或多个其它软件组件。软件组件142的例子包括但不限于:
[0050] 1.一条SQL查询语句为一个软件组件。
[0051] 2.一条SQL查询语句中的一个WHERE子句为一个软件组件。
[0052] 3.一个报表布局为一个软件组件。
[0053] 4.基于一个类模型创建的一个软件对象为一个软件组件。
[0054] 5.一个字体对象为一个软件组件
[0055] 6.一个数据结构为一个软件组件。
[0056] 7.一个数据库视图为一个软件组件。
[0057] 8.数据库中的一个数据表为一个软件组件。
[0058] 9.一个数据输入表单为一个软件组件。
[0059] 10.一个电子数据表为一个软件组件。
[0060] 包括另一个软件组件的软件组件142的例子包括但不限于:
[0061] 1.包括WHERE语句的SQL查询语句,一条SQL查询语句本身为一个软件组件,而一条WHERE语句也是一个软件组件。
[0062] 2.包括两个SQL视图的SQL视图,任何一个SQL视图都为软件组件。
[0063] 3.包括字体对象的报表布局,一个报表布局为一个软件组件,而一个字体对象也是一个软件组件。
[0064] 在一个软件组件142中,源组件144被至少一个数据值所表示,该数据值在下文中被称作组件值146。也就是说,一个源组件144相当于一个软件对象的一个属性,而组件值146相当于软件对象的属性的值。源组件144的例子包括但不限于:
[0065] 1.纸张大小为一个报表布局的一个源组件,一个报表布局为一个软件组件。在一个报表布局中,纸张大小被至少一个组件值所表示。在一个报表布局中,表示纸张大小的组件值可包括但不限于:A4、A3、信纸大小和8.5"x11"。
[0066] 2.背景颜色为一个数据输入表单的一个源组件,一个数据输入表单即为一个软件组件。在一个数据输入表单对象中,背景颜色可被一个或多个组件值所表示。
[0067] 3.在一条SQL查询语句中,一条SQL即为一个软件组件,一条命令为一个源组件。在一条SQL查询语句中表示命令的组件值可包括但不限于:SELECT、UPDATE、DELETE、INSERT INTO、CREATE DATABASE、ALTER DATABASE、以及like。
[0068] 4.一个空格为一个源代码块的一种计算机编程语言的一个源组件,而源代码块即为一个软件组件。表示空格的组件值可包括但不限于:空白字符和制表符。
[0069] 5.一个文本框的宽度为一个文本框对象的一个源组件,而一个文本框对象即为一个软件组件。一个文本框的宽度可被一种数字数据类型的组件值所表示。
[0070] 6.税率为税费计算业务规则的一个源组件,而税费计算业务规则即为一个软件组件。税率可被一种数字数据类型的组件值所表示。
[0071] 7.一个助记符为一种汇编语言的一个源代码块的一个源组件,一个源代码块即为一个软件组件。表示助记符的组件值可包括但不限于:MOV、XOR和CMP。
[0072] 预定义规则集合140包括足以创建一个软件组件的一个或多个预定义的规则。预定义规则集合由一个或多个源组件来体现,其中每一个源组件被一个软件组件中的至少一个组件值所表示。预定义规则集合140的例子可包括但不限于:
[0073] 1.用于创建SQL查询语句的基于SQL:2008标准的预定义规则集合,一条SQL查询语句即为一个软件组件。
[0074] 2.用于创建一条SQL查询语句的预定义规则集合,该SQL查询语句用于在ORACLE数据库中创建一个数据表,一条SQL查询语句即为一个软件组件。
[0075] 3.用于在MICROSOFT VISUAL BASIC6中创建一个表格的预定义规则集合,一个表格即为一个软件组件。
[0076] 4.用于在水晶报表中创建一个报表布局的预定义规则集合,一个报表布局即为一个软件组件。
[0077] 5.用于在一个软件应用程序中计算某一特定保险单的保费的预定义规则集合,一个软件应用程序即为一个软件组件。
[0078] 6.用于在一个EXCEL工作表中创建一个公式的预定义规则集合,一个公式即为一个软件组件。
[0079] 用户指的是开发、安装、使用和/或配置计算机程序的主体。用户包括但不限于人、机器和计算机程序。用户还有可能是同一程序的开发者和使用者。
[0080] 数据令牌152包括一个数据令牌规则集合158,数据令牌152被一个在下文中称作令牌值154的数据值所表示,令牌值的处理基于数据令牌规则集合;被处理后的令牌值的结果,其本身也为一个数据值,下文称之为令牌结果156,用于构建软件组件。数据令牌规则集合在定义数据令牌时被具体说明,数据令牌规则集合包括一个或多个规则;这些规则具体说明了将一个令牌值关联到软件组件的源组件的一个组件值的一种或多种形式,和/或具体说明一个令牌值被处理的一种或多种形式,和/或具体说明一个令牌值被使用的一种或多种形式。对一个令牌值的处理包括但不限于:执行一个函数、进行比较运算、创建一个组件值、定义软件组件以何种形式被构建、标识一个或多个组件值以用于在软件组件中的使用,以及上述处理的任意组合。一个令牌值可使用一个参数来进行定义。一个令牌值也可被关联到另一令牌值。一个令牌值也可嵌套在同一个或不同的数据令牌的另一个令牌值中。
[0081] 以下为数据令牌152的一些例子:
[0082] 1.tknCompare为由令牌值Comp(A,B)所表示的数据令牌152。Comp(A,B)根据它的数据令牌规则集合158来处理,Comp(A,B)处理后的令牌结果用于构建软件组件。数据令牌tknCompare的令牌值Comp(A,B)基于以下数据令牌规则集合来处理,其中A和B可使用两个参数值来进行定义:
[0083] a.如果A>B,则令牌结果为1;
[0084] b.如果A=B,则令牌结果为0;且
[0085] c.如果A
[0086] 换句话说,在这个例子中,数据令牌tknCompare的令牌值像函数一样返回三个可能的值1、0或-1中的一个。tknCompare用于决定运行时打印的报表的类型,若令牌结果为1,则打印利润汇总表,若令牌结果为0,则打开盈亏平衡报表,若令牌结果为-1,则打印亏损报表。从而,tknCompare使得软件组件构建者170可基于“A”和“B”的值生成合适的报表。
[0087] 2.knRetrieve为一个数据令牌152,数据令牌152由令牌值tknDept()所表示。处理tknRetrieve的数据令牌规则集合158规定令牌值tknDept()按照如下形式被处理:它从数据表tblDepartment中返回所有的部门代码,tblDepartment维护在一个包含部门代码的特定的数据库服务器上。返回的部门代码表示一个令牌结果,该返回的部门代码用于构建一个需要的软件组件,例如一条交叉表SQL查询语句。
[0088] 由于部门数量可能会不停地变化,tknRetrieve使得软件组件构建者170在运行时可创建一条适合的查询,该查询的创建基于在tknDept()被处理时作为令牌结果156返回的部门,tknDept()为tknRetrieve的令牌值154。
[0089] 3.tknJoinType为一个用于构建一条SELECT查询的数据令牌152,SELECT查询为一个软件组件。根据tknJoinType的数据令牌规则集合158,数据令牌tknJoinType可由以下令牌值中的一个令牌值所表示,其中每一个令牌值用一条规则来解释,每一条规则说明了令牌值可被使用的方式:
[0090] a.0–没有Join(一条在构建时不使用join的查询,因为第一个字符为0);
[0091] b.1–Inner Join(一条在构建时使用INNER JOIN的查询,因为第一个字符为1);
[0092] c.2–Left Join(一条在构建时使用LEFT JOIN的查询,因为第一个字符为2);以及[0093] d.3–Right Join(一条在构建时使用Right JOIN的查询,因为第一个字符为3)。
[0094] tknJoinType的令牌值154可通过使用一个参数值162而获得,该参数值162为运行时从用户获取的参数值,相应的,一条SQL查询语句可由一个软件组件构建者170构建。
[0095] 一个“源对象”166包括:
[0096] 1.一个组件值146;
[0097] 2.一个令牌值154;
[0098] 3.一个数据值,该数据值用于规定(描述):
[0099] a.源对象166的一个标识;
[0100] b.描述源对象166的一个元数据;
[0101] c.组件值146和令牌值154之间的一种关系、顺序和/或层次;
[0102] d.多个组件值146n之间的一种关系、顺序和/或层次;
[0103] e.多个令牌值154n之间的一种关系、顺序和/或层次;
[0104] f.对组件值146的引用;
[0105] g.对令牌值154的引用;
[0106] h.对另一个源对象166的引用;或
[0107] i.数据值所规定的上述内容的任意结合;或
[0108] 4.“源对象”166所包括的上述内容的任意结合。
[0109] 一个“软件组件构建者”170为可构建一个软件组件142或软件组件142的一部分的计算机程序,软件组件142的构建基于预定义规则集合140并通过使用一个源对象166、一个组件值146、一个令牌值154、一个令牌结果156或这些数据项的任意组合,其中,源对象166、组件值146和/或令牌值154可通过使用一个参数值162来确定。一个软件组件构建者可能是单个计算机程序或相互整合和/或交互的多个计算机程序。软件组件构建者可按照如下形式改写软件构建者所基于的预定义规则:预定义规则集合中没有规则被严重地违犯而导致软件组件不能基于改写后的预定义规则集合而构造。例如,用于为DB2、MICROSOFT ACCESS、MICROSOFT SQL Server、ORACLE和/或SYBASE构建SQL查询语句的queryBuilder为软件组件构建者。用于为水晶报表创建报表布局的报表创建者为软件组件构建者的另一个例子。
[0110] 一个“源对象容器”168包括一个或多个数据结构,源对象容器168用于在计算机可读存储介质中存储源对象166,源对象容器基于数据模型而创建,该数据模型适合并足够用于创建一个源对象容器,创建的源对象容器适合且足够用于
[0111] 1.必须的:
[0112] a.将一个或多个源对象作为结构数据和/或半结构数据存储;且
[0113] b.从一个或多个源对象中辨别并获得一个需要的源对象。
[0114] 2.可选的,如果需要的话:
[0115] a.以需要的方式实现并维护源对象所包含的所有这些源组件之间的一种需要的层次和/或一种需要的关系;
[0116] b.实现并维护属于一个源组件的一个或多个组件值之间的一种需要的顺序,该源组件表示一个或多个组件值;
[0117] c.在另一个源对象中使用一个源对象和/或一个源对象中被需要的一部分;
[0118] d.将一个或多个数据令牌与一个或多个源对象的一个或多个组件值相关联;以及[0119] e.以上任何可选的内容的组合。
[0120] 源对象容器所包括的一个数据结构包括但不限于:一张数据库表、一个类、一个数组、一个链表、一个变量、一个多维数组、一个多维数据库、一个常规数据库、一个平面文件、一个带分隔符的文本文件和一个参数。
[0121] 本文所使用的“计算机程序”指的是一系列用于在处理器上直接执行和/或通过另一计算机程序在处理器上执行的可执行指令。计算机程序可包括但不限于:一个子程序、一个函数、一个线程、一个翻译员、一个对象方法以及一个可执行应用中的一个对象实现、一个小工具、一个服务器端程序、一段可执行源代码、一段对象代码、一种微软公司的程序作业环境以及一个共享的文库/共享的动态加载库。计算机程序也被称为软件。
[0122] 本文中的词语“一个”用于一个或多个的情况。而词语“多个”用于两个或两个以上的情况;词语“另一个”用于至少第二个的情况。
[0123] 本文中所使用的词语“包括”意为包括组成成份。
[0124] 本文所述的创建、使用、关联和/或处理一个数据令牌指的是创建、使用、关联和/或处理一个数据令牌的令牌值。
[0125] 本文所述的使用一个参数指的是使用一个参数的一个参数值。
[0126] 说明书中的标题仅用于方便阅读,而没有解释性作用。
[0127] 2.软件开发中的挑战:
[0128] 软件开发的主要挑战为降低以下资源:
[0129] 1.软件开发和质量保证所需要的资源(人力资源、技术资源、资金资源和时间资源);
[0130] 2.已开发软件维护和质量保证所需要的资源;以及
[0131] 3.特别的,开发和维护软件所需要的时间,以及质量保证所需要的时间,即使在有足够可用的其它资源(人力资源、资金资源和技术资源)的情况下。
[0132] 现有技术中的软件开发由于背景技术中所提及的各种限制,而未能有效解决软件开发过程中的上述挑战。
[0133] 值得注意的是,在当前环境中,随着计算机处理能力的迅速增长,对软件的期望和要求也迅速上升。然而,由于可用资源的缺乏,例如人力资源、资金资源、时间资源和技术资源等等的缺乏,现有技术还不能让软件发挥它的全部潜能。
[0134] 3.软件开发中的障碍的起因
[0135] 在对广泛的已有计算机程序以及已有软件开发技术、方法、工具、环境和应用进行了深入研究以及详细分析之后,发明人认为以下为现有技术中软件开发所需资源有限的主要起因:
[0136] 1.现有技术中的可用的技术、工具和可选项一般地都很费时间,即使对于技术娴熟、经过很好的训练和非常有经验的人来说也是如此。
[0137] 2.尽管有许多可用于的先进技术、全面的软件工具、调试工具和质量保证工具,大部分的软件开发和质量保证都是由人工实现的;一些机器助理被使用,但是机器助理的数量不够且效率不高。人工执行的软件开发被认为存在固有的局限性,例如:
[0138] a.人不能日以继夜的工作,且工作速度受到其能力的限制。
[0139] b.软件开发需要技术上的高水平的培训和经验。
[0140] c.训练有素且经验丰富的开发员很难找,且非常贵。
[0141] 3.许多计算机程序非常巨大且过于复杂,从而需要庞大的资源用于开发、维护和/或质量保证,而这些资源有时还是受限制的。
[0142] 4.大部分用于开发(撰写)软件组件的预定义规则按照如下方式设计:已开发计算机程序中的一个小小的改变可能导致对该程序的广泛改变。因此,任何改变都需要额外的资源。在许多情况下,已经开发程序中的一个改变需要的资源甚至多于该程序原始开发过程中所花费的资源。用于使得对已开发程序进行改变这一功能简易化及扩大化的可用技术不是非常复杂就是只具有少量的功能。
[0143] 4.需要做些什么?
[0144] 在发现了软件开发中的障碍的主要起因后,发明人认为以下是解决上述起因所需要的:
[0145] 1.计算机和/或机器在开发和维护计算机程序以及提供质量保证方面所带来的贡献需要尽可能的得到放大。
[0146] 2.人工带来的贡献需要被进一步减少并且被简化,从而从实质上减少所属的人力资源,即减少时间、数量、训练、经验和费用。
[0147] 5.本发明中解决软件开发中的挑战的概念和方法
[0148] 现有技术中的主要挑战,即减少软件开发、维护、质量保证所需的资源(人力、技术、金钱和时间),被技术人员经常遇到。本发明中的一个实施例提供了一个创造性的方法,该方法使得计算机和/或机器可以像人类软件开发者一样工作并且进行软件开发过程中的大部分工作。而且,该创造性的方法还简化了软件开发过程中剩下的由人类软件开发者所做的部分。
[0149] 6.实施例和附图
[0150] 由于本发明中的概念和方法可以许多不同的方式和实施例进行实施,本文的附图中所展示的以及本文所进行详细阐述的实施例只是少部分实施例,仅用于示范性阐述本发明的原理,而不用于限定本发明。本发明旨在覆盖本发明的替换物、修改物和等价物,这些替换物、修改物和等价物包括在本发明的精神、原理和权利要求所限定的范围中。
[0151] 在附图中,相同的标号被用于指代相同的元素,在附图说明中,相关细节已经阐述和解释,以便透彻地理解本发明。但是,需要澄清的是,本发明可以在没有这些具体细节的情况下进行应用和/或使用。
[0152] 7.基于本发明的一个方面的一个实施例(图1A)
[0153] 图1A为本发明的一个实施例的流程示意图。
[0154] 在本发明的一个实施例的步骤20中,一个源对象容器168被创建。源对象容器168用于存储一个或多个源对象166n,源对象166n包括一个或多个令牌值154n和/或一个或多个组件值146n,该一个或多个组件值146n表示一个或多个不确定的源组件148n。源对象容器168基于数据模型164,数据模型164是为了一个软件组件而创建的,数据模型164的创建基于一个软件组件撰写和/或开发所基于的规则。例如,不作为限制,一条SQL查询语句的数据模型基于该SQL查询语句的语法。再例如,不作为限制,水晶报表中的一个报表布局的数据模型将基于水晶报表提供的报表的对象模型。
[0155] 在一个实施例中,源对象容器168基于数据模型164而创建。
[0156] 在一个实施例中,数据模型164基于一个软件组件142(软件源代码)的一个预定义规则集合140而被创建,且数据模型164通过使用一个或多个不确定的源组件148n而被创建。
[0157] 在一个实施例中,创建数据模型164包括以下步骤:
[0158] 1.选择预定义规则集合140,预定义规则集合140是以一个或多个源组件144n的形式定义的。
[0159] 2.将其中的每一个源组件144n分类到以下类别中:
[0160] a.不确定的源组件148;或
[0161] b.可确定的源组件150。
[0162] 3.定义一个或多个数据令牌152n及其各自的数据令牌规则集合。
[0163] 4.基于选择的预定义规则集合140创建数据模型164,数据模型164的创建通过使用以下内容:
[0164] a.一个或多个不确定的源组件148n;
[0165] b.一个或多个数据令牌152n;或
[0166] c.上述内容的任意集合。
[0167] 在一个实施例中,数据模型164使得源对象166、数据令牌值154和/或组件值146可被复用。
[0168] 在一个实施例中,软件组件(软件源代码)142的多个源组件144n基于以下内容被分类到不确定的源组件148n和可确定的源组件150n中:
[0169] 1.撰写/开发一个软件组件所基于的规则;
[0170] 2.用户需求;或
[0171] 3.上述内容的任意组合。
[0172] 例如,不用于限制本发明,一条SQL查询语句的启动命令为一个源组件144,如果该SQL查询语句用于从数据库中浏览记录,则该SQL查询语句的启动命令是一个可确定的源组件150,因为该SQL查询语句总是以“SELECT”命令开头。然而,在一条可从数据库中更新、插入、浏览和/或删除记录的SQL查询语句中,作为一个源组件144的启动命令是一个不确定的源组件148,因为启动命令不能被确定,除非知道该SQL查询语句的类型。上述例子说明,如果用户想写的是用于从数据库中浏览记录的查询语句,则用于从数据库中浏览记录的查询语句的撰写规则决定了这些查询语句的启动命令是一个可确定的源组件150。然而,如果用户想写的是用于从数据库中更新、插入、浏览和/或删除记录的查询语句,则用于从数据库更新、插入和/或删除记录的查询语句的撰写规则决定了这些查询语句的启动命令是一个不确定的源组件148。
[0173] 在步骤30中,一个软件组件构建者(源代码生成器)170被创建,该软件组件构建者170为计算机程序。
[0174] 在一个实施例中,软件组件构建者170用于构建(生产)一个或多个软件组件144。例如,不用作对本发明的限定,软件组件构建者170可用于在运行时根据用户需求生产(构建)一张货物入库清单,其中,货物入库清单为一个软件组件142,其中的用户需求通过使用一个或多个参数来进行具体化。
[0175] 在一个实施例中,软件组件构建者170从一个或多个源对象容器168中获取一个或多个源对象166来构建一个或多个软件组件142n。
[0176] 在一个实施例中,软件组件构建者170在运行时从用户接收一个或多个参数,这些参数用于构建一个或多个软件组件142n。
[0177] 在一个实施例中,软件组件构建者170在计算机程序的用户交互层接收一个参数值162。
[0178] 在一个实施例中,软件组件构建者170用于在运行时构建一个或多个软件组件142n。
[0179] 在步骤S40中,一个软件组件构建者170构建了一个软件组件142,在构建该软件组件142之前,该软件组件构建者170使用了一个源对象166,该软件组件142被存储在一个源对象容器168中。
[0180] 在一个实施例中,一个源对象166加上一个参数160,可用于构建多个软件组件142n.
[0181] 8.基于本发明的一个方面的一个实施例(图1B)
[0182] 图1B为基于本发明的一个实施例的一个方面的流程示意图,该图更详细地对图1A中的步骤20、30和40进行的阐述。
[0183] 流程示意图开始于首端108。
[0184] 在一个实施例中,步骤110选择了足够用于构建一个“软件组件142”的一个预定义规则集合140,该软件组件142是一个需要被构建的软件组件。在一个实施例中,预定义规则集合140可以按照需求被修改,只要其中的预定义规则没有被破坏到软件组件142不能再基于该被修改的预定义规则集合而构建的程度。在一个实施例中,可选择多个(大于等于一个)预定义规则集合140n。在一个实施例中,多个软件组件142n可以基于选择的预定义规则集合140而构建。在一个实施例中,多个软件组件142n可基于一个或多个预定义规则集合140n而被构建。
[0185] 以下列举一些选择的预定义规则集合的例子,本发明的实施例不限定于这些例子:
[0186] 1.用于构建一条ORACLE数据库的SELECT查询语句的一个预定义规则集合140,该SELECT查询语句是一个软件组件142,该ORACLE数据库的版本低于9。
[0187] 2.用于构建一条ORACLE数据库的SELECT查询语句的一个预定义规则集合140,该SELECT查询语句是一个软件组件142,该ORACLE数据库的版本为9或9以上。
[0188] 3.用于构建一条MICROSOFT ACCESS的SELECT查询语句的一个预定义规则集合140,该SELECT查询语句是一个软件组件142。
[0189] 4.用于在水晶报表中构建报表布局的一个预定义规则集合140,该报表布局是一个软件组件142。
[0190] 5.用于创建一个计算机程序的预定义规则集合140,该计算机程序是一个软件组件142,其用于处理特定业务实体的工资表。
[0191] 6.用于创建一个软件模型的预定义规则集合140,该软件模型为一个软件组件142,其用于照特定国家的税收法律计算营业税。
[0192] 7.用于在MICROSOFT VISUAL BASIC6环境中创建一个数据输入表单的预定义规则集合140,该数据输入表单为一个软件组件142。
[0193] 以下为对选择的预定义规则进行的一些修改的例子,本发明实施例不限定于这些例子:
[0194] 1.用于构建一条SELECT查询语句的预定义规则集合140,该SELECT查询语句为一个软件组件142,该预定义规则集合140以下述方式被修改:针对该SELECT查询语句的WHERE子句强制制定了左括号和右括号。
[0195] 2.用于在水晶报表中构建一个报表布局的预定义规则集合140,该报表布局为一个软件组件142,该预定义规则集合140以下述方式被修改:在该报表布局中每一个文本框的名称都以“txt”开头,不包括引号。
[0196] 3.用于创建一个软件模型的预定义规则集合140,该软件模型为一个软件组件142,其用于按照特定国家的税收法律计算营业税,该预定义规则集合以下述方式被修改:
当营业税不适用时,添加0%的营业税。
[0197] 在一个实施例中,子步骤110a阐明:预定义规则集合140需要足够用于构建软件组件142。
[0198] 以下为一些软件组件的例子,本发明的实施例不限定于这些例子:
[0199] 1.一个报表布局为一个软件组件142。
[0200] 2.一个数据输入表单为一个软件组件142。
[0201] 3.一个消息框为一个软件组件142。
[0202] 4.一条SQL查询语句为一个软件组件142。
[0203] 5.一个查找表为一个软件组件142。
[0204] 6.一个电子数据表为一个软件组件142。
[0205] 7.一个视频游戏为一个软件组件142。
[0206] 8.一条SQL查询语句的一条WHERE子句为一个软件组件142。
[0207] 9.实现一种业务处理规则的一个软件模型为一个软件组件142。
[0208] 在一个实施例中,子步骤110b阐明:预定义规则集合140以一个源组件144的形式进行具体化。在一个实施例中,预定义规则集合140可以多个源组件144n的形式进行具体化。
[0209] 以下为一些源组件的例子,本发明的实施例不限定于这些例子:
[0210] 1.纸张大小为报表布局的一个源组件144,其中的报表布局为一个软件组件142。
[0211] 2.背景颜色为数据输入表单的一个源组件144,其中的数据输入表单为一个软件组件142。
[0212] 3.一条命令为SQL查询语句的一个源组件144,其中的SQL查询语句为一个软件组件142。
[0213] 4.空格为源代码块的一个源组件144,其中的源代码块为计算机编程语言的一个软件组件142。
[0214] 5.文本框的宽度为文本框对象的源组件144,其中的文本框对象为软件组件142。
[0215] 6.税率为税费计算业务规则的一个源组件144,其中的税费计算业务规则为一个软件组件142。
[0216] 7.助记符为源代码块的一个源组件144,其中的源代码块为一个软件组件142。
[0217] 在一个实施例中,子步骤110c阐明:源组件144在软件组件142中由一个“组件值146”来表示。在一个实施例中,源组件144可由多个组件值146n来表示。
[0218] 以下为组件值的一些例子,本发明的实施例不限定于这些例子:
[0219] 1.A4、A3、信纸大小和8.5"x11"为4个组件值146,它们可用于表示报表布局的纸张大小,该报表布局为一个软件组件142,该纸张大小为一个源组件144。
[0220] 2.一个长整型值为一个组件值146,该组件值146用于表示一个数据输入表单的一种背景颜色,该背景颜色为一个源组件144,该数据输入表单为一个软件组件142。
[0221] 3.SELECT、UPDATE、DELETE、INSERT INTO、CREATE DATABASE和ALTER DATABASE为6个组件值146,这些组件值146可用于表示一条SQL查询语句的一条命令,该SQL查询语句为一个软件组件142,该条命令为一个源组件144。
[0222] 4.一个空格字符和一个制表符为两个组件值146,其可用于表示一个计算机程序的一个源代码块的一个空白,该源代码块为一个软件组件142,该空白为一个源组件144。
[0223] 5.一个正整型值为一个组件值146,该组件值146用于表示一个文本框对象的一个文本框的宽度,该文本框对象为一个软件组件142,该文本框的宽度为一个源组件144。
[0224] 6.一个数字值为一个组件值146,该组件值146用于表示一个税费计算业务规则的一种税率,该税费计算业务规则为一个软件组件142,该税率为一个源组件144。
[0225] 7.MOV、XOR和CMP为三个组件值146,这些组件值146用于表示一种汇编语言的一个源代码块的一个助记符,该源代码块为一个软件组件142,该助记符为一个源组件144。
[0226] 在一个实施例中,在步骤112中,源组件144被分类为:
[0227] 1.一个“不确定的源组件148”;和/或
[0228] 2.一个“可确定的源组件150”。
[0229] 在一个实施例中,不确定的源组件148由一个组件值146来表示,该组件值146:
[0230] 1.不能出于在构建软件组件142时被使用的目的,而通过使用一个算法和/或一段计算机可执行逻辑而被产生和/或确定;或者
[0231] 2.可出于在构建软件组件142时被使用的目的,而通过使用一个算法和/或计算机可执行逻辑而被产生和/或确定;但是被要求不出于在构建软件组件142时被使用的目的而被产生。
[0232] 在一个实施例中,一个源组件144可基于用户的需求而被分类为一个不确定的源组件148或一个可确定的源组件150。
[0233] 也就是说,一个源组件144的分类可根据用户需求来进行。例如,不用作对本发明的限定,一个报表的纸张大小可根据用户的需求而被分类为一个不确定的源组件148或一个可确定的源组件150,该纸张大小为一个源组件144,该报表为一个软件组件142。如果用户想打印一张具有明确纸张大小的报表,则纸张大小将被分类为一个可确定的源组件150,否则纸张大小将被分类为一个不确定的源组件150。
[0234] 在一个实施例中,表示一个不确定的源组件148的一个组件值146,通过以下的一种或多种方式来确定:
[0235] 1.使用一个数据令牌152;
[0236] 2.使用一个参数160;
[0237] 3.从一个源对象166中获取得到;或
[0238] 4.以上方式的任意组合。
[0239] 以下为一个不确定的源组件的一些例子,本发明的实施例不限定于这些例子:
[0240] 1.一条SQL查询语句中的一个列名称为一个不确定的源组件148,其中的SQL查询语句为一个软件组件142。
[0241] 2.一条SQL查询语句中的一条WHERE子句中的一个日期为一个不确定的源组件148,其中的WHERE子句为一个软件组件142,SQL查询语句也为一个软件组件142。
[0242] 3.一个报表布局中一个报表名称为一个不确定的源组件148,其中的报表布局为一个软件组件142。
[0243] 4.JAVA编程语言的一个源代码块中的一个空白可被分类为一个不确定的源组件148,其中的源代码块为一个软件组件142,因为该空白可由一个制表符或一个空格符所表示,该制表符和空格符为两个组件值146,而且该空白被要求不能通过使用一个计算机可执行逻辑来确定。
[0244] 5.一条SQL查询语句中的一条命令可被分类为一个不确定的源组件148,因为其中的命令可由以下6个组件值所表示:SELECT、UPDATE、DELETE、INSERT INTO、CREATE DATABASE和ALTER DATABASE,其中的SQL查询语句为一个软件组件142。因此,不可能通过使用一段计算机可执行逻辑确定上述命令的组件值146,若这段逻辑没有关于上述SQL查询语句的一些含蓄的或明确的信息。
[0245] 在一个实施例中,不是一个不确定的源组件148的一个源组件144可以为一个可确定的源组件150。
[0246] 以下为一个可确定的源组件的一些例子,本发明的实施例不限定于这些例子:
[0247] 1.一条SELECT查询语句中的一条命令可被分类为一个可确定的源组件150,因为该条命令只能由“SELECT”所表示,其中的SELECT查询语句为一个软件组件142,“SELECT”为一个组件值146。
[0248] 2.在JAVA编程语言的一个源代码块中的一个空白可被分类为一个可确定的源组件150,因为该空白可由制表符表示,其中的源代码块为一个软件组件142,制表符为一个组件值146。
[0249] 3.一个报表布局中的一个页码可被分类为一个可确定的源组件150,因为该页码可由一个值表示,该值为一个组件值146,该值可由一段计算机可执行逻辑所确定,其中的报表布局为一个软件组件142。
[0250] 在一个实施例中,在步骤114中,一个“数据令牌152”被定义,该数据令牌152被期望用于构建一个软件组件142。
[0251] 在一个实施例中,一个数据令牌152针对一个源组件144而定义,该源组件144的组件值在运行时被确定以用于构建一个软件组件142,且该组件值不能使用一段计算机可执行逻辑和/或一个参数160来确定。也就是说,一个软件组件构建者170使用一个数据令牌152来确定:
[0252] 1.一个组件值146,该组件值用于构建一个软件组件142;
[0253] 2.一个组件值146在构建一个软件组件142时被使用的方式;
[0254] 3.一个软件组件142被构建的方式;
[0255] 4.上述内容的任意组合。
[0256] 在一个实施例中,一个数据令牌152被定义以用于:
[0257] 1.确定一个不确定的源组件148的一个组件值146,和/或确定一个可确定的源组件150的一个组件值146,该组件值146被期望在运行时被确定以用于构建一个软件组件142,且该组件146不能通过使用一段计算机可执行逻辑和/或一个参数160来确定;
[0258] 2.确定一个组件值146在用于构建一个软件组件142时被使用的一种方式,该种方式被期望在运行时被确定,且该种方式不能通过使用一段计算机可执行逻辑和/或一个参数160来确定;或
[0259] 3.上述内容的任意组合。
[0260] 也就是说,一个数据令牌152必须是用于以下功能而定义的:在运行时确定一个组件值146和/或一个软件组件142被构建的一种方式;即该数据令牌152被期望于在运行时确定一个组件值146和/或一个软件组件142被构建的一种方式;而且这种确定不能通过使用一段计算机可执行逻辑和/或一个参数160来完成。
[0261] 在一个实施例中,一个数据令牌152被定义以在运行时自动化一个软件组件的构建,其中自动化一个软件组件的构建通过使用一段计算机可执行逻辑来实现。
[0262] 在一个实施例中,一个令牌值154与一个组件值146的关联使得一个软件组件构建者170可确定一个地方,一种特定类型的计算机实现逻辑在该地方需要被提供。换句话说,一个令牌值154与一个组件值146的关联使得一个软件组件构建者可像人类软件开发者一样工作。
[0263] 也就是说,一个数据令牌152被定义以使得一台机器(计算机)在运行时构建一个软件组件142的过程中可执行通常需要人类智慧的一个任务,然而该任务也可通过使用一段计算机可执行逻辑来执行,如果一台机器可确定一个任务执行什么、在什么时候执行、在什么地方执行的话。由一个令牌值154所表示的一个数据令牌152,使得一台机器可确定一个任务执行什么、在什么时候执行、在什么地方执行。
[0264] 在一个实施例中,一个数据令牌152连带着一个数据令牌规则集合158而被创建,该数据令牌规则集合156具体说明了一个令牌值154被创造的一种方式、一个令牌值154被关联到一个组件值146的一种方式、一个令牌值154可被处理的一种方式;其中,对一个令牌值154的处理产生一个令牌结果156,产生的令牌结果156可用于构建一个软件组件142。
[0265] 在一个实施例中,一个令牌值154通过使用一个参数值162来获得。
[0266] 在一个实施例中,一个令牌值154在使用时未经处理。
[0267] 在一个实施例中,通过使用一个参数值162来处理一个令牌值154。
[0268] 在一个实施例中,一个令牌值154在用于构建一个软件组件142时未经处理。
[0269] 在一个实施例中,对一个令牌值154的处理包括执行一组处理器可执行指令。
[0270] 在一个实施例中,一个令牌值154嵌入在一个组件值146中。
[0271] 在一个实施例中,一个令牌值154隐含地(实质上地)与一个组件值146相关联。
[0272] 在一个实施例中,一个组件146通过使用一个令牌值154来获得。
[0273] 在一个实施例中,一个组件值146通过使用一个参数值162来获得。
[0274] 在一个实施例中,子步骤114a阐明:一个数据令牌152由一个令牌值154来表示。
[0275] 在一个实施例中,子步骤114b阐明:一个“令牌结果156”可通过处理一个令牌值154来获得,其中的令牌值154通过使用一个“参数”160来进行处理。
[0276] 在一个实施例中,子步骤114c阐明:步骤114中定义的数据令牌152包括一个“数据令牌规则集合158”,该数据令牌152和该数据令牌规则令牌158是一起定义的。在一个实施例集合158包括一个或多个规则,这些规则说明了该数据令牌152被期望用于构建软件组件142的一种或多种方式。在一个实施例中,数据令牌规则集合158具体化了数据令牌152进行以下处理的一种或多种方式:
[0277] 1.被一个令牌值154所表示。
[0278] 2.隐含地和/或明确地通过一个令牌值被关联到一个组件值146。
[0279] 3.被用于构建一个组件值142。
[0280] 4.被处理以获得一个令牌结果156,且令牌结果156被用于构建一个软件组件142。
[0281] 一个令牌值154可与一个组件值146隐含地关联到一起,该隐含关联由一个软件组件构建者170来执行。例如,不用作对本发明的限定,一个软件组件构建者170可认为一个令牌值154与一个源组件144的每一个组件值146相关联。又例如,一个软件组件构建者170可认为一个令牌值154与一个源组件144的一种特定类型的组件值146n相关联。
[0282] 一个令牌值154可明确地与一组件值146相关联,其中一个令牌值154与一个源组件144的一个组件值146进行明确地关联。该明确关联可在一个源对象166和/或一个软件组件构建者170中完成。
[0283] 数据令牌152用于在构建软件组件142时将任务进行自动化,该任务通常由人类来执行。
[0284] 数据令牌152可用于将构建软件组件142需要的且可基于一个算法和/或一段计算机可执行逻辑来执行的所有任务进行自动化。
[0285] 在一个实施例中,一个数据令牌152的一个令牌值154可通过使用一个参数160的一个参数值162来确定。
[0286] 以下为一些数据令牌如何被使用的例子,本发明的实施例不限定于这些例子:
[0287] 1.用于创建一个组件值146以构建一个软件组件142。
[0288] 2.用于改变一个组件值146以构建一个软件组件142。
[0289] 3.用于确定一个合适的组件值146以构建一个软件组件142。
[0290] 4.用于确定一个源组件144的一个合适的组件值146
[0291] 5.用于获取一个组件值146以构建一个软件组件142。
[0292] 6.用于确定多个组件值146n的顺序以构建一个软件组件142。
[0293] 7.用于复用一个组件值145以构建一个软件组件142。
[0294] 8.用于复用多个组件值146n以构建一个软件组件142。
[0295] 9.用于改变一个组件值142被构建的方式。
[0296] 一个数据令牌152也可按照许多其它的方式被用于:将构建一个软件组件142的任意部分进行自动化,该软件组件142可基于一个算法和/或一段计算机可执行逻辑被自动化。
[0297] 一个数据令牌152也可用于发起任何期望的处理和/或任务。例如,不作为限定,基于对一个数据令牌152的一个令牌值154的处理,一个网络连接可被建立,一个新的程序可被启动,一个已运行的程序可被终止,一个组件值146可从一个数据库表中被解析,一个用户输入可被获得,与一个用户的一个交互可被发起,一个或多个软件组件142可被构建,一台机器可被启动,一台机器可被停止,等等。
[0298] 一个数据令牌152可用于发起一个硬件组件和/或一个软件组件上的一个进程;这样的组件包括但不限于:一台远程计算机、一台本地计算机、一台服务器、一台网联计算机、一个软件进程、一个存储设备、一台移动设备、一台通信设备、一个PLC(Programmable Logic Controller,可编程逻辑控制器)以及一个连接到计算机的硬件。
[0299] 在一个实施例中,在步骤116中,一个或多个参数160被定义。
[0300] 在一个实施例中,一个参数160被定义以使得用户可在运行时定义一个组件值146和/或一个令牌值154。也就是说,一个参数160使得一个用户可以在运行时控制一个软件组件142的构建。
[0301] 由一个参数值162表示的一个参数被用于使得一个用户可以与构建一个软件组件142的进程进行交互,和/或使得一个用户可以引导/控制该进程,用户以参数值162n的形式输入组件值146n和/或令牌值154n,即可按照用户期望的和/或需要的方式与该进程进行交互和/或引导/控制该进程。也就是说,一个组件值146和/或一个令牌值154在运行时可由一个参数值162来确定,如果一个参数值在运行时由用户输入的话。
[0302] 在一个实施例中,一个参数160可被一个软件组件构建者170用于构建一个软件组件142,该软件组件构建者170确定一个软件组件142基于一个参数160而被构建的方式。
[0303] 在一个实施例中,一个参数160被定义以确定一个源对象166,该源对象用于构建一个软件组件142。
[0304] 在一个实施例中,子步骤116a阐明:一个参数160由一个“参数值162”所表示,该参数值162由用户具体化和/或由用户输入,其中的参数值162为一个数据值,参数160也可连带一个默认参数值162而被定义。
[0305] 参数值162可由用户进行具体化或输入,这可在参数160每一次被使用时进行,也可以只在用户想改变一个已经具体化的参数值162时进行。针对后一种情况,参数值162可能:
[0306] 1.需要由用户进行第一次具体化;和/或
[0307] 2.被存储于一个计算机可读存储介质中,且在任何需要的时候从该计算机可读存储介质中被提取出来使用。
[0308] 在一个实施例中,一个参数160也可被定义以确定一个不确定的源组件148的一个组件值146。
[0309] 以下为使用一个参数的两个例子。这些例子并非详尽无遗,也不完整。而且,本发明不以任何形式依赖于或受限于这些例子:
[0310] 1.在构建一个包括多个报表列的一个报表布局时,用户可使用一个参数160来具体化所期望的报表列以及报表列的顺序,其中的报表布局为一个软件组件142。
[0311] 2.在构建一条SQL查询语句时,一个参数160可能被使用以使得用户可为该SQL查询语句具体化一个目标平台,该目标平台为ORACLE或MICROSOFT SQL Server,其中的SQL查询语句为一个软件组件142。
[0312] 3.在构建一个报表布局时,一个参数160可被定义以确定一个纸张大小的一个值,该纸张大小为一个不确定的源组件148,其中的报表布局为一个软件组件142。
[0313] 一个用户可通过使用一种或多种方法来具体化一个参数值162,这些方法包括但不限于:通过键盘输入的一条数据、对屏幕的一次触摸、一条语音命令、一个姿势、一次眨眼、一次眼睛扫视、被转换成数字信号的一个模拟信号,以及可通过人类身份验证来具体化参数值162,例如指纹检测、人眼检测、人脸检测和DNA鉴定等等。
[0314] 在一个实施例中,在步骤118中,一个数据模型164被创建,该数据模型164适合且足够用于创建一个“源对象容器168”,而该源对象容器168适合且足够用于:
[0315] 1.以下是必须的内容:
[0316] a.存储一个“源对象166”,该源对象166足够用于包括一个或多个组件值146n,这些组件值146n表示一个或多个不确定的源组件148n。
[0317] b.识别、解析和获取其存储的源对象166。
[0318] 2.以下是可选的内容,如果需要的话:
[0319] a.存储多个源对象166n。
[0320] b.从多个源对象166n中识别、解析和获取一个源对象166。在这种情况下,源对象容器168也应该提供一种可从多个源对象166n中识别出一个源对象166的机制。
[0321] c.以一种需要的方式实现和维护多个源组件144n之间的一种需要的层次和/或一种需要的关系,该种需要的层次和/或该种需要的关系基于以下内容而确定:
[0322] i.选择的预定义规则集合140,和/或
[0323] ii.一个软件组件142中的组件值146的一个任务和/或一个目的。
[0324] d.实现并维护多个组件值146n之间的一种期望的顺序。
[0325] e.在另一个源对象166中使用一个源对象,该一个源对象来自于多个源对象166n或多个源对象166n的一个期望的部分,该另一个源对象来自于该多个源对象166n。
[0326] f.根据数据令牌规则集合158,将一个令牌值154与一个组件值146进行关联,和/或与包括于一个源对象容器168中的另一个令牌值154进行关联。一个令牌值154可能通过以下一种或多种方式被关联:
[0327] i.嵌入一个组件值146中,
[0328] ii.嵌入一个源对象166中,
[0329] iii.隐含地与存储在源对象容器168中的一个组件值146关联,
[0330] iv.通过使用一个参考值与存储在一个源对象容器168中的一个组件值146相关联,其中的参考值为一个数据值,或
[0331] v.以上方式的任意组合,或
[0332] g.以上内容的任意组合。
[0333] 在一个实施例中,数据模型164包括一个或多个属性(也可称作字段或列),这些属性用于存储所有不确定的源组件148n的组件值146n,任何一个数据令牌152或一个参数160都不为这些不确定的源组件148n而定义。
[0334] 子步骤118a阐明:步骤118中创建的数据模型164足够用于存储一个源对象168。
[0335] 在一个实施例中,在步骤120中,源对象容器168以期望的方式以及基于一个数据模型164而被创建。在一个实施例中,源对象容器168通过使用一个或多个以下内容而被创建:
[0336] 1.结构化数据,
[0337] 2.半结构化数据,和
[0338] 3.以上内容的任意组合。
[0339] 在一个实施例中,一个源对象容器168可能通过使用任何合适的数据结构而被创建,这些合适的数据结构可包括但不限于:一张数据库表、以逗号分隔的文本文件、一张电子数据表、一个矩阵、一个对象、一个数据、一个变量集合和一个链表。
[0340] 在一个实施例中,一个源对象容器168足够用于存储一个源对象166,其中的源对象166包括一个不确定的源组件148,该不确定的源组件148由一个组件值146所表示,且该不确定的源组件148用于构建一个软件组件142。
[0341] 在一个实施例中,一个源对象容器168使得在该源对象容器168中一个组件值146可以被识别,通过参考存储的源对象166和一个不确定的源组件148,该不确定的源组件148由被识别的组件值146所表示。
[0342] 在一个实施例中,一个源对象容器168包括一个令牌值154,该令牌值154可:
[0343] 1.与一个组件值146进行关联,
[0344] 2.指的是一个组件值146,该组件值146和令牌值154存储在相同的源对象166中,[0345] 3.指的是一个组件值146,该组件值146存储在另一个源对象166中,或
[0346] 4.以上内容的任意组合。
[0347] 在一个实施例中,一个源对象容器168包括以一种期望的层次组织的多个源组件144n。
[0348] 在一个实施例中,一个源对象容器168包括以一种期望的顺序组织的多个组件值146n。
[0349] 在一个实施例中,存储于一个源对象容器168中的一个源对象166是可唯一识别的。
[0350] 在一个实施例中,在步骤122中,一个“软件组件构建者170”被创建,该软件组件构建者170是一个计算机程序,该计算机程序足够用于构建一个软件组件142,该软件组件142的构建基于一个预定义规则集合140且通过使用一项或多项以下内容:
[0351] 1.表示一个源组件144的一个组件值146,
[0352] 2.一个参数160的一个参数值162,
[0353] 3.表示一个数据令牌152的一个令牌值154,和
[0354] 4.以上内容的任意组合。
[0355] 在一个实施例中,一个软件组件构建者170以一个源对象容器168的方式使用一个源对象166的一个数据模型164,来获得这个源对象166。
[0356] 在一个实施例中,软件组件构建者170包括一个软件组件142的预定义规则集合140,并执行该预定义规则集合140。
[0357] 在一个实施例中,一个预定义规则集合140也可以一种期望的方式被修改到一定程度以构建一个软件组件构建者170,在该修改程度下,一个软件组件142可通过使用修改后的预定义规则集合140而构建。
[0358] 在一个实施例中,一个预定义规则集合140可以按照所期望的和/或要求的方式被修改,以构建一个软件组件构建者170,该修改按照如下方式进行:预定义规则集合中没有规则被严重地违犯而导致一个软件组件142不能基于改写后的预定义规则集合而构造。在一个实施例中,一个预定义规则集合140需要足够使得一个软件组件构建者170可以基于预定义规则集合140以及通过使用一个或多个以下内容而构建一个软件组件142:
[0359] 1.一个组件值146,
[0360] 2.一个令牌值154,和
[0361] 3.以上内容的任意组合。
[0362] 在一个实施例中,一个软件组件构建者170在构建一个软件组件142的过程中使用一个数据令牌152,一个软件组件构建者170在运行时使用一个数据令牌152用于确定:
[0363] 1.一个组件值146,
[0364] 2.一个组件值146被用于构建一个软件组件142时被使用的方式,
[0365] 3.一个软件组件142被构建的方式,或
[0366] 4.上述内容的任意组合。
[0367] 换句话说,一个软件组件构建者170使用一个数据令牌152以像一个人类开发者一样构建一个软件组件142。
[0368] 例如,不用作限定,一个软件组件构建者170可被用于构建一条数据库查询语句、一个报表布局、一个数据输入表单、一个菜单和/或一个定制库存处理规则。软件组件构建者170也可与一个计算机程序集成,以在运行时构建期望数量的软件组件。软件组件构建者170的集成可通过使用一个API(应用程序接口),或通过直接将软件组件构造者170编入一个该软件组件构造者170被期望集成的计算机程序中。
[0369] 在一个实施例中,一个软件组件构建者170在运行时根据用户需求而构建一个软件组件142,该用户需求被一个参数160所具体化。换句话说,一个计算机程序中从用户接收一个或多个参数160n的这一层可与一个软件组件构建者170集成,其中的软件组件构建者170根据输入的参数160n构建一个或多个软件组件。
[0370] 在一个实施例中,一个软件组件构建者170可通过使用一个源对象166、一个数据令牌152和一个参数160来构建多个软件组件142n。换句话说,一个参数160和一个数据令牌152使得一个软件组件构建者170可根据一个源对象166构建一个以上的软件组件142n。
[0371] 在一个实施例中,三个子步骤122a、122b和122c与步骤122是相联系的。该三个子步骤中的每一个子步骤都阐明了一个模块的创建,该模块为一个计算机程序,该模块被要求用于构建一个软件组件142。在子步骤122a、122b和122c中创建的每一个模块可以是:
[0372] 1.一个独立的计算机程序,该计算机程序与软件组件构建者170相结合或相集成,或
[0373] 2.一个计算机程序,该计算机程序为软件组件构建者170的一个组成部分,或[0374] 3.一个计算机程序,该计算机程序通过网络与软件组件构建者170相结合,例如通过LAN(Local Area Network,局域网)、MAN(Metropolitan Area Network,城域网)、WAN(Wide Area Network,广域网)、PAN(Personal Area Network,个人区域网)、SAN(Storage Area Network,存储区域网络)、CAN(Campus Area Network,校园局域网)和VPN(Virtual Private Network,虚拟专用网络)等等,或
[0375] 4.上述内容的任意组合。
[0376] 在一个实施例中,在子步骤122a中,一个“参数值解析模块170a被创建。该参数解析模块170a用于解析一个参数值162。一个参数值162可通过使用许多不同的方法而被解析,这些方法包括但不限于:
[0377] 1.用户通过一种或多种途径输入的数据,这些途径包括但不限于:
[0378] a.一个输入设备,
[0379] b.一个姿势,
[0380] c.一条语音命令
[0381] d.一条用于生物特征识别的输入
[0382] e.一次人眼扫描,
[0383] f.人脸识别,
[0384] g.一个可被一台计算翻译的想法,
[0385] h.一个被转换为数字信号的模拟信号,
[0386] i.DNA鉴定,和
[0387] j.上述内容的任意组合。
[0388] 2.从计算机可读介质中读取数据,
[0389] 3.上述内容的任意组合。
[0390] 在一个实施例中,参数值解析模块170a也可从一个计算机可读存储介质中解析参数值162,和/或通过使用一个算法和/或一段计算机可执行逻辑来解析参数值162。
[0391] 在一个实施例中,在子步骤122b中,一个“数据令牌处理模块170b”被创建。该数据令牌处理模块170b用于处理一个令牌值154。该数据令牌处理模块170b基于数据令牌规则集合158来处理令牌值154。
[0392] 在一个实施例中,在子步骤122c中,一个“源对象解析模块170c”被创建。该源对象解析模块170c用于识别一个源对象166以及从该源对象166中解析一个组件值146。
[0393] 源对象166可以多种方式被识别,这些方式包括但不限于:使用一个参数值162、使用一个算法和/或一段计算机可执行逻辑、使用一个令牌值154,和/或以上方式的任意组合。
[0394] 在一个实施例中,在解析一个源对象166的一个组件值146时,源对象解析模块170c也可使用一个参数值162,该参数值162被一个参数值解析模块170a所解析,以及/或者源对象解析模块170c可使用一个令牌值154,该令牌值154由一个数据令牌处理模块170b所处理。
[0395] 在一个实施例中,在解析一个源对象1661的一个组件值1461时,一个源对象解析模块170c也可解析另一个源对象1662的另一个组件值1462,该另一个源对象1662在第一个源对象1661中被引用。
[0396] 在一个实施例中,在解析一个源对象166的组件值146时,源对象解析模块170c也可解析多个源对象166n的多个组件值146n,该多个源对象166n在第一个源对象166中被引用。
[0397] 在一个实施例中,在解析一个源对象166的组件值146时,源对象解析模块170c也可基于一个令牌值154而改变、丢弃和/或增加一个组件值146。
[0398] 在一个实施例中,在步骤124中,一个源对象166被创建,该源对象166足够用于构建一个软件组件142,且该源对象166将被用于构建该软件组件142。该源对象166的创建也可包括一个数据令牌152的一个令牌值154的创建,以及包括将该令牌值154与一个组件值146和/或另一个令牌值154进行关联,上述创建与关联基于数据令牌规则集合158而进行。
在一个实施例中,该源对象166存储在一个源对象容器168中。
[0399] 在一个实施例中,在步骤124中,表示一个数据令牌152的一个令牌值154可能被创建以及被关联到一个组件值146,该组件值145表示一个源组件144,该源组件144被一个源对象166所包含。
[0400] 在一个实施例中,一个源对象166被创建,其中源对象166包括一个组件值146,该组件值146表示一个不确定的源对象148,且该组件值146用于构建一个软件组件142。
[0401] 在一个实施例中,一个源对象166以如下方式被创建:一个令牌值154可被关联到一个组件值146以使得该令牌值154可被使用和/或被处理。
[0402] 在一个实施例中,一个令牌值154的使用确定了一个组件值146用于构建一个软件组件142时被使用的方式。
[0403] 在一个实施例中,一个令牌值154的使用确定了一个组件值146将不会被用于构建一个软件组件142。
[0404] 在一个实施例中,一个令牌值154的使用确定了一个组件值146将被处理、处理后的组件值146将被用于构建一个软件组件142。
[0405] 在一个实施例中,一个令牌值154的使用确定了一个组件值146将被修改、修改后的组件值146将被用于构建一个软件组件142。
[0406] 在一个实施例中,一个令牌值154的使用确定了一个组件值146将被改变、改变后的组件值146将被用于构建一个软件组件142。
[0407] 在一个实施例中,一个令牌值154的使用确定了一个组件值146将被用于创建另一个组件值146,且另一个被创建的组件值146将被用于构建一个软件组件142。
[0408] 在一个实施例中,一个令牌值154被嵌入到一个组件值146中。
[0409] 在一个实施例中,一个令牌值154被嵌入到一个源对象166中。
[0410] 在一个实施例中,一个源对象166包括一个组件值146,该组件值146不包括于一个软件组件142中。
[0411] 在一个实施例中,一个源对象166包括一个组件值146,该组件值146不包括于一个软件组件142中,且该组件值146通过使用以下内容而被确定:
[0412] 1.一个令牌值154,
[0413] 2.一个令牌结果156,
[0414] 3.一个参数值162,
[0415] 4.一个软件组件构建者170,或
[0416] 5.以上内容的任意组合。
[0417] 在一个实施例中,一个令牌结果的使用确定了一个组件值146用于构建一个软件组件142时被使用的方式。
[0418] 在一个实施例中,一个令牌结果156的使用确定了一个组件值146将不会被用于构建一个软件组件142。
[0419] 在一个实施例中,一个令牌结果156的使用确定了一个组件值146将会被处理以及处理后的组件值将会被用于构建一软件组件142。
[0420] 在一个实施例中,一个令牌结果156的使用确定了一个组件值146将会被修改以及修改后的组件值146将会被用于构建一个软件组件142。
[0421] 在一个实施例中,一个令牌结果156的使用确定了一个组件值146将会被改变以及改变后的组件值146将会被用于构建一个软件组件142。
[0422] 在一个实施例中,一个令牌结果156的使用确定了一个组件值146将会被用于创建另一组件值146,且另一个被创建的组件值146将会被用于构建一个软件组件142。
[0423] 在一个实施例中,在步骤126中,一个软件组件142通过使用一个软件组件构建者170而被构建。图2描述了构建软件组件142的更多细节。
[0424] 在一个实施例中,以下步骤被一个软件组件构建者170执行以构建一个软件组件142:
[0425] 1.从用户接收一个参数值162。
[0426] 2.识别出一个源对象166。
[0427] 3.从一个源对象容器168中获取一个源对象166。
[0428] 4.从获取的源对象166中获取一个不确定的源组件148的一个组件值146。
[0429] 5.处理一个令牌值154以获取一个令牌结果156。
[0430] 6.构建一个软件组件142,该软件组件142的构建基于该软件组件142的一个预定义规则集合,且该软件组件142的构建通过使用上述参数值162、上述不确定的源组件148的上述组件值146、一个可确定的源组件150的一个组件值146和一个令牌结果156。
[0431] 在一个实施例中,一个令牌值154用于构建一个软件组件142时不被处理。也就是说,一个令牌值154未经处理即可用于构建一个软件组件142。
[0432] 在一个实施例中,一个参数值162不用于构建一个软件组件142。
[0433] 在一个实施例中,一个参数值162不用于处理一个令牌值154。
[0434] 在一个实施例中,一个可确定的源组件150的一个组件值146不用于构建一个软件组件142。
[0435] 在一个实施例,一个不确定的源对象148的一个组件值146不用于构建一个软件组件142。
[0436] 步骤128判定是否需要另一个源对象166。如果需要另一个源对象166,则执行步骤124,否则,执行步骤130。
[0437] 当已有的源对象166不足以创建一个需要的软件组件142时,则需要创建另一个源对象166。
[0438] 步骤130判断是否需要构建另一个软件组件142。若需要构建另一个软件组件142,则执行步骤126,否则,进入末端步骤132。
[0439] 流程图结束于端点132。
[0440] 端点134被用作流程图的另一个起点,以阐明源对象166、软件组件构建者170和源对象容器168可按照需要被使用多次。
[0441] 9.基于本发明的一个方面的一个实施例(图2)
[0442] 图2为在图1B的步骤122中创建的软件组件构建者170的工作流程示意图。该流程示意图仅阐明一个实施例中软件组件构建者170的一种执行模式。本领域技术人员可以许多种不同的方式构建软件组件构建者170。图2以更详细的细节来说明步骤126。
[0443] 在步骤212中,软件组件构建者170开始工作。
[0444] 在一个实施例中,在步骤214中,参数值解析模块170a解析一个或多个参数值162n,参数值162n需要用于构建一个或多个期望的软件组件142n。
[0445] 在一个实施例中,在步骤216,源对象166n被源对象解析模块170c所识别,源对象166n需要被用于构建期望的软件组件142n。
[0446] 在一个实施例中,在步骤218中,源对象166n的组件值146n被源对象解析模块170c所解析。在一个实施例中,源对象解析模块170c也可使用一个或多个以下内容,以解析组件值146n:
[0447] 1.一个或多个参数值162n,
[0448] 2.一个或多个令牌值154n,该一个或多个令牌值154n可被数据令牌处理模块170b所处理,和
[0449] 3.以上内容的任意组合。
[0450] 在步骤220中,软件组件构建者170基于多个预定义规则集合140n构建需要的软件组件142n,且这些软件组件142n的构建通过使用以下一项或多项内容:
[0451] 1.参数值162n。
[0452] 2.令牌值154n,该令牌值可被数据令牌处理模块170b所处理。
[0453] 3.被解析的组件值146n,和
[0454] 4.以上内容的任意组合。
[0455] 期望的软件组件142n的构建结束于步骤224。
[0456] 10.运行本发明的一个实施例的一个示范性环境。
[0457] 图3演示了一个示范性的计算系统环境300的一个示范性的结构图,计算系统环境300可实现本发明的一个实施例中的一个方面。计算系统环境300包括一个示范性的计算机
302、一个示范性的显示单元330、一个示范性的打印机332、一个示范性的扬声器334、一个示范性的键盘336、一个示范性的指取设备(pointing device)338、一个示范性的麦克风
340、一个示范性的数字化仪342以及一个示范性的扩展卡344。计算机302与一个或多个示范性的远程计算机354连接以在一个网络化环境中工作,远程计算机354与计算机302通过一条示范性的通信链路连接。另外,一个示范性的网络辅助存储器352与计算机302通过通信链路350连接,而且一个示范性的远程辅助存储器356与计算机302通过远程计算机354连接。通信链路350与计算机302通过一个示范性的通讯接口326连接。
[0458] 图3所示的计算系统环境300仅演示了可实现本发明的一个实施例的一个示范性环境的一个示例,但不作为对本发明的使用和/功能的范围的任何限制。而且,本发明不以任何方式依赖或受限于计算系统环境300以及计算系统环境包括的所有示范性组件。另外,计算系统环境300不应该被视为依赖于演示于其中的任何一个组件或任何组件的组合。而且,计算系统环境300不受限于其中演示的组件,在其它的配置和/或环境中组件的数量可以更多或更少。
[0459] 除了计算系统环境300,本发明的实施例可在任何其它通用和/或专用的计算系统环境和/或配置下实施。例如,不作为限制,可使用本发明的一些众所周知的计算环境和/或配置可能包括但不限于:个人计算机、服务端计算机、手持式计算机、平板设备、便携式通信设备、移动电话、多处理器系统、工作站、可编程消费电子、机顶盒、游戏控制台、网络个人计算机、小型机、大型计算机、超级计算机、可包括任何上述的系统的分布式计算环境、过程控制计算机、飞行电脑、GPS装置、媒体播放器以及用于控制汽车的计算机。
[0460] 计算机302所演示的组件包括一个示范性的处理器304、一个示范性总线306、一个示例性的计算机存储器308、一个示例性的ROM(只读存储器,Read Only Memory)310、一个示例性的BIOS(基本输入输出系统,Basic Input Output System)312、一个示例性的RAM(随机存取存储器,Random Access Memory)314、一个示例性的辅助存储接口316、一个示例性的辅助存储器318、一个示例性视频控制器320、一个或多个示例性输入/输出接口单元322、一个示例性的扩展接口324和通信接口326。
[0461] 处理器304,可以多个形式出现,被连接到总线306。处理器304可以包括但不限于:一个微处理器、精简指令集计算机(RISC,Reduced Instruction Set Computer)处理器以及复杂指令集计算机(CISC,Complex Instruction Set Compute)处理器。
[0462] 总线306连接一个或多个组件至处理器304,方便处理器304与连接的一个或多个组件之间的数据交换,总线306可包括以下内容中的一项或多项:
[0463] 1.一条系统总线,
[0464] 2.一条外围总线,和/或
[0465] 3.上述内容的任意组合。
[0466] 系统总线也被称为局部总线、处理器总线或前端总线(FSB,Front-Side Bus)。系统总线可以进一步包括一个地址总线、一个存储器总线、一个数据总线、一个北桥、一个内存控制器(MCH,Memory Controller Hub)等等。外围总线也被称为I/O总线。
[0467] 总线306可包括但不限于:一个ISA(工业标准结构)总线、一个EISA(扩展工业标准结构)总线、一个MCA(微通道体系结构)总线、一个VESA(视频电子标准协会)总线、一个VLB(VESA局部总线)、一个PCI(外设部件互连)总线、一个多总线、一个单总线、一个FireWire总线、一个SCSI(小型计算机系统接口)总线、一个RS-232总线、一个ATA(先进技术附件)总线、一个SATA(串行高级技术附件)总线、一个PATA(并行高级技术附件)总线、一个USB(通用串行总线)、一个串行总线、一个CardBus、一个PCMCIA(个人计算机存储卡国际协会)总线,一个AGP(加速图形端口)总线、一个ExpressCard总线、Wishbone总线、一个CAN(控制器局域网络)总线,一个FlexRay总线和一介STD总线。此外,本发明还将与任何类型的总线拓扑结构以及总线拓扑结构组合一起工作,总线拓扑结构可包括但不限于:并行结构、串行结构、菊花链结构以及多点结构。
[0468] 总线306还可以支持通过使用扩展卡344增加一个或多个输入/输出组件到扩展接口。扩展接口324和扩展卡344可支持一个或多个总线306所支持的总线类型。
[0469] 扩展接口324可以包括但不限于:一个ISA(工业标准体系结构)接口、一个PCI(外围部件互连)接口、一个火线接口、一个SCSI(小型计算机系统接口)的接口、一个RS-232接口、一个ATA(高级技术附件)接口、一个SATA(串行高级技术附件)接口、一个PATA(并行高级技术附件)接口、一个USB(通用串行总线)接口、一个PCMCIA(个人计算机存储卡国际协会)接口、一个AGP(加速图形端口)接口和ExpressCard接口。
[0470] 扩展卡344可包括但不限于:一个调制解调器、一个网卡、一个蓝牙卡、一个USB接口卡、一个视频卡、一个声卡、一个PLC(可编程逻辑控制器)卡以及向一个特殊的硬件提供接口的卡。
[0471] 计算机302通常需要一个存储器,计算机302的存储器在图3中被表示为计算机存储器308。计算机存储器308包括ROM310和RAM314。然而,计算机存储器308不限于ROM310和/或RAM314,并且可包括任何其它类型和/或形式的处理器304可直接访问的存储器。计算机存储器308连接到总线306以存储信息和处理器304将执行的指令。此外,计算机存储器308的内容还可以包括当前正由处理器304操作的内容。为此,总线306连接计算机存储器308到处理器304。
[0472] 计算机302通常需要一组启动指令来进行启动,启动指令被存储在一个非易失性存储器,它在图3中由ROM310表示。
[0473] ROM310可以包括但不限于:一个ROM(只读存储器,也称为固态ROM)、一个PROM(可编程只读存储器)、一个EPROM(可擦除可编程只读存储器)和一个EEPROM(电可擦除可编程只读存储器,也被称为闪速存储器)。
[0474] ROM310通常用于存储BIOS312,其中BIOS312包括计算机启动程序(routines)和其它的基本程序,这些程序方便计算机302的不同组件之间的令牌传输。ROM310还可以存储一个操作系统、一个设备驱动程序、一个应用程序、一个数据结构、其它程序模块和静态应用数据等。
[0475] 计算机302还通常需要一个易失性存储器,它在图3中由RAM314表示。RAM314通常被用于存储一个计算机程序以及将由处理器304执行的信息/指令。RAM314也可用于存储处理器304执行指令期间的临时变量或其他中间数据。
[0476] RAM314可包括但不限于以下多种形式:SRAM(StaticRAM)、DRAM(动态RAM)、SDRAM(同步DRAM)、DDR SDRAM(双数据速率SDRAM)、ESDRAM(增强型SDRAM)、SLDRAM(同步链接DRAM)和DRDRAM(直接Rambus DRAM)。
[0477] 在计算机302中,处理器304可通过使用总线306直接访问ROM310和RAM314。而且,ROM310和RAM314的内容可包括处理器304当前正处理的内容。
[0478] 辅助存储接口316通过总线306方便了辅助存储器318和计算机302之间的连接。辅助存储器318还可以像网络辅助存储器352一样通过通信链路350连接到计算机302,和/或像远程辅助存储器356一样通过远程计算机354连接到计算机302。辅助存储器318提供对软件和数据的存储,这些软件和数据可包括但不限于:计算机可读指令、数据结构、操作系统、设备驱动程序、应用程序的计算机程序、其它程序模块、数据库和应用程序数据。
[0479] 辅助存储接口316可包括但不限于:一个或多个硬盘接口、一个软盘驱动接口、一个SCSI(小型计算机串行接口)接口、一个光盘接口、一个蓝光光盘接口、一个磁光接口、一个磁带接口、一个DAT(数字音频磁带)接口、一个DASD(直接访问存储设备)接口、一个ATA(高级技术附件)接口、一个SATA(串行高级技术附件)界面、一个PATA(并行高级技术附件)接口和一个USB(通用串行总线)接口。
[0480] 辅助存储器318可以是一个或多个非易失性的不可移动介质、一个非易失性可移动介质、一个不可移动介质的相关设备和上述内容的任意组合。
[0481] 辅助存储器318可以包括但不限于:一个或多个硬盘或多个硬盘的组合、一个固定盘、一个温切斯特(Winchester)磁盘驱动器、一个软盘驱动器和存储介质、一个在CD-ROM(光盘只读存储器)驱动器和存储介质、一个CD-R(可刻录光盘)驱动器和存储介质、一个CD-RW光碟(光盘可重写)驱动器和存储介质、一个DVD(数字多功能光盘)驱动器和存储介质、一个蓝光光驱动器和存储介质、一个光盘存储装置和存储介质、一个磁-光存储设备和存储介质、一个磁带盒驱动器和存储介质、一个磁带驱动器和存储介质、一个纸带读取器和纸带、一个纸卡读卡器和纸卡、一个DAT(数字音频磁带)驱动器和存储介质、一个DASD(直接访问存储设备)设备和存储介质、一个移动硬盘和一个基于硬盘的RAID(独立磁盘冗余阵列)。
[0482] 显示单元330通过一个接口连接到计算机302,该接口在计算系统环境300中表示,虽然以多个可用于一个接口,它是在计算系统环境300显示单元330和视频控制器320,视频控制器320。可使用多个显示单元330和视频控制器320。
[0483] 显示单元330和视频控制器320可以是任何类型,如CGA(彩色图形适配器)、EGA(增强型图形适配器)、VGA(视频图形阵列)、SVGA(超级视频图形阵列)、XGA(中扩展图形阵列)、SXGA(超级XGA)、QVGA(四分之一VGA)、WXGA(宽屏XGA)、SXGA+、WXGA+、WSXGA、WQVGA、MDA、Hercules(大力士)、MCGA(多色图形适配器)、UXGA、WUXGA、2K(DLP影院技术)、WQUXGA(宽四极速扩展图形阵列)等等。
[0484] 显示单元330和视频控制器320之间可通过使用一个视频接口标准相连接,该标准可以包括但不限于:VGA接口标准、DVI(数字视觉接口)标准和HDMI(高清晰度多媒体接口)标准。
[0485] 一种触摸屏面板(在图3中未示出)也可以连接到显示单元330,其中,所述显示单元330用于显示输出,而触摸屏被用作输入设备。
[0486] 计算系统环境300包括其它的输出设备,这些输出设备可通过一个或多个输入/输出接口单元322连接到总线306。
[0487] 输入/输出接口单元322可包括但不限于:一个或多个PS/2接口或多个PS/2接口组合、USB(通用串行总线)接口、并行接口、串行RS-232接口以及RS-762接口。
[0488] 以下六个输入/输出设备被演示于计算系统环境300中:
[0489] 1.打印机332,
[0490] 2.扬声器334,
[0491] 3.键盘336,
[0492] 4.指取设备338,
[0493] 5.麦克风340和
[0494] 6.数字化仪342。
[0495] 然而,这样的输入/输出设备可以包括但不限于:热敏打印机、点阵打印机、喷墨打印机、激光打印机、行式打印机、绘图仪、多功能打印机、头戴式耳机、耳机、投影仪、鼠标、追踪球、指点杆、触摸板、数字化仪、扫描仪、游戏手柄、操纵杆、条码阅读器、游戏桨、指纹扫描仪、网络摄像头、USB集线器、端口复制器、摄像头、访问控制设备、闪存键和移动硬盘。此外,可使用多个输入/输出设备。
[0496] 一般的,计算机302还可以在联网环境中操作,其中,计算机302通过通信链路350连接到其他计算机,例如一台或多台远程计算机354,通信链路350通过使用通信接口326而被建立,通信接口326耦合到总线306上。
[0497] 远程计算机354可以包括但不限于:类似于计算机302的计算机、个人计算机、膝上型计算机、平板计算机、笔记本计算机、服务器、路由器、PDA(计算机个人数字助理)、移动电话、网络PC、对等设备、其他常见的网络节点、公共网络、移动网络、大型计算机以及微型计算机。
[0498] 计算机302和远程计算机354使用一种或多种技术进行通信,这些技术可包括但不限于:web服务、CORBA(公共对象请求代理体系结构)、RPC(远程过程调用)、CBSE(基于组件的软件工程)、REST(表述性状态转移)以及电子邮件。
[0499] 耦合在总线305上的通信接口326通过通信链路350提供双向数据通信,其中,所述通信链路350被用于连接计算机302与其它部件,如网络辅助存储器352、远程计算机354和远程辅助存储器356。
[0500] 通信接口326可以包括但不限于:一个或多个物理连接或多个物理连接的任意组合、逻辑连接、协议、调制解调器、电缆调制解调器、DSL(数字用户线路)调制解调器、ADSL(非对称数字用户线路)调制解调器、路由器、帧中继连接、AIN(高级智能网)连接、同步光纤连接、DSL连接、数字T1线路、数字线路T2、数字E1线路、DDS(数字数据服务)连接、以太网连接、ISDN(综合业务数字网)线路、拨号端口(例如V.90、V.34或双V.34模拟调制解调器连接)、ATM(异步传输模式)连接、HSSI(高速串行接口)、FDDI(光纤分布式数据接口)和CDDI(铜线分布式数据接口)。
[0501] 通信链路350可方便建立网络,该网络包括但不限于:LAN(局域网)、MAN(城域网)、WAN(广域网)、PAN(个人局域网)、SAN(存储区域网络)、CAN(校园局域网)和VPN(虚拟专用网)。
[0502] 通信链路350可以包括或可以访问任何一个或多个:、WAP(无线应用协议)链路、GPRS(通用分组无线服务)链路、GSM(全球移动通信系统)链路、CDMA(码分多址)或TDMA(时分多址)链路(诸如移动电话信道)、GPS(全球定位系统)的链路、CDPD(移动数字分组数据)、RIM(Research in Motion有限公司)双工寻呼类型的设备、蓝牙无线电链路、基于IEEE802.11的无线射频链路、#G链路、HSPA链路,等等。
[0503] 通信链路350还可进一步地包括或访问任何任意一个或多个:RS-232串行连接、IEEE-1394(光纤线)连接、IrDA(红外)端口、SCSI(小型计算机串行接口)连接、USB(通用串行总线)的连接以及任何其它接口或连接,有线或无线的,数字的或模拟的。该接口可以包括但不限于:以太网接口、帧中继接口、电缆接口、DSL接口以及令牌环接口。此外,各种非常高速的接口也可被使用;例如,快速以太网接口、千兆以太网接口、ATM接口、POS(销售点)接口、FDDI(光纤分布式数据接口),等等。一个接口可以包括用于与适当的介质通信的一个适当的端口。
[0504] 通信链路350可通过使用一个或多个拓扑结构进行部署,这些拓扑结构包括但不限于:总线拓扑、星型拓扑、环型拓扑、网状拓扑、星型总线拓扑结构,以及树或分层拓扑结构。
[0505] 通讯链路350可使用一个或多个协议进行通信,这些协议可以包括但不限于:IP(因特网协议)、IPv4、IPv6、ICMP(互联网控制消息协议)、IGMP(因特网组管理协议)、IPsec(Internet协议安全性)、TCP(传输控制协议)、UDP(用户数据报协议)、HTTP(超文本传输协议)、FTP(文件传输协议)、远程登录、IRC(互联网中继聊天)、DSL(数字用户线路)和ISDN(综合业务数字网)。
[0506] 可使用多个远程计算机354及其任意组合和多个通信链路350及其任意组合,以及远程计算机354和通信链路350的任意组合。更具体地,编程或配置或控制装置或设备(例如一台计算机)以执行本发明的实施例所描述的功能,将创建一个新的机器。例如,一台计算机(一台通用计算机)将变成一台专用计算机,一旦它被编程或配置或控制以依照来自程序软件的指令执行本发明的实施例的特定功能。如所讨论的,实施本发明的一个实施例的一个程序/软件可以被记录在计算机可读介质中,例如,非短暂性或持续性的计算机可读介质。
[0507] 11.运行本发明的一些实施例的一些方面的一些示范性模式(图4A至图10Z)[0508] 图4A至图10Z阐明了一个实施例中针对MICROSOFT ACCESS和/或ORACLE数据库构建期望的示范性SQL查询语句的详细步骤,这些SQL查询语句为软件组件142n。这些步骤包括:
[0509] 1.创建一个源对象容器168(图1A的步骤20的一个例子),该过程图示于图4A到7C中。创建源对象容器168的过程具体包括以下步骤:
[0510] a.选择一个或多个预定义规则集合(图1B的步骤110的一个例子),该过程图示于图4A到4R中。
[0511] b.将源组件144n分类到不确定的源组件148n和可确定的源组件150n中(图1B的步骤112的一个例子),该过程图示于图4S至4T中。
[0512] c.定义数据令牌152n(图1B的步骤114的一个例子)以及它们各自的数据令牌规则集合158n,该过程图示于图5A至5C中。
[0513] d.定义参数160n(图1B的步骤116的一个例子),该过程图示于图6中。
[0514] e.创建一个数据模型164(图1B的步骤118的一个例子),该过程图示于图7A至7B中。
[0515] f.创建一个源对象容器168(图1B的步骤120的一个例子),该过程图示于图7C中。
[0516] 2.创建一个软件组件构建者170(图1A的步骤30的一个例子),该过程图示于图8A至8X中。
[0517] 3.构建一个或多个软件组件142n(图1A的步骤40的一个例子),该过程图示于图9A至10Z中。
[0518] a.创建源对象166n(图1B的步骤124的一个例子),该过程图示于图9A至9O中。
[0519] b.构建软件组件142n(图1B的步骤126的一个例子),该过程图示于图10A至10Z中。
[0520] 图4A至10Z阐明了基于本发明的一些方面的一些示范性实施例的实现过程。然而,熟悉本发明相关技术的人可以识别出用于实行本发明权利要求所公开的这些方面的相关的替代设计、实施例和实现方式。
[0521] 图4A至10Z的详细说明中所用到的“期望的查询语句”指的是一条或多条查询语句,查询语句为软件组件142的一个例子,查询语句通过使用图4A至9O所示的实施例而被构建。
[0522] 图4A至10Z的说明中所用到的“queryBuilder”指的是软件组件构建者170的一个例子。queryBuilder是基于本发明的一些原理而发展的一个示范性实施例,queryBuilder的具体情况图示于图8A至8P中。然而,本发明不以任何方式依赖或受限于queryBuilder。
[0523] 示范性预定义规则集合的语法图图示于图4B至4R中,语法图为适应本发明的一些方面的一些示范性实施例的示范性实现而被修改。然而,所有修改基于以下方式而进行:没有一个预定义规则集合被违犯到严重程度以致于合法的查询语句不能基于修改后的预定义规则集合而被构建。
[0524] 图4A至9O所示的实施例没有包括错误检查和异常处理;所有的实施例都被认为可正常运行。
[0525] 图4A至9O所示的实施例都足够用于在运行时构建一条或多条期望的查询语句,每一条查询语句都可为以下内容而构建:
[0526] 1.Microsoft Access,或
[0527] 2.ORACLE,或
[0528] 3.Microsoft Access和ORACLE。
[0529] 图4A描述了两个示范性的预定义规则集合400,该预定义规则集合400是根据本发明一个实施例的一个方面而选择的,其包括针对ACCESS SELECT查询语句401的一个预定义规则集合,该预定义规则集合为预定义规则集合140的一个示例,以及包括针对ORACLE SELECT查询语句402的一个预定义规则集合,该预定义规则集合也为预定义规则集合140的一个示例。
[0530] 针对ACCESS SELECT查询语句401的预定义规则集合仅包括需要且足够用于产生期望的MICROSOFT ACCESS查询语句的规则。MICROSOFT ACCESS可能包括额外的预定义规则,这些规则在这个例子中不被选择。
[0531] 针对ORACLE SELECT查询语句402的预定义规则集合仅包括需要且足够用于产生期望的ORACLE查询语句的规则。ORACLE可能包括额外的预定义规则,这些规则在这个例子中不被选择。
[0532] 图4B至4K通过使用多个语法图详细地描述了针对ACCESS SELECT查询语句401的预定义规则集合。每一个语法图有一个入口点和一个终结点,且语法图描述了这两个点之间的可能的路径,这些路径通过其它非终端框、终端框和/或判定框。终端框由圆角框表示,非终端框由直角框表示,判定框由菱形框表示。
[0533] 410a、410b、411a等等所指的圆圈表示语法图中的入口点和终结点。
[0534] 由圆角框表示的终端框描述的内容按照字面意义直接被书写出来,例如“SELECT”(不包括引号),而有着直角的非终端框则可延伸到另外的终端框和非终端框。终端框包括470a、470b、470c、471a、471b、472a和472b等等。每一个终端框描述的内容都是源组件144的一个示例。
[0535] 非终端框包括401、402、410、411和412等等。
[0536] 图4B至4R所示的判定框由图8A至8P所示的流程图实现。
[0537] 在图4B中,入口点401a描述了ACCESS SELECT查询语句401的起始点,终结点401b描述了ACCESS SELECT查询语句401的结束点。图4B也给出了两个非终端框410和411,非终端框410和411的详细细节分别描述在图4C和图4D中。
[0538] 图4C描述了非终端框410的详细细节。非终端框410的入口点410a和终结点410b图示于图4C中。三个非终端框412、413和414也图示于图4C中。非终端框412、413和414的详细细节分别描述于图4E、4F和4G中。
[0539] 图4D描述了非终端框411的详细细节。非终端框411的入口点411a和终结点411b也图示于图4D中。
[0540] 图4E描述了非终端框412的详细细节。非终端框412的入口点412a和终结点412b也图示于图4E中。非终端框415也图示于图4E中。非终端框415的详细细节图示于图4H中。
[0541] 图4F描述了非终端框413的详细细节。非终端框413的入口点413a和终结点413b也图示于图4F中。三个非终端框416、417和418也图示于图4F中。非终端框416、417和418的详细细节分别图示于图4I、4J和4K中。
[0542] 图4G描述了非终端框414的详细细节。非终端框414的入口点414a和终结点414b也图示于图4G中。
[0543] 图4H描述了非终端框415的详细细节。非终端框415的入口点415a和终结点415b也图示于图4H中。
[0544] 图4I描述了非终端框416的详细细节。非终端框416的入口点416a和终结点416b也图示于图4H中。非终端框410也图示于图4I中。非终端框410的详细细节图示于图4C中。
[0545] 图4J描述了非终端框417的详细细节。非终端框417的入口点417a和终结点417b也图示于图4J中。
[0546] 图4K描述了非终端框418的详细细节。非终端框418的入口点418a和终结点418b也图示于图4K中。
[0547] 图4L至4R通过使用多个语法图描述了针对ORACLE SELECT查询语句402的预定义规则集合的详细细节。每一语法图有一个入口点和一个终结点,且语法图描述了这两个点之间的可能的路径,这些路径通过其它非终端框、终端框和/或判定框。终端框由圆角框表示,非终端框由直角框表示,判定框由菱形框表示。
[0548] 在图4L中,入口点402a描述了ORACLE SELECT查询语句402的起始点,终结点402b描述了ORACLE SELECT查询语句402的结束点。图4L也给出了两个非终端框430和411,非终端框430和411的详细细节分别描述在图4M和图4D中。
[0549] 图4M描述了非终端框430的详细细节。非终端框430的入口点430a和终结点430b图示于图4M中。四个非终端框431、432、433和414也图示于图4C中。非终端框431、432、433和414的详细细节分别描述于图4N、4O、4P和4G中。
[0550] 图4N描述了非终端框431的详细细节。非终端框431的入口点431a和终结点431b也图示于图4N中。非终端框434也图示于图4N中。非终端框434的详细细节图示于图4Q中。
[0551] 图4O描述了非终端框432的详细细节。非终端框432的入口点432a和终结点432b也图示于图4O中。非终端框435也图示于图4O中。非终端框435的详细细节图示于图4R中。
[0552] 图4P描述了非终端框433的详细细节。非终端框433的入口点433a和终结点433b也图示于图4P中。
[0553] 图4Q描述了非终端框434的详细细节。非终端框434的入口点434a和终结点434b也图示于图4Q中。
[0554] 图4R描述了非终端框435的详细细节。非终端框435的入口点435a和终结点435b也图示于图4R中。非终端框430也图示于图4R中。非终端框430的详细细节图示于图4M中。
[0555] 图4S描述了所有被分类为不确定的源组件的源组件,这些不确定的源组件被标记为1481-24。不确定的源组件1481-24中的每一个都被要求在一个期望的查询语句中由至少一个组件值146所表示,该组件值146:
[0556] 1.不能通过使用一个算法和/或一段计算机可执行逻辑来产生,或
[0557] 2.至少在一个期望的查询语句中被要求不通过使用一个算法和/或一段计算机可执行逻辑来产生
[0558] 图4T描述了所有被分类为可确定的源组件的源组件,这些可确定的源组件被标记为1501-15。可确定的源组件1501-15中的每一个都由一个组件值146所表示,这些组件值146可通过使用一个算法和/或一段计算机可执行逻辑而产生。以下为一些示范性的可确定的源组件:
[0559] 1.SELECT470a
[0560] 2.空格470b
[0561] 3.FROM470c
[0562] 4.BY470d
[0563] 5.左圆括号470e
[0564] 6.右圆括号470f
[0565] 7.逗号470g
[0566] 8.AND470h
[0567] 9.句号470i
[0568] 10.AS470j
[0569] 11.srcAlaGrp470k
[0570] 12.等号470m
[0571] 13.srcAlaTbl470n
[0572] 14.ON470p,和
[0573] 15.srcAla1470q。
[0574] 图5A描述了一些示范性的数据令牌,每一个数据令牌被定义以便于与一个组件值146一起被使用,该组件值表示一个或多个图4S中不确定的源组件和/或图4T中的可确定的源组件。
[0575] 数据令牌qryGrp512为数据令牌152的一个示例,其由一个布尔类型的令牌值154所表示,且其可由以下三个可能的令牌值所表示:True、False和NULL。qryGrp512的数据令牌规则集合158由以下内容所具体化:
[0576] 1.如果qryGrp512由True所表示,其中的True为一个令牌值154的一个示例,则期望的查询语句将被构建为一条汇总查询语句。
[0577] 2.否则,期望的查询语句将被构建为一条非汇总查询语句。
[0578] qryGrp512可与一个组件值146进行关联,关联的方式为:queryBuilder可基于一个令牌值154构建一条期望的查询语句,该令牌值154用于表示qryGrp512,其中期望的查询语句为一条汇总查询语句或一条非汇总查询语句。qryGrp512使得“GROUP471b”的组件值146可以被确定,其中“GROUP471b”为一个不确定的源组件148。
[0579] 数据令牌qryUni514为一个数据令牌152的一个示例,其由一个布尔类型的令牌值154所表示,且其可由三个可能的令牌值所表示:True、False和NULL。qryUni514的数据令牌规则集合158由以下内容所具体化:
[0580] 1.如果qryUni514由True所表示,True为一个令牌值154的一个示例,则期望的查询语句将通过使用UNION ALL操作符而被构建为一条UNION查询语句。
[0581] 2.否则,被构建的期望的查询语句中将没有UNION ALL操作符。
[0582] qryUni514可按照如下方式被关联到一个组件值146:queryBuilder可基于表示qryUni514的一个令牌值154构建一条期望的查询语句,该期望的查询语句可为一条全连接(UNION ALL)查询语句或一条非连接(non-union)查询语句。qryUni514可为“UNION ALL471c”确定一个组件值146,其中UNION ALL471c为一个不确定的源组件148。
[0583] qryUni514的令牌值154可有另一个数据类型以满足其它的操作符,其它的操作符不包括在本示例中,例如UNION、MINUS以及类似操作符,但是在本示范性实施例中,qryUni514只用于满足UNION ALL操作符。
[0584] 作为数据令牌152的一个示例,数据令牌srcUseCnd516由一个字符串类型的令牌值154所表示,该令牌值154可为:
[0585] 1.一个NULL值,或
[0586] 2.一个空字符串,或
[0587] 3.一个字符串值,或,
[0588] 4.一串以逗号分隔的字符串值,其中至少包括两个字符串值。
[0589] 表示srcUseCnd516的一个令牌值154,可被关联到表示“table-name472k”的一个组件值146,“table-name472k”为不确定的源组件148的一个示例,“table-name472k”与一个参数prmUseCnd622的一个参数值162一起被处理,prmUseCnd622为一个参数160的一个示例。对表示srcUseCnd516的令牌值154的处理结果用于确定一个组件值146是否用于构建一条期望的查询语句,该处理结果为令牌结果156的一个示例,而该组件值146用于表示table-name472k。表示srcUseCnd516的令牌值154可在以下时机被处理:
[0590] 1.获取表示table-name472k的一个组件值146时,和/或
[0591] 2.构建一条期望的查询语句时。
[0592] srcUseCnd516基于以下数据令牌规则集合158而被处理:
[0593] 1.表示table-name472k的一个组件值146在以下条件下被使用:
[0594] a.表示srcUseCnd516的一个令牌值154为一个空字符串或一个NULL值,该令牌值154也被关联到表示table-name472k的组件值146,或
[0595] b.表示srcUseCnd516的一个令牌值154包括至少一个字符串值,该字符串值也被prmUseCnd622的参数值162所包含,该令牌值154也被关联到表示table-name472k的组件值146。例如,如果表示srcUseCnd516的一个令牌值154为“abc,xyz”,该令牌值154也被关联到表示table-name472k的组件值146,而prmUseCnd622的参数值162为“nop,xyz”,从而字符串值“xyz”被表示srcUseCnd516的令牌值154和prmUseCnd622的参数值162所包含,则表示table-name472k的组件值146将被用于构建一条期望的查询语句。又例如,如果表示srcUseCnd516的一个令牌值154为“abc”,该令牌值154也被关联到表示table-name472k的组件值146,而prmUseCnd622的参数值162为“abc,xyz”,从而字符串值“abc”被表示srcUseCnd516的令牌值154和prmUseCnd622的参数值162所包含,则表示table-name472k组件值146将被用于构建期望的查询语句。被逗号分隔的单个字符串值之间总是进行比较,这种比较不区分大小写。
[0596] 2.表示table-name472k的组件值146在以下条件下不被使用:
[0597] a.prmUseCnd622的参数值162为一个空字符串或一个NULL值,但表示srcUseCnd516的且被关联到表示table-name472k的组件值146的令牌值154包括至少一个字符串值,或
[0598] b.t表示srcUseCnd516的且也被关联到组件值146的令牌值154不包括prmUseCnd622所包括的字符串值,该组件值146用于表示table-name472k。例如,如果表示srcUseCnd516的且也被关联到组件值146的令牌值154为“abc,xyz”,该组件值146用于表示table-name472k,而prmUseCnd622的参数值162为“nop,rst”,则字符串值“abc”和字符串值“xyz”都不被prmUseCnd622的参数值162所包括,从而表示table-name472k的组件值146将不被用于构建一条期望的查询语句。被逗号分隔的单个字符串值之间总是进行比较,而这种比较不区分大小写。
[0599] 为了srcUseCnd516的实现,以下内容是强制性的:
[0600] 1.表示srcUseCnd516的且也被关联到表示table-name472k的组件值146的令牌值154必须关联到所有组件值,这些组件值指的是与表示table-name472k的组件值146被一起使用的组件值或直接依赖于表示table-name472k的组件值146的组件值,或
[0601] 2.与表示table-name472k的组件值146一起被使用的组件值或直接依赖于表示table-name472k的组件值146的组件值需要以下述方式被构造:如果表示table-name472k的组件值146不被用于构建一条期望的查询语句,则上述的这些与表示table-name472k的组件值146一起被使用的组件值或直接依赖于表示table-name472k的组件值146的组件值也不被用于构建一条期望的查询语句。
[0602] 数据令牌colUseCnd518,其为数据令牌152的一个示例,由一个字符串类型的令牌值154所表示,该数据令牌colUseCnd518为:
[0603] 1.一个NULL值,或
[0604] 2.一个空字符串,或
[0605] 3.一个字符串值,或
[0606] 4.一串以逗号分隔的字符串值,其中包括至少两个字符串值。
[0607] 表示colUseCnd518的一个令牌值154,可被关联到表示fldAla472c的一个组件值146,fldAla472c为不确定的源组件148的一个示例,fldAla472c与一个参数prmUseCnd622的一个参数值162一起被处理,prmUseCnd622为一个参数160的一个示例。对表示colUseCnd518的令牌值154的处理结果用于确定组件值146是否用于构建一条期望的查询语句,该处理结果为令牌结果156的一个示例,而该组件值146用于表示fldAla472c。表示colUseCnd518的令牌值154可在以下时机被处理:
[0608] 1.获取表示fldAla472c的一个组件值146时,和/或
[0609] 2.构建一条期望的查询语句时。
[0610] colUseCnd518基于以下数据令牌规则集合158而被处理:
[0611] 1.表示fldAla472c的一个组件值146在以下条件下被使用:
[0612] a.表示colUseCnd518的一个令牌值154为一个空字符串或一个NULL值,该令牌值154也被关联到表示fldAla472c的组件值146,或
[0613] b.表示colUseCnd518的一个令牌值154包括至少一个字符串值,这些字符串值也被prmUseCnd622的参数值162所包含,该令牌值154也被关联到表示fldAla472c的组件值146。例如,如果表示colUseCnd518的一个令牌值154为“abc,xyz”,该令牌值154也被关联到表示fldAla472c的组件值146,而prmUseCnd622的参数值162为“nop,xyz”,从而字符串值“xyz”被表示colUseCnd518的令牌值154和prmUseCnd622的参数值162所包含,则表示fldAla472c的组件值146将被用于构建一条期望的查询语句。又例如,如果表示colUseCnd518的一个令牌值154为“abc”,该令牌值154也被关联到表示fldAla472c的组件值146,而prmUseCnd622的参数值162为“abc,xyz”,从而字符串值“abc”被表示colUseCnd518的令牌值154和prmUseCnd622的参数值162所包含,则表示fldAla472c组件值
146将被用于构建一条期望的查询语句。被逗号分隔的单个字符串值之间总是进行比较,这种比较不区分大小写。
[0614] 2.表示fldAla472c的组件值146在以下条件下不被使用:
[0615] a.prmUseCnd622的参数值162为一个空字符串或一个NULL值,但表示colUseCnd518的且被关联到表示fldAla472c的组件值146的令牌值154包括至少一个字符串值,或
[0616] b.表示colUseCnd518的且也被关联到组件值146的令牌值154不包括prmUseCnd622所包括的字符串值,该组件值146用于表示ldAla472c。例如,如果表示colUseCnd518的且也被关联到组件值146的令牌值154为“abc,xyz”,该组件值146用于表示fldAla472c,而prmUseCnd622的参数值162为“nop,rst”,则字符串值“abc”和字符串值“xyz”都不被prmUseCnd622的参数值162所包括,从而表示fldAla472c的组件值146将不被用于构建期望的查询语句。被逗号分隔的单个字符串值之间总是进行比较,而这种比较不区分大小写。
[0617] 为了colUseCnd518的实现,以下内容是强制性的:
[0618] 1.表示colUseCnd518的且也被关联到表示fldAla472c的组件值146的令牌值154必须关联到所有组件值,这些组件值指的是与表示fldAla472c的组件值146被一起使用的组件值或直接依赖于表示fldAla472c的组件值146的组件值,或
[0619] 2.与表示fldAla472c的组件值146一起被使用的组件值或直接依赖于表示fldAla472c的组件值146的组件值需要以下述方式被构造:如果表示fldAla472c的组件值146不被用于构建期望的查询语句,则上述的这些与表示fldAla472c的组件值146一起被使用的组件值或直接依赖于表示fldAla472c的组件值146的组件值也不被用于构建期望的查询语句。
[0620] 数据令牌colReuse520,作为数据令牌152的一个示例,由一个布尔类型的令牌值154所表示,该colReuse520可包括以下三个可能的令牌值中的一个:True、False和NULL。
colReuse520与表示另一个数据令牌tknMonth524的一个令牌值154一起被使用。
colReuse520将被关联到表示fldAla472c的一个组件值146。colReuse520使得
queryBuilder可识别表示fldAla472c的一个组件值146,且colReuse520被要求基于tknMonth524的令牌结果156产生多个组件值146n,tknMonth524与表示fldAla472c的组件值相关联,其中tknMonth524的令牌结果156通过处理令牌值154而获得,该令牌值154用于表示tknMonth524。
[0621] 为了实现colReuse520,与表示fldAla472c的组件值146一起使用的组件值或直接依赖于表示fldAla472c的组件值146的组件值将必须以下述方式而构造:所有与表示fldAla472c的组件值一起使用的组件值和直接依赖于表示fldAla472c的组件值的组件值可与表示fldAla472c的组件值146一起被产生。
[0622] 数据令牌tknAlias522,作为一个数据令牌152的一个示例,由一个令牌值“!”所表示,该令牌值即为一个不包括引号的惊叹号,正如针对tknAlias522的数据令牌规则集合158所规定的。针对tknAlias522的数据令牌规则集合158也规定tknAlias522隐含地与源组件table-name472k相关联,关联的方式为:针对表示table-name472k的每一个新的组件值
146,tknAlias522用于产生一个新的且唯一的表格/视图别名,该别名包括一个或多个字母。既然与tknAlias522的关联是隐含的,因此“!”(不包括引号的惊叹号)不会与表示table-name472k的任何组件值146一起使用。
[0623] tknAlias522可确定srcAla472e的一个组件值146,srcAla472e为一个不确定的组件值148。
[0624] tknAlias522也可与表示fldNamCol472b和/或fldXpr472d一个组件值146关联,这种关联通过将“!”(不带引号的惊叹号)嵌入到表示fldNamCol472b和/或fldXpr472d的一个组件值146中来达成。在处理过程中,依据图4B至4R所示的预定义规则,“!”(不带引号的惊叹号)将被一个表格/视图别名所替换,该表格/视图别名跟随着一个句号(.),该句号(.)是为表示fldNamCol472b和/或fldXpr472d的一个组件值146而产生的,且该句号(.)为表示fldNamCol472b和/或fldXpr472d的组件值146的源表格/视图。例如,如果对于tblA,表示table-name472k的一个组件值146为“b”(不带引号的小写b),其中table-name472k为一个表格/视图别名,且table-name472k作为表示tknAlias522的一个令牌值154的处理结果而产生,则以下内容演示一些组件值示例,这些组件值与组件值tblA有关且用于表示fldNamCol472b和/或fldXpr472d,且这些组件值也与“!”(不带引号的惊叹号)相关联:
[0625] 1.在对“!”(不带引号的惊叹号)进行处理后,一个组件值“!fld_01”将会变成“b.fld_01”,
[0626] 2.在对“!”(不带引号的惊叹号)进行处理后,一个组件值“!fld_01+!fld_02”将会变成“b.fld_01+b.fld_02”,
[0627] 3.在对“!”(不带引号的惊叹号)进行处理后,一个组件值“!fld_04+INT(fld_05)-!fld_06”将会变成“b.fld_04+INT(fld_05)–b.fld_06”,以及
[0628] 4.在对“!”(不带引号的惊叹号)进行处理后,一个组件值“fld_09”还是“fld_09”,因为“!”(不带引号的惊叹号)没有嵌入在“fld_09”中。
[0629] 数据令牌tknMonth524,作为数据令牌152的一个示例,用于创建表示fldNamCol472b、fldAla472c和/或fldXpr472d的一个或多个组件值。tknMonth524基于表示colReuse520的一个令牌值154和参数prmMthCnt614的参数值162而被处理,prmMthCnt614为一个参数160的一个示例。根据tknMonth524的数据令牌规则158,tknMonth524可以下述两种格式中的一种而被使用:
[0630] 1.%TknMth%,其可被嵌入到表示fldNamCol472b、fldAla472c和/或fldXpr472d的一个组件值中,以及
[0631] 2.%TknMth,argComp,argTrue,argFalse%,tknMonth524附带三个参数:argComp、argTrue和argFalse。tknMonth524的这种格式只可被嵌入到表示fldNamCol472b和/或fldXpr472d的组件值中。在这种格式中,三个参数argComp、argTrue和argFalse都是强制性的,并且被要求由一个数据值表示,该数据值为一个有效的列/字段名称或为一个有效的表达式。在这种格式中,tknMonth524用于确定以下不确定的源组件的组件值:
[0632] a.IIF471f,
[0633] b.DECODE471n,
[0634] c.fldNamCnd472g,
[0635] d.值472h,
[0636] e.true-结果472i,和
[0637] f.false-结果472j。
[0638] 对tknMonth524的处理基于表示colReuse520的一个令牌值154以及prmMthCnt614的参数值162,prmMthCnt614是参数160的一个示例。
[0639] 针对colReuse520的一个示范性数据令牌规则集合规定:如果表示colReuse520的一个令牌值为一个NULL值或False,或者prmMthCnt614的参数值162为0或未被定义,则tknMonth524基于针对tknMonth524的数据令牌规则集合158的以下部分而被处理:
[0640] 1.如果tknMonth524以%TknMth%的格式被嵌入,%TknMth%为一个令牌值154的一个示例,则%TknMth%将在其被嵌入的地方被一个空字符串所替换。
[0641] 2.如果tknMonth524以%TknMth,colCmpare,colTrue,colFalse%的格式被嵌入,%TknMth,colCmpare,colTrue,colFalse%为一个令牌值154的一个示例,则%TknMth,colCmpare,colTrue,colFalse%将在tknMonth524被嵌入的地方被colTrue所替换。
[0642] 针对colReuse520的数据令牌规则集合158规定:如果表示colReuse520的令牌值154为True,并且prmMthCnt614的参数值162为一个正整数,则表示tknMonth524的令牌值
154按以下方式被处理:表示fldAla472c的组件值146与所有满足条件的组件值一起被用于构建一条期望的查询语句,这些满足条件的组件值为与表示fldAla472c的组件值相关的组件值或依赖于表示fldAla472c的组件值的组件值,在构建期望的查询语句时表示fldAla472c的组件值147被使用的次数与prmMthCnt614的参数值162所规定的相同。为了处理tknMonth524,prmBegMth616的参数值162也被使用,prmBegMth616为一个参数160的一个示例。表示fldAla472c的组件值146与所有的与该表示fldAla472c的组件值146相关的或依赖于该fldAla472c的组件值146的组件值146n一起按照以下方式被处理:所有的这些组件值在构建期望的查询语句时可被使用的次数与prmMthCnt614的参数值162所规定的相同。
tknMonth524基于针对tknMonth524的数据令牌规则集合158的以下部分而被处理:
[0643] 1.如果tknMonth524以%TknMth%的格式被使用,%TknMth%为一个令牌值154的一个示例,则在对表示fldAla472c的组件值进行处理时,每一个重复出现的%TknMth%与所有的与表示fldAla472c的组件值有关的组件值或所有的依赖于表示fldAla472c的组件值的组件值一起,由下一个月份的名称的前三个字母所替换,这里的月份开始于由prmBegMth616的参数值162所表示的月份,而且当达到12月份后又从1月份继续。以下为两个示例:
[0644] a.如果prmMthCnt614的参数值162为4,且prmBegMth616的参数值162为3(3表示起始月份),则表示fldAla472c的组件值与所有的与该表示fldAla472c的组件值相关的组件值或所有的依赖于该表示fldAla472c的组件值的组件值一起将在期望的查询语句中被使用4次,而且%TknMth%在所有的组件值中将被替换为:
[0645] i.Mar(3月的英文名称的前三个字母),在组件值被第一次使用时,
[0646] ii.Apr(4月的英文名称的前三个字母),在组件值被第二次使用时,
[0647] iii.May(5月的英文名称的前三个字母),在组件值被第三次使用时,以及[0648] iv.Jun(6月的英文名称的前三个字母),在组件值被第四次使用时。
[0649] b.如果prmMthCnt614的参数值162为5,且prmBegMth616的参数值162为11(11表示起始月份),则表示fldAla472c的组件值与所有的与该表示fldAla472c的组件值有关的组件值或所有的依赖于该表示fldAla472c的组件值的组件值一起将在期望的查询语句中被使用5次,而且%TknMth%在所有的组件值中将被替换为:
[0650] i.Nov(11月的英文名称的前三个字母),在组件值被第一次使用时,
[0651] ii.Dec(12月的英文名称的前三个字母),在组件值被第二次使用时,
[0652] iii.Jan(1月的英文名称的前三个字母),在组件值被第三次使用时,
[0653] iv.Feb(2月的英文名称的前三个字母),在组件值被第四次使用时,和
[0654] v.Mar(3月的英文名称的前三个字母),在组件值被第五次使用时。
[0655] 2.如果tknMonth524以%TknMth,argComp,argTrue,argFalse%的格式被使用,%TknMth,argComp,argTrue,argFalse%为一个令牌值154的一个示例,则在对表示fldAla472c的组件值进行处理时,每一个重复出现的%TknMth,argComp,argTrue,argFalse%与所有的与表示fldAla472c的组件值有关的组件值或所有的依赖于表示fldAla472c的组件值的组件值一起,由一个IIF471f函数或一个DECODE471n函数所替换,IIF471f函数或DECODE471n函数依赖于期望的查询语句所为之构建的数据库。在IIF471f函数和DECODE471n函数中,argComp被与一个值进行比较,在表示fldAla472c的组件值第一次重复使用时该值与prmBegMth616的参数值162相等,且在表示fldAla472c的组件值每下一次使用时该值被增加1,其中,表示fldAla472c的组件值与所有的与表示fldAla472c的组件值相关的组件值或依赖于表示fldAla472c的组件值的组件值一起被重复使用。上述的值当超过12时又总是重新从1开始。以下为两个示例:
[0656] a.如果prmMthCnt614的参数值162为4,prmBegMth616的参数值162为3,并且tknMonth524由%TknMth,colCmpare,colTrue,colFalse%所表示,则%TknMth,colCmpare,colTrue,colFalse%将由以下内容所替换:
[0657] i.对于MICROSOFT ACCESS:
[0658] 1)IIF(colCompare=3,colTrue,colFalse)
[0659] 2)IIF(colCompare=4,colTrue,colFalse)
[0660] 3)IIF(colCompare=5,colTrue,colFalse)
[0661] 4)IIF(colCompare=6,colTrue,colFalse)
[0662] ii.对于ORACLE:
[0663] 1)DECODE(colCompare,3,colTrue,colFalse)
[0664] 2)DECODE(colCompare,4,colTrue,colFalse)
[0665] 3)DECODE(colCompare,5,colTrue,colFalse)
[0666] 4)DECODE(colCompare,6,colTrue,colFalse)
[0667] b.如果prmMthCnt614的参数值162为5,prmBegMth616的参数值162为11,并且tknMonth524由%TknMth,colCmpare,colTrue,colFalse%所表示,则%TknMth,colCmpare,colTrue,colFalse%将由以下内容所替换
[0668] i.对于MICROSOFT ACCESS:
[0669] 1)IIF(colCompare=11,colTrue,colFalse)
[0670] 2)IIF(colCompare=12,colTrue,colFalse)
[0671] 3)IIF(colCompare=1,colTrue,colFalse)
[0672] 4)IIF(colCompare=2,colTrue,colFalse)
[0673] 5)IIF(colCompare=3,colTrue,colFalse)
[0674] ii.对于ORACLE:
[0675] 1)DECODE(colCompare,11,colTrue,colFalse)
[0676] 2)DECODE(colCompare,12,colTrue,colFalse)
[0677] 3)DECODE(colCompare,1,colTrue,colFalse)
[0678] 4)DECODE(colCompare,2,colTrue,colFalse)
[0679] 5)DECODE(colCompare,3,colTrue,colFalse)
[0680] 数据令牌tknCurlyBrackets526,作为一个数据令牌152的一个示例,可被嵌入到不确定的源组件whrXpr472a的组件值146中。数据令牌tknCurlyBrackets526由大括号所表示,该大括号成对使用,包括:一个左大括号“{”(不包括引号)和一个右大括号“}”(不包括引号),左大括号和右大括号都为tknCurlyBrackets526的一个令牌值154的示例。左大括号总是在右大括号的左边。大括号可以嵌套。
[0681] 图5B和5C演示了一个示范性流程图,该流程图诠释了一个数据令牌规则集合158的一个示例,该数据令牌规则集合158规定了tknCurlyBrackets526的一个示范性的处理逻辑。然而,该示范性流程图没有提供任何对tknCurlyBrackets526进行错误检查和/或错误使用的方式;整个示范性流程图假定tknCurlyBrackets526被正确地使用。
[0682] tknCurlyBrackets526的处理逻辑从步骤550a开始。
[0683] 在步骤550b中,在流程图中被表示为“一个目标字符串”的whrXpr472a被赋值给一个变量EmbStr。在这个例子中,tknCurlyBrackets526可只在表示whrXpr472a的一个组件值中被使用。然而,tknCurlyBrackets526可在任何其它字符串类型的组件值中被使用,在被要求和/或期望的情况下。
[0684] 在步骤550c中,EmbStr中从左边数起的最后一个“{”(不包括引号)出现的位置被存储在变量Pos1中。
[0685] 步骤550d检查“{”(不包括引号)的最后一次出现是否被找出。如果“{”(不包括引号)的最后一次出现未被找出,则流程进入步骤550e。否则,流程进入步骤550f。以下两种情况下“{”(不包括引号)的最后一次出现将不会在EmbStr中被找到(假定大括号没有被错误使用):
[0686] 1.表示tknCurlyBrackets526的一个令牌值154在whrXpr472a中未被使用。
[0687] 2.tknCurlyBrackets526的处理已经完成。
[0688] 在步骤550e中,EmbStr被返回并且对tknCurlyBrackets526的处理被完成。
[0689] 在步骤550f中,从左边数起位于Pos1后面的第一个“}”的出现位置被定位出来并被赋值给变量Pos2。
[0690] 在步骤550g中,Pos1和Post2之间的字符串(不包括Pos1和Pos2所在位置的字符)被赋值给变量DtaTkn。
[0691] 在步骤550h中,承载了一个数据令牌的一个令牌值的DtaTkn以一种期望的方式被处理,被DtaTkn所承载的令牌值的处理结果被赋值给变量TknResult。在这个特定的例子中,一个参数将成为DtaTkn所承载的令牌值的一个处理结果。如果对应于DtaTkn的令牌值参数被找出,则TknResult将包括被找出的参数。否则,TknResult将不包括一个NULL值。
[0692] 在步骤550i中,变量Pos3被赋值为(Pos2+1)的值。
[0693] 在步骤550j中,检查EmbStr中Pos3所在位置的字符是否为“}”(不包括引号)。若EmbStr中Pos3所在位置的字符是否为“}”,则流程进入步骤550k。否则,流程进行步骤550l。
[0694] 在步骤550k中,EmbStr中从左边数起位于Pos1之前的最后一个“{”(不包括引号)的位置被赋值给变量Pos4。
[0695] 在步骤550l中,检查TknResult是否承载了一个Null值。如果TknResult承载了一个Null值,则流程进行步骤550m。否则,流程进入步骤550n。
[0696] 在步骤550m中,TknResult被赋值为“1=1”(不包括引号)的值。
[0697] 在步骤550n中,EmbStr中Pos1至Pos2的字符串(包括Pos1和Pos2)被替换为TknResult所承载的值。
[0698] 步骤550o中,检查TknResult是否承载了一个NULL值。如果检查TknResult承载了一个NULL值,则流程进行步骤550p,否则,流程进入步骤550q。
[0699] 在步骤550p中,TknResult被赋值为“1=1”(不包括引号)的值。
[0700] 在步骤550r中,EmbStr中从Pos4至Pos3的字符串(包括Pos4和Pos3)被替换为TknResult所承载的值。
[0701] 在步骤550q中,Pos3所在位置的字符被替换为一个空格字符。
[0702] 在步骤550s中,Pos4所在位置的字符被替换为一个空格字符。
[0703] 在步骤550t中,EmbStr中从Pos1至Pos2的字符串(包括Pos1和Pos2)被替换为TknResult所承载的值。
[0704] 数据令牌tknItemCodeBegin528与参数prmItmBeg624的参数值162一起被处理。tknItemCodeBegin528的一个示范性的数据令牌规则集合指出:tknItemCodeBegin528由“itmBeg”(不包括引号)所表示,且仅可被嵌入到表示whrXpr472a的一个组件值中。在被处理过程中,“itmBeg”(不包括引号)被替换为prmItmBeg624的参数值162。
[0705] 一个数据令牌tknItemCodeEnd530与一个参数prmItmEnd626的一个参数值一起被处理。tknItemCodeEnd530的一个示范性数据令牌规则集合规定:tknItemCodeEnd530被替换为“itmEnd”(不包括引号)且只能被嵌入到表示whrXpr472a的一个组件值中。在被处理过程中,“itmEnd”(不包括引号)被替换为prmItmEnd626的参数值162。
[0706] 图6演示了用于构建一条期望的查询语句的一些示范性参数。每一个参数被赋予一个随意的名称以便于解释和参考。对这些示范性参数给出的名称不影响本发明的构思、原理和/或方法的实现。图6演示了以下示范性参数:
[0707] 1.参数prmQryId612,作为一个参数160的一个示例,为字符串类型。prmQryId612的参数值162用于标识一个源对象,该源对象被要求用于构建一条期望的查询语句。
[0708] 2.参数prmMthCnt614,作为一个参数160的一个示例,为数字类型。prmMthCnt614的参数值162规定了用于处理表示tknMonth524的一个令牌值的月份数量。prmMthCnt614的参数值162可以是一个从0至12的整数,包括0和12。
[0709] 3.参数prmBegMth616,作为一个参数160的一个示例,为数字类型。prmBegMth616的参数值162用于规定起始月份,该起始月份用于处理表示tknMonth524的一个令牌值。prmBegMth616的参数值可以是从1至12的整数,包括1和12。
[0710] 4.参数prmOraQry618,作为一个参数160的一个示例,为布尔类型。prmOraQry618的参数值162用于确定一条期望的查询语句所为之构建的数据库。如果prmOraQry618的参数值162为Ture,则该期望的查询语句为ORACLE而构建。否则,该期望的查询语句为MICROSOFT ACCESS而构建。
[0711] 5.参数prmLftJoi620,作为一个参数160的一个示例,为布尔类型。prmLftJoi620的参数值162用于确定JOIN的类型,该JOIN在一条期望的查询语句中将被使用。如果prmLftJoi620的参数值162为True,则期望的查询语句中的所有连接操作(join)都将被轮换成左连接(LEFT join)。否则,期望的查询语句中的所有联合(join)都将被轮换成I内连接(INNER join)。prmLftJoi620的参数值162用于确定以下不确定的源组件的组件值:
[0712] a.INNER471h,
[0713] b.LEFT471i,
[0714] c.加号471m
[0715] 6.参数prmUseCnd622作为一个参数160的一个示例,为字符串类型。prmUseCnd622的参数值162用于处理一个令牌值,该令牌值表示srcUseCnd516和/或colUseCnd518。
[0716] 7.参数prmItmBeg624,作为一个参数160的一个示例,为字符串类型。prmItmBeg624的参数值162用于处理“itmBeg”(不包括引号),itmBeg为表示
tknItemCodeBegin528的一个令牌值。
[0717] 8.参数prmItmEnd626,作为一个参数160的一个示例,为字符串类型。prmItmEnd626的参数值162用于处理“itmEnd”(不包括引号),itmEnd为表示
tknItemCodeEnd530的一个令牌值。
[0718] 图7A演示了一个示范性数据模型164的一些示范性的属性(也可称作列或字段),该示范性数据模型164图示于图7B中。基于本发明的一个实施例的一个方面,这些示范性的属性包含于一个源对象窗口中以容纳一些不确定的源组件的组件值,这些不确定的源组件为图4S中演示的所有不确定的源组件的一部分,且这些不确定的源组件的组件值不能通过使用一个参数值160和/或一个数据令牌152而被确定。
[0719] 图7A所示的属性被赋予随意的名称以用于解释和参考。对这些属性所赋予的名称不影响本发明的原理的实现。图7A演示了以下属性:
[0720] 1.属性qryWhr752用于存储和确定以下不确定的源组件的一个组件值146:
[0721] a.WHERE471a,和
[0722] b.whrXpr472a
[0723] 2.属性srcId754用于存储和确定以下不确定的源组件的一个组件值146:
[0724] a.表格名称472k,和
[0725] b.JOIN471j。
[0726] 3.属性srcJoinFld756用于存储和确定fldAla1472m的一个组件值146,fldAla1472m为一个不确定的源组件148的一个示例。
[0727] 4.属性srcJoinToFld758用于存储和确定fldAla2472p的一个组件值146,fldAla2472p为一个不确定的源组件148的一个示例。
[0728] 5.属性srcJoinToSrc760用于存储和确定srcAla2472n的一个组件值146,srcAla2472n为一个不确定的源组件148的一个示例。
[0729] 6.属性colAla762用于存储和确定fldAla472c的一个组件值146,fldAla472c为一个不确定的源组件148的一个示例。
[0730] 7.属性colXpr764用于存储和确定以下不确定的源组件的一个组件值146:
[0731] a.fldNamCol472b,和
[0732] b.fldXpr472d
[0733] 8.属性colGrpFun766用于存储和确定以下不确定的源组件的一个组件值146:
[0734] a.fldAlaGrp471e,
[0735] b.SUM471g,和
[0736] c.fldXpr472d
[0737] 图7B演示了一个数据模型,该数据模型为一个数据模型164的一个示例,且该数据模型用于创建一个示范性的源对象容器168,该示范性的源对象容器用于存储一个或一个以上的源对象以及一个或一个以上的嵌入的令牌值,这些令牌被要求用于构建一条期望的查询语句。该示范性的源对象容器168基于示范性的数据模型164而被创建,其可通过使用一个或一个以上的数据结构而被创建,这些数据结构可能包括但不限于:一个多维数据库、一个平面文件数据库、一个传统的数据库、一个数组、一个矩阵、一张电子数据表、一个类、一个以逗号分隔的文件和一个变量。上述示范性数据模型164按照以下方式被创建:创建一个示范性的源对象容器168是足够的,且该示范性的源对象容器168足够用于:
[0738] 1.存储一个或多个需要的源对象为结构化数据和/或半结构化数据,
[0739] 2.从一个或多个期望的源对象中识别并获取一个需要的源对象,
[0740] 3.以需要的方式在图4S所示的所有不确定的源组件之间维护一个期望的层次和/或一个期望的关系,
[0741] 4.在属于srcld754的一个或多个组件值之间维护一个期望的顺序。
[0742] 5.在属于colAla762的一个或多个组件值之间维护一个期望的顺序。
[0743] 6.将图5A所示的所有数据令牌的令牌值与一个或多个源组件的一个或多个源组件值进行隐含的和/或明确的关联,其中的源组件由图7A演示的属性所表示,以及[0744] 7.使用一个源对象和/或另一个源对象中的一个期望的部分。
[0745] 上述示范性的数据模型164包括以下三项:
[0746] 1.Query702。
[0747] 2.Query Source704。
[0748] 3.Query Field706。
[0749] Query702为最高层的实体,该实体包括足够用于标识一个源对象的信息,以及包括可适用于整条查询语句的信息。Query702包括以下属性:
[0750] 1.qryId732,
[0751] 2.qryWhr752,
[0752] 3.qryGrp512,和
[0753] 4.qryUni514。
[0754] qryld732为一个示范性的属性,该属性在query702中用于标识一个特定的源对象。qryld732作为一个主键被用于唯一标识每一个源对象。在query702中,qryld732被当作一个字符串来执行,qryld732可能包括任何有效的字符串类型的数据值。既然qryId732仅用于标识和引用一个源对象,因此存储于qryId732中的数据值没有特定的规则。然而,在这个例子中,存储于qryld732中的组件值相对于每一个源对象必须是唯一的,且存储于qryld732中的数据值可能只包括可印刷的字符。在本示范性实施例中,qryld732为字符串类型;然而,其可以是其它任何足以实现一个主键的数据类型,例如,一个长整型、一个短整型、一个全局唯一标识符(GUID,Globally Unique Identifier)等等。
[0755] 在本示范性数据模型中,qryWhr752用于存储一个WHERE子句表达式。qryWhr752为字符串类型,其长度足够存储任何期望的WHERE子句表达式以及一个或多个表示tknCurlyBrackets526、tknItemCodeBegin528和/或tknItemCodeEnd530的令牌值。存储于qryWhr752中的组件值为一个字符串,该字符串:
[0756] 1.被嵌入到一个或多个以下内容中,该嵌入为可选的:
[0757] a.表示tknCurlyBrackets526的一个令牌值,
[0758] b.表示tknItemCodeBegin528的一个令牌值,
[0759] c.表示tknItemCodeEnd530的一个令牌值,
[0760] d.以上内容的任意结合,和
[0761] 2.如所期望的一样成为MICROSOFT ACCESS和/或ORACLE的一个有效的WHERE子句表达式,在所有令牌值被处理之后,这些令牌值指的是表示tknCurlyBrackets526、tknItemCodeBegin528和/或knItemCodeEnd530的令牌值,且这些令牌值被嵌入存储在qryWhr752中的组件值中。
[0762] qryGrp512被嵌入query702中,以使得queryBuilder可确定一条期望的查询语句是否为一条汇总查询语句。
[0763] qryUni514被嵌入query702中,以使得queryBuilder可确定一条期望的查询语句是否为一条全连接(UNION ALL)查询语句。
[0764] Query source704为qurey702的子项,query702和query source704之间存在一种一对多的关系712。Query702还与query source704之间存在另一种的一对多的关系714。另一种的一至多个关系714为可选的。Query702包括以下属性:
[0765] 1.srcQryId734,
[0766] 2.srcOrd736,
[0767] 3.srcId754,
[0768] 4.srcReuseId738,
[0769] 5.srcUseCnd516,
[0770] 6.srcJoinFld756,
[0771] 7.srcJoinToFld758,和
[0772] 8.srcJoinToSrc760。
[0773] srcQryId734为在query source704中使用以启用一种一对多的关系的一个示范性的属性。srcQryId734为与query702的qryId732相关的一个外键。在query source704中,srcQryId734作为一个字符串数据类型来执行,其与qryId732的长度是相同的。srcQryId734和srcId754在query source704中作为一个组合主键而发挥作用。
[0774] srcOrd736为在query source704中用于维护多个组件值之间的一个期望的顺序的示范性属性,这些组件值存储在srcld754中。在query source704中,srcOrd736作为一个长整型数据类型而被执行;然而,srcOrd736可作为任何其它的数据类型而被执行,只要这些数据类型足够用于维护存储于srcId754中的多个组件值之间的顺序。这些数据类型可包括但不限于:短整型、字符串类型、浮点类型。
[0775] srcld754用于规定一个表格/视图的名称,该表格/视图被要求用于构建一条期望的查询语句。存储于srcld754中的组件值在一个源对象中必须是唯一的,因为srcld754为query source704的组合主键的一部分。srcld754可由以下内容表示:
[0776] 1.表示一个表格/视图名称的一个组件值,该名称存在于一个数据库中,该数据库将执行一条期望的查询语句,或
[0777] 2.一个随意的视图名称(该名称必须包括本示例中所有可打印的字符),仅当一个数据值表示srcReuseId738。
[0778] srcReuseId738为一个示范性属性,该属性在query source704中用于使得query source704中的另一个源对象可被使用。srcReuseId738为一个外键且可选的包括qryld732的一个值。在本示例中,srcReuseId738不能包括表示其父项qryld732的一个数据值,因为这样的一个数据值在本示范性数据模型中将造成一个无限递归循环。一对多的关系714通过使用qryId732和srcReuseId738来实现。
[0779] srcUseCnd516被嵌入query source704中。如果对srcUseCnd516所包括的令牌值的处理确定了srcId754不能被用于构建一条期望的查询语句,则包括srcUseCnd516的令牌值和srcId754的数据值的整条记录,包括所有的子记录,将不能用于构建一条期望的查询语句。
[0780] srcJoinFld756、srcJoinToFld758和srcJoinToSrc760用于具体化连接两个表格、连接两个视图或连接一个表格和一个视图所需要的信息。srcJoinFld756用于具体化属于一个表格/视图的一个字段别名,该表格/视图由当前记录的srcId754所具体化。srcJoinToFld758用于具体化属于另一个表格/视图的一个字段别名,该另一个表格/视图将与由当前记录的srcld754所具体化的表格/视图相连接,且该另一个表格/视图被表示srcJoinToSrc760的组件值具体化。在本示范性实施例中,自连接不被执行。
[0781] Query field706为query source704的一个子项,其中query source704与query field706存在一对多的关系716。Query field706包括以下属性:
[0782] 1.colQryId740,
[0783] 2.colSrcId742,
[0784] 3.colOrd744,
[0785] 4.colAla762,
[0786] 5.colXpr764,
[0787] 6.colUseCnd518,
[0788] 7.colGrpFun766,和
[0789] 8.colReuse520。
[0790] colQryId740和colSrcId742为在query field706中用于启用一对多的关系716的两个示范性的属性。colQryId740和colSrcId742为分别与srcQryId734和srcId754相关的外键。colQryId740和colSrcId742通过使用一个字符串数据类型而被实现,且分别与srcQryId734和srcId754的长度相同。colQryId740、colSrcId742和colAla762在query field706中作为一个组合主键而发挥作用。
[0791] colOrd744为一个示范性的属性,该属性用于在query field706中维护多个组件值之间的一种期望的顺序,这些组件值存储在colAla762中。在query field706中,colOrd744作为一个长整型数据类型而被执行;然而,colOrd744可作为任何其它的数据类型而被执行,只要这些数据类型足够用于在多个组件值中维护一种期望的顺序即可,其中的组件值存储在colAla762中。这些数据类型可包括但不限于短整型类型、字符串类型和浮点类型。
[0792] colAla762用于为一条期望的查询语句具体化一个有效的列/字段别名。colAla762在本示范性数据模型中作为一个字符串类型而被执行。存储于colAla762中的一个组件值也可以被%TknMth%嵌入其中,%TknMth%为表示tknMonth524的一个令牌值。该存储在colAla762中的组件值在一个源对象中相对于它们的父组件值必须是唯一的,因为colAla762为query source704的组合主键的一部分。
[0793] colXpr764用于为一条期望的查询语句具体化一个有效的表达式。colXpr764在本示范性数据模型中作为一个字符串类型而被执行。存储在colAla762中的一个组件值也可被以下内容嵌入其中:
[0794] 1.表示tknMonth524的一个或多个令牌值,和/或
[0795] 2.表示tknAlias522的一个或多个“!”(惊叹号,不包括引号)。
[0796] colUseCnd518被嵌入到query field706中。如果对包括于colUseCnd518中的令牌值的处理确定了colAla762不能用于构建期望的查询语句,则包括colUseCnd518的令牌值和colAla762的组件值的整条记录将不能用于构建期望的查询语句。
[0797] colGrpFun766用于具体化针对于列/字段的SUM函数,这些列/字段被要求在一条期望的查询语句中进行累加,这条期望的查询语句被构建为一条汇总查询语句。在本示范性实施例中,如果colGrpFun766被“SUM”(不包括引号)所表示,则SUM函数应用于存储在colXpr764中的组件值。否则,如果colGrpFun766被“Group”(不包括引号)所表示,则colAla762在GROUP BY子句中被使用,否则存储在colXpr764中的组件值被作为一个表达式且不包含在GROUP BY子句中。在本示范性实施例中,仅阐述了SUM函数的使用;然而,colGrpFun766可用于实现任何其它的函数,例如,AVG(平均函数)、MAX(求最大值函数)、MIN(求最小值函数)等等。
[0798] colReuse520被嵌入query field706中,且用于具体化query field706的记录,该query field706被要求复制。
[0799] 图7C演示了示范性数据模型164的一个示范性实现,该示范性数据模型164作为一个示范性源对象窗口168图示于图7B中。Query702被实现为一个tblQry782,tblQry782为一个MICROSOFT ACCESS数据库表。Query source704被实现为一个tblQrySrc784,tblQrySrc784为一个MICROSOFT ACCESS数据库表。Query field706被实现为一个tblQryFld786,tblQryFld786为一个MICROSOFT ACCESS数据库表。
[0800] 图8A至8P演示了一个示范性软件组件构建者170的一个示范性流程图,该示范性组件构建者被实现为一个函数并被称为queryBuilder。queryBuilder用于通过使用一个源对象166构建一条期望的查询语句,该源对象存储于tblQry782、tblQrySrc784和tblQryFld786中,该tblQry782、tblQrySrc784和tblQryFld786为图示于图5A中的数据令牌和图示于图6中的参数。上述的示范性流程图可以任何计算机编程语句实现。在该示范性流程图中使用的变量名称和编程协定不依赖于任何特定的计算机编程语言。然而,该示范性流程图的实现可能需要对一个或多个步骤的一种编程语言的特定解释,这些步骤图示于该示范性流程图中。例如,该示范性流程图中两个或多个字符串值的串联由一个加号来表示,而加号这个操作符在一些编程语句中用&表示。而且,在该示范性流程图中使用的所有的变量名称和函数名称只是示范性的,其可按照期望的和/或要求的进行更改以用于任何特定的实现。
[0801] 在上述示范性流程图中,UNION ALL操作符仅被实现用于子查询语句。
[0802] 在上述示范性流程图中,参数argComp、argTrue和argFalse被象征性的使用。然而,这些参数所包括的值将被使用在任何使用了这些参数的每一个操作中。
[0803] 上述示范性流程图隐含地表示出:每当tknMonth524在一个步骤中被替换,tknMonth524的整条表述,从第一个%(百分号)至最后一个%(百分号),被替换。针对上述示范性流程图,假定仅有一个表示tknMonth524的令牌值被嵌入到一个数据库字段中。
[0804] 在上述示范性流程图中,一个变量被认为是空的如果该变量:
[0805] 1.是空的,或
[0806] 2.包括一个NULL值,或
[0807] 3.包括相对于其数据类型的一个空值,例如,一个空字符串、一个零和一个False。
[0808] 在上述示范性流程图中,除varCalCnt和varMthAry以外的所有变量在模块层被定义,且在对函数queryBuilder进行任何递归调用时,且这些变量连同之前的保持各自的值的变量一起被创建。然而,变量varCalCnt和varMthAry并不在对函数queryBuilder进行递归调用时被初始化。图6中定义的所有参数在全局层被定义,在不在任何递归调用时被初始化。
[0809] 在上述示范性流程图中,双引号被用于识别一个字符串值。在上述示范性流程图中,双引号不会作为字符串的一部分。然而,所使用的单引号都是一个字符串值的一部分。
[0810] 上述示范性流程图不包括任意错误和/或异常处理;其假定所有组件值和令牌值都被正确地提供且在需要的范围内。
[0811] 上述示范性流程图是含义清楚的。然而,为了清楚起见,还是对其中的一些步骤进行了详细的描述。
[0812] 在图8A至8X所示的示范性流程图中,tblQry782、tblQrySrc784和tblQryFld786的字段名称在使用时没有携带它们各自的数字。以下所列的是表示示范性数据模型的属性的上述表格的字段名称:
[0813] 1.qryId732,
[0814] 2.qryWhr752,
[0815] 3.qryGrp512,
[0816] 4.qryUni514,
[0817] 5.srcQryId734,
[0818] 6.srcOrd736,
[0819] 7.srcId754,
[0820] 8.srcReuseId738,
[0821] 9.srcUseCnd516,
[0822] 10.srcJoinFld756,
[0823] 11.srcJoinToFld758,
[0824] 12.srcJoinToSrc760,
[0825] 13.colQryId740,
[0826] 14.colSrcId742,
[0827] 15.colOrd744,
[0828] 16.colAla762,
[0829] 17.colXpr764,
[0830] 18.colUseCnd518,
[0831] 19.colGrpFun766,和
[0832] 20.colReuse520。
[0833] 除了上述的字段名称外,以下的数据令牌、参数和表格名称在图8A至8X所示的示范性流程图中使用时也不携带它们各自的数字:
[0834] 1.prmQryId612,
[0835] 2.prmMthCnt614,
[0836] 3.prmOraQry618,
[0837] 4.prmLftJoi620,
[0838] 5.tblQry782,
[0839] 6.tblQrySrc784,
[0840] 7.tblQryFld786,
[0841] 8.tknMonth524,
[0842] 9.prmBegMth616,和
[0843] 10.prmUseCnd622。
[0844] 在图8A中,函数queryBuilder开始于端点810a。queryBuilder接收针对prmQryId612的一个参数,prmQryId612用于从tblQry782中识别一个期望的源对象。
[0845] 在判定框810b中,检查本次调用是否为对queryBuilder的第一次调用。该检查对于全局变量的一次性初始化是需要的,全量变量指的是varCalCnt和varMthAry,varCalCnt和varMthAry分别在步骤810c和810d中被初始化。如果本次调用为对queryBuilder的第一次调用,则流程进入步骤810c。否则,流程进行步骤810e。
[0846] 在步骤810e中,一个对象varQryRcd被初始化。该对象varQryRcd为ADO Recordset Object的一个示例,其包括关于一个Recordset的信息,该Recordset可通过使用对象varQryRcd而被打开。
[0847] 在步骤810f中,一个对象varSrcRcd被初始化。该对象varSrcRcd为ADO Recordset Object的一个示例,其包括关于一个Recordset的信息,该Recordset可通过使用对象varSrcRcd而被打开。
[0848] 在步骤810g中,一个对象varFldRcd被初始化。该对象varSrcRcd为ADO Recordset Object的一个示例,其包括关于一个Recordset的信息,该Recordset可通过使用对象varSrcRcd而被打开。
[0849] 在步骤810h中,一个数组变量varTblAry被初始化,varTblAry为一个二维数组,该二维数组用于存储srcId754中的组件值以及一个表格/视图别名,该表格/视图别名作为对tknAlias522的处理的结果而产生,为了srcId754。
[0850] 在图8B中,步骤811p和811q对于一条查询语句仅被调用一次;这两个步骤不为子查询而调用。
[0851] 在步骤811p中,varAlaCnt被初始化为0。varAlaCnt用于计算针对tknAlias522的一个别名。
[0852] 在步骤811q中,图6中的所有参数都被解析。这些参数既可通过用户直接输入的数据而被决定,也可从计算机可读存储介质中获取。
[0853] 图8C中,步骤812b,对象varQryRcd被打开,对象varQryRcd包括blQry782的所有字段,qryId732的数据值等于prmQryId612的参数值。由于qryId732为主键,对象varQryRcd将包括最大的一个记录。
[0854] 在步骤812c中,对象varSrcRcd被打开,对象varSrcRcd包括tblQrySrc784的所有字段,srcQryId734的数据值等于qryId732的数据值,且对象varSrcRcd包括的Recordset的顺序基于srcOrd736的数据值。
[0855] 在步骤812f中,varSrcAvl被赋予了srcUseCnd516的令牌值的处理结果。对srcUseCnd516的处理在名为CheckAvailability的一个示范性的函数中进行,CheckAvailability的详细内容图示于图8Q中。如果函数CheckAvailability返回True,则表明由对象varSrcRcd所指向的当前记录将被queryBuilder使用。另一方面,如果函数CheckAvailability返回False,则表明由对象varSrcRcd所指向的当前记录将不被queryBuilder使用。
[0856] 在步骤812l中,tknAlias522被处理。tknAlias522由一个示范性的函数NewAlias()所处理,NewAlias()的详细内容图示于8R中。由函数NewAlias()所产生的别名存储在一个变量varCurAla中。
[0857] 在图8D的步骤813c中,queryBuilder被重复的调用以构建一个子查询,该子查询由srcReuseId738的一个数据值所识别。构建而成的子查询被存储在一个变量varSubQry中。
[0858] 在步骤813i中,对象varFldRcd被打开,对象varFldRcd包括tblQryFld786的所有字段,其中,colQryId740的数据值等于srcQryId734的数据值,colSrcId742的数据值等于srcId754的数据值,且由对象varFldRcd所表示的Recordset的顺序基于colOrd744的数据值。
[0859] 在步骤813m中,varFldAvl被赋予colUseCnd518的被处理的令牌值的一个结果,该结果为令牌结果156的一个示例。对colUseCnd518的令牌值的处理在一个示范性函数CheckAvailability中进行,函数CheckAvailability的详细内容图示于图8Q中。如果函数CheckAvailability返回Ture,则表明由对象varFldRcd所指向的当前记录将被queryBuilder使用。另一方面,如果函数CheckAvailability返回False,则表明由对象varFldRcd所指向的当前记录将不被queryBuilder使用。
[0860] 图8Q演示了对两个数据令牌srcUseCnd516和colUseCnd518的示范性处理过程的示范性流程图,对srcUseCnd516和colUseCnd518的处理过程通过使用示范性函数CheckAvailability而实现。既然对两个数据令牌srcUseCnd516和colUseCnd518的处理逻辑是相同,则两个数据令牌的处理过程由一个函数来实现。
[0861] 在步骤826a中,函数CheckAvailability启动且接收一个参数prmCndTkn,prmCndTkn包括一个参数,该参数或者为表示srcUseCnd516的一个令牌值,或者为表示colUseCnd518的一个令牌值,取决于函数CheckAvailability被调用的位置。
[0862] 在步骤826d中,prmUseCnd622的参数值162作为一个数组存储在一个数组变量varCndPrm中,prmUseCnd622包括一列用于逗号分隔的字符串值或单个字符串值。以下示例演示了prmUseCnd622的内容在varCndPrm中作为一个数组的存储。
[0863] 1.如果prmUseCnd622为空,则varCndPrm将不包括数组项。
[0864] 2.如果prmUseCnd622仅包括一个字符串值,则varCndPrm将包括一个数组项。
[0865] 3.如果prmUseCnd622包括10个用逗号分隔的字符串值,则varCndPrm将包括10个数组项,每一个数组项包括一个字符串值。
[0866] 图8R演示了函数NewAlias()的示范性处理过程的一个示范性流程图,函数NewAlias()用于对tknAlias522进行示范性处理。函数tknAlias522每一次被调用时都返回包括一个或多个字母的一个新的别名。
[0867] 在步骤827a中,函数NewAlias()启动。
[0868] 在步骤827e中,MOD表示模运算,该模运行计算一个变量varWrkCnt的值被16整除之后的余数。
[0869] 在步骤827f中,INT表示一个整型函数,该整型函数仅返回一个数字的整数部分,不对该数字进行四舍五入。
[0870] 在步骤827i中,CHR表示一个函数,该函数返回一个ASCII字符,该ASCII字符由作为一个参数传递给CHR的数字所表示
[0871] 在步骤827k中,函数NewAlias()返回最新计算得到的别名。
[0872] 图8S演示了一个示范性函数WhereClause,该函数WhereClause被queryBuilder用于合并两个WHERE子句。函数WhereClause也使用了一个示范性函数WhereToken,函数WhereToken用于处理knCurlyBrackets526、tknItemCodeBegin528和tknItemCodeEnd530。
[0873] 在步骤828a中,函数WhereClause启动且接收两个参数prmOrgWhr和prmNewWhr,其中prmOrgWhr包括一个已经建造的WHERE子句,该WHERE子句在一些情况下可为一个空字符串,而prmNewWhr可为一个空字符串且其包括一个WHERE子句,该WHERE子句被要求合并到prmOrgWhr中。
[0874] 在步骤828d中,函数WhereToken用于处理tknCurlyBrackets526、tknItemCodeBegin528和tknItemCodeEnd530。
[0875] 图8T至8X演示了对tknCurlyBrackets526、tknItemCodeBegin528和tknItemCodeEnd530的处理一个示范性实现的一个示范性流程图,该处理基于图5B和5C所示的处理规则以及针对tknItemCodeBegin528和tknItemCodeEnd530制定的处理规则。
[0876] 在图8T的步骤829a中,函数WhereToken启动且接收一个参数prmRawWhr,参数prmRawWhr包括一个WHERE子句,该WHERE子句可能包括表示tknCurlyBrackets526、tknItemCodeBegin528和/或tknItemCodeEnd530的一个或多个令牌值。
[0877] 在图8U的步骤830d中,varResult被替换为:
[0878] 1.prmItmBeg624的参数值162,如果一个变量varTknDta包含“itmBeg”(不包括引号),该“itmBeg”表示tknItemCodeBegin528,或
[0879] 2.prmItmEnd626的参数值162,如果变量varTknDta包含“itmEnd”(不包括引号),该“itmEnd”表示tknItemCodeEnd530,或
[0880] 3.一个NULL值,如果变量varTknDta既不包含“itmBeg”又不包含“itmEnd”(不包括引号),该“itmBeg”表示tknItemCodeBegin528,该“itmEnd”表示tknItemCodeEnd530。
[0881] 图9A至9O演示了一些示范性源对象,这些源对象存储于源对象容器tblQry782,、tblQrySrc784和tblQryFld786中,这些源对象容器被queryBuilder用于构建一条期望的查询语句。
[0882] 图9A演示了tblQry782(表示为782a,因为其演示了tblQry782的一个具体的示范性的部分)的一个具体的示范性的部分,tblQry782展示了可被qryA(表示qryId732的一个数据值)识别的一个示范性源对象,下文中qryA被称为示范性源对象qryA,且tblQry782被表示在一条记录901中。示范性源对象qryA可被用于构建一条期望的查询语句。示范性源对象qryA不与任何数据令牌相关联。从而,通过使用示范性源对象qryA而构建的期望的查询语句对于一个具体的数据库将总是相同的。然而,prmOraQry618和prmLftJoi620的参数可以改变构建的查询语句,因为这些参数在构建期望的查询语句的过程中被使用时没有使用任何数据令牌。
[0883] tblQrySrc784(表示为784a,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分包括三条记录,这三条记录与记录901相关。784a中的每一条记录阐明了一个表格的相关信息,该表格将在一条期望的查询语句中使用,该期望的查询语句将通过使用示范性源对象qryA而被构建。784a演示了:
[0884] 1.包括tblItems的一条记录901a
[0885] 2.包括tblBrands的一条记录901b,其中tblBrands将通过使用一个列brandCode而在期望的查询语句中被与tblItems合并,该期望的查询语句通过使用示范性源对象qryA而被构建。
[0886] 3.包括tblOrigins的一条记录901c,其中tblOrigins将通过使用一个列originCode而在期望的查询语句中被与tblItems合并,该期望的查询语句通过使用示范性源对象qryA而被构建。
[0887] 图9B演示了tblQryFld786(表示为786b,因为其演示了tblQryFld786的一个具体的示范性的部分)的一些示范性的记录,tblQryFld786与记录901a相关,记录901a在tblQrySrc784(表示为784b,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中被演示。786b中所演示的记录包括tblItems的列,tblItems由记录901a所包括,记录901a将被包含于一条期望的查询语句中,该期望的查询语句由queryBuilder通过使用示范性源对象qryA而构建。
[0888] 图9C演示了tblQryFld786(表示为786c,因为其演示了tblQryFld786的一个具体的示范性的部分)的一些示范性的记录,tblQryFld786与记录901b相关,记录901b在tblQrySrc784(表示为784c,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中被演示。786c中所演示的记录包括tblBrands的一个列,tblBrands由记录901b所包括,记录901b将被包含于一条期望的查询语句中,该期望的查询语句由queryBuilder通过使用示范性源对象qryA而构建。
[0889] 图9D演示了tblQryFld786(表示为786d,因为其演示了tblQryFld786的一个具体的示范性的部分)的一些示范性的记录,tblQryFld786与记录901c相关,记录901c在tblQrySrc784(表示为784d,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中被演示。786d中所演示的记录包括tblOrigins的一个列,tblOrigins由记录901c所包括,记录901c将被包含于一条期望的查询语句中,该期望的查询语句由queryBuilder通过使用示范性源对象qryA而构建。
[0890] 图9E演示了tblQryFld782(表示为782e,因为其演示了tblQryFld782的一个具体的示范性的部分)的一些示范性的记录,tblQryFld782展示了一个示范性源对象,该示范性源对象对于qryPur(表示qryld732的一个数据值)是可识别的,qryPur在下文中被称为示范性源对象qryPur,且在记录902中被表示。示范性源对象qryPur在另一个源对象中被使用,该另一个源对象对于qryUnion(表示qryId732的一个数据值)是可识别的,qryUnion在下文中被称为示范性源对象qryUnion且演示于图9G中。然而,queryBuilder可仅通过使用示范性源对象qryPur构建一条期望的查询语句。
[0891] tblQrySrc784(表示为784e,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分包括一条记录902a,记录902a与记录902相关。记录902a演示了一个表格,该表格将在一条期望的查询语句中被使用,其中期望的查询语句将通过使用示范性源对象pryPur而被构建,以及/或者该表格将在由queryBuilder通过使用一个源对象而构建的任何其它的查询语句中被使用,该源对象使用了示范性源对象qryPur。
[0892] 在记录902a中,srcUseCnd516由一个示范性的令牌值所表示,该令牌值包括一列由逗号分隔的字符串,这些字符串包括两个字符串值:TknPur和TknZon。srcUseCnd516的使用隐含地表明在构建使用了示范性源对象qryPur的一条期望的查询语句的过程中,记录902a将仅在prmUseCnd622的参数值162包括以下字符串值中的至少一个时被使用:TknPur和TknZon。在记录902a不被使用的情况下,tblQryFld786(表示为786e)的一个示范性的部分所演示的记录也将不被使用。
[0893] 如果记录902a被使用,记录902b才将被使用。如果srcUseCnd516包括一个字符串值TknZon,记录902c才将使用。如果srcUseCnd516包括一个字符串值TknPur,记录902d才将使用。如果srcUseCnd516包括一个字符串值TknSal,记录902e才将使用。字符串值TknSal不包含于记录902a中,因为902a和它的相关记录902b、902c、902d和902e不要求被用于构建一条期望的查询语句,如果srcUseCnd516的参数值162包括字符串值TknSal但不包括字符串值TknPur和TknZon中的任何一个的话。
[0894] 在记录902d和902e中,%TknMth%,作为表示tknMonth524的一个令牌值,被嵌入到表示colAla762的组件值中。
[0895] 在记录902d中,colXpr764包括表示tknMonth524的一个示范性令牌值154:%TknMth,!purchaseMonth,!Amount,0%,其中,表示tknMonth524的令牌值也包括两个“!”(惊叹号,不包括引号)的例子,该“!”为表示tknAlias522的一个令牌值154。本示范性实施例阐述了表示tknAlias522的一个令牌值在表示tknMonth524的另一个令牌值中的一个嵌套。在记录902d的colXpr764中使用的参数purchaseMonth和Amount为tblPurchases的列名称,而0为一个常量。
[0896] 在记录902d和902e中,colReuse520由一个示范性数据值True表示。这隐含地表明记录902d和902e将被使用以构建一条期望的查询语句,如果使用基于colUseCnd518的话,使用的次数与prmMthCnt614的参数值162所规定的一样。如果prmMthCnt614的参数值162为0,则记录902d和902e将只被使用一次。
[0897] 图9F演示了tblQry782(表示为782f,因为其演示了tblQry782的一个具体的示范性的部分)的一个示范性的部分,tblQry782展示了一个示范性的源对象,该源对象对于qrySal(表示qryId732的一个数据值)是可识别的;下文中qrySal被称为示范性的源对象qrySal,且其表示在记录903中。示范性的源对象qrySal在另一个源对象中被使用,该另一个源对象可由示范性的源对象qryUnion识别,qryUnion演示于图9G中。然而,queryBuilder可通过仅使用示范性的源对象qrySal来构建一条期望的查询语句。
[0898] tblQrySrc784(表示为784f,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分包括一条记录903a,记录903a与记录903相关。记录903a演示了一个表格,该表格将在一条期望的查询语句中被使用,该期望的查询语句将通过使用示范性的源对象qrySal而被构建,以及/或者该表格将在任何其它的由queryBuilder通过使用一个源对象构建的查询语句中使用,该源对象指的是使用了示范性的源对象qrySal的源对象。
[0899] 在记录903a中,srcUseCnd516由一个示范性的令牌值所表示,该令牌值包括一列由逗号分隔的字符串,该列字符串包括两个字符串值:TknSal和TknZon。srcUseCnd516的使用隐含地表示:在使用示范性源对象qrySal的一条期望的查询语句的构建期间,记录903a仅当prmUseCnd622的参数值162包括TknSal和TknZon中的至少一个字符串值时才被使用。如果记录903a不被使用,则tblQryFld786(表示为786f,因为其演示了tblQryFld786的一个具体的示范性的部分)的一个示范性部分中演示的记录也将不被使用。
[0900] 如果记录903a被使用,记录903b才将被使用。如果srcUseCnd516包括一个字符串值TknZon,记录903c才将被使用。如果srcUseCnd516包括一个字符串值TknSal,记录903d才将被使用。如果srcUseCnd516包括一个字符串值TknPur,记录903e才将被使用。字符串值TknPur不包括于记录903a中,因为记录903a及其相关的记录903b、903c、903d和903e不被要求用于构建一条期望的查询语句,如果srcUseCnd516的参数值162包括一个字符串值TknPur但不包括TknSal和TknZon中的任何一个的话。
[0901] 在记录903d和903e中,%TknMth%被嵌入到存储于colAla762中的组件值中,%TknMth%为表示tknMonth524的一个令牌值。
[0902] 在记录903e中,colXpr764包括表示tknMonth524一个示范性的令牌值%TknMth,!saleMonth,!Amount,0%,其中表示tknMonth524的令牌值也包括两个“!”(惊叹号,不包括引号)的例子,该“!”为表示tknAlias522的一个令牌值154。本示范性的实施例演示了表示tknAlias522的一个令牌值在表示tknMonth524的另一个令牌值中的一个嵌套。在记录903d的colXpr764中被使用的参数saleMonth和Amount为tblSales的列名称,而0为一个常量。
[0903] 在记录903d和903e中,colReuse520由一个示范性的数据值True所表示。这隐含地表明:记录903d和903e将被用于构建一条期望的查询语句,如果使用基于colUseCnd518的话,使用的次数由prmMthCnt614的参数值所规定的相同。如果prmMthCnt614的参数值为0,则记录903d和903e将只被使用一次。
[0904] 图9G演示了tblQry782(表示为782g,因为其演示了tblQry782的一个具体的示范性的部分)的一个示范性的部分,tblQry782展示了一个示范性的源对象,该源对象对于一个数据值qryUnion是可识别的,qryUnion表示qryId732且存储于记录904中。
[0905] 在记录904中,qryUni514由一个示范性的令牌值True表示,True隐含的表明:通过使用示范性的源对象qryUnion构建的一条期望的查询语句将是一条联合(union)查询语句。记录904有两条相关的记录,该两条相关的记录演示于tblQrySrc784(表示为784g,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中。如果784g的两条示范性的记录,即记录904a和904b,都被使用,则通过使用示范性的源对象qryUnion构建的期望的查询语句将是一条联合(union)查询语句,该联合(union)查询语句将使用UNION ALL操作符。
[0906] 在记录904a中,srcReuseId738由一个数据值qrySal表示,qrySal规定:当记录904a被使用以构建一条期望的查询语句时,示范性的源对象qrySal将被作为一个视图使用。一个数据值qrySale为赋予一条期望的查询语句的一个示范性的随意的名称,其中qrySale表示记录904a的srcId754,期望的查询语句通过使用示范性源对象qrySal而被构建。
[0907] 在记录904b中,srcReuseId738由一个数据值qryPur表示,qryPur规定:当记录904b被使用以构建一条期望的查询语句时,示范性的源对象qryPur将被作为一个视图使用。一个数据值qryPurchase为赋予一条期望的查询语句的一个示范性的随意的名称,其中qryPurchase表示记录904b的srcId754,期望的查询语句通过使用示范性源对象qryPur而被构建。
[0908] 图9H演示了tblQry782(表示为782h,因为其演示了tblQry782的一个具体的示范性的部分)的一个示范性的部分,tblQry782展示了一个示范性的源对象,该源对象对于一个数据值qryGroup是可识别的,qryGroup在下文中被称为示范性的源对象qryGroup,其表示qryId732且存储于记录904中。
[0909] 在记录905中,qryGrp512由一个示范性令牌值True表示,True隐含的表明:通过使用示范性的源对象qryGroup而构建的期望的查询语句将是一条汇总查询语句。记录905有一条相关的记录,该相关的记录演示于tblQrySrc784(表示为784h,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分中,tblQrySrc784由记录905a表示。
[0910] 记录905a有四条相关的记录,这些相关的记录演示于tblQryFld786(表示为786h,因为其演示了tblQryFld786的一个具体的示范性的部分)的一个示范性的部分中。在记录905b和905c中,colGrpFun766由一个组件值“Group”(不包括引号)表示,“Group”隐含地表明:记录905b和905c提及的列将在一条期望的查询语句的GROUP BY子句中使用,该期望的查询语句通过使用示范性的源对象qryGroup而被构建。在记录905d和905e中,
colGrpFun766包括一个示范性的组件值“SUM”(不包括引号),“SUM”隐含地表明:SUM函数将应用于一条期望的查询语句中的记录905d和905e提及的列,该期望的查询语句通过使用示范性的源对象qryGroup而被构建。
[0911] 图9I演示了tblQry782(表示为782i,因为其演示了tblQry782的一个具体的示范性的部分)的一个示范性部分,tblQry782展示了一个示范性的源对象,该源对象对于qryFinal(表示qryId732的一个数据值)是可识别的,qryFinal在下文中被称为示范性的源对象qryFinal,其表示于记录906中。
[0912] 记录906有五个相关的示范性的记录,这些示范性的记录演示于tblQrySrc784(表示为784i,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中,tblQrySrc784由记录906a、906b、906c、906d和906e所表示。演示于784i中的五个相关的示范性的记录表示四个表格和一个视图,该表格和视图可能在一条期望的查询语句中被使用,该期望的查询语句通过使用示范性的源对象qryFinal而被构建。在784i中,906a、906b、906c和906e包括一个表格的一个定义,该表格可能在一条查询语句中使用,该使用基于表示各有关记录的令牌值以及prmUseCnd622的参数值162,该查询语句通过使用示范性源对象qryFinal而被构建。记录906d包括一个视图的一个定义,该视图由“qryGroup”(不包括引号)具体化,qryGroup为表示srcReuseId738的一个数据值,且qryGroup可能基于以下内容而在一条期望的查询语句中被使用:表示其自身的记录的srcUseCnd516的令牌值,以及prmUseCnd622的参数值162;该期望的查询语句通过使用示范性的源对象qryFinal而被构建。
[0913] 图9J演示了tblQryFld786(表示为786j,因为其演示了tblQryFld786的一个具体的示范性的部分)的记录,tblQryFld786与记录906a有关,记录906a演示于tblQrySrc784(表示为784j,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性部分中。演示于786j中的记录具体化了包括于记录906a中的tblItems的列,记录906a可能被使用以构建一条期望的查询语句,该期望的查询语句由queryBuilder通过使用示范性的源对象qryFinal而构建。
[0914] 图9K演示了tblQryFld786(表示为786k,因为其演示了tblQryFld786的一个具体的示范性的部分)的一条记录,tblQryFld786与记录906b相关,记录906b演示在tblQrySrc784(表示为784k,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分中。演示于786k的记录具体化了tblBrands的一个列,tblBrands被记录906b所包括,记录906b可能被使用以构建一条期望的查询语句,该期望的查询语句由queryBuilder通过使用示范性的源对象qryFinal而构建。
[0915] 图9L演示了tblQryFld786(表示为786l,因为其演示了tblQryFld786的一个具体的示范性的部分)的一条记录,tblQryFld786与记录906c相关,记录906c演示在tblQrySrc784(表示为784l,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分中。演示于786l的记录具体化了tblOrigins的一个列,tblOrigins被记录906c所包括,记录906c可能被使用以构建一条期望的查询语句,该期望的查询语句由queryBuilder通过使用示范性的源对象qryFinal而构建。
[0916] 图9M演示了tblQryFld786(表示为786m,因为其演示了tblQryFld786的一个具体的示范性的部分)的一条记录,tblQryFld786与记录906d相关,记录906d演示在tblQrySrc784(表示为784m,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分中。演示于786m的记录具体化了qryGroupSrc的一个列,qryGroupSrc被记录906d所包括,记录906d可能被使用以构建一条期望的查询语句,该期望的查询语句由queryBuilder通过使用示范性的源对象qryFinal而构建。
[0917] 图9N演示了tblQryFld786(表示为786n,因为其演示了tblQryFld786的一个具体的示范性的部分)的一条记录,tblQryFld786与记录906e相关,记录906e演示在tblQrySrc784(表示为784n,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分中。演示于786n的记录具体化了tblZones的一个列,tblZones被记录906e所包括,记录906e可能被使用以构建一条期望的查询语句,该期望的查询语句由queryBuilder通过使用示范性的源对象qryFinal而构建。
[0918] 图9O演示了tblQry782(表示为782o,因为其演示了tblQryFld786的一个具体的示范性的部分)的一个示范性的部分,tblQry782展示了一个示范性的源对象,该源对象可由qryModify(表示qryId732的一个数据值)识别,qryModify下文中被称为示范性的源对象qryModify,其表示于记录907中。
[0919] 在记录907中,qryWhr752由一个示范性的WHERE子句表达式所表示,该示范性的WHERE子句表达式被表示tknCurlyBrackets526、tknItemCodeBegin528和tknItemCodeEnd530的令牌值嵌入其中。记录907有一个相关的示范性的记录,该记录演示于tblQrySrc784(表示为784o,因为其演示了tblQrySrc784的一个具体的示范性的部分)的一个示范性的部分,tblQrySrc784由记录907a表示。
[0920] 记录907a有十个相关的记录,这些记录演示于tblQryFld786(表示为786o,因为其演示了tblQryFld786的一个具体的示范性的部分)的一个示范性的部分中。在记录907b和907c中,colUseCnd518由一个示范性的令牌值“TknItm”(不包括引号)表示,TknItm用于启用记录907b和907c的使用以构建一条期望的查询语句,该期望的查询语句通过使用示范性的源对象qryModify而被构建,qryModify的使用是基于prmUseCnd622的参数值162而可选的。
[0921] 图10A至10Z演示了由queryBuilder通过使用一个或多个源对象而构建的一些示范性的期望的查询语句,queryBuilder演示于图8A至8P中,其中的源对象演示于图9A至9O中。应当指出的是,图10A至10Z仅演示了少量的示范性的查询语句。通过使用参数的不同组合以及源对象而构建的查询语句可以是成百上千的,且可在运行时实时地被构建,所述的参数演示于图6中,所述的源对象演示于图9A至9O中。在现有技术中,如此多的查询语句的构建将需要上百万的工时。
[0922] 图10A演示了一条示范性的期望的查询语句1012a,查询语句1012a由queryBuilder通过使用示范性的源对象qryA和图10A所示的参数而被构建。
[0923] 图10B演示了一条示范性的期望的查询语句1012b,查询语句1012b由queryBuilder通过使用示范性的源对象qryA和图10B所示的参数而被构建。
[0924] 图10C演示了一条示范性的期望的查询语句1012c,查询语句1012c由queryBuilder通过使用示范性的源对象qryA和图10C所示的参数而被构建。
[0925] 图10D演示了一条示范性的期望的查询语句1012d,查询语句1012d由queryBuilder通过使用示范性的源对象qryA和图10D所示的参数而被构建。
[0926] 图10E演示了一条示范性的期望的查询语句1012e,查询语句1012e由queryBuilder通过使用示范性的源对象qryPur和图10E所示的参数而被构建。
[0927] 图10F演示了一条示范性的期望的查询语句1012f,查询语句1012f由queryBuilder通过使用示范性的源对象qryPur和图10F所示的参数而被构建。
[0928] 图10G演示了一条示范性的期望的查询语句1012g,查询语句1012g由queryBuilder通过使用示范性的源对象qryPur和图10G所示的参数而被构建。
[0929] 图10H演示了一条示范性的期望的查询语句1012h,查询语句1012h由queryBuilder通过使用示范性的源对象qryFinal和图10H所示的参数而被构建。
[0930] 图10I演示了一条示范性的期望的查询语句1012i,查询语句1012i由queryBuilder通过使用示范性的源对象qryFinal和图10I所示的参数而被构建。
[0931] 图10J演示了一条示范性的期望的查询语句1012j,查询语句1012j由queryBuilder通过使用示范性的源对象qryFinal和图10J所示的参数而被构建。
[0932] 图10K演示了一条示范性的期望的查询语句1012k,查询语句1012k由queryBuilder通过使用示范性的源对象qryFinal和图10K所示的参数而被构建。
[0933] 图10L演示了一条示范性的期望的查询语句1012l,查询语句1012l由queryBuilder通过使用示范性的源对象qryFinal和图10L所示的参数而被构建。
[0934] 图10N演示了一条示范性的期望的查询语句1012m,查询语句1012m由queryBuilder通过使用示范性的源对象qryFinal和图10M所示的参数而被构建。
[0935] 图10P演示了一条示范性的期望的查询语句1012o,查询语句1012o由queryBuilder通过使用示范性的源对象qryFinal和图10O所示的参数而被构建。
[0936] 图10Q演示了一条示范性的期望的查询语句1012q,查询语句1012q由queryBuilder通过使用示范性的源对象qryModify和图10Q所示的参数而被构建。
[0937] 图10R演示了一条示范性的期望的查询语句1012r,查询语句1012r由queryBuilder通过使用示范性的源对象qryModify和图10R所示的参数而被构建。
[0938] 图10S演示了一条示范性的期望的查询语句1012s,查询语句1012s由queryBuilder通过使用示范性的源对象qryModify和图10S所示的参数而被构建。
[0939] 图10T演示了一条示范性的期望的查询语句1012t,查询语句1012t由queryBuilder通过使用示范性的源对象qryModify和图10T所示的参数而被构建。
[0940] 图10U演示了一条示范性的期望的查询语句1012u,查询语句1012u由queryBuilder通过使用示范性的源对象qryModify和图10U所示的参数而被构建。
[0941] 图10V演示了一条示范性的期望的查询语句1012v,查询语句1012v由queryBuilder通过使用示范性的源对象qryModify和图10V所示的参数而被构建。
[0942] 图10X演示了一条示范性的期望的查询语句1012w,查询语句1012w由queryBuilder通过使用示范性的源对象qryModify和图10W所示的参数而被构建。
[0943] 图10Z演示了一条示范性的期望的查询语句1012y,查询语句1012y由queryBuilder通过使用示范性的源对象qryModify和图10Y所示的参数而被构建。
[0944] 12.对实施例和附图的总结
[0945] 本发明虽然参照一些实施例描述于上文中,但本发明可以多种方式来实施,方式数量过多在此不作赘述,且本发明不应当受限于上述的示范性的实施例,这些示范性的实施例只作为本发明的解释,而这些实施例并不是详尽无遗的。从而,本发明不应该被视为受限于以上的仅以揭露为目的而描述的具体的例子和实施例。对于本领域技术人员而言,在上述方案的教导下,许多的替代方案、修改方案和变更方案将会是显而易见的。因此,本发明旨在涵盖落入权利要求的构思范围内的所有的替代方案、修改方案和变更方案。
[0946] 本发明的实施例可在一个计算机硬件(计算机装置)和/或软件中实现,包括但不限于:任何可存储、获取、处理和/或输出数据的计算机或机器,以及/或者可与其它计算机或机器进行通信的计算机或机器,以及任何类型的软件,例如,图3所示的计算系统环境300。
[0947] 实现上述实施例的一个软件/计算机程序可能被任何计算机可读存储介质提供,也可能被记录在任何易失性和/或非易失性存储器中。实现上述实施例的软件/计算机程序也可从一个传输通信介质传输而来,传输通信介质包括但不限于:一个载波信号和一个光信号,等等。
[0948] 本发明也可以在数字电子电路或者计算机硬件、固件、软件中实现,以及/或者在它们的任意组合中实现。本发明可在有形地包括于一个计算机可读存储设备的一个计算机程序产品中实现,或者本发明可在一台机器中实现以由一个可编程处理器来执行。本发明的方法可由一个可编程处理器来完成,该可编程处理器执行指令各种以完成本发明的功能。
[0949] 所附的权利要求应理解为不仅包括如上字面意义所述的元素及其任意组合,还包括以实质上相同的方式有效的实现相同的功能并获得相同的结果的所有可能的相等同的元素。因此,权利要求应理解为包括以上详细演示和描述的内容、概念上等同的内容以及结合了本发明的基本思想和原理的内容。所附权利要求旨在涵盖实施例的所有的这些特征和有益效果,以及落入权利要求的真实思想和范围内的这些特征和有益效果的等同物。
[0950] 13.本发明的一些有益效果和商业应用
[0951] 本发明的好处和优点很多且很显著,可以很容易地在大多数计算机程序中实现。本发明也有着巨大的商业潜力。基于本发明的任何商业应用拥有的能量和功能将远超出现有技术所能达到的。即使是已经存在的商业产品和应用,例如计算机程序,也可以通过使用本发明而变得非常强大、灵活、具有动态性和丰富的特征、以及有效地耗费成本。本发明的使用将在软件开发领域打开新的视野并开辟一个新的编程示范,给软件开发者和软件使用者都带来益处。
[0952] 显然的,对于本领域技术人员来说,本发明可很容易的应用/使用于软件开发的各个方面,特别是几乎任何已经存在的或新的计算机程序,
[0953] 本发明可促进软件的开发,使得软件组件的开发可方便地基于用户的需求。
[0954] 本发明将极大地简化软件开发。软件开发者当前面临的大多数的复杂问题都将被扫除。这将导致另外一个巨大的益处:对于软件开发人员的相当多的培训将不再需要。从而,人工生产力将得到极大地提高,在资金和时间方面节省了大量的成本。
[0955] 本发明所达到的对软件开发的简化将减少软件开发目前所需要的时间。利用本发明开发一个软件程序所需要的时间将仅占现有技术所需时间的很小的比例。例如:
[0956] 1.通过利用本发明,数据库查询语句的开发可变得如此简单和高效,以致于即使是一个中等大小的计算机程序也可节省成百上千的工时。
[0957] 2.本发明具有创新性的源对象容器可使得软件开发变得如此简单,以致于一个软件开发初学者也可以仅花几分钟就可以生产出优秀的产品,而现有技术中,非常熟练的专业软件开发人员花数月也可能得不到这样的产品。
[0958] 通过使用本发明,创建和处理数据库查询语句的效率将得到极大的提升,而成本耗费也将变得更加合理。针对一个计算机程序的撰写、测试和调试查询语句所花费的成百上千的工时可被节省下来。这将使得对数据库查询语句进行创建、处理、维护、修改以及提供质量保证比起现有技术来变得更加简单。建造查询语句变得特别简单,这尤其对软件开发者特别有益处。
[0959] 源对象容器、软件组件构建者、可复用性、数据令牌和参数这些创新性的概念将使得减少查询语句的数量变为可能,在现有技术中,这些查询语句可能达到成百上千条。一般的,软件开发,尤其是商业智能,可从查询语句的数量减少中获得极大的益处。以下讨论本发明的一些可能性:
[0960] 1.数据库查询语句:本发明可极大地改善对数据库查询语句的创建、测试和调用,在任何使用数据库查询语句的数据库处理系统和/或计算机程序中。
[0961] 2.报表:报表为任何计算机程序的一个重要部分。本发明对于一个报表计算机程序的应用将使得一个计算机可仅从一个源对象产生数以百万计的报表布局以及相应的数据库查询语句。
[0962] 3.数据输入表格:本发明将允许数据输入表格的开发,这些数据输入表格可在运行时定制和/或根据用户需求而定制。这将使得开发商业应用成为可能,这些商业应用跨越一个或拥有不同的法律和环境的多个不同的区域或国家,在一个或多个不同工业中使用及部署。
[0963] 4.业务处理规则:业务处理规则为一个计算程序的最重要部分之一。业务处理规则从一个产业变换到另一个产业,也从一个国家变换到另一个国家。由于这个原因,许多严重依赖业务处理规则的计算机程序,例如薪资处理、税费计算等等,只能根据具体的产业和/或领域来开发。本发明使得开发跨产业及跨领域的程序变为可能。
[0964] 5.软件配置:软件开发中最耗费时间以及缺少资源的工作之一就是根据用户需求进行软件配置。即使是很小的业务应用程序也可能花费数月进行部署。基于本发明构台计算机程序在配置和部署上所花费的时间只占现有技术所花费时间的很小的比例。
[0965] 6.本发明可被简单地应用于一个用户管理系统、一个错误管理系统、一个帮助系统、一个用户界面、一个软件向导,一个游戏引擎,等等。
[0966] 本发明可用于于几乎每一种类型的软件程序和应用程序。因此,将本发明的所有可能的应用都列举出来几乎是不可能的。而以下仅提供一些示范性的商业应用和使用:
[0967] 1.基于商业智能的计算机程序使用了许多的软件组件,例如:一条数据库查询语句、一个报表布局、一个用户界面、一个用户管理系统等等。本发明可应用于所有这些组件。然而,仅仅通过将本发明应用于数据库查询语句和报表布局,商业智能的计算机程序就可变得强大、智能以及经济合算很多倍。本发明将在数据分析和报表领域打开新的可能性,而这是现有技术不可能达到甚至想到的。
[0968] 2.本发明也可被用于将已有商业智能的计算机程序的生产力和功能提高到现有技术不能企及的水平,商业智能的计算机程序例如有水晶报表、康格诺商业智能软件(COGNOS)等等。
[0969] 3.以下为可以在力量、灵活性、动态性和耗费有效性方面从本发明受益的一些软件应用分类:
[0970] a.商业智能。
[0971] b.数据库管理系统。
[0972] c.客户关系管理(CRM,Customer Relationship Management)软件
[0973] d.企业资源规划(ERP,Enterprise Resource Planning)软件
[0974] e.供应链管理(SCM,Supply Chain Management)软件
[0975] f.地理信息系统(GIS,Geographical Information System)软件
[0976] g.数字资产管理(DAM,Digital Asset Management)软件
[0977] h.材料需求规划(MRP,Material Requirements Planning)软件
[0978] i.销售力量自动化(SFA,Sales Force Automation)软件
[0979] j.计算机辅助工程(CAE,Computer Aided Engineering)软件
[0980] k.计算机辅助设计(CAD,Computer Aided Design)软件
[0981] l.旅店管理软件
[0982] m.人力资源管理软件
[0983] n.银行软件
[0984] o.基于网页的应用程序
[0985] p.生产控制系统
[0986] q.过程控制系统
[0987] 本发明使得已经开发的计算机程序及其相关的资源可在另一个计算机程序中按照需要使用多次。本领域技术人员将很快利用这一优势。例如,如果一个查询语句建造引擎(其为一个软件组件构建者)基于本发明而被开发,则该查询语句建造引擎可在任何其它的计算机程序中使用。仅通过将查询语句建造引擎移植到任何其它的平台,由查询语句建造引擎写的所有查询语句就可以很容易地在其它的平台上使用。
[0988] 基于发明而开发的具有创新性的软件组件构建者,可以很容易的用于构建数十亿万亿不同的软件组件,即使软件组件的构建只是根据单个源对象进行。
[0989] 在本发明下,即时可用的软件组件的可复用性和多样性的好处对于几乎所有的软件组件都是有效的,例如,报表、数据输入表格、业务处理规则、错误管理系统、知识库系统、门户网站、计算机游戏,等等。
[0990] 本发明使得小块地开发软件组件变为可能,并可实现块之间独立地互不依赖地测试每一小块。这种可能使得一个软件开发者可按以下方式管理计算机:软件组件的每一块进行独立地开发和测试,并且所有软件组件的块被合并到一起以作为一个单独的软件组件进行工作。这种能力可通过使用具有创新性的源对象容器、数据令牌和一个或多个组件值的可复用性来实现。
[0991] 本发明可创建软件工厂,该软件工厂如真实工厂般运行从而使得软件产业化成为现实
[0992] 现有技术中,大多数计算机程序被开发后需要花费大量的时间、人力和资金资源进行维护。然而,本发明使得软件的维护变得如此方便和简单,这在现有技术中是不可想象的。而且,本发明教导一个软件开发者按以下方式软件:维护已开发是很轻松的,只是一个较小的事情。例如,如果一个按照传统方式开发的计算机程序基于一个数据库表格使用了几百条查询语句,在每一个数据库表格中增加一列则需要成千上万的工时。但是,在基于本发明而开发的一个相似的计算机程序中,这个改变将只需要几分钟的时间。
[0993] 在现有技术中,开发平台独立的软件的能力一直以来都是一个未曾有效解决的挑战。本发明使得这种能力达到了在现有技术中前所未闻的水平。使用本发明可开发出一个软件组件构建者,该软件组件构建者可为许多的平台构建软件组件。例如,作为一个软件组件构建者的一个报表引擎可基于本发明而被开发,则本发明还可根据单个源对象为水晶报表、MICROSOFT ACCESS以及许多其它的报表平台构建报表布局。
[0994] 软件通过使用本发明而开发的软件有效地使用了可用的计算资源。基于本发明而开发的一个计算机程序的存储需求比基于现有技术中惯用的方法开发的相似的计算机程序的存储需求要少很多。而且,对于网络带宽的使用也被优化了,因为基于本发明开发的计算机程序的大小被缩减了很多。因此,在网络环境和/或基于网页的环境中部署基于本发明开发的计算机程序的效率非常高,例如云计算、客户端服务器架构,等等。
[0995] 基于本发明开发的软件在对用户的软件支持方面可节省很多的资源。得益于软件的内在结构,软件可进行高效地升级和维护,并且花费非常低的成本。支持使用本发明开发的计算机程序所需要的资源仅是支持现有技术开发的相似的程序所需要的资源的一小部分。
[0996] 本发明在软件开发中的应用可最小化软件所需的资源以及最大化软件的效率、灵活性和/或输出,而且使得用户在以下方面:(i)软件的行为,(ii)软件的结果,(iii)程序数据的复用性,(iv)软件开发的简单性,和/或(v)上述方面的任意组合,可进行以下操作:(1)精确地控制,(2)动态的改变,和/或(3)以上操作的任意组合;尤其是,以上所有的益处可在运行时进行和/或通过使用一个或多个控制参数实现。
[0997] 基于本发明开发的软件在运行时也可给予用户巨大的能力、灵活性和动态性。使用源对象容器、数据令牌和参数使得已开发的软件可如一个智能的组件构建者一样在运行时立即根据用户需求构建一个软件组件;实际上,用于可根据不断变化且不断增长的业务需求使用已开发的软件。例如,基于本发明,可开发出一个报表系统,该报表系统可即刻根据用户要求产生几乎任何可以想到的数据组合。
[0998] 通过使用本发明,可创建出适合几乎任何未来的需求的计算机程序,只要根据新的/未来的需求适当地改变一个或多个参数或者增加新的组件值、数据令牌和/或参数就可以了。
[0999] 由于基于本发明开发的任何软件都非常容易维护,因为已开发软件的使用年限可延长许多年。
[1000] 概括地说,本发明是一个独特的具有突破性的发展。它将在软件开发过程中特别是在运行时,向软件开发者和使用者提供全面的灵活性和活力。