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 :

Mise à jour d'une table via Excel erreur 3078 [AC-2007]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut Mise à jour d'une table via Excel erreur 3078
    Bonjour à tous,

    Je code actuellement une procédure pour mettre à jour une base a partir d'un fichier Excel. J'ai donc fait une correspondance de champs entre la base et le fichier Excel. Au moyen d'un formulaire, l'utilisateur choisi le fichier excel, le type de contenu et en cliquant sur un bouton cela déclenche la mise à jour. Cette MàJ se décompose en plusieurs étapes :

    1-Ajout des nouveaux enregistrements (INSERT INTO)
    2-Mise à jour des enregistrements commune (UPDATE, certains champs seulement)

    Le lien entre la base et le fichier se fait sur les sirets (si le siret n'existe que dans le fichier excel ça lance le insert into).

    Le code me semble bon, pourtant lors de l’exécution, Access me renvoi ce message suivant :



    Voici mon formulaire :



    et enfin mon code :

    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
    '------------------------------------
    '---- Procédures sur les boutons ----
    '------------------------------------
     
    '---- Bouton "..." : choix de la table à ajouter ----
    '---- Récupération du repertoire sélectionné ----
    Private Sub btn_parcourir_Click()
    Dim Chemin As String
     
    opg_contenu.Enabled = False
    Me.opg_contenu.Value = Null
    btn_import.Enabled = False
     
    Chemin = OuvrirUnFichier(Me.Hwnd, "Sélectionner le fichier à mettre à jour...", 2)
        If Chemin <> "" Then
            Me.txt_table = Chemin
            opg_contenu.Enabled = True
        End If
     
    End Sub
     
     
    Private Sub opg_contenu_Click()
     
    Me.btn_import.Enabled = True
     
    End Sub
     
    Private Sub btn_import_Click()
    Dim w_sql As String
    Dim w_fichier As String
     
    'On Error GoTo trait_erreur_import
     
        w_fichier = Me.txt_table.Value
        w_fichier = Left(w_fichier, InStr(1, w_fichier, ".") - 1)
        w_sql = ""
     
    If Not IsNull(Me.opg_contenu.Value) Then
     
        Select Case Me.opg_contenu.Value
     
            Case 0      'Fichier consulaire
     
                '---- Ajout des nouveaux enregistrements ----
                w_sql = "INSERT INTO etablissement(eta_siret, eta_coord_l93_X, eta_coord_l93_Y, eta_coord_wgs84_E, eta_coord_wgs84_N, eta_raison_soc, eta_enseigne, eta_sigle, eta_nom_com, eta_nom_reel, eta_ad_num, eta_ad_num2, eta_indice_repet, eta_adresse_lib, eta_ad_complement, eta_cp, eta_cc, eta_telephone, eta_fax, eta_site_web, eta_capsoc_etp, eta_date_creation, eta_effectif, eta_eff_date, eta_com_act, eta_origine, eta_etp_siren, eta_apet_code, eta_statut, eta_siege_social, eta_acm) "
                w_sql = w_sql & "SELECT " & w_fichier & ".siret_entreprise,  " & w_fichier & ".Coord_X_L93, " & w_fichier & ".Coord_Y_L93, " & w_fichier & ".Coord_E_WGS84, " & w_fichier & ".Coord_N_WGS84, " & w_fichier & ".raison_soc, " & w_fichier & ".enseigne, " & w_fichier & ".sigle, " & w_fichier & ".nom_com, " & w_fichier & ".nom_reel, " & w_fichier & ".num_voie, " & w_fichier & ".num_voie2, " & w_fichier & ".indice_repet, " & w_fichier & ".adresse_lib, " & w_fichier & ".ad_complement, " & w_fichier & ".code_postal, " & w_fichier & ".code_commune, " & w_fichier & ".telephone, " & w_fichier & ".fax, " & w_fichier & ".site_web, " & w_fichier & ".capital, " & w_fichier & ".date_creation, " & w_fichier & ".effectif, " & w_fichier & ".date_effectif, " & w_fichier & ".com_act, " & w_fichier & ".origine, Left(" & w_fichier & ".siret_entreprise,9), " & w_fichier & ".ape_entreprise"
                w_sql = w_sql & ", " & w_fichier & ".statut, " & w_fichier & ".siege_social, " & w_fichier & ".accord_mail "
                w_sql = w_sql & "FROM " & w_fichier & " LEFT JOIN etablissement ON " & w_fichier & ".[siret_entreprise] = etablissement.[eta_siret] "
                w_sql = w_sql & "WHERE (((etablissement.eta_siret) Is Null));"
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                '---- Sur le champ eta_adresse_lib, résultant de la concaténation des champs contenant la désignation (rue, place...) et le nom de la voie), si il n'y a pas de désignation, un espace sera présent. Ainsi, on enleve cet espace (premier caractère est un espace alors on le supprimme)
                w_sql = ""
                w_sql = "UPDATE etablissement, " & w_fichier & " "
                w_sql = w_sql & "SET etablissement.eta_adresse_lib = " & w_fichier & ".nom_voie "
                w_sql = w_sql & "WHERE (Left(eta_adresse_lib, 1)=' ') AND (etablissement.eta_siret = " & w_fichier & ".siret_entreprise));"
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                '---- Champ eta_etp_siren : ajout de la forme juridique si le siren n'est pas existant ===> a tester ----
                w_sql = ""
                w_sql = "UPDATE entreprise, " & w_fichier & " "
                w_sql = "SET entreprise.etp_siren = Left(" & w_fichier & ".siret_entreprise,9), entreprise.fj_code = " & w_fichier & ".forme_juridique"
                w_sql = "WHERE (etablissement.eta_siret = " & w_fichier & ".siret_entreprise) AND ((eta_tp_siren) Is Null);"
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                '---- Mise à jour des champs de traçabilité géographique ----
                '---- Ajout des eta_id et des sirets absents dans la table modification ----
                w_sql = ""
                w_sql = "INSERT INTO modification(mdf_eta_id, mdf_siret) "
                w_sql = w_sql & "SELECT etablissement.eta_id, etablissement.eta_siret "
                w_sql = w_sql & "FROM etablissement LEFT JOIN modification ON etablissement.[eta_id] = modification.[mdf_eta_id] "
                w_sql = w_sql & "WHERE (((modification.mdf_eta_id) Is Null));"
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                '---- Mise des champs echelle, type et organisme ----
                w_sql = ""
                w_sql = "UPDATE modification, " & w_fichier & " "
                w_sql = w_sql & "SET modification.mdf_echelle = " & w_fichier & ".ECH_GEO, modification.mdf_type = " & w_fichier & ".TYP_GEO, modification.mdf_organisme = " & w_fichier & ".ORG_GEO, modification.mdf_date = " & w_fichier & ".DAT_GEO "
                w_sql = w_sql & "WHERE ((modification.mdf_siret = " & w_fichier & ".siret_entreprise) AND ((modification.mdf_organisme) Is Null);"
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                '---- Mise à jour des établissements actifs déjà présents ----
                w_sql = ""
                w_sql = "UPDATE etablissement, " & w_fichier & " "
                w_set = "SET etablissement.eta_telephone = " & w_fichier & ".telephone, etablissement.eta_fax =" & w_fichier & ".fax, etablissement.eta_site_web = " & w_fichier & ".site_web, etablissement.eta_acm = " & w_fichier & ".accord_mail, etablissement.eta_effectif = " & w_fichier & ".effectif, etablissement.eta_eff_date = " & w_fichier & ".date_effectif, etablissement.eta_origine = " & w_fichier & ".origine "
                w_where = "WHERE (((etablissement.eta_origine_id) Like '*CCI*' ) AND (etablissement.eta_siret = " & w_fichier & ".siret_entreprise));"
                w_sql = w_sql & w_set & w_where
                DoCmd.SetWarnings False
                DoCmd.RunSQL w_sql
                DoCmd.SetWarnings True
     
                MsgBox "La mise à jour via le fichier consulaire a été effectuée avec succès!", vbInformation, "Import terminé"    End Select
    Else
        MsgBox "Veuillez d'abord choisir un type de contenu!", vbExclamation, Erreur!
    End If
     
    'fin:
     '   Exit Sub
     
    'trait_erreur_import:
     '   MsgBox "Erreur lors de l'import! L'opération a été stoppée.", vbExclamation, "Erreur..."
      '  Resume fin
     
    End Sub
    Je tiens à préciser, qu'un autre module d'import avait été mis en place avant mon arrivé (mais juste l'ihm, sans trop de code derrière) qui se basait sur un lien. Serait-ce la solution? Créer un lien et importer à partir de cette table liée???

    Ou existe-t-il une solution en passant par mon formulaire??? Merci pour votre aide!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Géomaticien
    Inscrit en
    Avril 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Géomaticien

    Informations forums :
    Inscription : Avril 2011
    Messages : 39
    Points : 18
    Points
    18
    Par défaut
    PROBLEME RESOLU :

    J'ai trouvé une solution qui me convient (sans passer par un lien), la voici pour ceux que cela pourrait interesser :

    Avant de passer dans le select case, je créer une table temporaire à partir de mon fichier excel via ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        DoCmd.SetWarnings False
        DoCmd.TransferSpreadsheet acImport, , "TableTemp", w_fichier, True
        DoCmd.SetWarnings True
    Les requêtes se déroulent désormais sans problèmes et une fois le select case terminé, je supprime la table TableTemp via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        DoCmd.DeleteObject acTable, "TableTemp"
    Voila!

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

Discussions similaires

  1. [AC-2007] Mise à jour d'une table via VBA
    Par Korleone dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/03/2014, 10h39
  2. mise à jour d'une table via un portail web
    Par jeanbernard.weck dans le forum SQL
    Réponses: 0
    Dernier message: 31/03/2010, 14h59
  3. [c# 2.0] Mise à jour d'une table via DataSet
    Par tscoops dans le forum ASP.NET
    Réponses: 4
    Dernier message: 04/01/2008, 13h52
  4. Mise à Jour d'une table via un Update (select)
    Par Arola78 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 23/09/2006, 14h59
  5. Mise à Jour d'une table via un formulaire
    Par Arola78 dans le forum IHM
    Réponses: 5
    Dernier message: 05/09/2006, 10h48

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