东流西上
故在柳溪,水东有柳

ACCESS组合框的条件格式

水东柳阅读(88)

在设计ACCESS数据库时,需要使窗体上的组合框控件根据不同的值显示不同的颜色,使用控件的条件格式来实现。但是在使用条件格式时碰到了一些问题,在此记录下。

组合框的值的行来源主要来自“列表”和“表/查询”两个大方面。

当组合框的值是“值列表”或“字段列表”时,其条件格式可以是:字段值 <> Z(设置显示的字体、背景色等格式),如下图。

当组合框的值的行来源是“表/查询”时,其条件格式可以是:字段值 <> [纱线种类].[ItemData](0)(设置显示的字体、背景色等格式),[纱线种类].[ItemData](0)是值组合框名称“纱线种类”第一行的值,如下图。

ACCESS合并两张表并删除重复字段的一个方法

水东柳阅读(225)

ACCESS在制作数据查询时,发现两张表有部分相同的字段,但各自又有不同的数据和相同的数据,想把两张表合并,但要同时删除重复的数据。查了下资料,发现可以采用“追加表”的方法实现。

表1

表2

表1中有10个字段的数据,表2中有9个字段的数据,表1和表2有相同的字段的数据,但表1中的部分字段的数据在表2中有重复,而表2中的部分字段的数据在表1中也有重复,想要把表1和表2合并,但要去除重复的数据,采用追加表的方法。

1、创建追加查询

点击创建查询设计→关闭显示表→点击菜单的追加→选择需要追加到数据的表(表1)→选择表2并添加表2中将要追加的目标字段。表1和表的字段最好修改成相同,这样不容易出错。

2、设计SQL语句作为追加查询的条件来删除重复项

采用“not in”运算符来删除想要不重复字段的数据。例如在“纱线批号”字段的条件位置添加SQL查询语句“Not In (select 纱线批号 from [产品纱批表])”,其意思就是把表2中的“纱线批号”字段在表1中与表1“纱线批号”字段不重复的数据添加到表1中。

SQL语句代码如下

INSERT INTO 表1 ( 字段1, 字段2,字段…… )
SELECT 表2.字段1, 表2.字段2, 表2.字段……, 
FROM 表2
WHERE (((表2.重复内的容字段) Not In (select 重复内容的字段 from [表1])));

本例中的具体SQL代码如下

INSERT INTO 产品纱批表 ( 制批日期, 品号, 纱线批号, 名称, 纱支, 色号, 捻度, 捻向 )
SELECT 纱批生产通知汇总单.制批日期, 纱批生产通知汇总单.品号, 纱批生产通知汇总单.纱线批号, 纱批生产通知汇总单.名称, 纱批生产通知汇总单.纱支, 纱批生产通知汇总单.色号, 纱批生产通知汇总单.捻度, 纱批生产通知汇总单.捻向
FROM 纱批生产通知汇总单
WHERE (((纱批生产通知汇总单.纱线批号) Not In (select 纱线批号 from [产品纱批表])));

最后点击菜单中的“运行”按钮就可以了。

ACCESS子窗体根据父窗体的条件显示记录

水东柳阅读(138)

根据需要,要在数据表形式的子窗体中显示符合父窗体中某一条件的全部记录,在父窗体打开事件中加入以下代码,

Private Sub Form_Open(Cancel As Integer)
    '确切值查询
    Me.工艺单详情纱批子窗体.Form.Filter = "[品号]= '" & Me.品号 & "'"
    
    '下面这句模糊查询代码是成功的
    'Me.工艺单详情纱批子窗体.Form.Filter = "[品号] Like '*" & Me.品号 & "*'"
   
    Me.工艺单详情纱批子窗体.Form.FilterOn = True
End Sub

效果如图,根据父窗体的“品号”条件,子窗体中显示了符合父窗体“品号”的全部记录。

ACCESS登录窗体实现用户名和密码登录的VBA代码

水东柳阅读(99)

用户登录的具体VBA代码如下:

Private Sub 确定_Click()
On Error GoTo Err_确定_Click
Dim i As Integer
Dim StrTemp As String
Dim rs As ADODB.Recordset

Set rs = New ADODB.Recordset
‘判断“用户名”文本框是否为空
If Nz(Me.密码) = “” Then
MsgBox “请输入“密码”!”, vbExclamation, “输入密码”
Me![密码].SetFocus
ElseIf Nz(Me.确认密码) = “” Then
MsgBox “请输入“确认密码”!”, vbExclamation, “输入确认密码”
Me![确认密码].SetFocus
ElseIf Len(Me![密码]) > 20 Or Len(Me![确认密码]) > 20 Then
MsgBox “您输入的“密码”或“确认密码”字数太多,最多只可以输入20个字符!”, Me![密码] = “”
Me![确认密码] = “”
Me![密码].SetFocus
ElseIf Trim(Me![密码]) <> Trim(Me![确认密码]) Then
MsgBox “您输入的“密码”和“确认密码”不相同, 请重新输入!”, vbExclamation, “重输密码”
Me![密码] = “”
Me![确认密码] = “”
Me![密码].SetFocus
Else
StrTemp = “Select * From 系统用户表”
‘打开“系统用户表”数据表
rs.Open StrTemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
rs.MoveFirst
For i = 1 To rs.RecordCount
‘判断用户输入的“密码提示”和“密码答案”是否与用户注册时设置的时候相同
If rs(“用户名”) = Me![用户名] Then

rs(“密码”) = Me![密码]
rs.Update
MsgBox “密码修改成功,你的密码是:” & rs(“密码”) & “,请您牢记密码!”, vbInformation, “修改成功”
DoCmd.Close
Exit Sub
Else
rs.MoveNext
End If
Next i
End If
Set rs = Nothing

Exit_确定_Click:
Exit Sub
Err_确定_Click:
MsgBox Err.Description
Resume Exit_确定_Click
End Sub

ACCESS窗口置顶的函数

水东柳阅读(77)

有时候需要把某些窗体置顶到屏幕的最前面,方便的编辑或输入数据,所以网上查了窗口置顶的函数,找到了红尘如烟的窗口置顶自定义函数,只要在模块中申明一下的函数,再到需要置顶的窗体的Load下调用就可以了,不需要的时候再调用取消置顶,具体如下:


Option Compare Database
Option Explicit

Private Declare Function SetWindowPos Lib “user32” (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Const API_SWP_NOSIZE = &H1

Const API_SWP_NOMOVE = &H2

Const API_HWND_TOPMOST = -1

Const API_HWND_NOTOPMOST = -2

Public Type POINTAPI

X As Long

Y As Long

End Type
‘====================================================================
Function setFormPos(frm As Form, Optional bln As Boolean = True) As Boolean

If bln = True Then

SetWindowPos frm.hwnd, -1, 0, 0, 0, 0, 3 ‘置顶

Else

SetWindowPos frm.hwnd, -2, 0, 0, 0, 0, 3 ‘正常

End If

If Err.Number = 0 Then

setFormPos = True

Else

setFormPos = False

End If

End Function



//实际使用
Private Sub Form_Load()

setFormPos Me      ‘调用函数,置顶

Private Sub Form_Load()

setFormPos Me, False         ‘调用函数,取消置顶

Access数据库主窗口隐藏的方法——DoCmd.RunCommand acCmdAppMinimize

水东柳阅读(108)

有时候我们需要隐藏ACCESS数据库的主窗口,比如在程序登录窗口,这时有两种方法可以达到这个要求。

1.采用ShowWindow 函数:

首先在模块中声明下面的代码:

Option Explicit

Private Declare Function ShowWindow Lib “user32″ _
(ByVal hwnd As Long, ByVal nCmdShow As Long) As Long

然后在窗体加载代码中调用:

ShowWindow Me.Application.hWndAccessApp, 0’隐藏

当需要恢复时,使用下面的代码:

ShowWindow Me.Application.hWndAccessApp, 1’不隐藏,即恢复

2.使用最小化命令,将窗体设置”弹出”方式为”是”

DoCmd.RunCommand acCmdAppMinimize

恢复代码:

DoCmd.RunCommand acCmdAppMaximize

 

摘自http://www.accessoft.com,学习、备用。

ACCESS的treeview控件展开和收起所有节点的代码

水东柳阅读(102)

 

  1. Private Sub Command1_Click()
  2. Dim I As Long
  3. For I = 1 To TreeView.Nodes.Count
  4. TreeView.Nodes(I).Expanded = True ‘展开所有节点
  5. Next I
  6. End Sub
  7. Private Sub Command2_Click()
  8. Dim I As Long
  9. For I = 1 To TreeView.Nodes.Count
  10. TreeView.Nodes(I).Expanded = False ‘收起所有节点
  11. Next I
  12. End Sub

Access权限 判断函数(2)

水东柳阅读(94)

根据网上和书本的教程,结合自己的实际自定义了适合自己系统的权限判断函数,具体如下:

  1. Function OpenForm(FormID As Integer)
  2. On Error GoTo Err_OpenForm
  3. Dim i As Integer
  4. Dim STemp As String
  5. Dim Rs1 As ADODB.Recordset
  6. Dim Rs2 As ADODB.Recordset
  7. Set Rs1 = New ADODB.Recordset
  8. Set Rs2 = New ADODB.Recordset
  9. Dim blnOpen As Boolean
  10. Dim FormName As String
  11. Dim UserGroup As String
  12. Dim UserID As String
  13. UserGroup = DLookup(“用户组”“系统用户表”“用户名 ='” & User & “‘”)
  14. UserID = DLookup(“用户组ID”“用户组表”“用户组 ='” & UserGroup & “‘”)
  15. ‘打开“用户组权限表”数据表
  16. STemp = “Select * From 用户组权限表”
  17. Rs1.Open STemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  18. ‘打开“系统窗体表”数据表
  19. STemp = “Select * From 系统窗体表”
  20. Rs2.Open STemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  21.     blnOpen = False
  22.     ‘判断“用户组权限”数据是否为空
  23.     If Rs1.RecordCount < 1 Then
  24.         blnOpen = False
  25.     Else
  26.         Rs1.MoveFirst
  27.         ‘判断当前“登录用户”是否有权限打开FormID对应的窗体
  28.         For i = 1 To Rs1.RecordCount
  29.             If Rs1(“用户组ID”) = UserID And Rs1(“窗体ID”) = FormID And Rs1(“权限”) = True Then
  30.                 blnOpen = True
  31.             Else
  32.                 Rs1.MoveNext
  33.             End If
  34.         Next i
  35.     End If
  36.     ‘在“系统窗体表”数据表中搜索待打开窗体的“名称”
  37.     Rs2.MoveFirst
  38.     For i = 1 To Rs2.RecordCount
  39.         If Rs2(“窗体ID”) = FormID Then
  40.             FormName = Rs2(“窗体名称”)
  41.         Else
  42.             Rs2.MoveNext
  43.         End If
  44.     Next i
  45.     ‘判断用户是否有权限打开窗体,blnOpen为“真”有权限
  46.     If blnOpen = False Then
  47.         MsgBox “您没有权限使用” & ““” & FormName & “”窗体”, vbCritical, “无权使用”
  48.        Exit Function
  49.     Else
  50.         DoCmd.OpenForm FormName, acNormal, , , , acWindowNormal
  51.     End If
  52.     Set Rs1 = Nothing
  53.     Set Rs2 = Nothing
  54.     Exit Function
  55. Err_OpenForm:
  56.     Set Rs1 = Nothing
  57.     Set Rs2 = Nothing
  58.     MsgBox Err.Description, vbOKOnly, “窗体打开错误”
  59. End Function

最后需要调用该函数的地方直接调用好了。如果没有权限就会有以下提示。

Access权限 判断函数

水东柳阅读(67)

  1. Option Compare Database
  2. Public Const ErrQX = “权限不足!请与管理员联系!”
  3. Public YGNumber As String    ‘员工编号
  4. Public ygName As String    ‘员工姓名
  5. ///////////////////////////////////////———验证用户权限 ——//////////////////////////////////////////////////
  6. Public Function Frm_Qx(Frm As Form, UserID As String)
  7.     ‘在系统表里寻找登陆用户关于打开窗体的权限记录集
  8. Dim sql As String
  9. sql = “SELECT * from Tbl_权限 where 用户='” & UserID & “‘and 对象='” & Frm.Name & “‘;”
  10.     ‘打开记录集
  11. Dim db As ADODB.Connection
  12. Dim rs As New ADODB.Recordset
  13. Set db = CurrentProject.Connection    rs.Open sql, db, adOpenStatic, adLockReadOnly
  14.         ‘如果记录为空,改用户没有任何权限
  15. If rs.BOF And rs.EOF Then
  16. MsgBox ErrQX, vbCritical, “错误”
  17. DoCmd.RunCommand acCmdClose
  18. Exit Function
  19. End If
  20.         ‘如果权限为 “全部”
  21. If rs!完全 = True Then
  22. Frm.AllowAdditions = True
  23. Frm.AllowEdits = True
  24. Frm.AllowDeletions = True
  25.             Exit Function
  26. End If
  27.         ‘如果权限为“只读”
  28. If rs!只读 = True Then
  29. Frm.AllowAdditions = False
  30. Frm.AllowEdits = False
  31. Frm.AllowDeletions = False
  32.              Exit Function
  33. End If
  34.         ‘如果全是否,忘记填写了…
  35. If rs!只读 = False And rs!添加 = False And rs!删除 = False And rs!修改 = False And rs!完全 = False Then
  36. MsgBox ErrQX, vbCritical, “错误”
  37. DoCmd.RunCommand acCmdClose
  38. Exit Function
  39. End If
  40.         ‘其他情况就是按照正常的选择了..
  41. Frm.AllowAdditions = rs!添加
  42. Frm.AllowEdits = rs!修改
  43. Frm.AllowDeletions = rs!删除
  44. End Function

 

 

摘自  http://www.access-cn.com/info/1768-cn.html

 

ACCESS判断字段不能重复录入的方法

水东柳阅读(130)

1、DCount

文本型数据

If DCount(“文本型字段名”, “表名称”, “文本型字段名='” & Me.文本型字段名 & “‘”) > 0 Then
MsgBox “你输入的数据已经存在,请重新输入”, vbCritical, “警告”
Me.文本型字段名.SetFocus
Exit Sub
End If

 

 

文本型数据

‘判断数字型不能重复录入使用DCount函数方法:

If DCount(“数值型字段名”, “表名称”, “数值型字段名=” & Me.数值型字段名) > 0 Then

MsgBox “你输入的数字已经存在,请重新输入”, vbCritical, “警告”

Me.数值型字段名.SetFocus

Exit Sub

End If

2、Dlookup

Dim z As Long

z = DLookup(“数值型字段名”, “表名称”, “数值型字段名= ” & Me.数值型字段名)

If Not IsNull(z) Then

MsgBox “你输入的数字已经存在,请重新输入”, vbCritical, “警告”

Me.数值型字段名.SetFocus

Exit Sub

End If

 

日期型数据

Dim x As Variant

x = DLookup(“日期型字段名”, “表名称”, “日期型字段名= #” & Me.日期型字段名 & “#”)

If Not IsNull(x) Then
MsgBox “你输入的日期已经存在,请重新输入”, vbCritical, “警告”
Me.日期型字段名.SetFocus
Exit Sub

End If

 

3、ADO遍历数据库

Dim Rs As ADODB.Recordset

Dim strtemp As String

Dim i As Integer

Dim Xitong As Boolean

 

Set Rs = New ADODB.Recordset

strtemp = “select * from 字段所在表”

Rs.Open strtemp, CurrentProject.Connection, adOpenKeyset, adLockOptimistic

If Rs.RecordCount <= 0 Then

‘判断记录是否存在

Rs.MoveFirst

For i = 0 To Rs.RecordCount – 1

If (Rs(“字段名称”) = Me![字段名称]) Then

MsgBox “你输入的数据已经存在,请重新输入”, vbCritical, “警告”

Me.字段名称.SetFocus
Exit Sub

Else

Rs.MoveNext

End If

Next i

End If