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

Access Discussion :

[VBA] Gestion des dates nulles provenant d'un recordset


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut [VBA] Gestion des dates nulles provenant d'un recordset
    Bonjour,

    Je fais un script de migration d'une ancienne base vers une nouvelle. Dans l'ancienne, des dates ne sont pas renseignées, c'est à dire que lorsque je fais ma requete SELECT il me sort des valeurs nulles. Je voudrai récupérer ces valeurs nulles et les réinjecter dans ma nouvelle base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim nvDate As Date
    nvDate = verif.Fields(7) ' 7 : index de la colonne.
    L'exécution me "jète" lorsque dans cette colonne, il y a la valeur nulle.
    (Message : Utilisation incorrecte de Null).

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    if not isnull(verif.Fields(7)) then nvDate = verif.Fields(7)

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Bonjour

    tu peux mettre une date bidon en remplacement de Null et ensuite tester nvDate.
    Si nvDate est différent de la valeur bidon alors ChampDestiantion = nvDate.
    dans le cas contraire on ne met rien (Null donc).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    nvDate = Nz(verif.Fields(7), #1/1/1901#)
    ...
    If nvDate <> #1/1/1901# Then
       Destination.Fields(7) = nvDate
    End If
    Autre solution qui doit fonctionner je crois : déclarer nvDate en Variant.
    Je crois que ça accepte les valeurs Null.

    A+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    Le soucis quand je fais cela, c'est que ma date que je vaius mettre dans la base de données va être égale à 1/1/1901 et non pas à une date nulle. Car dans ma base de données le champs date accepte les valeurs nulles.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     If (Not IsNull(verif(5))) Then
                    d = verif(5)
                Else
                    d = #1/1/1901#
                End If

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    C'est pour cela que je disais qu'il fallait tester la valeur de la date avant de l'affecter au champ de destination.
    Si on n'affecte rien à un champ d'un nouvel enregistrement, il prend la valeur Null.

    Comment injectes-tu les données ?
    Est-ce par requêtes ou par VBA+DAO ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    C'est un code un peu long mais pas dur à comprendre, Je vais chercher des valeur dans l'ancienne base, je les affecte à des variable et je les injecte dans la nouvelle

    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
         Dim numDev  As Variant
        Dim UP      As Variant
        Dim Service As Variant
        Dim Ligne   As Variant
        Dim eqp     As Variant
        Dim dateEvt As Variant
        Dim dateAtt As Variant
        Dim dateCcl As Variant
        Dim dateSld As Variant
        Dim annulee As Integer
        Dim prodSO  As Variant
        Dim refSO   As Variant
        Dim lotSO   As Variant
        Dim prodPF  As Variant
        Dim refPF   As Variant
        Dim lotPF   As Variant
        Dim typeDev As Variant
        Dim numInv  As Variant
        Dim descDef As Variant
        Dim descAct As Variant
        Dim evalDev As Variant
        Dim respAct As Variant
        Dim actPrev As Variant
     
    sql1 = "SELECT * FROM Deviation In '" & ANCIENNE_BDD & "'"
        Set verif = CurrentDb.OpenRecordset(sql1)
        Debug.Print "*** debut ***"
        While Not verif.EOF
     
            Service = Null
            Ligne = Null
            eqp = Null
     
            dateEvt = Null
            dateAtt = Null
            dateCcl = Null
            dateSld = Null
     
            prodSO = ""
            refSO = ""
            lotSO = ""
     
            prodPF = ""
            refPF = ""
            lotPF = ""
     
            numInv = ""
     
            descAct = ""
            evalDev = ""
            respAct = ""
            actPrev = ""
     
            numDev = verif.Fields(0)
            UP = verif.Fields(2)
            If Not IsNull(verif.Fields(3)) Then
                Service = verif.Fields(3)
            End If
     
            If Not IsNull(verif.Fields(4)) Then
                Ligne = verif.Fields(4)
            End If
     
            If Not IsNull(verif.Fields(5)) Then
                eqp = verif.Fields(5)
            End If
     
            If (verif.Fields(10) = True) Then
                annulee = 1
            End If
     
            If Not IsNull(verif.Fields(11)) Then
                prodSO = verif.Fields(11)
            End If
     
            If Not IsNull(verif.Fields(12)) Then
                refSO = verif.Fields(12)
            End If
     
            If Not IsNull(verif.Fields(13)) Then
                lotSO = verif.Fields(13)
            End If
     
            If Not IsNull(verif.Fields(14)) Then
                prodPF = verif.Fields(14)
            End If
     
            If Not IsNull(verif.Fields(15)) Then
                refPF = verif.Fields(15)
            End If
     
            If Not IsNull(verif.Fields(16)) Then
                lotPF = verif.Fields(16)
            End If
     
            typeDev = verif.Fields(17)
     
            If Not IsNull(verif.Fields(18)) Then
                numInv = verif.Fields(18)
            End If
     
            If Not IsNull(verif.Fields(19)) Then
                descDef = "AA"
    '            descDef = verif.Fields(19)
    '            descDef = Replace(descDef, "'", " ")
            End If
     
            If Not IsNull(verif.Fields(20)) Then
                descAct = "BB"
    '            descAct = verif.Fields(20)
    '            descAct = Replace(descAct, "'", " ")
            End If
     
            If Not IsNull(verif.Fields(21)) Then
                evalDev = "CC"
    '            evalDev = verif.Fields(21)
    '            evalDev = Replace(evalDev, "'", " ")
            End If
     
            If Not IsNull(verif.Fields(22)) Then
                respAct = verif.Fields(22)
                respAct = Replace(respAct, "'", " ")
            End If
     
            If Not IsNull(verif.Fields(23)) Then
                actPrev = "FF"
    '            actPrev = verif.Fields(23)
    '            actPrev = Replace(actPrev, "'", " ")
            End If
     
     
            Dim i As Integer
            If (Not IsNull(eqp) And eqp <> "" And eqp <> "0") Then
                eqp = RechercherIDEquipement(CStr(eqp))
            End If
            If (Not IsNull(Ligne) And Ligne <> "" And Ligne <> "0") Then
                Ligne = RechercherIDLigne(CStr(Ligne))
            End If
            If (Not IsNull(respAct) And respAct <> "" And respAct <> "0") Then
                respAct = RechercherIDDemandeur(CStr(respAct))
            End If
            If (Not IsNull(Service) And Service <> "" And Service <> "0") Then
                Service = RechercherIDService(CStr(Service))
            End If
     
            typeDev = RechercherIDType(CInt(typeDev))
     
            sqlTmp = "INSERT INTO Deviation (numeroDeviation, UP, idLigne, idService, idEquipement, idType, idDemandeur, dateEvenement, dateAttribuee, dateConclue, dateSoldee, numInvAnalytique, descDefaut, descAction, evaluation, actionPreventive, estAnnulee, nomSo, refSO, lotSo, nomPF, refPF, lotPF) VALUES (" & numDev & ",'" & UP & "', " & Ligne & ", " & Service & ", " & eqp & ", " & typeDev & ", " & respAct & ", '" & dateEvt & "', '" & dateAtt & "', '" & dateCcl & "', '" & dateSld & "', '" & numInv & "', '" & descDef & "', '" & descAct & "','" & evalDev & "','" & actPrev & "', " & annulee & ", '" & prodSO & "', '" & refSO & "', '" & lotSO & "', '" & prodPF & "', '" & refPF & "', '" & lotPF & "')"
     
            CurrentDb.Execute (sqlTmp)
     
            verif.MoveNext
     
        Wend

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    ben un simple insert into t'aurait fait gagné bien du temps

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par random
    ben un simple insert into t'aurait fait gagné bien du temps
    Tu peux développer un peu ??

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut
    Ok, je le voyais pas comme ça.

    Essaie de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If (Not IsNull(verif(5))) Then
                    d = "#" & Format(verif(5), "mm/dd/yyyy") & "#"
                Else
                    d = "Null"
                End If
     
    sqlTmp = "INSERT INTO Deviation (ChampDate) VALUES (" & d & ")"
    Tu remarquera que je n'ai pas de guillemets simples.

  10. #10
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Citation Envoyé par LedZeppII
    d = "Null"

    sqlTmp = "INSERT INTO Deviation (ChampDate) VALUES (" & d & ")"
    .
    attention à ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub truc()
    Dim d As Variant
    MsgBox IsNull(d)
    MsgBox IsEmpty(d)
    d = "null"
    MsgBox IsNull(d)
    d = Null
    MsgBox IsNull(d)
    End Sub

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    Merci, tous vos posts m'ont pas mal aidé

  12. #12
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 768
    Points
    7 768
    Par défaut Re: Attention
    Oui Random, j'avais bien fait attention.
    Comme wperezrobles crée une requête SQL en VBA, il n'a besoin que de variables type String et de valeurs converties en Texte.
    C'est pour ça que j'ai mis Null entre double quotes de manière à ce que l'instruction SQL finale soit

    INSERT INTO Deviation (ChampDate) VALUES (#une_date#)
    ou
    INSERT INTO Deviation (ChampDate) VALUES (Null)

    C'est correct non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Gestion des dates en vba
    Par AgriPhilou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/01/2014, 22h23
  2. Gestion des dates en VBA/Excel ?
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/07/2012, 10h34
  3. [VBA-E] Gestion des dates selon format de départ
    Par Gamal le Celte dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/02/2007, 14h41
  4. Gestion des Date Null
    Par vincnet68 dans le forum Accès aux données
    Réponses: 6
    Dernier message: 06/10/2006, 23h49
  5. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01

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