Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Microsoft Access中创建只能由特定字段搜索的数据库_Sql_Vba_Ms Access - Fatal编程技术网

Sql 在Microsoft Access中创建只能由特定字段搜索的数据库

Sql 在Microsoft Access中创建只能由特定字段搜索的数据库,sql,vba,ms-access,Sql,Vba,Ms Access,如何在Microsoft Access中创建一个数据库,该数据库只能由某些字段搜索,并且只由表单上的几个(必要的)文本框和复选框控制,以便易于使用—无需进行困难的查询 例如: 表单上有多个文本框和多个相应的复选框,当选中文本框旁边的复选框时,该文本框将启用,然后您可以通过在该文本框中输入的内容进行搜索 (事实上,我已经知道这一点,只是在玩stackoverflow jeopardy,我问了一个我知道答案的问题,只是为了增加世界的编码知识!回答大约5分钟)对于一个模糊的问题,我只能回答打开MS A

如何在Microsoft Access中创建一个数据库,该数据库只能由某些字段搜索,并且只由表单上的几个(必要的)文本框和复选框控制,以便易于使用—无需进行困难的查询

例如: 表单上有多个文本框和多个相应的复选框,当选中文本框旁边的复选框时,该文本框将启用,然后您可以通过在该文本框中输入的内容进行搜索


(事实上,我已经知道这一点,只是在玩stackoverflow jeopardy,我问了一个我知道答案的问题,只是为了增加世界的编码知识!回答大约5分钟)

对于一个模糊的问题,我只能回答打开MS Access,然后单击鼠标几次

仔细想想:

使用“OpenForm”方法的“WhereCondition”参数启动时,您需要显示表单并禁用其他菜单等。这样,您的用户只能看到您有限的功能,无法直接打开表格等


这本书的摘录,应该是有启发性的

我自己的解决方案是在表单的标题部分为我希望能够筛选的每个列(通常是所有…)添加一个“filter”控件。每次更新此类“过滤器”控件时,都会运行一个过程,使用Access VBA中提供的“BuildCriteria”功能更新窗体的活动过滤器

因此,当我在“采购订单描述”列顶部的“过滤器”中键入“
*cable*
”时,“WHERE pod描述类似”
*cable*
”将自动添加到MyForm.filter属性中

有些人会反对,过滤由多个基础表组成的记录源可能会变得非常棘手。没错。因此,我认为最好的解决方案是始终(我是说!)使用平面表或视图(“选择”Access中的查询)作为表单的记录源。这将使您的生活更加轻松


一旦你确信这一点,你甚至可以想到一个小模块,它将自动添加“过滤器”“控件和与表单相关的过程。您将获得真正用户友好的客户端界面

这实际上是一个相当大的话题,而且充满了各种潜在的问题。大多数关于Access的中级到高级书籍都会有一些讨论“按表单查询”的章节,其中有一个未绑定的表单,允许用户选择某些条件,并且在执行时动态写入SQL以返回匹配的数据

在平面、单表数据结构之外的任何情况下,这都不是一项简单的任务,因为SQL的FROM子句依赖于WHERE子句中查询的表

我为客户创建的应用程序中的一些QBF表单示例:

  • 第一个由类模块驱动,该类模块具有反映此表单中所选条件的属性,并且具有写入FROM和WHERE子句的方法。这使得添加其他字段非常容易(只要这些字段不是来自已经包含的表之外的表)

    该过程中最复杂的部分是编写FROM子句,因为您必须具有适当的联接类型,并且只包括SELECT子句或WHERE子句中的表。如果包含任何其他内容,则会大大降低查询速度(尤其是在有任何外部联接的情况下)

    但这是一个大问题,没有灵丹妙药解决方案——相反,必须为每个特定的应用程序创建类似的东西。同样重要的是,你要对用户进行彻底的测试,因为对于你,开发人员来说,什么是完全清楚和可以理解的,对于最终用户来说,这通常是非常令人困惑的


    但这一原则不仅仅适用于QBF

    如果功能非常有限和/或专门化,那么SQL数据库可能会被过度使用,例如,本地缓存所有数据组合,甚至在内存中,并根据表单上的复选框显示一个。以前,您可以撤销表中的权限,并仅对以规定方式查询数据的视图/进程授予权限,但是,MS Access 2007中的安全性已被删除,因此您现在可以真正阻止用户绕过您的简单应用程序,例如,Excel和以任何方式查询数据……但这不是企业数据库的重点吗?;-)

    但是很好的内容。发布你已经解决的问题的解决方案没什么错。我不是在刻薄。回答你自己的问题也可以。我只是觉得这个问题太模糊了,无法得到一个直截了当的答案。你的答案可以总结为:“使用OpenForm方法的WhereCondition参数”-这不是真实的生活,它只是非常有趣的一和零(spaf),可能会阻止临时用户编辑数据。但我不相信它能真正保护需要保密的数据,因为你可以在.Net中编写一个程序,连接到access数据库并运行查询而不打开它。是的,我想这是一个相当大的问题。尽管如此,我仍然无法让查询有效(或正确)地从表单中获取数据,因此,请参阅底部的解决方案以及所有代码。基本的想法是好的。示例更好。不幸的是,我没有任何可共享的示例,正是因为这是一个复杂的主题,我所有的解决方案都是针对我没有权限共享的客户项目的。您提到了查询——我不会为此使用保存的查询,而是动态编写SQL。