2017-01-12 37 views
2

我需要一些帮助踢首发的方式来验证字符串出现在某一特定领域的表的所有记录的完整性:验证基于基线公式

表阿尔法:

| A-ID* |  Description**   |  Formula**   | 
|-------|------------------------------|--------------------------| 
| A101 | House + 2 bed + 1 bath  | TYPH + numbdB + numbathA | 
| A212 | Apartment + 1 bed + 1 bath | TYPA + numbdA + numbathA | 
| A342 | Condominium + 4 bed + 3 bath | TYPC + numbdC + numbathZ | 

*主键;固定长度 **可变长度

现在组成“描述”的项目(表阿尔法[以上])在单独的表中找到:

表布拉沃:

| Housing_ID* | HousingDes** | 
|-------------|--------------| 
| TYPH  | House  | 
| TYPA  | Apartment | 
| TYPC  | Condominium | 

表查理:

| Room_ID* | RoomDes** | 
|----------|-----------| 
| numbdA | 1 bed  | 
| numbdB | 2 bed  | 
| numbdC | 4 bed  | 

表三角洲:

| Bath_ID* | BathDes** | 
|----------|-----------| 
| numbathA | 1 bath | 
| numbathZ | 3 bath | 

*主键;固定长度 **可变长度

现在,我需要一种方法来验证记录(表格Alpha)的“说明”与表格Bravo指定的相关“公式”(表格Alpha)一致 - 三角洲。例如,关于表阿尔法的记录1,记录的“描述”可能被无意中修改。我怎么能“标记”这个不正确的记录?

| A-ID* |  Description**  |  Formula**   | 
|-------|----------------------------|--------------------------| 
| A101 | House"ee" + 2 bed + 1 bath | TYPH + numbdB + numbathA | 

如何重建表阿尔法[让我们把这种新的表,表FormAlphaBuild]基于“公式”而已?对于每个“A-ID”,我可以将Table Alpha中的“Description”与表FormAlphaBuild中的“Description”进行比较,然后查询该差异,以便知道哪些记录需要更正。

任何输入,将不胜感激。我的想法如下:

Private Sub VerifyDescription_Click() 

     Dim dbHouse As Database 
     Dim rsAlp, rsFAB As Recordset 
     Dim Description, Formula, Housing_ID, Room_ID, Bath_ID As String 

     Set dbhouse = CurrentDb 
     Set rsFAB = dbs.OpenRecordSet ("Table_FormAlphaBuild") 
     Set rsAlp = dbs.OpenRecordSet ("Table_Alpha") 


     rsAlp.MoveLast 
     rsAlp.MoveFirst 

     Do Until rsAlp.EOF 
      rsFAB.AddNew 
       rsFAB![A-ID] = rsAlp![A-ID] 
       rsFAB![Formula] = rsAlp![Formula] 
     rsFAB.Update 
     rsAlp.MoveNext 
     Loop 

     rsFAB.MoveLast 
     rsFAB.MoveFirst 

     Do Until rsFAB.EOF 
      Housing_ID = Mid(rsFAB![Formula], 1, 4) 
      Room_ID = Mid(rsFAB![Formula], 5, 6) 
      Bath_ID = Mid(rsFAB![Formula], 9) 

Description = DLookup("HousingDes", "Table_Bravo") "+" DLookup("RoomDes", "Table_Charlie") "+" DLookup("BathDes", "Table_Delta") & Mid(Bath_ID, x, 8) 

我该如何解释一个可变数量的bathroom_IDs?他们总是会在单一的Housing_ID + Room_ID后出现。

有些洞察请 - 如何列出每个“A-ID”的正确描述。

我需要帮助来创建FormAlphaBuild表。一旦我有了这个,我想我可以想出一个比较Alpha“描述”和FormAlphaBuild“描述”的机制。

+0

请使用http://ozh.github.io/ascii-tables/显示在表格的形式,而不是列出了样本数据。请摆脱印刷引用''“'并使用标准引号'”“'代替(双+单引号)。 – Andre

+0

谢谢你,安德烈。我已经更新了我的初始文章。 – Ludwig

+0

可能值得重新访问您的数据库模式(结构)。通常,将多个信息合并到一个列中并不是一个好主意。例如,您可以将您的数据分为三列:房屋类型(可能是在另一张桌子中用简单英文名称查找的键),床数和浴缸数。然后,您可以使用该信息进行查询,以您喜欢的任何格式撰写纯英文描述。有关更多阅读,请查看https://en.wikipedia.org/wiki/Database_normalization –

回答

1

乔布斯会如何以他建议的方式重新设计您的数据库结构。 也许这是你的过程的最终目标?

要验证您的描述字符串的完整性问问自己,这个过程是否需要定期轻松重复?在这种情况下,你需要一些漂亮的代码。

如果它只是一个清理数据的过程,并希望遵循Will Jobs的数据库结构建议,那么我只需在访问用户界面中使用一些查询和过滤器。

我个人发现在表格结构中查看我的工作情况很有帮助,访问对此很有帮助。

要走这条路线,请在您的描述字符串上使用一些字符串函数根据您的Alpha表创建一个查询。

decriptionStringIntegrity: iif(lcase(trim([Description])) Like "[a-z]* + #* bed + #* bath","good","bad") 

propertyType: Trim(Left([Description],InStr([Description]," + "))) 

bedroomCount: Trim(Left(Mid([Description],InStr([Description],"+")+2),InStr(Mid([Description],InStr([Description],"+")+2)," "))) 

bathroomCount: Trim(Replace(Mid([Description],InStr([Description],"bed + ")+5,30),"bath","")) 

这里有很多事情要做,但是如果你把每个细分成更小的块,这是很容易理解的。

在Access的查询视图中,您可以通过仅显示“bad”decriptionStringIntegrity或空白bedroomCount等来进一步过滤。 这不是很健壮,但它至少会显示大部分“不好”的描述,如拼写错误和缺少分隔符(加号+字符)。

您甚至可能希望通过删除双空格并确保每个“+”被空格包围来运行初始清理描述字符串。

请务必在数据库的副本中完成所有这些操作,只需复制文件,无需借口。

这是一个查询字符串,它可以在您的示例数据上执行任务。

SELECT Alpha.Description, IIf(LCase(Trim([Description])) Like "[a-z]* + #* bed + #* bath","good","bad") AS decriptionStringIntegrity, Trim(Left([Description],InStr([Description]," + "))) AS propertyType, Trim(Left(Mid([Description],InStr([Description],"+")+2),InStr(Mid([Description],InStr([Description],"+")+2)," "))) AS bedroomCount, Trim(Replace(Mid([Description],InStr([Description],"bed + ")+5,30),"bath","")) AS bathroomCount 
FROM Alpha; 

希望帮助