【问题标题】:Global variable doesn't transfer its value to a form全局变量不会将其值传输到表单
【发布时间】:2020-07-13 21:22:15
【问题描述】:

我在多用户环境中开发了一个 MS Access 工具。基于登录不同的用户有不同的看法和获得不同的信息。

所以我的问题是我在模块中声明的全局变量没有保存并将信息传输到表单,我想根据标准对其进行过滤。

这是完美运行的全局变量(模块级别)设置的代码。

Option Compare Database

Global GBL_Username as String

Public Function Init_Globals() As String
    GBL_Username = Forms!frm_Login.txtUsername

    DoCmd.OpenForm "frm_Login"

    frm_Login.Visible = False

    Forms!frm_Login.txtUsername.Value.Enabled = False
End Function

在应该填充的表单中,我调用该函数并将其设置在过滤器字段(txtfilterfield)中。

但是,经过多次尝试,我仍然遇到一些错误,例如“未定义变量”或者它只是显示变量是" "

我会很感激这里的一些帮助。

【问题讨论】:

  • 全球很烂。为什么不直接使用隐藏窗体上的控件呢?
  • 这是个好主意...我会试试...
  • 不...没用...我会尝试其他的...

标签: ms-access vba


【解决方案1】:

试试Public GBL_Username As String

【讨论】:

  • 好答案。另外,Ira,在每个模块的顶部包含Option Explicit 非常重要。这通过强制您使用DimPublic 等声明变量来防止各种名称和范围问题。
  • 嗨!这不是问题..即使我使用 Global 或 Public 声明它并将 Option Explicit 放在代码上方.. 变量保持不变(因此代码实际上读取它),但稍后不会通过代码使用它形式。 :(
  • 如果您在代码中遇到未处理的错误,所有变量,包括您的公共/全局变量都会恢复为默认值。也许是这样?如果您使用我的答案中的语法将变量放入模块中,它应该可以正常工作。
  • 这就是为什么我建议使用隐藏控件而不是全局变量的原因。 1)它不会通过停止代码重置,并且 2)您可以在开发过程中使其可见,并且 3)它可以通过查询访问。
  • 您的第一句话是绝对正确的。然而,使您的变量可见,可以通过在您的 vba 编辑器中添加一些简单的手表来完成,您还可以通过创建一个将变量分配给函数的简单函数将您的公众分配给查询。除此之外,我也更喜欢使用隐藏控件!
【解决方案2】:

我不确定这是否会是一个答案,但评论太长了,因此发布为答案。

您的函数不返回任何值,因此就您想要实现的目标而言没有任何意义。

让我们逐行尝试:

Public Function Init_Globals() As String
    'Receive the username from a textbox called txtusername? if yes you should use txtUsername.value. if txtusername is a db field your should use frmlogin.[txtusername] << strongly not recommended
    GBL_Username = Forms!frm_Login.txtUsername

    'Open the login form thereafter? how can you receive the username in previous code without having the form opened?
    DoCmd.OpenForm "frm_Login"

    'since you have saved/taken your username and saved on a public variable why keeping the login form open and visible? 
    frm_Login.Visible = False

    'I have no clue what this code supposed to do, disable the textbox? if yes you should use txtUsername.enabled = false
    Forms!frm_Login.txtUsername.Value.Enabled = False
End Function

也许你想这样做:

  1. 检查用户是否登录
  2. 如果不强制用户登录
  3. 获取登录用户名

在代码中

Public UserName as String

Public Function GET_USER_NAME() as String
   CHECK_LOGIN ' checks if username is already there
   get_user_name = userName ' return the username
End Function

Public Function CHECK_LOGIN()
   if nz(username,"") = "" then ' check if username is empty
      LOGIN ' if empty force relogin
   End Id
End function

Public Function LOG_OUT()
   userName = ""
end Function

Public Function LOGIN()
   docmd.OpenForm "frm_Test", WindowMode:=acDialog
   ' in your login form after successful login save the username into the userName variable
   'something like this. userNAme = me.txt_username.value
End Function

要获取登录的用户名,您可以调用函数“get_user_name”,例如

 dim crr_user  as string
 crr_user = get_user_name

注意:我没有检查错误,我只是从头开始写的。

这里有一些逻辑想法如何在 Access 中使用用户登录:

  1. 只需使用公共变量来保存用户名。当用户在成功登录后登录时,将用户名/ID 保存在公共变量中。使用该变量以备将来使用
  2. 创建一个显示登录表单的登录/注销函数,成功登录后将用户详细信息保存在“本地表”中,然后您可以通过 Dlookuping(username, tablename...) 获取用户名
  3. 复杂的方式:创建类模块“Membership”创建用于保存/检索用户详细信息/登录详细信息等的 getter 和 setter 函数。

也许检查这个帖子有人上传了示例数据库: Microsoft Access - Show name of logged in user from UserID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2012-05-01
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多