Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2011, 16h07   #1
Invité régulier
 
Homme
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 9
Points : 9
Par défaut Dupliquer l'enregistrement courant et msgbox de saisie pour la nouvelle clé primaire

Bonjour à tous,

Dans un formulaire, je voudrais que sur click d'un contrôle, cela duplique l'enregistrement courant et ouvre une msgbox demandant la nouvelle valeur de la clé primaire.
Que ce soit pour le code de la duplication ou pour le code de la msgbox, j'ai quelques difficultés.

Auriez vous des idées?

Merci par avance
Oxopor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 16h59   #2
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 261
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 261
Points : 304
Points : 304
Par défaut Des idées...

Peut-être pas simple comme approche, mais pour ma part, sur le click du bouton en question, je lancerais une requete SQL (Select *) pour récupérer l'enregistrement (avec un Where basé sur un élément unique de ta table (par exemple sur la valeur actuelle de la clé primaire de l'enregistrement à dupliquer)), puis j'ouvrirai un formulaire (ressemblant à un MsgBox) pour permettre à l'utilisateur de saisir la nouvelle clé primaire... et je ferai un AddNew en utilisant (en update de l'enregistrement ainsi créé par le AddNew) les toutes rubriques récupérées dans le Select et la saisie de l'utilisateur...

Je suppose que ta clé primaire n'est pas en NuméroAuto ... car sinon faut pas la faire saisir, bien sûr. Access s'en charge lui-même.

Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 00h03   #3
Membre du Club
 
beauchat symba
Inscription : janvier 2010
Messages : 95
Détails du profil
Informations personnelles :
Nom : beauchat symba

Informations forums :
Inscription : janvier 2010
Messages : 95
Points : 50
Points : 50
Par défaut Comment dupliquer un Formulaire et son Sous-formulaire

Bonsoir
Voici un code qui marche bien avec ses explications,je n'ai pas trop le temps de tout traduire .
La klé primaire n'a pas besoin d'être saisie à la main car j'utilise des compteurs
Code :
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
 
Private Sub B_CopyConforme_Click()
 
    ' Msgbox d'Avertissement
    Dim Msg, Style, Title, Help, Ctxt, Response, MyString
    Msg = "Vous êtes sur le point de faire une Copy-Conforme du Devis" & Chr(13) & "Souhaitez-vous continuer?" ' Définit le message.
    Style = vbYesNo + vbExclamation + vbDefaultButton2    ' Définit les boutons.
    Title = "Avertissement"    ' Définit le titre.
    ' Affiche le message.
    Response = MsgBox(Msg, Style, Title)
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
            Else    ' L'utilisateur a choisi Non.
            Exit Sub
        End If
 
On Error GoTo Err_Handler 
 
    Dim strSql As String    'SQL statement.
    Dim lngID As Long       'Primary key value of the new record.
 
    'Save any edits first
    If Me.Dirty Then
        Me.Dirty = False
    End If
 
    'Make sure there is a record to duplicate.
    If Me.NewRecord Then
        MsgBox "Selectionner le Devis à Dupliquer."
    Else
        'Duplicate the main record: add to form's clone.
        With Me.RecordsetClone
            .AddNew 'la methode AddNewcar permet de Récupérer la nouvelle K_NumDevis
                !NomSociete = Me.NomSociete
                !NomClt = Me.NomClt
                !Ad1Clt = Me.Ad1Clt
                !Ad2Clt = Me.Ad2Clt
                !CpClt = Me.CpClt
                !VilleClt = Me.VilleClt
                !HTDevis = Me.HTDevis
                'etc for other fields.
            .Update
 
            'Save the primary key value, to use as the foreign key for the related records.
            .Bookmark = .LastModified
            lngID = !K_NumDevis 'nouvelle K_NumDevis
 
            'Duplicate the related records: append query.
            'Attention : Dans le cas d'un Compteur ne pas recopier la Kprimaire: K_DevisLig
            If Me.F111_DevisLigSousFormulaire.Form.RecordsetClone.RecordCount > 0 Then
                strSql = "INSERT INTO [T_DevisLig] (K_NumDevis,Description,Qté,Unité,Pu )" & _
                    "SELECT " & lngID & " ,Description,Qté,Unité,Pu " & _
                    "FROM [T_DevisLig] WHERE K_NumDevis = " & Me.K_NumDevis & ";"
             DBEngine(0)(0).Execute strSql, dbFailOnError
 
            Else
                MsgBox "Le Devis est Dupliqué, mais il n'y avait pas de Lignes à Dupliquer", vbOKOnly + vbInformation, ""
            End If
 
            'Affiche à l'Ecran le Devis Dupliqué .
            Me.Bookmark = .LastModified
            MsgBox "Devis Dupliqué ! " & "    " & Chr(13) & Chr(13) & "N°:" & lngID, vbInformation, ""
            Me.Ctl_DevisSigné.Visible = False
            'Cacher les Boutons Inutiles
            Me.B_ImprimeDevis.SetFocus 'Car Impossible de masquer le Controle Actif
            Me.B_CopyConforme.Visible = False 'Controle Actif
            Me.B_CopyStructure.Visible = False
            Me.Caption = "Copy Conforme"
            Me.Étiquette44.Caption = "Copy Conforme" 'Etiqette44 (c'est le Titre )
            Me.Boîte97.Visible = False 'Boite97(Cadre)
        End With
    End If
 
Exit_Handler:
    Exit Sub
 
Err_Handler:
    MsgBox "Error " & Err.Number & " - " & Err.Description, , "B_CopyConforme_Click"
    Resume Exit_Handler
End Sub
Explications
Le code sauvegarde en premier l'enregistrement en cours
AddNew assigne un buffer au nouvel enregistrement puis copie les données de ton formulaire vers ce buffer
Update sauvegarde l'Enregistrement

En s'assurant que l'Enregistrement dupliqué devient Current (Me.Bookmark = .LastModified),on stock la nouvelle Klé primaire dans une variable de façon à pouvoir l'utiliser pour les enregistrements liés (côté plusieurs)

Puis on vérifie l'existence d'enregistrements dans le s/s form et on les duplique avec une requête sql Append

La requête sélectionne les Enregistrements enfants dans le s/s form et les ajoute dans la table avec la Nouvelles Klé de liaison

Pourquoi utilise t-on AddNew pour dupliquer les Enregistrements du Formulaire Principal et une Requête Sql pour dupliquer ceux du Sous-form ?
  • AddNew nous renvoie la Nouvelle Klé Primaire que nous avons besoin pour créer les Enregistrements côté plusieurs.
  • La Requête Sql créé TOUS les Enregistrements du Sous-Form en 1 seule fois
  • On peut accéder les nouveaux Enregistrement du s/s form sans avoir à Requery

Cordialement
symbabeauchat est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/08/2011, 08h43   #4
Membre du Club
 
beauchat symba
Inscription : janvier 2010
Messages : 95
Détails du profil
Informations personnelles :
Nom : beauchat symba

Informations forums :
Inscription : janvier 2010
Messages : 95
Points : 50
Points : 50
Par défaut InputBox pour entrer la Klé

Bonjour

Suggestion:
pour entrer la Klé à la main, je pense qu'il faut créer une variable et la charger avec une InputBox

Code :
 Dim lngMaNouvelleKlé As Long ' à placer avec les autres Dim au début (Long si la Klé est un Entier Long )
Emplacement de InputBox
Code :
1
2
3
4
5
6
7
8
9
 Else
    lngMaNouvelleKlé=InputBox("entrer la Klé" )  
   'Dupliquer l'Enregistrement principal:add to form's clone.
        With Me.RecordsetClone
            .AddNew
                !Klé = lngMaNouvelleKlé
                !NomSociété = Me.NomSociété
                !NomClient = Me.NomClient
                !etc......
ou peut être directement je n'ai pas tester

Code :
1
2
3
4
5
 .AddNew 'la methode AddNewcar permet de Récupérer la nouvelle K_NumDevis
        !Klé = InputBox("entrez le la Klé" )               
        !NomSociete = Me.NomSociete
        !NomClt = Me.NomClt
        etc....
Voilà je vous laisse adapter le code pour un formulaire simple il suffit de supprimer la Requête Sql

Bonne journée
symbabeauchat est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/08/2011, 18h35   #5
Invité régulier
 
Homme
Inscription : mai 2011
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : mai 2011
Messages : 28
Points : 9
Points : 9
Tout d'abord, un grand merci. Réponse très rapide et parfaitement ciblée.

Tout fonctionne à merveille.

Pour résumer:
Ma clé primaire est Nom_Botanique et le code final est le suivant
Code :
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
Private Sub Dupliquer_Fiche_Click()
 
        Dim Msg, Style, Title, Help, Ctxt, Response, MyString
 
    'Message d'avertissement pour continuation.
 
        Msg = "Vous êtes sur le point de dupliquer la fiche " & Chr(13) & "Souhaitez-vous continuer?" ' Définit le message.
        Style = vbYesNo + vbExclamation + vbDefaultButton2    ' Définit les boutons.
        Title = "Avertissement"    ' Définit le titre.
        Response = MsgBox(Msg, Style, Title) 'Affiche le message.
 
        If Response = vbYes Then    ' L'utilisateur a choisi Oui.
            Else    ' L'utilisateur a choisi Non.
                Exit Sub
        End If
 
        On Error GoTo Err_Handler
 
        Dim NomFicheEnfant As String
 
    'Sauvegarde de l'enregistrement
        If Me.Dirty Then
                Me.Dirty = False
        End If
 
    'Vérification si l'enregistrement courant n'est pas vierge
        If Me.NewRecord Then
                MsgBox "Selectionner la fiche à dupliquer."
            Else
                NomFicheEnfant = InputBox("Entrer le nom botanique de la nouvelle fiche")
 
    'Dupliquation de l'enregistrement courant
                With Me.RecordsetClone
                    .AddNew 'la methode AddNewcar permet de Récupérer la nouvelle K_NumDevis
                        !Nom_Botanique = NomFicheEnfant
                        !Nom_commun = Me.Nom_commun
                        !Famille = Me.Famille
                        !Type = Me.Type
                        !Origine = Me.Origine
                        ...
 
            .Update
 
            'Save the primary key value, to use as the foreign key for the related records.
            '.Bookmark = .LastModified
 
                End With
        End If
 
Exit_Handler:
    Exit Sub
 
Err_Handler:
    MsgBox "Error " & Err.Number & " - " & Err.Description, , "B_CopyConforme_Click"
    Resume Exit_Handler
 
End Sub
Encore un grand merci
Oxopor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h03.


 
 
 
 
Partenaires

Hébergement Web