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 :

INSERT INTO avec une valeur numéroauto lors de la copie d'une table [AC-2016]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Homme Profil pro
    Bidouilleur du dimanche
    Inscrit en
    Février 2023
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Bidouilleur du dimanche
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2023
    Messages : 23
    Points : 16
    Points
    16
    Par défaut INSERT INTO avec une valeur numéroauto lors de la copie d'une table
    Salutations à tous,

    Avant d'exposer mon problème, je tiens à remercier la communauté de ce forum sans laquelle je passerais mon temps à poser des questions sur comment faire une chose ou une autre...
    Je trouve beaucoup de réponse ici et, jeter quelques fleurs à l'occasion, ça fait aussi plaisir aux personnes concernées...
    J'ai encore tant de choses dont j'ignore les possibilités mais, lorsque je compare mes premiers essais et les réalisations que je tente aujourd'hui, l'évolution est évidente...
    Et d'avance je vous remercie pour les futures réponses que je risque de trouver ici aux questions que je ne me pose pas encore !

    Je découvre actuellement l'avantage d'exécuter du SQL en VBA (moins de requêtes qui trainent dans ma colonne d'objets à gauche de l'écran, gestion des sous-formulaires simplifiée, ...)

    Mon problème du soir, j'essaie de copier une table dans une autre, sachant que la table de destination à une colonne avec un NuméroAuto et ça coince...

    Voici le message d'erreur
    Nom : Message erreur exécution.jpg
Affichages : 85
Taille : 33,4 Ko

    Lorsque j'exécute le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub ZZZ_Copie_Table_LignesAAjouter_Vers_BUDGET_T_EcrituresBudget()
     
        Dim db As dao.Database: Set db = CurrentDb
        Call db.Execute("INSERT INTO BUDGET_T_EcrituresBudget Select * From BUDGET_T_LignesAAjouter_T_EcrituresBudget", dbFailOnError)
        db.Close: Set db = Nothing
     
    End Sub
    J'ai contrôlé le nom des champs, le type de valeurs que chacun peut recevoir, s'il y avait un null interdit quelque part, ...
    Nom : Tables.jpg
Affichages : 78
Taille : 184,0 Ko

    En farfouillant sur la toile, je n'ai pas trouvé de solution direct à mon problème...
    Lors d'une procédure moulure, j'intégrais ligne par ligne avec une requete d'ajout classique mais il suffit que j'ai un nombre suffisant de lignes à traiter et ça devient l'usine à gaz...
    J'ai bien trouvé ce fil de discussion https://www.developpez.net/forums/d6...to-numeroauto/ qui permet de passer par sql vba mais aussi ligne par ligne... (si je ne dis pas de bêtise)

    Est-ce que quelqu'un serait en mesure de me proposer une solution d'incrémentation automatique lors de la copie de tables comme présenté ?
    Devrais-je intégrer le NuméroAuto suivant de la table de destination lorsque je crée ma ligne dans la table d'origine et ainsi de suite ligne par ligne pour que, lors de la copie de la table, ça impose les bons NuméroAuto dans la table de destination ?
    Ou autre chose ?

    D'avance merci et bonne soirée

    B.

  2. #2
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 885
    Points : 1 037
    Points
    1 037
    Par défaut
    Bonjour,
    Select * From BUDGET_T_LignesAAjouter_T_EcrituresBudget
    A mon sens, il conviendrait de ne pas inclure la colonne No dans l'ordre INSERT INTO, car dans la table de destination, il s'agit d'une colonne AUTOINCREMENT.
    Bon DEV
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  3. #3
    Membre à l'essai
    Homme Profil pro
    Bidouilleur du dimanche
    Inscrit en
    Février 2023
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Bidouilleur du dimanche
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2023
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour Star et merci pour la réponse...

    J'ai donc cherché de quoi m'aiguillonner et j'ai trop souvent trouvé du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO [Table] (Colonne_1, Colonne_2, ...) VALUES (Colonne_1, Colonne_2, ...)
    Jusqu'à ce que je tombe sur un fil de discussion qui proposait de passer par la création de requête ajout et ensuite de regarder le sql, le copier dans le vba et nettoyer tout ça.
    Ceci testé, voici le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO BUDGET_T_EcrituresBudget ( [Date comptabilisation], [Date valeur], Année, [No écriture], [No position], [No interne], Compte, Libellé, Débit, Crédit, [Type écriture] ) SELECT [Date comptabilisation], [Date valeur], Année, [No écriture], [No position], [No interne], Compte, Libellé, Débit, Crédit, [Type écriture] FROM BUDGET_T_LignesAAjouter_T_EcrituresBudget
    Quelle horreur une ligne pareille !
    Dommage qu'elle fonctionne aussi bien ^^

    Merci pour la piste suggérée

    Bonne fin de nuit

    B.

  4. #4
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 885
    Points : 1 037
    Points
    1 037
    Par défaut
    Bonjour,
    Pour bien faire, il est préférable de nommer les objets de type colonne, table, contrôle, formulaire et autres, en évitant d'introduire des espaces et caractères accentués. Cela permet de les utiliser sans les crochets dans les instructions SQL et le code VBA.
    Aussi, terminer le nom de la table par un "s" pour le pluriel.
    Bon DEV
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  5. #5
    Membre à l'essai
    Homme Profil pro
    Bidouilleur du dimanche
    Inscrit en
    Février 2023
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Bidouilleur du dimanche
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2023
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour Star et merci pour le complément

    Pour bien faire, il est préférable de nommer les objets de type colonne, table, contrôle, formulaire et autres, en évitant d'introduire des espaces et caractères accentués. Cela permet de les utiliser sans les crochets dans les instructions SQL et le code VBA
    En effet ! A part les noms des colonnes, tout le reste est sans espace et sans accent. Je me suis habitué à utiliser les crochets un peu partout (ça relève sans doute un peu du TOC)...

    Par contre je n'ai pas saisis ...
    terminer le nom de la table par un "s" pour le pluriel
    Belle journée

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 334
    Points : 19 575
    Points
    19 575
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par star Voir le message
    ...
    Aussi, terminer le nom de la table par un "s" pour le pluriel.
    Bon DEV
    .
    Bonjour,

    Concernant les tables c'est l'éternel débat : le créateur de la base verra une table client comme une structure de données propre au client et l'utilisateur de la base verra une liste de clients.

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Membre à l'essai
    Homme Profil pro
    Bidouilleur du dimanche
    Inscrit en
    Février 2023
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Bidouilleur du dimanche
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2023
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonsoir User,

    Merci pour votre apport

    Bidouillant en tailleur dans mon salon, je n'ai pas les reflexes d'un développeur professionnel.
    Il y a du coup beaucoup de choses qui m'échappent qui feraient hurler un expert ^^ (faute avouée...?)
    Arrivé à la fin de la conception d'un formulaire, il m'est déjà arrivé de garder la coquille et de supprimer tout le code pour repartir sur quelque chose de moins lourd...

    J'ai réfléchi à mon problème de copie de table et pour d'autres besoins du formulaire, j'ai posé ceci, ça fonctionne, j'en suis un minimum pas peu fier

    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
    Private Sub ZZZ_Copie_Selection_Table_EcrituresBudget_Vers_EcritureOriginaleControleModifications()
     
        TableOrigine = "[BUDGET_T_EcrituresBudget]"
        TableDestination = "[BUDGET_T_EcritureOriginaleControleModifications]"
        Colonnes = "[No], [Date comptabilisation], [Date valeur], [Année], [No écriture], [No position], [No interne], [Compte], [Libellé], [Débit], [Crédit], [Type écriture]"
        Critere1 = "[Année]"
        ConditionCritere1 = [ECRITURE_01_TB_AnneeComptabilisation]
        Critere2 = "[No écriture]"
        ConditionCritere2 = [ECRITURE_01_TB_NoEcriture]
        Ordre = "[No position]"
     
        Dim db As dao.Database: Set db = CurrentDb
        Call db.Execute("INSERT INTO " & TableDestination & " ( " & Colonnes & " ) SELECT " & Colonnes & " FROM " & TableOrigine & " WHERE (((" & Critere1 & ")=" & ConditionCritere1 & ") AND ((" & Critere2 & ")=" & ConditionCritere2 & ")) ORDER BY " & Ordre, dbFailOnError)
        db.Close: Set db = Nothing
     
    End Sub
    Et je suis sur que je pourrais encore pousser la décomposition maintenant que j'ai "compris" une ou deux choses...

    Encore merci et belle soirée

    B.

  8. #8
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 885
    Points : 1 037
    Points
    1 037
    Par défaut
    Bonjour,
    Il faudrait considérer une table comme une liste d'enregistrements de même type. Pour faire une analogie, on dira que c'est la vision orientée relationnelle de ce qu'est une liste liée en programmation procédurale.
    En POO, on parlerait d'une classe d'objets, pour ce qui est de la structure de la collection, au moyen de laquelle une fois instanciée, elle servira à contenir des objets de même type.
    A vrai dire, c'est cette vision qu'il faut primer, car ce qui compte au final c'est l'expérience utilisateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Exercice, Compte, Objet, Sens, Montant FROM Ecritures WHERE Exercice = 2024
    Ici, l'utilisateur demande une extraction des écritures de l'exercice 2024 contenues dans la table des écritures comptables.
    L'ordre SQL match la demande écrite en plein texte de l'utilisateur.
    Bon DEV
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  9. #9
    Membre à l'essai
    Homme Profil pro
    Bidouilleur du dimanche
    Inscrit en
    Février 2023
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Bidouilleur du dimanche
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2023
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour Star et merci pour ce rajout

    Je n'ai pas tout compris mais ça viendra avec le temps

    Belle fin de semaine

    B.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 13/04/2023, 14h25
  2. Réponses: 18
    Dernier message: 07/07/2022, 15h42
  3. [VB.NET]Utiliser un INSERT INTO avec une VIew Access
    Par Ashleyriot dans le forum Accès aux données
    Réponses: 3
    Dernier message: 23/11/2006, 18h31
  4. insert into avec une date
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/11/2006, 22h08
  5. INSERT INTO avec une valeur numéroauto
    Par priest69 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 08/11/2005, 15h39

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