Office中国论坛/Access中国论坛
标题:
如何在不建立外部链接表的情况下,如何把另一数据库的查询结果赋值给窗体的子窗体
[打印本页]
作者:
dulton
时间:
2012-3-2 14:48
标题:
如何在不建立外部链接表的情况下,如何把另一数据库的查询结果赋值给窗体的子窗体
我有两个数据库,一个作为前台进行数据录入,保存和查询,一个作为后台数据。
为了实现多用户同时能进行连接操作,所以我准备用ADO 来连接数据库,进行数据的添加,更新等操作。
现在我想实现下面的功能,就是把 "DATA” 据库里的查询结果“订单汇总”,根据 "前台" 数据库 窗体 “订单查询”里的 店铺 和 产品 两个文本控件的条件删选后得到的记录集 Recordset, 赋值给订单查询的子窗体 --->“订单汇总子窗体“
望高手不吝指教!
谢谢!
[attach]48554[/attach]
作者:
todaynew
时间:
2012-3-3 16:45
[attach]48588[/attach]
作者:
dulton
时间:
2012-3-4 09:28
SELECT 订单汇总.店铺名称, 订单汇总.产品, 订单汇总.规格1Sum, 订单汇总.规格2Sum, 订单汇总.规格3Sum
FROM 订单汇总 IN "d:\temp\ado\Data.mdb";
谢谢
作者:
dulton
时间:
2012-3-4 09:42
可是这样一来,只要这个窗体文件打开着,后台的data数据裤就一直链接着,会不会影响别的用户的使用?
作者:
roych
时间:
2012-3-4 12:15
本帖最后由 roych 于 2012-3-4 12:17 编辑
事实上DAO写起来比ADO更简单些许~~嗯,只是些许而已,所以我这里用DAO来完成。
Private Sub cmd查询_Click()
Dim rst As dao.Recordset
Dim db As dao.Database
Dim Shop As String, Prod As String, GetRow
'定义查询条件
If IsNull(Me.t店铺) Then
Shop = "'*'"
Else
Shop = "'*" & Me.t店铺 & "*'"
End If
If IsNull(Me.t产品) Then
Prod = "'*'"
Else
Prod = "'*" & Me.t产品 & "*'"
End If
'定义sql查询语句
ssql = "SELECT 订单明细.店铺名称, 订单明细.产品, Sum(订单明细.规格1) as 规格1, " _
& "Sum(订单明细.规格2) As 规格2, Sum(订单明细.规格3) As 规格3 FROM 订单明细 " _
& "GROUP BY 订单明细.店铺名称, 订单明细.产品 " _
& "HAVING 订单明细.店铺名称 Like " & Shop & " And 订单明细.产品 Like " & Prod
'打开数据库并连接记录集
Set db = dao.OpenDatabase(CurrentProject.Path & "\data.mdb")
Set rst = db.OpenRecordset(ssql)
'绑定窗体数据源
Set Me.订单汇总子窗体.Form.Recordset = rst
Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = "店铺名称"
Forms!订单查询!订单汇总子窗体!t产品.ControlSource = "产品"
Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = "规格1"
Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = "规格2"
Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = "规格3"
End Sub
复制代码
此外,用老汉的In语句也是可行的,不过SQL查询语句写起来也挺麻烦的。这个就留给你做作业了。{:soso_e112:}
[attach]48601[/attach]
作者:
dulton
时间:
2012-3-5 09:41
谢谢 roych
作者:
dulton
时间:
2012-3-5 14:56
谢谢roych!
最近我在做一个下数据库,我们是个小的服务型公司,做服务的工程师会在各个客户处工作。
我在公司设了服务器,通过花生壳的地址绑定,在外的员工可以通过VPN拨号连上公共盘。
现在要求在外的员工要及时把数据维护到服务器上的数据库,所以我准备在每个员工放一个前台数据库,后台数据放在服务器上。
考虑到ADSL上网的网速情况,如果都通过建立连接表,每次打开占用很多内存和带宽,感觉很慢。
所以现在准备,用ADO连接,获得记录集后,可以马上关闭链接。
或者你有什么好的推荐。
作者:
鱼儿游游
时间:
2012-3-5 15:41
本帖最后由 鱼儿游游 于 2012-3-6 00:57 编辑
帮你写了以下代码:不用链接表读取ADO记录集,并在子窗体显示取回的ADO记录集,供楼主参考。
Private Sub cmd查询_Click()
On Error GoTo Err_Handler
Dim rst As Object
Dim strShop As String
Dim strProd As String
Dim strSQL As String
'关闭屏幕刷新
Application.Echo False
'设置鼠标指针为沙漏形状
DoCmd.Hourglass True
'定义子窗体的数据源的SQL语句
Me.t店铺 = Trim(Nz(Me.t店铺, ""))
Me.t产品 = Trim(Nz(Me.t产品, ""))
strShop = IIf(Len(Me.t店铺) = 0, "%", "%" & Me.t店铺 & "%")
strProd = IIf(Len(Me.t产品) = 0, "%", "%" & Me.t产品 & "%")
strSQL = "SELECT 订单明细.店铺名称, 订单明细.产品, Sum(订单明细.规格1) as 规格1," _
& " Sum(订单明细.规格2) As 规格2, Sum(订单明细.规格3) As 规格3 FROM 订单明细" _
& " GROUP BY 订单明细.店铺名称, 订单明细.产品" _
& " HAVING 订单明细.店铺名称 Like '" & strShop & "' And 订单明细.产品 Like '" & strProd & "'"
'设置子窗体的数据源
If GetRecordset(rst, strSQL, 1, 1) Then
SetFieldName True
Set Me.Controls("订单汇总子窗体").Form.Recordset = rst
Else
SetFieldName False
End If
Exit_Handler:
'恢复鼠标指针
DoCmd.Hourglass False
'打开屏幕刷新
Application.Echo True
Exit Sub
Err_Handler:
MsgBox Err.Descripton, vbExclamation, "读取数据"
Resume Exit_Handler
End Sub
Private Sub SetFieldName(Optional ByVal blnDisplayRecordset As Boolean = True)
If blnDisplayRecordset Then
Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = "店铺名称"
Forms!订单查询!订单汇总子窗体!t产品.ControlSource = "产品"
Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = "规格1"
Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = "规格2"
Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = "规格3"
Else
Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = ""
Forms!订单查询!订单汇总子窗体!t产品.ControlSource = ""
Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = ""
Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = ""
Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = ""
End If
End Sub
复制代码
调用函数如下:
Option Compare Database '使用数据库的字符串比较方式
Option Explicit '变量在使用前必须进行显式声明
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Public cn As Object '定义全程变量:数据链接对象(ADODB.Connection),用来保存连接数据库信息变量。
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'=======================================
' 建立与后台数据库的链接(无链接表方式)
'=======================================
Public Function ADODB_Connect(Optional ByVal strDatabase As String = ".\Data.MDB", Optional ByVal strPwd As String = "") As Boolean
On Error GoTo Err_ADODB_Connect
Dim strConnect As String
strDatabase = Trim(Nz(strDatabase, ""))
'如果是简写的路径则转换为绝对路径
If strDatabase Like ".\*" Then strDatabase = CurrentProject.Path & Mid(strDatabase, 2)
'如果是相对路径则转换为绝对路径
If Left(strDatabase, 1) = "" Then strDatabase = Mid(CurrentProject.Path, 1, 2) & strDatabase
If Not strDatabase Like "[A-z]:*" Then strDatabase = CurrentProject.Path & "" & strDatabase
'定义ACCESS链接串
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0" & ";Data Source=" & strDatabase & ";Jet OLEDB:Database Password=" & strPwd
'用ADO通过OLEDB直接连接数据库
Set cn = Nothing
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = strConnect
cn.CursorLocation = adUseClient
cn.ConnectionTimeout = 15
cn.CommandTimeout = 30
cn.Open
ADODB_Connect = True
Exit_ADODB_Connect:
Exit Function
Err_ADODB_Connect:
ADODB_Connect = False
MsgBox "连接后台数据库【" & strDatabase & "】失败!" \ Chr(10) & Chr(10) & "出错原因:" & Err.Description, 64, "出错信息"
'并释放变量
Set cn = Nothing
Resume Exit_ADODB_Connect
End Function
'=======================================
' 打开记录集
'=======================================
Public Function GetRecordset(ByRef rst As Object, _
ByRef strSQL As String, _
Optional ByRef intOpenKeyset As Integer = adOpenKeyset, _
Optional ByRef intLockOptimistic As Integer = adLockReadOnly, _
Optional ByRef IsCurrentMDB As Boolean = False) As Boolean
On Error GoTo Err_GetRecordset
RetryOpen:
'打开ADO记录集
Set rst = Nothing
Set rst = CreateObject("ADODB.Recordset")
If IsCurrentMDB Then
'当前MDB
rst.Open strSQL, CurrentProject.AccessConnection, intOpenKeyset, intLockOptimistic
Else
With rst
.Source = strSQL
.ActiveConnection = cn
.CursorLocation = adUseClient '3
.CursorType = intOpenKeyset
.LockType = intLockOptimistic
.Open
End With
End If
GetRecordset = True
If rst.RecordCount > 0 Then rst.MoveFirst
Exit_GetRecordset:
Exit Function
Err_GetRecordset:
If Not IsCurrentMDB Then
Dim intCounter As Integer
'与数据库断开连接,则重新连接一次。
If Err.Number = 91 Or cn Is Nothing Then
If intCounter = 0 Then
intCounter = intCounter + 1
If ADODB_Connect Then Resume RetryOpen
End If
ElseIf Err.Number = 3709 Then
If intCounter = 0 Then
intCounter = intCounter + 1
Sleep 1000
Resume RetryOpen
End If
ElseIf Err.Number = -2147217865 Then
If intCounter = 0 Then
intCounter = intCounter + 1
Sleep 1000
Resume
End If
End If
End If
GetRecordset = False
'并释放变量
Set rst = Nothing
'显示错误信息
MsgBox Err.Description, vbExclamation, "打开记录集过程:GetRecordset"
Resume Exit_GetRecordset
End Function
复制代码
[attach]48621[/attach]
作者:
dulton
时间:
2012-3-5 16:43
鱼儿游游
你能分享经验吗?
作者:
鱼儿游游
时间:
2012-3-5 16:52
本帖最后由 鱼儿游游 于 2012-3-5 16:53 编辑
dulton 发表于 2012-3-5 16:43
鱼儿游游
你能分享经验吗?
附件已测试,不当之处请斧正。
作者:
dulton
时间:
2012-3-5 17:02
谢谢!
我会好好理解一下代码。
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3