2017-01-12 38 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; 

希望幫助