Ms access 基于基线公式的数据串完整性验证

Ms access 基于基线公式的数据串完整性验证,ms-access,vba,Ms Access,Vba,我需要一些帮助来启动一种方法来验证表中所有记录的特定字段中出现的字符串的完整性: 表A: | A-ID* | Description** | Formula** | |-------|------------------------------|--------------------------| | A101 | House + 2 bed + 1 bath | TYPH + numbdB + numbathA | |

我需要一些帮助来启动一种方法来验证表中所有记录的特定字段中出现的字符串的完整性:

表A:

| 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 |
*主键;固定长度 **可变长度

现在,组成“描述”(表Alpha[上文])的项目可以在单独的表中找到:

表B:

| 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–Delta指定的相关“公式”(表Alpha)一致。例如,关于表Alpha的记录1,记录的“描述”可能会被无意中修改。我怎样才能“标记”这个不正确的记录

| A-ID* |       Description**        |        Formula**         |
|-------|----------------------------|--------------------------|
| A101  | House"ee" + 2 bed + 1 bath | TYPH + numbdB + numbathA |
如何仅基于“公式”重新创建表Alpha[我们称之为新表,表FormAlphaBuild]。对于每个“A-ID”,我可以将表Alpha中的“描述”与表FormAlphaBuild中的“描述”进行比较,然后查询此差异,以便知道哪些记录需要更正

如有任何意见,将不胜感激。我的想法如下:

    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)
我如何解释不同数量的浴室ID?他们总是追求一个单一的住房ID+房间ID

请了解如何列出每个“A-ID”的正确描述


我需要有关创建FormAlphaBuild表的帮助。一旦我有了这个,我想我可以着手设计一种机制,将Alpha“描述”与FormAlphaBuild“描述”进行比较。

威尔·乔布斯将以他建议的方式对数据库结构进行重新设计。 也许这就是你过程的最终目标

要验证描述字符串的完整性,请扪心自问,此过程是否需要易于定期重复?在这种情况下,您需要一些好的代码

如果清理数据只是一个一次性的过程,并且希望遵循威尔·乔布斯的数据库结构建议,那么我只需要在用户界面中使用一些查询和过滤器

我个人认为在表结构中查看我的工作是很有帮助的,access对此非常有用

要执行此操作,请在描述字符串上使用一些字符串函数,基于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的查询视图中,您可以通过仅显示“坏”说明字符串完整性或空白卧室数等来进一步过滤此信息。 这不是很可靠,但它至少会向您显示大多数“错误”描述,例如拼写错误和缺少分隔符(加号+字符)

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

确保所有这些都是在数据库的副本中完成的,易于访问,只需复制文件,没有理由不这样做

下面是一个查询字符串,用于处理示例数据

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;

希望对您有所帮助

请使用以表格形式而不是列表形式显示样本数据。请不要用印刷体的引号,改用标准引号(双引号+单引号)。谢谢你,安德烈。我已经相应地更新了我的第一篇文章。也许值得重温一下你的数据库模式(结构)。通常,将多条信息合并到一个列中不是一个好主意。例如,可以将数据分为三列:房屋类型(可能是要在另一个表中的纯英文名称中查找的键)、床数和浴室数。然后,您可以使用该信息进行查询,以您喜欢的任何格式编写简单的英语描述。更多阅读,请查看