ms-access - programmation - vba microsoft documentation



Vérification de l'intégrité de la chaîne de données basée sur la formule de base (1)

J'ai besoin d'aide pour démarrer un moyen de vérifier l'intégrité des chaînes qui apparaissent dans un champ particulier pour TOUS les enregistrements d'une table:

Tableau Alpha:

| 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 |

*Clé primaire; longueur fixe ** Longueur variable

Maintenant, les éléments qui composent la "Description" (Table Alpha [ci-dessus]) se trouvent dans des tables séparées:

Bravo de table:

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

Tableau Charlie:

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

Table Delta:

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

*Clé primaire; longueur fixe ** Longueur variable

Maintenant, j'ai besoin d'un moyen de vérifier que la "Description" d'un enregistrement (Table Alpha) est cohérente avec la "Formule" associée (Table Alpha) comme spécifié par les Tables Bravo-Delta. Par exemple, en ce qui concerne l'enregistrement 1 du tableau alpha, la «description» d'un enregistrement pourrait être modifiée par inadvertance. Comment pourrais-je "marquer" cet enregistrement incorrect?

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

Comment recréer Table Alpha [appelons cette nouvelle table, Table FormAlphaBuild] basé sur les "Formules" seulement? Pour chaque "A-ID", je pourrais alors comparer la "Description" trouvée dans le tableau Alpha à la "Description" trouvée dans la table FormAlphaBuild, puis interroger cette anomalie afin que je sache quels enregistrements doivent être corrigés.

Toute contribution serait appréciée. Mes pensées sont les suivantes:

    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)

Comment pourrais-je comptabiliser un nombre variable de bathroom_IDs? Ils viendraient toujours après un seul Housing_ID + Room_ID.

Un aperçu s'il vous plaît-comment énumérer la description appropriée pour CHAQUE "A-ID".

J'ai besoin d'aide pour créer la table FormAlphaBuild. Une fois que j'ai ceci, je pense que je peux arriver à proposer un mécanisme pour comparer l'Alpha "Description" contre le "Description" de FormAlphaBuild.


Will Jobs parle parfaitement de la refonte de la structure de votre base de données comme il le suggère. Peut-être que c'est le but ultime de votre processus?

Pour vérifier l'intégrité de votre chaîne de description demandez-vous, ce processus doit-il être facilement reproductible régulièrement? Dans ce cas, vous aurez besoin d'un code sympa.

Si ce n'est qu'un processus unique pour nettoyer les données et, je l'espère, suivre les conseils de la structure de base de données de Will Jobs, j'utiliserais juste quelques requêtes et filtres dans l'interface utilisateur d'Access.

Personnellement, je trouve qu'il est utile de voir mon fonctionnement dans une structure de table et l'accès est excellent pour cela.

Pour suivre cette route, créez une requête basée sur votre table Alpha en utilisant des fonctions de chaîne sur votre chaîne Description.

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",""))

Il se passe beaucoup de choses là-bas, mais si vous divisez chacun en morceaux plus petits, c'est assez facile à comprendre.

Dans la vue de requête d'Access, vous pouvez filtrer plus loin en montrant seulement "mauvais" decriptionStringIntegrity ou blankCount etc Ce n'est pas très robuste mais il vous montrera au moins la plupart des "mauvaises" descriptions telles que les fautes d'orthographe et les délimiteurs manquants (le plus + caractère).

Vous pouvez même vouloir effectuer un nettoyage initial de la chaîne de description en supprimant les espaces doubles et en vous assurant que chaque "+" est entouré d'un espace.

Assurez-vous de faire tout cela dans une copie de la base de données, facile à faire avec l'accès, il suffit de copier le fichier, pas d'excuse pour ne pas le faire.

Voici une chaîne de requête qui effectue le travail sur vos données d'exemple.

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;

J'espère que cela pourra aider