ms-access - 如何从外部程序在 Microsoft Access 表单中设置当前记录

标签 ms-access

背景 :
我工作的慈善机构有两个系统,一个新的 C# 系统和一个 MS Access 系统。接听某人的电话通常意味着在新系统上查找他们,然后在旧系统上再次查找他们。
不幸的是,我们被 Access 系统困住了,因为我们没有钱重新开发它。

两个系统都为每个人使用一个唯一的 PersonID,并且这些 ID 在系统之间是同步的。 Access 系统基本上是一个巨大的表格,它显示特定 PersonID 的信息。

问题 :
我想要做的是告诉 Access 将当前记录从外部 c# 程序移动到特定的 PersonID。我不想启动新的 Access 窗口,因为这在我们的 PC 上非常慢。

我试图思考谷歌如何从外部控制 Access (类似于 DDE??),但我画了一个空白。任何人都可以给我任何指示要寻找什么?这甚至可能吗?

最佳答案

您可以使用 COM 自动化。如果您的新系统是例如Excel,你可以使用这样的 VBA 代码:

Sub TestCOMtoAccess()

    ' Has References to Microsoft Access Object Library & Microsoft DAO 3.6 Object Library

    Dim oAccess As Access.Application
    Dim oForm As Access.Form
    Dim RS As DAO.Recordset

    ' This assumes that exactly one instance of Access is running, with your old application
    Set oAccess = GetObject(, "Access.Application")
    Set oForm = oAccess.Forms("your_giant_form")

    ' find the record you are looking for
    Set RS = oForm.RecordsetClone
    RS.FindFirst "myPrimaryKey = 42"
    ' and navigate the form to this record
    If Not RS.NoMatch Then
        oForm.Bookmark = RS.Bookmark
    End If
    RS.Close

End Sub

并根据 How to interact with another programs with OLE Automation in C#?这很容易适应 C# 和 .NET。

对于 C# Windows 窗体应用程序,等效代码为:

using System;
using System.Windows.Forms;

namespace ComAutoWindowsFormsApp
{
    public partial class MyCsharpForm : Form
    {
        Microsoft.Office.Interop.Access.Application accApp;
        public MyCsharpForm()
        {
            InitializeComponent();
        }

        private void MyCsharpForm_Load(object sender, EventArgs e)
        {
            accApp = 
                (Microsoft.Office.Interop.Access.Application) 
                System.Runtime.InteropServices.Marshal.GetActiveObject("Access.Application");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Microsoft.Office.Interop.Access.Form accForm = accApp.Forms["your_giant_form"];
            Microsoft.Office.Interop.Access.Dao.Recordset accRs = accForm.RecordsetClone;
            accRs.FindFirst("myPrimaryKey = 42");
            if (!accRs.NoMatch)
            {
                accForm.Bookmark = accRs.get_Bookmark();
            }
            accRs.Close();
        }
    }
}

关于ms-access - 如何从外部程序在 Microsoft Access 表单中设置当前记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45754030/

相关文章:

vba - 使用默认浏览器打开浏览器/URL

ms-access - 在Access应用程序中混合ADO和DAO

ms-access - 微软 Access : use VBA to split a string from a text box into other text boxes

sql - 女士 Access 排名前三名

ms-access - 确定路径是否为网络路径 VBA

ms-access - MS Access VBA 交叉表报告图例排序顺序

ms-access - VBA检查对象是否已设置

ms-access - 有没有办法在 Microsoft Access 中将整数连接到始终包含整数的字符串

sql-server - 配置 Access 报表以使用 SQL Server 存储过程作为其记录源

c# - 如何迭代 MS-Access 表单上的控件?