IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Verifier datatype correspondance entre deux tables


Sujet :

VBA Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 61
    Points : 34
    Points
    34
    Par défaut Verifier datatype correspondance entre deux tables
    Bonjour a vous,
    ACCES 2003
    Je réalise un outil d'importation de feuille de calcul excel dans ma base de données.
    Mais avant de les importer dans mon tableau définitif (targeTable) je stocke les données dans un tableau temporaire (tableImport) et je vérifie que les données de la feuille excel sont compatible avec le tableau de destination.
    Une des phase de test est la vérification du type de données.
    Je prend comme référence les "datatypes" du tabletarget et vérifie dans lea tableimport qu'elles correspondent ou bien sont compatible ( un single peut aller dans un double par exemple)
    J'ai écrit le code suivant qui me semble un peu lourdeau et maladroit.
    Si quelqu'un a des pistes pour rendre ce code plus efficace et mieux structure je suis preneur.
    J'effectue une comparaison column par column.
    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    Private Function CompareFieldDataType(ByRef r_ImportTable As TableDef, ByRef r_TargetField As Field, ByRef r_ImportField As Field) As Boolean
     
     
         '//*****Check target field datatype vs import field datatype*****
           Select Case r_TargetField.Type
     
         '//******Same datatype*****
           Case r_ImportField.Type
     
           '//Check data size
           If CompareFieldDataSize(r_ImportTable, r_ImportField, r_TargetField) Then
           CompareFieldDataType = True
           Else
           CompareFieldDataType = False
           End If
     
         '//*****Import datatype ID inferior to target field*****
           Case Is > r_ImportField.Type
                   ''''''''''''''''''''''''''''''''''''''''''''''''''''''
                   '//%%%%Check target field%%%%
                   Select Case r_TargetField.Type
     
                   '//%%%%Target field type is a number%%%%
                   Case 2 Or 4 Or 6 Or 7
     
                            '''''''''''''''''''''''''''''''''''''''''''''
                            '//******Check import field datatype*****
                            Select Case r_ImportField.Type
     
                            '//Import field is a number
                            Case 2 Or 4 Or 6 Or 7
                            CompareFieldDataType = True
     
                            Case Else
                            CompareFieldDataType = False
                            End Select
                            '''''''''''''''''''''''''''''''''''''''''''
     
                   '//%%%%Target field type is text%%%%
                   Case 10
     
                            '//Check data size
                              If CompareFieldDataSize(r_ImportTable, r_ImportField, r_TargetField) Then
                            CompareFieldDataType = True
                            Else
                            CompareFieldDataType = False
                            End If
     
                   '//%%%%Target field type is memo%%%%
                   Case 12
                   CompareFieldDataType = True
                   End Select
                    '''''''''''''''''''''''''''''''''''''''''''''''''''''
           '//*****Import datatype ID superior to target field******
           Case Is < r_ImportField.Type
           CompareFieldDataType = False
           End Select
     
    End Function
     
    Private Function CompareFieldDataSize(ByRef r_ImportTable As TableDef, r_ImportField As Field, r_TargetField As Field) As Boolean
     
    Dim l_daoRecordset As recordset
    Dim l_daoDB As Database
    Dim l_lngMaxLength As Long
    Dim l_strSQL As String
     
    Set l_daoDB = CurrentDb()
     
    '//Import field is not text
    If r_ImportField.Type <> 10 Then
     
            '//Check import field data size
            Select Case r_ImportField.Size
            '// Import field size superior to target field
            Case Is > r_TargetField.Size
            CompareFieldDataSize = False
            '// Import field size inferior to target field
            Case Is <= r_TargetField.Size
            CompareFieldDataSize = True
            End Select
     
    '//Import field is text
    ElseIf r_ImportField.Type = 10 Then
     
    '//SQL statement: max length of text field in the import table
    l_strSQL = "SELECT TypeName("
    l_strSQL = l_strSQL & r_ImportField.Name & ") AS TypeName, Max(Len (" & r_ImportField.Name & ")) AS Length "
    l_strSQL = l_strSQL & "FROM " & r_ImportTable.Name
    l_strSQL = l_strSQL & " GROUP BY TypeName(" & r_ImportField.Name & ")"
    l_strSQL = l_strSQL & "HAVING (((TypeName(" & r_ImportField.Name & "))<>""null""));"
     
    Set l_daoRecordset = l_daoDB.OpenRecordset(l_strSQL)
    l_lngMaxLength = l_daoRecordset.Fields(1).Value
     
        If l_lngMaxLength <= r_TargetField.Size Then
        CompareFieldDataSize = True
        Else
        CompareFieldDataSize = False
        End If
     
    End If
     
     
    End Function

  2. #2
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    Les champs de la table TableImport sont au format texte donc acceptent toutes les données du fichier Excel.
    Il suffit par une requete de copier les données de TableImport dans targeTable en forçant les formats de données qui sont connus
    soient
    pour le texte : pas de changement ou Left$([champTexte];longueur) pour limiter la longueur du champ
    pour un long : nz(CLng([NomDuCHamp];0)
    pour un double: nz(CDbl([NomDuCHamp];0)
    etc
    ce qui peut donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO targeTable (champText1, champLong2, champDouble3) SELECT [Champ1], nz(CLng([Champ2];0), nz(CDbl([Champ3];0) FROM TableImport;
    nz force à 0 si le champ est vide

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 61
    Points : 34
    Points
    34
    Par défaut
    Merci pour la réponse.
    Le problème c'est que j'effectue de nombreux tests sur la table import avant de la copier et de l'importer dans la table de destination (duplicate, foreign key...).
    Le but de cet outil d'importation est d'empêcher l'importation de données erronés, donc le copier/coller dans la table de destination est le but ultime du code et ne doit pas être un moyen de vérifier des paramètres. Je ne veux pas du tout forcer des données dans access mais avertir l'utilisateur que les données importer ne correspondent pas aux formats de la base de données.
    J'espère que mes explications sont claires.
    Et me cir encore pour cette réponse rapide.

Discussions similaires

  1. [AC-2010] Jointure entre deux tables pour cherche l'absence de correspondance entre les lignes
    Par Daejung dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/02/2015, 15h48
  2. Procédure de correspondance entre deux tables
    Par fetano dans le forum PL/SQL
    Réponses: 3
    Dernier message: 29/07/2014, 16h08
  3. Correspondance entre deux tables
    Par hiver dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2014, 15h55
  4. Réponses: 2
    Dernier message: 22/01/2014, 16h53
  5. [AC-2000] Etablir une correspondance entre deux tables et Excel en VBA
    Par Tydher dans le forum VBA Access
    Réponses: 1
    Dernier message: 25/05/2011, 15h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo