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 :

Instruction Do Loop


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Septembre 2007
    Messages : 120
    Par défaut Instruction Do Loop
    Je voudrais transférer le contenu d'une table A vers une autre table B vide à l'aide de la fonction Do Loop. Un message d'erreur survient : Aucun enregistrement en cours !
    Le code fonctionne quand un enregistrement existe dans la table B. Comment faut-il faire pour amorcer le transfert vers table B?
    J'utilise les séquences: MoveFirst, AddNew, Update, MoveNext

  2. #2
    Membre Expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Par défaut
    Bonsoir et bienvenu sur le forum.

    Tu as sans doute fais une ou plusieurs erreurs de positionnement dans ton code.

    Merci de nous présenter le code en question pour plus de précisions.

  3. #3
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Par défaut
    Bonjour,

    Pourquoi passer par une boucle alors qu'il serait plus efficace de faire exécuter une requete Ajout (dans du Code)

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim strSqlAjout as String
     
    strSqlAjout = "INSERT INTO les_champs_TableB SELECT Les_champs_TableA FROM TableA
     
    RunSQL strSqlAjout
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  4. #4
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Par défaut
    OK !

    Exemple de 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
    dim rstTableA as DAO.RecordSet, rstTableB as DAO.RecordSet
    dim StrSQLTableA as String, strSqlTableB as String
     
    strSqlTableA = "SELECT * From TableA"
    strSqlTableB = "SELECT * From TableB"
     
    Set rstTableA = currentdB.OpenRecordSet(strSqlTableA)
    Set rstTableB = currentdB.OpenRecordSet(strSqlTableB)
     
        Do While Not rstTableA.EOF
            rstTableB.AddNew
            For intCompteur = 0 to rstTableB.Fields.Count-1
                rstTableB.Fields(intCompteur) = rstTableA.Fields(intCompteur)
            Next
            ' Ajouter les champs (Secteur financier etc ...)
            rstTable.Update
            rstTableA.MoveNext
        Loop
     
    rstTableA.Nothing
    rstTableB.Nothing
    A vérifier (je n'ai pas testé), j'ai supposé que tous les champs de la table A étaient transférés dans la Table B et que les Structures étaient identiques sinon au lieu de la boucle, il faudra écrire un ligne de code par Champ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rstTableB.Fields("MonChamp") = rstTableA.Fields("MonChamp")
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Septembre 2007
    Messages : 120
    Par défaut Instruction Do Loop
    Pour Jeannot : je suis novice concernant le forum, transmet donc les infor via celui-ci)
    Transfert des données d'une table (A) vers table (B)
    Code générant l'erreur "Aucun enregistrement en cours". Où est l'anomalie?

    Lorenzo

  6. #6
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Par défaut
    tu disais

    Les structures des champs n'étant pas identiques, 1 ligne de code par champ s'impose.

    Je vais tester votre méthode en espérant que le msg d'erreur n'apparaisse plus.

    Je vous transmet le code simplifié que j'utilise actuellement pour le transfert des données, qui génère l'erreur "Aucun enregistrement en cours". Vous y verrez plus clair et découvrirez sans doute l'anomalie (je suis sûr qu'une instruction doit manquer)

    Code:
    '------------------------------------------------------------------------------------------------
    'STEP 1 - Sélection et Importation brute (format txt) du contenu du fichier source
    '------------------------------------------------------------------------------------------------

    DoCmd.SetWarnings False

    'Sélection du fichier source.
    'Appel du complément (Ocx) - Microsoft Common Dialog Control 6.0 (comdlg32.ocx)
    With SelectionFichier
    .DialogTitle = "Sélectionnez le fichier à importer."
    .Filename = "*.xls"
    .initDir = "C:\Documents and Settings\Checchi Lorenzo\Mes documents\Bibliothèque\DEV_ACCESS\DEVELOPPEMENT_BDA\CLASSIFICATION\"
    .CancelError = False
    .ShowOpen
    End With
    chemin = SelectionFichier.Filename
    txtpath = chemin

    'Déclaration des variables table.
    Dim rstTblTemp_1 As DAO.Recordset
    Dim rstTblFinal As DAO.Recordset

    'Déclaration des variables diverses.
    Dim warm As Boolean

    'On attache la table (Access) à la variable table
    Set rstTblTemp_1 = CurrentDb.OpenRecordset("TblTemp_1", dbOpenDynaset)
    Set rstTblFinal = CurrentDb.OpenRecordset("TblFinal", dbOpenDynaset)

    'Mise à zéro de la variable warm (Permet la mise sous condition)
    warm = False

    'Importation du fichier xls dans la table TblTemp_1
    If warm = False Then
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TblTemp_1", txtpath, , , UseOA
    End If

    'Suppression des libellés contenus dans le fichier source
    DoCmd.RunSQL "DELETE TblTemp_1.F1 FROM TblTemp_1 WHERE (((TblTemp_1.F1)='Ident'));"

    '---------------------------------------------------------------------------------------------------------
    'STEP 2 - Transfert des enregistrements dans la table TblFinal (formatage des données)
    '---------------------------------------------------------------------------------------------------------

    'Insertion des enregistrements dans la table TblFinal
    With rstTblFinal
    rstTblTemp_1.MoveFirst
    With rstTblTemp_1
    Do While Not rstTblTemp_1.EOF
    rstTblFinal.AddNew
    warm = False
    rstTblFinal!Ident = rstTblTemp_1!F1
    rstTblFinal!Label = rstTblTemp_1!F2
    rstTblFinal!Currency = rstTblTemp_1!F3
    rstTblFinal!Price = rstTblTemp_1!F4
    rstTblFinal!Quantity = rstTblTemp_1!F5
    rstTblFinal!Tch = rstTblTemp_1!F6
    rstTblFinal.Update
    rstTblTemp_1.MoveNext
    Loop
    End With
    End With
    Je pense que le problème vient de ce que tu initialises ta table rstTblTemp_1 trop tot d'autre part les With rstTblFinal et With rstTblTemp_1 sont inutiles

    Voici ce que je garderai :

    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
    'Déclaration des variables table.
    Dim rstTblTemp_1 As DAO.Recordset
    Dim rstTblFinal As DAO.Recordset
    
    'Déclaration des variables diverses.
    Dim warm As Boolean
    
    
    'Mise à zéro de la variable warm (Permet la mise sous condition)
    warm = False
    
    'Importation du fichier xls dans la table TblTemp_1
    If warm = False Then
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TblTemp_1", txtpath, , , UseOA
    End If
    
    'Suppression des libellés contenus dans le fichier source
    DoCmd.RunSQL "DELETE TblTemp_1.F1 FROM TblTemp_1 WHERE (((TblTemp_1.F1)='Ident'));"
    
    ' Déplacement des deux lignes d'intialisation des recordset
    'On attache la table (Access) à la variable table
    Set rstTblTemp_1 = CurrentDb.OpenRecordset("TblTemp_1", dbOpenDynaset)
    Set rstTblFinal = CurrentDb.OpenRecordset("TblFinal", dbOpenDynaset)
    '---------------------------------------------------------------------------------------------------------
    'STEP 2 - Transfert des enregistrements dans la table TblFinal (formatage des données)
    '---------------------------------------------------------------------------------------------------------
    
    'Insertion des enregistrements dans la table TblFinal
    ' Supprimer cette instruction With rstTblFinal
    rstTblTemp_1.MoveFirst
    ' Supprimer cette instruction With rstTblTemp_1
    Do While Not rstTblTemp_1.EOF
    rstTblFinal.AddNew
    warm = False
    rstTblFinal!Ident = rstTblTemp_1!F1
    rstTblFinal!Label = rstTblTemp_1!F2
    rstTblFinal!Currency = rstTblTemp_1!F3
    rstTblFinal!Price = rstTblTemp_1!F4
    rstTblFinal!Quantity = rstTblTemp_1!F5
    rstTblFinal!Tch = rstTblTemp_1!F6
    rstTblFinal.Update
    rstTblTemp_1.MoveNext
    Loop
    ' Supprimer cette instruction End With
    ' Supprimer cette instruction End With
    A+
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Septembre 2007
    Messages : 120
    Par défaut Instruction Do Loop
    Citation Envoyé par Jeannot45 Voir le message
    tu disais



    Je pense que le problème vient de ce que tu initialises ta table rstTblTemp_1 trop tot d'autre part les With rstTblFinal et With rstTblTemp_1 sont inutiles

    Voici ce que je garderai :

    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
    'Déclaration des variables table.
    Dim rstTblTemp_1 As DAO.Recordset
    Dim rstTblFinal As DAO.Recordset
    
    'Déclaration des variables diverses.
    Dim warm As Boolean
    
    
    'Mise à zéro de la variable warm (Permet la mise sous condition)
    warm = False
    
    'Importation du fichier xls dans la table TblTemp_1
    If warm = False Then
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, "TblTemp_1", txtpath, , , UseOA
    End If
    
    'Suppression des libellés contenus dans le fichier source
    DoCmd.RunSQL "DELETE TblTemp_1.F1 FROM TblTemp_1 WHERE (((TblTemp_1.F1)='Ident'));"
    
    ' Déplacement des deux lignes d'intialisation des recordset
    'On attache la table (Access) à la variable table
    Set rstTblTemp_1 = CurrentDb.OpenRecordset("TblTemp_1", dbOpenDynaset)
    Set rstTblFinal = CurrentDb.OpenRecordset("TblFinal", dbOpenDynaset)
    '---------------------------------------------------------------------------------------------------------
    'STEP 2 - Transfert des enregistrements dans la table TblFinal (formatage des données)
    '---------------------------------------------------------------------------------------------------------
    
    'Insertion des enregistrements dans la table TblFinal
    ' Supprimer cette instruction With rstTblFinal
    rstTblTemp_1.MoveFirst
    ' Supprimer cette instruction With rstTblTemp_1
    Do While Not rstTblTemp_1.EOF
    rstTblFinal.AddNew
    warm = False
    rstTblFinal!Ident = rstTblTemp_1!F1
    rstTblFinal!Label = rstTblTemp_1!F2
    rstTblFinal!Currency = rstTblTemp_1!F3
    rstTblFinal!Price = rstTblTemp_1!F4
    rstTblFinal!Quantity = rstTblTemp_1!F5
    rstTblFinal!Tch = rstTblTemp_1!F6
    rstTblFinal.Update
    rstTblTemp_1.MoveNext
    Loop
    ' Supprimer cette instruction End With
    ' Supprimer cette instruction End With
    A+
    Bravo !! Ce coup là est le bon. La procédure se déroule à la perfection. Cela faisait un bail que je me traumatisais là-dessus. Un grand merci pour Jeannot45 ainsi qu'à l'existence de Developpez.com


    Lorenzo

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

Discussions similaires

  1. Principe de l'instruction LOOP
    Par mathk dans le forum Assembleur
    Réponses: 25
    Dernier message: 16/05/2004, 11h08
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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