0

我不确定是在这里还是在 SuperUser 上问这个问题,所以如果它不属于这里,我深表歉意。

我创建了一个小型 PHP/MySQL 数据库应用程序来管理我妈妈商店的客户忠诚度数据,打算用 XAMPP 在她的收银机计算机上进行本地设置。但是,我被要求在 GUI 关系数据库(例如 MS Access 或 OpenOffice Base)中重新实现系统,主要是为了让她可以使用 GUI 执行邮件合并和图形报告等操作(我不必编写) .

我可以轻松地复制我的 MySQL 表结构和关系,并创建一些更基本的表单和报告,但我从未在 Access 或 Base 中编写过任何脚本、宏等。我的 PHP 处理的不仅仅是表单输入,还涉及一些我不知道如何在 Access / Base 中实现的脚本。值得注意的是:如果我最终使用 Access,它将是 Access 2007。

这是我正在尝试制作的内容的快速概述,以防万一。对不起,长度。

该业务是一个外卖食品市场,数据库正在取代实体邮票卡忠诚度系统。每位顾客每消费 25 美元,就会在他们的卡上盖上一个印章。他们获得以下免费餐点:
- 在第 8 次邮票上,他们获得免费配菜。
- 在第 16 枚邮票上,他们可以获得免费的常规大小餐。
- 在第 24 章,他们可以获得免费的家庭大小餐,并且他们的卡重置为零印章。
必须记录每张邮票的日期(否则我只会增加一个字段而不是邮票表)。

我有 3 个表:customersstampsfreebies。与和customers都有一对多的关系。stampsfreebies

  • customers是一个简单的联系人列表。
    列:ID, firstname, lastname, email, phone
  • stamps记录每张获得的邮票。
    列:ID, customerID, date, index(1-24;该客户卡上的第 N 个印章)
  • freebies记录他们赚取的每一顿免费餐食。
    列:ID, customerID, date, size, is_redeemed

这是我的 PHP 的魔力,我不知道如何在 Access/Base 中实现:

  1. 当用户选择客户并单击“添加图章”按钮时:

    • stamps被查询以从该客户的最后一个标记中获取索引 => 局部变量 N
    • 如果 N == 24,则设置 N = 0。将 N 增加 1。
    • 插入一条记录,stamps其中包含当前日期、客户 ID 和索引 N
    • 如果 N == 8、16 或 24,则插入一条freebies具有适当大小的记录,并且会出现一个警报,通知用户该客户获得了一些免费的东西。
  2. 某种“查看客户”页面(表格?报告?),显示他们获得的所有邮票和赠品,在未兑换的赠品旁边有“兑换”按钮。

一般来说,我需要让它相当防白痴和“大按钮”——尽可能自动化——商店的收银员应该能够在没有数据库先验知识的情况下使用它。

这在 Access 或 Base 这样的程序中是否实用,还是我应该说服她使用我的 PHP 版本?如果我需要编写代码,我需要自学什么语言?我应该以不同的方式构建数据吗?我不知道从哪里开始。

4

3 回答 3

4

真的,我认为这将是小菜一碟。就像托尼说的那样,您可以继续使用相同的表/后端是真的,这可能是我推荐的路线。您需要在任何将链接到 MySQL 数据库的机器上安装 MySQL 的 ODBC 驱动程序。之后创建一个 DSN,然后通过 Access 中的 DSN 访问表。您可能希望稍后添加代码以在每次使用无 DSN 表加载软件时重新链接表。这样,数据库可以在没有配置 DSN 的机器上运行。我确实建议您使用 MySQL 或 SQL Server Express,而不是 MS Access 后端,但我不会花时间详细说明原因。

我认为您实际上可以从传统的 Windows 桌面应用程序(内置于 MS Access 或 VB.Net)中获得比 PHP 更多的功能。我个人认为,您可以用更少的代码和更少的时间来完成它。我提到了 VB.Net,但我可能会推荐 MS Access over VB.Net 用于数据库,尽管任何一个都可以完成这项工作。

正如 Tony 已经提到的,Access 使用 VBA 语言。除非您已经对使用基本语法的其他编程语言有一定的经验,否则要真正掌握它需要一点时间。我发现从 VBA/ASP 迁移到 PHP/Javascript 进展缓慢,但不一定那么困难。PHP 使用带有花括号的 C 样式代码,而 VBA 不使用。

来自 PHP,这里有一些对你来说可能是新的东西:

更强的变量类型 - 在 Access 中,您实际上可以使用指定的数据类型声明变量,例如 String、Date、Integer、Long、Single、Double 等。我建议尽可能多地使用它。在极少数情况下,您需要使用更通用的类型,例如 Object 或 Variant。如果您尝试将错误的数据类型放入其中,使用指定数据类型声明的变量将引发错误。在我看来,这可以帮助您编写更好的代码。

Option Explicit - Option Explicit 是一个声明,您可以将其放在每个代码模块的顶部,以强制您必须在使用之前使用 Dim 语句声明一个变量。我强烈建议您这样做。它将为您节省大量解决问题的时间。

Set MyVariable = Nothing - 在使用对象变量后清理它们是使用 MS Access 的最佳实践之一。您将使用它来清理 DAO Recordset 变量、ADO Connection 变量、ADO Recordset 变量、表单变量等。您声明为对象(或某些特定类型的对象)的任何变量都应该通过将其设置为 Nothing 来清理当您不再需要使用该变量时。

无包含 - MS Access 中没有包含语句之类的东西。您可以从其他 Access 数据库导入代码模块。您可以调用包含在 DLL 中的函数。但是 Access 中没有包含 PHP 中的包含。

DoCmd - 您必须使用 MS Access 的 DoCmd 对象来打开表单和报告并执行其他常见任务。只是一个警告:它经常是不合理的。长期使用 Access 的用户并没有多想,但我发现这些命令几乎没有凝聚力或一致性。让我给你举个例子。如果要关闭表单,请使用以下代码:DoCmd.Close acForm, "frmSomeFormName"但如果要打开表单,请使用以下代码:DoCmd.OpenForm "frmName"在这个例子中,为什么打开一个表单会获得它自己的 OpenForm 函数,而关闭一个表单只是使用 Close 后跟一个告诉 Access 您想要关闭一个表单的常量?我没有答案。DoCmd 充满了这种不一致。Blueclaw 在列出最常见的 DoCmd 方面做得非常好,尽管我认为那里的示例并不十分出色。

参考资料- 您不需要经常使用参考资料。您必须使用它们来启用诸如 DAO 和 ADO(见下文)或 Microsoft Scripting Runtime(通常用于访问、读取、写入文件和文件夹等)之类的功能。这基本上是你做一次然后你就忘记它的事情。

ActiveX 控件- 尝试在不使用这些控件的情况下构建您的项目可能会更好。它们需要在将运行您的软件的每台计算机上安装相同的控件。我对此了解不多,但我知道如果您在项目中使用 ActiveX 控件,可能会出现一些兼容性问题。

DAO - 数据访问对象- DAO 是 Access 的原始、本机对象集,用于连接到您的数据容器。虽然它主要用于访问 Access 数据库后端/容器中保存的日期,但当您使用 ODBC 链接表时,它也可用于某些任务。当您需要遍历记录集以进行批量更改时,DAO 非常有用。您甚至可以使用它来循环表单控件。我使用它的一个地方是在删除一行后重新排序发票详细信息中的行号。另一个典型用途是在“实用程序”功能中使用它,您需要更改给定字段或无法通过更新查询完成的字段中的某些内容。

CurrentDb.Execute("Update or Delete query here...") 在我的理解中,CurrentDb 对象的 Execute 方法是一个隐式的 DAO 调用。它允许您从 VBA 代码对本地和链接表运行更新或删除查询。您也可以使用 DoCmd.RunSQL 实现此目的,但 CurrentDb.Execute 是首选方法,因为如果您将“, dbFailOnError” 作为第二个参数附加,它会在出现故障时为您提供改进的错误消息。

ADO - ActiveX 数据对象- 我建议不要使用 ActiveX 控件,但这是您可能需要的一种 ActiveX 技术。据我所知,ADO 是唯一可以用来从 Access 运行存储过程的东西。ADO 与 DAO 类似,应该取代 DAO,但实际上并没有。我倾向于在我的应用程序中使用它们。需要一段时间才能确定哪一个会为您完成这项工作,或者哪一个会做得更好。一般来说,除了运行存储过程或连接到外部数据源(即不使用链接表)之外,我坚持使用 DAO。DAO 和 ADO 都是与 MS Access 一起安装的 MDAC(Microsoft 数据访问组件)的一部分。

文件系统对象- 上面提到的这个对象通常用于访问文件和文件夹。你会发现你可能不得不使用它来复制文件、创建文本文件、读取文本文件、写入文本文件等。它是 Microsoft Scripting Runtime 的一部分,它是 Windows Script Host 的一部分(尽管存在于所有 Windows 计算机上它可能会“损坏”)。Access 确实为您提供了一些使用 VBA 的内置函数/方法(例如 Dir())访问文件和文件夹的方法,但这些函数并未涵盖所有基础。

SQL - 服务器的查询语言- 您可能已经熟悉 SQL,但您需要习惯 Access 的 SQL 语言“超集”。它并没有太大的不同,但 Access 确实允许您使用 Access 函数(例如 Len、Left、right)或您自己的自定义函数。您自己的函数只需要存在于代码模块中并声明为公共。您自己的函数的一个示例是重复(在 MS Access 中不存在,在 MySQL 中存在),它有时用于在具有子父关系的表中基于 Count(*) 创建缩进。我举个例子,尽管除非你打算使用嵌套集模型来保存层次类别,否则你不太可能需要使用这样的函数。

变量不能是文字字符串 - 这是 Access 和 PHP 之间的巨大差异。PHP 允许你写:"SELECT * FROM tag WHERE tagtext = '$mytag'" 在 MS Access 中你必须这样写:"SELECT * FROM tag WHERE tagtext = '" & strMyTag & "'"(你可以除非您在 VBA 中格式化查询以检索 DAO 或 ADO 记录集,否则无需担心这一点。我刚刚指出的内容通常不会影响您的表单或报表的记录源或保存的查询,因为您通常不使用其中的变量。)

查询 - 不难弄清楚,但在 Access 中,查询基本上是一个 MySQL 视图。我实际上并不经常保存查询。我通常只使用它们来导出我的 SQL“代码”,然后我将那个 SQL 粘贴到我的表单中作为记录源,而不是将表单绑定到保存的查询。你想以哪种方式去做并不重要。无论您选择哪种方式,都有利有弊。作为旁注,不要害怕在 MySQL 中创建视图并在 Access 中链接到它们。当您链接到它们时,Access 将它们视为表格。它是否可更新/可写将取决于视图的构造。某些类型的查询/视图(例如联合)是只读的。

最后一点,我推荐 MS Access 而不是 OpenOffice.org Base。几年前我试用了 Base,发现它缺少很多功能。但是,我已经在 MS Access 方面有经验,所以我不确定我是否给了 OpenOffice Base 一个公平的试验。我发现缺少的是事件。我习惯于在 MS Access 中微调我的表单,为用户提供一个响应迅速的 UI,并提供大量反馈,但我不知道如何在 Base 中做到这一点。也许自从我上次尝试以来情况发生了变化,我不知道。这是一篇比较 Base 和 MS 访问的文章。

其他 SO Access 大师,请随时指出我回答中的任何错误。我仍然认为自己是编程新手。

于 2011-01-28T05:47:48.713 回答
2

我不能为基地说话。但是 Access 可以直接链接到 MySQL 数据库,因此您不必重做数据。至于在 Access 中创建代码的点点滴滴,那将非常容易。Access、Word 和 Excel 使用与 Visual Basic 6.0 相同的 VBA,除了 Access、Word 或 Excel 对象模型特定的东西。实际上,VB6 编辑器中也存在使用 VBA 编辑器时的一个小错误。

我还要补充一点,我的一个 Access 数据库有 160 个表、1200 个查询、350 个表单、450 个报告和 70K 行代码。因此,相比之下,您的应用程序非常小。

在免费赠品表上,我会将 is_redeemed 字段更改为 date_redeemed。我绝对同意将每个邮票和获得的免费赠品作为单独的记录记录在表格中。这样就可以很容易地向客户展示历史,而不仅仅是说您只有 x 个印章。

还可以考虑使用条形码阅读器并向用户发放带有条形码的塑料钱包卡。这将大大加快职员查找记录所需的时间。确实考虑使用他们可能已经拥有的您所在地区的常见会员卡,例如 Safeway 或 AirMiles 卡。我会把这个数字放在一个单独的表中,以防万一他们丢了他们得到的第一张牌。或者他们可以跟踪多张卡片。一个家庭可能希望将积分累积到一个帐户上。

感谢您的冗长发布。这使我们能够就您一开始可能没有想到的不同方面为您提供一些建议。

于 2011-01-28T04:08:18.843 回答
1

我的建议:不要这样做。在有问题的 PC 上运行 mysql 服务器,将您的 PHP 应用程序作为收银员的前端,然后如果您想要 MS Access 的报告功能,只需让 Access 使用 ODBC 连接到 mysql 数据库。

最好的实现通常是您已经拥有的。

于 2011-04-22T14:25:35.430 回答