使用带有 postgresql 表的 vba 填充组合框访问 2007

Posted

技术标签:

【中文标题】使用带有 postgresql 表的 vba 填充组合框访问 2007【英文标题】:Populate combobox access 2007 using vba with postgresql table 【发布时间】:2016-09-07 12:59:04 【问题描述】:

我正在尝试使用父组合框过滤的表中的记录填充组合框。 我要过滤的表称为 muni,父表称为 prov。它们通过一个公共字段相关(muni 有一个名为 gid_prov 的字段,其中包含每条记录的 prov gid) 第一个组合框存储 prov gid 并显示 prov 名称。 这两个表都在来自 postgresql 的数据库中,连接到使用 ODBC 的 DSN 文件访问。 我尝试了很多选项,但没有一个是正确的。 首先,我尝试了一个简单的选项。这段代码现在没用了

Private Sub PROV_Change()
   MUNI.RowSourceType = "Table/Query"
   MUNI.RowSource = "select *  from memoria.muni  where gid_provs =" & PROV
   MUNI.Requery
   MUNI.SetFocus
   MUNI.Text = ""

   End Sub

PROV 是存储 prov gid 的父组合框的名称。和 MUNI 我要填充的组合框。 我尝试的其他选项是使用 sql 语句创建查询,这是现在的代码,我尝试使用 OpenRecordsetOutput,但无法正常工作。我可以访问数据库并获取字段,但我无法填充组合框 MUNI

     Private Sub PROV_Change()
    Dim oDb As DAO.Database
    Dim oRs As DAO.Recordset
    dbconnect = "ODBC;DRIVER=PostgreSQL ANSI;UID=***;PWD=***;PORT=5432;SERVER=127...;DATABASE=memoria_historica;DSN=C:\Users\***"
    Set oDb = OpenDatabase("", False, False, dbconnect)
Dim sql As String
sql = "select gid,nombre  from memoria.municipios m where m.gid_provs =" & PROV & "order by m.nombre;"
Set oRs = oDb.OpenRecordset(sql, dbOpenSnapshot, dbSQLPassThrough)
Me.muni2.RowSource = ""
If oRs.RecordCount > 0 Then
With oRs
.MoveFirst
.MoveNext

Do While Not .EOF
                    muni2.AddItem .Fields("nombre").Value

                    .MoveNext
Loop
End With
End Sub

在@Thaipo 的支持下工作得很好。谢谢

【问题讨论】:

你为什么不编辑你的问题并将你的代码更新到现在的样子?我想这和你上面展示的完全不一样 谢谢!现在它工作正常。最后为了填充 id_muni 字段,我对这样的更改进行了另一个查询 If oRs.recordCount>0 Then Me.txtTextbox=oRs!gid Else Me.txtTextbox="N/A" End If Set oRs=Nothing Set oDb=Nothing End Sub 来自@Fiounnala 【参考方案1】:

您可以使用 DAO 库。

你可以是 DAO。数据库和 DAO。像这样的记录集:

Dim oDb as DAO.Database
Dim oRs as DAO.Recordset

您的第二个代码块可以完成这项工作。

Set oDb = OpenDatabase("", False, False, dbconnect)
Dim sql As String
sql = "select m.nombre  from memoria.muni 
m,memoria.prov p where st_within(m.the_geom,p.the_geom) and p.gid =" & PROV ";"

Set oRs = oDb.Openrecordset(sql) 

If oRs.Recordcount > 1 Theb
With oRs
.Movelast
.Movefirst

Do while not.EOF
                    PROV.Additem . Fields("nameOfFieldsYouNeed"). Value
                    .Movenext
Loop
End With

End if

在添加新项目之前清除组合框是个好主意。

【讨论】:

很抱歉没有格式化代码块,我在手机上!待会我会在生病的时候编辑 感谢您的回答,但它不起作用。 oDb.Openrecordset(sql) 尝试在我的本地计算机上打开数据库,它显示“错误,找不到数据库 C:\Users\Documents\memoria.mdb”。我不明白为什么,因为 dbconnect 正在调用 ODBC 驱动程序 DSN。有什么建议吗?提前致谢 我尝试使用记录集类型中的 dbSnapshot 和选项中的 dbSQLPassThrough,现在我没有这个错误,但过滤器不起作用。我完全迷路了:-( 嗨@Thapipo,感谢您的代码,我已经实现了解决方案。我现在需要清除组合框,你有什么提示吗?我试过 combobox.Clear(); combobox.SelectedIndex = -1 和其他,但它不起作用。谢谢!

以上是关于使用带有 postgresql 表的 vba 填充组合框访问 2007的主要内容,如果未能解决你的问题,请参考以下文章

从vba中的表填充列表框

Access VBA:更改子表单的记录源

PostgreSQL 9.4 中 UUID 列索引的填充因子建议

如何自动填充公式 VBA

如何使用 VBA 动态自动填充目标?

VBA实现查找两个EXCEL表不同的地方