哪位大虾研究过Compiere,小弟请教一问题,先谢过~~~~

时间:2023-01-19 17:57:17
不知道有没有哪位大虾研究过Compiere,它里面的org.compiere.model.*;这个包里面的东东大致是怎样运作的,CalloutEngine,MTab,MField,MWindow..........,这些这些,谁能说个大概的原理,谢谢!!!

10 个解决方案

#1


顶~~~~~~~~~~~~~~~~~~~~~

#2


呵呵,要看懂这些类,一定要好好看看它们后面对应的数据结构,首先MTable对应于好像AD_Table这个表,一个表对应一个Tab,几个Tab对应一个窗口,一个Tab里面有一个JTable,里面放的是MFiled,对应于AD_Field,还有一个AD_Column,没时间了,明天再说吧。

#3


我现按你的思路看看,明天等待你继续指教!!

还有哪位大虾看过,也来谈谈呀


#4


顶~~~~~~~~~~~~~~~~~~~~~~~~~~

#5


compiere的主要思路是这样的,通过一个表的名字来在数据库中调用一个存储过程(表现为创建列这个process)。这个存储过程查找在数据库中的这个表中存在的字段而在AD_Column这个表中又没有的字段,并把这些字段赋一些默认值来来插入到AD_Column表中,也就是说AD_Column这个表是用来描述各个表的字段的。还有一个表叫AD_Table来存放表的。其中的灵魂就是MField类和AD_Field这个表,这个表中是描述一个窗口中的一个TAB页对应的表的各个字段,就是对AD_Column的进一步描述,一个AD_Column可能对应几个 AD_Field。它描述的是这个字段在这个Tab页中显示的是按钮还是编辑框,有效值是什么,有没有关联到什么逻辑,主要是一个界面属性。然后在Tab页中利用了一个卡片式布局管理器,一个是单行显示一个就是多行显示,多行显示是用了一个JTable,单行显示是一行数据的另外一种布局方式,基本上是最多两列,行数不限。可以简单调整的。
在一般它的模型是MO方式对应的如MField对应于MFieldVO,后者主要处理数据库操作。
布局管理器的处理主要是放到GridController.java里面的,大部分的C/S界面代码都在grid这个目录里面。
也就是说基本上model里面是模型,grid里面是界面,控制器分散在两者之间。
至于B/S界面用了同一套模型,只不过解释器不同,用的是apache的一套能生成html控件的类库,实现上有一些别扭得地方。

#6


下面是我原来写的文档的一部分,和compiere现在的版本应该有出入,不过基本原理还是这样的其中有些U是word的符号。如果你是蓬莱的话就直接给我打电话吧,呵呵。
自动生成界面部分:
这部分界面或者说相关的控件放在org.uniplat.grid中。主要的一个类就是GridController,这是一个存放一个Tab页也就是一个物理表内容的面板,自动生成的界面就是由它来表现出来的,不过在介绍GridController之前必须先介绍一下系统的数据结构和几个数据模型类如上面提到的MTab,MWindow等。
1.系统的数据结构和自动生成界面的原理:
  系统默认是一个物理表对应一个Tab页来显示操作它的数据,几个Tab页也就是几个表组成一个窗口。几个窗口对应一个工作台,但实际中工作台基本没有用到。窗口在加载时通过树来得到工作台的ID,然后得到这个工作台对应的几个窗口(实际中都是一个),根据每个窗口的ID得到窗口对应的Tab页,再找到Tab页对应的字段的显示元素来加载到tab页上,就是GridController了。最后把这个工作台对应的各个窗口或者其他元素显示出来。窗口中的每个控件后面都对应着一个Mfield,当控件的值发生变化时,就会通过MField通知Mtable,MTab等模型来感知,并触发相关逻辑和处理。
模型对应的类放到org.uniplat.model中。
u 工作台:对应的模型是Mworkbench。一个工作台可能包含一些Window,Form,Process,Task。对应的关联表为AD_WorkbenchWindow。它是描述一个工作台与所对应的Window,Form,Process,Task的从属关系;
AD_WorkbenchWindow的主要表结构:
工作台ID 窗口ID Form ID Process ID Task ID
AD_WorkbenchWindow_ID AD_Window_ID AD_Form_ID AD_Process_ID AD_Task_ID
u 窗口:一个窗口对应这一个Swing中的Jframe。它的结构表是AD_Window,模型是MWindow类。在模型中,很多采用VO模式的,就是一个模型对应一个数据查询的类,所以就会有:MwindowVO类。这两个类主要是处理AD_Window这个表的。主要是得到本Window拥有的那些TAB页,各个Tab页之间的主从关系。
u Tab页:
一个Tab页对应这一个物理表,它的结构表是AD_Tab,Tab页中的元素对应物理表的字段即域。Mtab是个比较复杂的类,除了要处理它所拥有的域外,还要处理域之间的一些逻辑关系,处理数据改变引起的一些逻辑。每个Tab页上有一个GridController,GridController通过卡式布局有两个面板,一个是多行显示,一个是Grid方式即单行显示。多行显示显示所有符合条件的数据,单行显示显示对应的某一行的数据明细。
多行显示实际是一个Jtable,所以有一个对应的模型Mtable。
u Mtable,对应的结构表是AD_Table。和Tab页是一对一关系。
u Mfield,对应于字段,它的结构表是AD_Field,是对字段的描述,通过对字段的描述就可以按照适当的方式来把字段显示到界面上。这个类也比较复杂。

2.各种模型:
u Mfield:
Mfield可以说是整个uniplat平台的核心,对字段的封装和处理都是通过Mfield来完成的。Mfield主要是对应AD_Field物理表,有一个VO对象MfieldVO。Mfield主要难于处理的一是对Lookup的处理,通过与MlookupFactory等类的结合,得到它的有效行验证码并进行处理。还有对相关性的处理,计算字段的处理,显示逻辑的处理,mini语言的解释。
u MTab:
    
3.各种控件:
u Vstring,字符串
u Vdate,时间控件
u Vnumber数字控件
u Vlookup下拉列表框和search控件,对应一个Mlookup模型。
u 表格控件
u mini表格

#7


那Callout,CalloutEngine,以及扩展CalloutEngine的那些类主要是做什么用,是怎么实现的呢?
说实话,看了几天,脑子里一团浆糊....
还请赐教


 pentax我给你发了CSDN短信,希望你能帮帮忙

#8


#9


偶再顶!!

#10


Well done pentax()! let me up you.

#1


顶~~~~~~~~~~~~~~~~~~~~~

#2


呵呵,要看懂这些类,一定要好好看看它们后面对应的数据结构,首先MTable对应于好像AD_Table这个表,一个表对应一个Tab,几个Tab对应一个窗口,一个Tab里面有一个JTable,里面放的是MFiled,对应于AD_Field,还有一个AD_Column,没时间了,明天再说吧。

#3


我现按你的思路看看,明天等待你继续指教!!

还有哪位大虾看过,也来谈谈呀


#4


顶~~~~~~~~~~~~~~~~~~~~~~~~~~

#5


compiere的主要思路是这样的,通过一个表的名字来在数据库中调用一个存储过程(表现为创建列这个process)。这个存储过程查找在数据库中的这个表中存在的字段而在AD_Column这个表中又没有的字段,并把这些字段赋一些默认值来来插入到AD_Column表中,也就是说AD_Column这个表是用来描述各个表的字段的。还有一个表叫AD_Table来存放表的。其中的灵魂就是MField类和AD_Field这个表,这个表中是描述一个窗口中的一个TAB页对应的表的各个字段,就是对AD_Column的进一步描述,一个AD_Column可能对应几个 AD_Field。它描述的是这个字段在这个Tab页中显示的是按钮还是编辑框,有效值是什么,有没有关联到什么逻辑,主要是一个界面属性。然后在Tab页中利用了一个卡片式布局管理器,一个是单行显示一个就是多行显示,多行显示是用了一个JTable,单行显示是一行数据的另外一种布局方式,基本上是最多两列,行数不限。可以简单调整的。
在一般它的模型是MO方式对应的如MField对应于MFieldVO,后者主要处理数据库操作。
布局管理器的处理主要是放到GridController.java里面的,大部分的C/S界面代码都在grid这个目录里面。
也就是说基本上model里面是模型,grid里面是界面,控制器分散在两者之间。
至于B/S界面用了同一套模型,只不过解释器不同,用的是apache的一套能生成html控件的类库,实现上有一些别扭得地方。

#6


下面是我原来写的文档的一部分,和compiere现在的版本应该有出入,不过基本原理还是这样的其中有些U是word的符号。如果你是蓬莱的话就直接给我打电话吧,呵呵。
自动生成界面部分:
这部分界面或者说相关的控件放在org.uniplat.grid中。主要的一个类就是GridController,这是一个存放一个Tab页也就是一个物理表内容的面板,自动生成的界面就是由它来表现出来的,不过在介绍GridController之前必须先介绍一下系统的数据结构和几个数据模型类如上面提到的MTab,MWindow等。
1.系统的数据结构和自动生成界面的原理:
  系统默认是一个物理表对应一个Tab页来显示操作它的数据,几个Tab页也就是几个表组成一个窗口。几个窗口对应一个工作台,但实际中工作台基本没有用到。窗口在加载时通过树来得到工作台的ID,然后得到这个工作台对应的几个窗口(实际中都是一个),根据每个窗口的ID得到窗口对应的Tab页,再找到Tab页对应的字段的显示元素来加载到tab页上,就是GridController了。最后把这个工作台对应的各个窗口或者其他元素显示出来。窗口中的每个控件后面都对应着一个Mfield,当控件的值发生变化时,就会通过MField通知Mtable,MTab等模型来感知,并触发相关逻辑和处理。
模型对应的类放到org.uniplat.model中。
u 工作台:对应的模型是Mworkbench。一个工作台可能包含一些Window,Form,Process,Task。对应的关联表为AD_WorkbenchWindow。它是描述一个工作台与所对应的Window,Form,Process,Task的从属关系;
AD_WorkbenchWindow的主要表结构:
工作台ID 窗口ID Form ID Process ID Task ID
AD_WorkbenchWindow_ID AD_Window_ID AD_Form_ID AD_Process_ID AD_Task_ID
u 窗口:一个窗口对应这一个Swing中的Jframe。它的结构表是AD_Window,模型是MWindow类。在模型中,很多采用VO模式的,就是一个模型对应一个数据查询的类,所以就会有:MwindowVO类。这两个类主要是处理AD_Window这个表的。主要是得到本Window拥有的那些TAB页,各个Tab页之间的主从关系。
u Tab页:
一个Tab页对应这一个物理表,它的结构表是AD_Tab,Tab页中的元素对应物理表的字段即域。Mtab是个比较复杂的类,除了要处理它所拥有的域外,还要处理域之间的一些逻辑关系,处理数据改变引起的一些逻辑。每个Tab页上有一个GridController,GridController通过卡式布局有两个面板,一个是多行显示,一个是Grid方式即单行显示。多行显示显示所有符合条件的数据,单行显示显示对应的某一行的数据明细。
多行显示实际是一个Jtable,所以有一个对应的模型Mtable。
u Mtable,对应的结构表是AD_Table。和Tab页是一对一关系。
u Mfield,对应于字段,它的结构表是AD_Field,是对字段的描述,通过对字段的描述就可以按照适当的方式来把字段显示到界面上。这个类也比较复杂。

2.各种模型:
u Mfield:
Mfield可以说是整个uniplat平台的核心,对字段的封装和处理都是通过Mfield来完成的。Mfield主要是对应AD_Field物理表,有一个VO对象MfieldVO。Mfield主要难于处理的一是对Lookup的处理,通过与MlookupFactory等类的结合,得到它的有效行验证码并进行处理。还有对相关性的处理,计算字段的处理,显示逻辑的处理,mini语言的解释。
u MTab:
    
3.各种控件:
u Vstring,字符串
u Vdate,时间控件
u Vnumber数字控件
u Vlookup下拉列表框和search控件,对应一个Mlookup模型。
u 表格控件
u mini表格

#7


那Callout,CalloutEngine,以及扩展CalloutEngine的那些类主要是做什么用,是怎么实现的呢?
说实话,看了几天,脑子里一团浆糊....
还请赐教


 pentax我给你发了CSDN短信,希望你能帮帮忙

#8


#9


偶再顶!!

#10


Well done pentax()! let me up you.