Copier données dans base Access

Signaler
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020
-
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
-
Bonjour,
Peut on copier les enregistrements d'une table A vers une autre table B tout en gardant les enregistrements déjà effectuées dans la table B.
merci d'avance

16 réponses

Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Bonjour

Il suffit de prendre enregistrement de A, et de les ajouter dans B.
Peut-être vérifier avant s’il n’existe pas déjà, si tu veux éviter les doublons.
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
C'est parce que tu n'exploites pas .Net pour ce qu'il est: un langage objet prévu pour le pattern MVC.

Tu te sers du datagridview comme du contenant de tes données (comme on aurait fait en VB6), au lieu d'avoir une collection d'un objet métier bindé sur la grille. La grille ne servant que de "vue".

Cette classe métier pourrait stocker dans une propriété l'information de sa modification, sans l'afficher dans la grille.

A la suite de quoi, une simple requête linq retournerait uniquement les instances modifiées à enregistrer.

J'ai fait un petit tuto sur le binding en winform https://codes-sources.commentcamarche.net/faq/1291-utilisation-du-binding-au-travers-de-l-objet-databindingsource
Pour te donner une idée
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Ha autant pour moi, comme tu as écrit plusieurs instructions par ligne j'ai zappé

Grid.DataSource = CDSet

Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Alors, je rappelle que je n'ai pas utilisé Access depuis des années et je précise que je ne l'ai pas sur mon PC.

Donc je me suis inspiré des codes présents ici et sur ton 2eme sujet.


Ensuite, je code en C#, je sais que VB n'est pas sensible à la casse, alors j'ai appelé variables internes, propriétés et paramètre du constructeurs de façon bien distincte.
J'ai ensuite passé ces codes dans un traducteur en ligne.

On commence par écrire une classe qui correspond à tes enregistrements avec une propriété qui stocke si il y'a eu un changement (j'ai pas géré les annulation, c'est plus complexe mais réalisable)

Imports System.ComponentModel

Public Class DataColby
    Implements INotifyPropertyChanged

    Public Sub New(ByVal Ident As Integer, ByVal CodeArt As String, ByVal Prix_U As Double)
        MyBase.New
        ide = Ident
        code = CodeArt
        prixU = Prix_U
        IsChanged = False
    End Sub

    Private ide As Integer

    ''' <summary>
    ''' Propriété correspondant au champ ID de la BDD
    ''' </summary>
    Public Property ID As Integer
        Get
            Return Me.ide
        End Get
        Set
            If (Me.ide = Value) Then
                Return
            End If

            Me.ide = Value
            Me.GenerePropertyChanged("ID")
        End Set
    End Property

    Private code As String

    ''' <summary>
    ''' Propriété correspondant au champ Prix(U) de la BDD
    ''' </summary>
    Public Property CodeArticle As String
        Get
            Return Me.code
        End Get
        Set
            If (Me.code = Value) Then
                Return
            End If

            Me.code = Value
            Me.GenerePropertyChanged("CodeArticle")
        End Set
    End Property

    Private prixU As Double

    ''' <summary>
    ''' Propriété correspondant au champ ID de la BDD
    ''' </summary>
    Public Property PrixUnitaire As Double
        Get
            Return Me.prixU
        End Get
        Set
            If (Me.prixU = Value) Then
                Return
            End If

            Me.prixU = Value
            Me.GenerePropertyChanged("CodeArticle")
        End Set
    End Property

    'etc
    ''' <summary>
    ''' Propriété qui stockera si un changement a eu lieu
    ''' </summary>
    Public Property IsChanged As Boolean

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged


    Private Sub GenerePropertyChanged(ByVal Propriete As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propriete))
        Me.IsChanged = True
    End Sub
End Class


Ensuite la méthode qui charge les données et affiche les données dans le datagridview
Dim lesData As List(Of DataColby) = New List(Of DataColby)

    Private Sub ChargeBDD()
        Dim Mag As Integer = 1
        Dim PrixU As Integer = 0
        Dim Sql As String = String.Format("SELECT ID, CodeArt, Stock, Sortie, [PrixG] AS[Prix(U)], Qté, Montant  FROM Gros WHERE [Stock] >= '{0}' AND [PrixG] NOT LIKE '{1}' ORDER BY [ID] ASC",
                                          Mag, PrixU) 'c'est mieux avec string format qu'avec des +
        Dim GP As OleDbConnection = New OleDbConnection
        Dim Cmd As OleDbCommand = New OleDbCommand(Sql)
        Dim GrTA As OleDbDataAdapter = New OleDbDataAdapter(Cmd)
        Cmd.Connection = GP
        Dim CDSet As DataSet = New DataSet
        GrTA.Fill(CDSet, "Gros")
        Dim GrT As DataTable = CDSet.Tables("Gros")
        Dim i As Integer = 0
        Do While (i < GrT.Rows.Count)
            lesData.Add(New DataColby(GrT.Rows(i).Field(Of Integer)("ID"), GrT.Rows(i).Field(Of String)("CodeArt"), GrT.Rows(i).Field(Of Double)("PrixG")))
            i = (i + 1)
        Loop

        'là on ne fait pas Grid.DataSource = lesData car on verrait la colonne IsChanged
        'Il faut ajouter un contrôle binding source comme expliqué dans le tuto, et modifier les colonnes à sa guise
        DataColbyBindingSource.DataSource = lesData
    End Sub


Et enfin la méthode qui extrait les datas modifiées pour les enregistrer
    Private Sub EnregistrerModifs()
        Dim modifs As List(Of DataColby) = lesData.Where(Function(x) x.IsChanged).ToList 'liste des enregistrements modifiés
        For Each item As DataColby In modifs
            'ici le code pour ajouter dans la BDD
        Next
    End Sub

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Avantage non négligeable de cette façon de faire, si tu dois faire des calculs avec la quantité et le prix, les propriétés sont des nombres et pas du texte comme dans le datagridview
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

Mais comment Whis
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Y’a « 36 » facons d’interagir avec des bases de données.
Donc sans savoir par quel classe ou méthode tu t’y connectes pas moyen de te donner une réponse précise. (Sans compter que mon dernier projet avec access date de 2007)

Est ce lié à ton autre question?

Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

merci
OUI, ne trouvant pas comment enregistrer en cascade les données de la datagridview dans la base, alors j'ai imaginé créer une table de transit, y enregistrer chaque modification séparément et de tout transférer plus tard dans la table principale en faisant une copie de la table de transit et en supprimant les enregistrements copiées pour réutiliser plus tard cette mémé table de transit si besoin y a.
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Donc au final, tu veux dans la table 1 les données d’origine et les données modifiées, c’est bien ça ?

Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

oui
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Pourquoi ajouter directement dans table 1 ne convient pas?
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

c'est faisable, mais j'ai quelques soucis.
1. la modification dans le datagridview peut concerner un ou plusieurs lignes et je ne sais pas comment enregistrer en bloc dans la table 1 toutes les lignes modifiées dans la datagridview D’où ma première question sur le forum : comment enregistrer en mème temps plusieurs lignes d'un datagridview dans une table access?.
donc j'ai penser faire une table de transit pour après exporter son contenu
2. toutes les modification sont enregistrer dans une table contrôle et portent un numéro
Donc si une seule ligne est modifiée elle porte un numéro et si 3 ligne sont modifiées elles porteront toutes trois le même numéro
3. Après les modification je dois recalculer le champ total a la suite d'un click sur bouton.
Mon dernier soucis est de pouvoir annuler la modification avant de valider si je veux.
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

Bonsoir Whismeril
Honnêtement j'ai pas compris grand chose. Je continu de creuser.
Merci pour le temps que je vous ai pris
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Peux tu poster le code avec lequel tu charges le datagridview
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

 Private Sub ChargerGros()
        Try
            Connection()
            Dim PrixU As Integer = 0
            Dim Mag As Integer = 1
            Sql = "SELECT ID, CodeArt,  Stock, Sortie, [PrixG] AS [Prix(U)], Qté, Montant " _
                + " FROM Gros WHERE [Stock] >= '" & Mag & "'" _
                + " AND [PrixG] NOT LIKE '" & PrixU & "' ORDER BY [ID] ASC"

            Cmd = New OleDb.OleDbCommand(Sql) : GrTA = New OleDb.OleDbDataAdapter(Cmd)
            Cmd.Connection() = GP : CDSet = New DataSet : GrTA.Fill(CDSet, "Gros")
            GrT = CDSet.Tables("Gros") : Grid.DataSource = CDSet
            Grid.DataMember = "Gros" : GridStockStyles()
        Catch ex As Exception
        Finally
            GP.Close()
        End Try
    End Sub
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
Ok, je suppose que le datagridview est rempli dans GridStockStyles()

Pourras tu poster son code aussi?

PS, je n’aurais probablement pas le temps de te faire un exemple avant ce soir
Messages postés
124
Date d'inscription
mardi 10 mai 2005
Statut
Membre
Dernière intervention
29 mai 2020

MERCI INFINIMENT. J’ÉTAIS EN BROUSSE JE VIENS JUSTE DE RENTRER, ET TOUTES MES EXCUSES POUR LE TEMPS MIS POUR VOUS RÉPONDRE. ENCORE MERCI. JE REVIENS VERS VOUS .
Messages postés
14863
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
30 mai 2020
412
De rien