使用 vba 和 postgresql table 填充组合框访问 2007
Populate combobox access 2007 using vba with postgresql table
我正在尝试使用父组合框过滤的 table 中的记录填充组合框。
我要过滤的 table 称为 muni,父 table 称为 prov。它们由一个公共字段相关(muni 有一个名为 gid_prov 的字段,其中包含每个记录的 prov gid)
第一个组合框存储 prov gid 并显示 prov 名称。
两个 table 都在 postgresql 的数据库中,连接到使用 ODBC 的 DSN 文件访问。
我尝试了很多选项, none 是正确的。
首先,我尝试了一个简单的选项。这段代码现在没用了
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
在@Thaippo 的支持下工作得很好。谢谢
你可以使用 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
最好先清除组合框,然后再向其中添加新项目。
我正在尝试使用父组合框过滤的 table 中的记录填充组合框。 我要过滤的 table 称为 muni,父 table 称为 prov。它们由一个公共字段相关(muni 有一个名为 gid_prov 的字段,其中包含每个记录的 prov gid) 第一个组合框存储 prov gid 并显示 prov 名称。 两个 table 都在 postgresql 的数据库中,连接到使用 ODBC 的 DSN 文件访问。 我尝试了很多选项, none 是正确的。 首先,我尝试了一个简单的选项。这段代码现在没用了
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
在@Thaippo 的支持下工作得很好。谢谢
你可以使用 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
最好先清除组合框,然后再向其中添加新项目。