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 :

[VBA-A]Comment créer une table à partir d'un recordset ?


Sujet :

VBA Access

  1. #21
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut Access et les champs vides
    C'est bien ce que je pensais.

    Est-ce que tu as fait la modif du "If not IsNull(fsSrce) then..." ?
    Sinon c'est normal qu'il y ait l'erreur.
    Les champs Access n'acceptent généralement pas une longueur de chaîne nulle par défaut. Dans Access, on peut forcer la propriété "AllowZeroLength" des champs texte, ce qui résoud le problème mais n'est pas satisfaisant pour l'esprit.

    La bonne solution est de sauter la mise à jour du champ destination si le champ source est nul. Comme par défaut le champ est nul (vide) à sa création, il le reste.

    Si malgré le If... le problème persiste, c'est que la requête ne renvoie pas un champ null (comme le ferait une base Access) mais un texte de longueur 0 (comme un serveur SQL). Tu ne précises pas le type de serveur origine.
    Dans ce cas, on peut tenter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            For Each fdSrce In rsSrce.Fields
                If Not IsNull(fdSrce) and not fdSrce = "" then
                    rsDest.Fields(fdSrce.Name) = fdSrce
                End If
            Next
    Ce coup-ci, on ne peut pas avoir l'erreur 3315 puisqu'on ne tente pas de mettre à jour les champs vides. Par contre, si le champ est Null, VB peut faire un caca sur l'expression fdSrce = "", car je ne sais plus s'il sait comparer un objet Null à une chaine vide. Dans le pire des cas, une solution plus longue mais plus sûre serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            For Each fdSrce In rsSrce.Fields
                If IsNull(fdSrce) then
                    'On ne fait pas de mise à jour si le source est Null
                ElseIf fdSrce = "" then
                    'On ne fait pas de mise à jour si le source est une chaine vide
                Else
                    rsDest.Fields(fdSrce.Name) = fdSrce
                End If
            Next
    VBA, on t'aura ! Non mais alors !

  2. #22
    Membre habitué Avatar de MGD_Software
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2006
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 137
    Points : 139
    Points
    139
    Par défaut
    Il y a encore une autre solution, encore moins propre mais désespérée:

    Dans la boucle qui crée les champs, on force les champs de type Texte à accepter les chaines vides. Cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        For Each fdSrce In rsSrce.Fields
            Set fdDest = New DAO.Field
            fdDest.Name = fdSrce.Name
            fdDest.Type = fdSrce.Type
            Select Case fdDest.Type
                Case dbBinary, dbLongBinary, dbText 'Champs de taille réglable fdDest.Size = fdSrce.Size
            Case Else
                'On ne fait rien car la taille est implicite
            End Select
            If fdDest.Type = dbText Then fdDest.AllowZeroLength = True
            Td.Fields.Append fdDest 'Ajout du champ à la table
        Next
    A n'utiliser qu'en dernier recours car après il est difficile de savoir si le champ est Null (non initialisé par une valeur) ou si on y a mis une chaine vide. A toi de voir...

  3. #23
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    C'est bon !
    On l'a défoncé ! Access pleure parce qu'on a réussi !
    Merci beaucoup !

    Mais comme je vois que t'es calé ! je ferai appel à toi à l'avenir si sa ne te déranges pas ....

    Merci MGD !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Comment créer une table à partir d'une autre table
    Par martinou34 dans le forum Administration
    Réponses: 4
    Dernier message: 09/10/2013, 14h43
  2. Réponses: 5
    Dernier message: 17/10/2008, 15h41
  3. [VB.NET] Comment créer une table dans base de données ?
    Par ptitesouris dans le forum VB.NET
    Réponses: 3
    Dernier message: 03/05/2006, 08h46
  4. Créer une table à partir d'une autre dans un script
    Par Dam)rpgheaven dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 24/06/2005, 10h55
  5. Comment créer une Table dans 1 Bdd ACCESS avec Builder??
    Par makandja dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/03/2004, 20h21

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