以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]问几个关于外部数据源的问题:  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=791)

--  作者:wcs
--  发布时间:2008/10/7 21:56:00
--  [求助]问几个关于外部数据源的问题:
问几个关于外部数据源的问题:
1、在某项目中设置好了外部数据源,并设置好了需要加载的几个外部数据表,保存。以后再次打开该项目,狐表是否会自动加载那几个数据表?
2、那几个外部的数据表源于其他管理软件的后台数据库,如SQL,要怎样才能保证数据完全不被改动?只有锁定行吗?
3、我之所以这样做是因为:希望用狐表实现管理软件不能实现的功能,当然我先得在其他管理软件的后台数据库中增加几个我自己需要的数据表,这种方法可行吗?有没有更好的方法呢?
4、在狐表中能新增外部的数据表吗,比如新增到SQL数据库中,怎样搞啊?
5、我希望在外部数据源中的某个表中有新增或修改记录的行为时,启动一段计算代码,取得新增的那些记录中的某些值,这样可行吗,具体是那些事件?
6、我看到其他管理软件的后台数据库中有很多“系统数据表”,这和“用户数据表”有什么区别?
7、我在外部数据源生成器--提供程序-OLE DB提供程序 的表单中看到10多种程序,我只会其中的三、四个,能介绍一下它们是用于联接什么数据库的吗?  我看到论坛里有人直接写的连接字符串(有一个直接联接EXCEL的),能介绍一下这些字符串的编写规则吗?
[此贴子已经被作者于2008-10-7 22:32:22编辑过]

--  作者:wcs
--  发布时间:2008/10/7 23:25:00
--  
不知是我问的太简单了,

还是想法怪,想与其他管理软件分别控制SQL数据库中的不同表,不可行吗?

没有人回答啊?

另外,我还想在代码中解决联接财务软件各种数据库,提取所需要的表,将表中的数据转化到我的10多个模板表中,进行通用的查询和分析,这样的功能用代码搞,可以实现吗?我希望自动化程度高,代码难度可能比较大点,但我希望用户操作简单,傻瓜式的。这个想法我正在学习实践中......。
--  作者:yuanbin
--  发布时间:2008/10/8 12:15:00
--  

大家目前都在学习中.针对你前6个问题谈谈我的看法:
1、在某项目中设置好了外部数据源,并设置好了需要加载的几个外部数据表,保存。以后再次打开该项目,狐表是否会自动加载那几个数据表?
当然可以。参考帮助中“大容量数据的管理”说明,使用项目事件BeforeLoadOuterTable,利用DataTable的LoadFiler属性设置加载条件,然后执行Load方法重新加载数据。

2、那几个外部的数据表源于其他管理软件的后台数据库,如SQL,要怎样才能保证数据完全不被改动?只有锁定行吗?
至少有2种方法:
第一 ,设置好外部的数据表后再手动增加一个表达式列,逻辑型,在表达式生成器中选择[_Locked]。实际操作中按条件设置[_Locked],比如在事件PrepareEdit中填写代码:
If  User.Group <> "经理" Then
   e.Row.Locked = True
End If
第二,直接锁定整表不让编辑:
  DataTables("公共资料").LoadFilter = Filter0   \'Filter0是事先定义好的筛选条件
  DataTables("公共资料").Load()
  DataTables("公共资料").AllowEdit = False


3、我之所以这样做是因为:希望用狐表实现管理软件不能实现的功能,当然我先得在其他管理软件的后台数据库中增加几个我自己需要的数据表,这种方法可行吗?有没有更好的方法呢?
在没有绝对把握情况下,不要在其他管理软件的后台数据库中增加列,一是当你的FOXTABLE编程中产生误操作时可能对它产生不经意的破坏,另一个当其他管理软件升级时,如果涉及到库结构变化和数据移植后,你原来增加的列数据能否接着二次移植呢?建议对其他ERP数据库只采取读,不采取写操作。

4、在狐表中能新增外部的数据表吗,比如新增到SQL数据库中,怎样搞啊?
这个在帮助中使用指南中“外部数据”章节里有答案,网站中也有讨论。

5、我希望在外部数据源中的某个表中有新增或修改记录的行为时,启动一段计算代码,取得新增的那些记录中的某些值,这样可行吗,具体是那些事件?
可以增加按钮对新增的记录进行筛选,参考:
StateFilter

状态筛选,StateFilterEnum型枚举,可选值有:

None  :显示所有行
Added :显示新增行
Modified :显示已经修改的行
UnChanged :显示没有修改的行

值可以组合,例如在当前表显示新增和已修改行:CurrentTable.StateFilter = StateFilterEnum.Added Or StateFilterEnum.Modified

显示所有行:CurrentTable.StateFilter = StateFilterEnum.none 


6、我看到其他管理软件的后台数据库中有很多“系统数据表”,这和“用户数据表”有什么区别?

“系统数据表”是SQL等自身建立的,不用管它。“用户数据表”才是用户自己建立的,才是应用系统使用的数据库。

 


--  作者:wcs
--  发布时间:2008/10/8 12:46:00
--  

哈哈,yuanbin 好强!

关于第3、  我想在财务软件的后台数据库中增加表或在表中增加列,是有风险的,因为财务软件可能会删除它们或者引起财务软件的不正常。这样搞吧:加载外部的表--锁定它们--内部表与这些外部表同步--我只编辑内部的表。这样,内部的表存在在狐表的项目文件中,外部的表只是在打开项目时加载进来,并不保存的,我的这种想法对吗?可行吧?

关于第7、  没有人了解 OLE DB提供程序列表 中每个项目的具体意思吗?


我提出这七个问题,想表达一个意思:用狐表来做一些管理软件没有做到的功能,而这些功能是企业管理所急需,大部分的基础信息源于管理软件的外部表,狐表只是引用这些表,并按管理者要求对之进行统计、加工、计算。


--  作者:cpayinyuan
--  发布时间:2008/10/8 12:49:00
--  
以下是引用wcs在2008-10-8 12:46:00的发言:

哈哈,yuanbin 好强!

关于第3、  我想在财务软件的后台数据库中增加表或在表中增加列,是有风险的,因为财务软件可能会删除它们或者引起财务软件的不正常。这样搞吧:加载外部的表--锁定它们--内部表与这些外部表同步--我只编辑内部的表。这样,内部的表存在在狐表的项目文件中,外部的表只是在打开项目时加载进来,并不保存的,我的这种想法对吗?可行吧?

关于第7、  没有人了解 OLE DB提供程序列表 中每个项目的具体意思吗?


我提出这七个问题,想表达一个意思:用狐表来做一些管理软件没有做到的功能,而这些功能是企业管理所急需,大部分的基础信息源于管理软件的外部表,狐表只是引用这些表,并按管理者要求对之进行统计、加工、计算。

 我与你的设想基本相同,关于3,你上面的想法应该没有问题,这是一个既能实现功能又比较稳妥的办法!


--  作者:gdtgl
--  发布时间:2008/10/8 12:58:00
--  
我提出这七个问题,想表达一个意思:用狐表来做一些管理软件没有做到的功能,而这些功能是企业管理所急需,大部分的基础信息源于管理软件的外部表,狐表只是引用这些表,并按管理者要求对之进行统计、加工、计算。


---------
是,所以要求老六要支持所有数据库(和加强功能).不可能推翻已有系统,而重新用foxtable来重新写,重新写是不实际(内部用foxtable时)

(较大些的公司或企业或单位应基本已引进系统了吧?)
[此贴子已经被作者于2008-10-8 13:06:12编辑过]

--  作者:gdtgl
--  发布时间:2008/10/8 13:03:00
--  
oracle现在还不支持.确实不太好.刚才用谷歌搜了1下 oracle 这个关键词..有1亿个数据量(应很普遍使用它作为数据库了)
--  作者:wcs
--  发布时间:2008/10/8 15:22:00
--  
oracle 应该支持的,好像差了一个东西,记得老六在论坛里说过。
--  作者:yuanbin
--  发布时间:2008/10/8 16:48:00
--  
以下是引用wcs在2008-10-7 23:25:00的发言:
另外,我还想在代码中解决联接财务软件各种数据库,提取所需要的表,将表中的数据转化到我的10多个模板表中,进行通用的查询和分析,这样的功能用代码搞,可以实现吗?我希望自动化程度高,代码难度可能比较大点,但我希望用户操作简单,傻瓜式的。这个想法我正在学习实践中......。

利用FOXTABLE对联接财务软件等各种数据库的查询分析的功能比较好实现。以下内容供参考。


假设做一个ERP的库存查询系统。表有2个:库存表icinventory(FItemID、fstockid、fqty),基础资料表t_item(包含仓位和产品表:fitemid、fitemclassid、flevel、fnumber、fname、FparentID、fdetail),具体字段含义暂不做解释,有时结合数据应该可以猜出来的。
表中建立子窗体,使用5种控件:SplitContainer、TreeView、DataList、Button、Label做ERP的库存查询系统。另外使用一个全局变量vars("item")

充分利用SQLCommand的cmd.ExecuteReader()读外部数据源(可以跨表操作,之后还可以进一步跨数据源操作)、写树节点、数据列表的功能。
按钮一:按产品查询
Dim tv As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim td As WinForm.TreeNode
tv.Nodes.clear
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText ="SELECT * FROM t_item where fitemclassid=4 and flevel =1"
dt = cmd.ExecuteReader() \'生成统计表
For Each dr As Datarow In dt.Datarows
    td=tv.Nodes.Add( dr("FItemID"),  dr("fnumber") & ":" & dr("fname"),"home.ico")          
Next
vars("item")="cp"
Dim dst As WinForm.DataList = e.Form.Controls("DataList1")
dst.DataTable = dt
dst.RowFilter = false
dst.Build()

 

按钮二:按仓位查询
 Dim tv As WinForm.TreeView = e.Form.Controls("TreeView1")
Dim td As WinForm.TreeNode
tv.Nodes.clear
Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText ="SELECT * FROM t_item where fitemclassid=5 and flevel =1"
dt = cmd.ExecuteReader() \'生成统计表
For Each dr As Datarow In dt.Datarows
    td=tv.Nodes.Add( dr("FItemID"),  dr("fnumber") & ":" & dr("fname"),"home.ico")          
Next
vars("item")="ck"
Dim dst As WinForm.DataList = e.Form.Controls("DataList1")
dst.RowFilter = false
dst.Build()


目录树控件的 AfterSelectNode事件代码:(以下代码框架简单,只是结合数据库的SELECT语句有所不同而已。)

dim itemk3 as string
Select Case vars("item")
  Case "cp"
        itemk3 ="b.fitemid"
  Case "ck"
        itemk3 ="b.fstockid"
    Case Else
       
End Select

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C

cmd.CommandText ="SELECT * FROM t_item where FparentID=" & e.node.name  & " and (fdetail=0 or (fdetail=1 and  FItemID in (SELECT a.FItemID FROM t_item as a INNER JOIN icinventory as b ON a.fitemid=" & itemk3 & " where  b.fqty <> 0 and a.FparentID=" & e.node.name & " ))) "
dt = cmd.ExecuteReader() \'生成统计表
e.Node.Nodes.Clear
dim level0 as integer
For Each dr As DataRow In dt.Datarows
    if not dr("fdetail") then
       e.Node.Nodes.Add( dr("FItemID"),dr("fnumber") & " " & dr("fname"),"home.ico")    
    else  
       e.Node.Nodes.Add( dr("FItemID"),dr("fnumber") & " " & dr("fname"),"Accept.ico")    
    end if
next
 dim selt1,selt2,selt3 as string
 Select Case vars("item")
   Case "cp"
       selt1="SELECT a.fnumber AS 产品代码, a.fname AS 产品型号, c.fnumber AS 仓库代码, c.fname AS 仓库名称, b.fqty AS 库存数量 "
       selt2="FROM (t_item AS a INNER JOIN icinventory AS b ON a.fitemid=" & itemk3 & ") INNER JOIN t_item AS c ON b.fstockid=c.fitemid "
   Case "ck"
       selt1="SELECT a.fnumber AS  仓库代码, a.fname AS 仓库名称, c.fnumber AS 产品代码, c.fname AS 产品型号, b.fqty AS 库存数量 "
       selt2="FROM (t_item AS a INNER JOIN icinventory AS b ON a.fitemid=" & itemk3 & ") INNER JOIN t_item AS c ON b.fitemid=c.fitemid "        
     Case Else       
 End Select
 selt3="where a.flevel>1 and a.fdetail=1  and b.fqty > 0 and a.fparentid=" & e.node.name  & " or (a.FItemID=" & e.node.name  & " and b.fqty > 0) "
 cmd.CommandText =selt1 & selt2 & selt3
 dt = cmd.ExecuteReader() \'生成统计表
Dim dst As WinForm.DataList = e.Form.Controls("DataList1")
dst.DataTable = dt
dst.Build()

 


此主题相关图片如下:库存查询窗体案例.bmp
按此在新窗口浏览图片

--  作者:贺老六
--  发布时间:2008/10/8 16:54:00
--  

呵呵,老袁同志越来越专业了。

[此贴子已经被作者于2008-10-8 16:54:09编辑过]