根据Access中的字段值更改关系

问题描述:

我有一张表,我想链接其他三张表,我意识到这是不可能的,因此我决定找到一种方法来处理VBA。我抓住了一些代码,我真的希望将工作,并已编辑它,使之与我的具体需求根据Access中的字段值更改关系

Option Compare Database 

Function changeRel() 

    If Players.Cond = "Quest" Then 
     Dim dbs As DAO.Database 
     Dim rel As DAO.Relation 

     Set dbs = CurrentDb 

     Set rel = dbs.CreateRelation("QuestRel", "Players", "Player Quests", dbRelationDeleteCascade) 
     rel.Fields.Append rel.CreateField("PlayerID") 
     rel.Fields("PlayerID").ForeignName = "PQuestID" 

     dbs.Relations.Append rel 
     dbs.Relations.Refresh 

    ElseIf Players.Cond = "Level" Then 
     Dim dbs As DAO.Database 
     Dim rel As DAO.Relation 

     Set dbs = CurrentDb 

     Set rel = dbs.CreateRelation("LevelRel", "Players", "Player Levels", dbRelationDeleteCascade) 
     rel.Fields.Append rel.CreateField("PlayerID") 
     rel.Fields("PlayerID").ForeignName = "PLevelID" 

     dbs.Relations.Append rel 
     dbs.Relations.Refresh 

    ElseIf Players.Cond = "Stat" Then 
     Dim dbs As DAO.Database 
     Dim rel As DAO.Relation 

     Set dbs = CurrentDb 

     Set rel = dbs.CreateRelation("StatRel", "Players", "Player Stats", dbRelationDeleteCascade) 
     rel.Fields.Append rel.CreateField("PlayerID") 
     rel.Fields("PlayerID").ForeignName = "PStatsID" 

     dbs.Relations.Append rel 
     dbs.Relations.Refresh 

    Else 
     'Do nothing 

End Function 

我从来没有在VBA之前编码工作,我不知道是什么Option Compare Database手段,它是就在那里。我很确定我需要一个子程序,尽管我对它是什么感到困惑。

有人能告诉我如何在每次单元格Players.Cond的值发生变化时运行此函数吗?

+0

[上docs.SO选项关键字(http://stackoverflow.com/documentation/vba/3992/vba-option -keyword/13937/option-compare-binary-text-database#t = 20161121223654120041) –

+3

您不应该根据数据值定期更改数据库关系。表关系维护数据库的结构完整性,并应在数据库设计期间仅调整一次。否则你可能会破坏很多应用程序逻辑和记录管理。 – Parfait

如何像这样从所有4台拉相关数据:

SELECT Players.PlayerID, [Player Quests].PQuestID, [Player Levels].PLevelID, [Player Stats].PStatsID 
FROM (((Players 
    LEFT JOIN [Player Quests] ON Players.PlayerID = [Player Quests].PQuestID) 
    LEFT JOIN [Player Levels] ON Players.PlayerID = [Player Levels].PLevelID) 
    LEFT JOIN [Player Stats] ON Players.PlayerID = [Player Stats].PStatsID)