ADO problème d'update (renseigner une table à partir d'une autre)

amerok Messages postés 2 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 16 novembre 2004 - 15 nov. 2004 à 23:22
amerok Messages postés 2 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 16 novembre 2004 - 16 nov. 2004 à 19:38
Après avoir beaucoup cherché (oui, ici aussi ;) ), voici ma question :

Je voudrais pouvoir créer des enregistrements dans ma table finale à partir de ma table originale, pour ce faire j'essaye d'abord de :

1. Pouvoir lire à partir de ma table originale un recordset (c'est bon)
2. Pouvoir écrire dans ma table destination (aïe, c'est ma question)
3. Ecrire dans la table destination les originaux (j'y suis pas encore)

En sachant que ma table finale est vide pour l'instant mais que ses champs existent. Je voudrais déjà pouvoir écrire dedans à l'aide de VB... Mais il me dit qu'il y a un risque de doublons... ma clé primaire est No d'identification et les 2 champs sexe et date de naissance ne peuvent être null: voici mon code :

Option Explicit ' Déclaration obligatoire des variables

'Dim cnnOriginale As New ADODB.Connection
'Dim cmdOriginale As New ADODB.Command
'Dim recOriginale As New ADODB.Recordset ' Ancien jeu d'enregistrements

Dim cnnFinale As New ADODB.Connection
Dim cmdFinale As New ADODB.Command
Dim recFinale As New ADODB.Recordset ' Nouveau jeu d'enregistrements

Dim Test As Integer

Private Sub Form_Load()
Test = 1
' Connexion à la BD originale
'cnnOriginale.Provider = "Microsoft.jet.OLEDB.4.0" ' Fournisseur de la BD
'cnnOriginale.ConnectionString = "D:\ExempleDeTransfert\Originale.mdb" ' Chemin de la BD
'cnnOriginale.Open ' Ouverture de la BD

' Commande SQL à envoyer à la base de données pour récupérer les informations des cas
'cmdOriginale.ActiveConnection = cnnOriginale ' Pour relier la connexion ouverte à la commande
'cmdOriginale.CommandText = "SELECT * FROM tbl_chd_stammdaten" ' Configuration de la commande avec requete SQL

' Curseur sur le recordset des cas d'origine
'recOriginale.CursorLocation = adUseClient ' Initialisation du Curseur Client
'recOriginale.CursorType = adOpenDynamic ' Utilisation d'un Curseur Client Dynamique
'recOriginale.Open cmdOriginale ' Transmission de la commande à la méthode Open

' Connexion à la BD finale
cnnFinale.Provider = "Microsoft.jet.OLEDB.4.0" ' Fournisseur de la BD
cnnFinale.ConnectionString = "D:\ExempleDeTransfert\Finale.mdb" ' Chemin de la BD
cnnFinale.Open ' Ouverture de la BD
recFinale.LockType = adLockOptimistic
' Commande SQL à envoyer à la base de données pour ouvrir un pointeur sur les cas d'arrivée
cmdFinale.ActiveConnection = cnnFinale ' Pour relier la connexion ouverte à la commande
cmdFinale.CommandText = "SELECT * FROM tbl_Cas" ' Configuration de la commande avec avec requete SQL

' Curseur sur le recordset des cas finaux
recFinale.CursorLocation = adUseClient ' Initialisation du Curseur Client
recFinale.CursorType = adOpenDynamic ' Utilisation d'un Curseur Client Dynamique
recFinale.Open cmdFinale ' Transmission de la commande à la méthode Open

End Sub
Private Sub cmdTransfert_Click()
'rec.MoveNext
recFinale.AddNew
recFinale.Fields("No identification") = "1"
recFinale.Fields("Sexe") = "2"
recFinale.Fields("Date de naissance") = "12.10.1980"
Test = Test + 1
recFinale.Update


'Text1.Text = recFinale("Sexe")
End Sub
Private Sub Command1_Click()
'cnnOriginale.CommitTrans
'recOriginale.Close
'cnnOriginale.Close
recFinale.Close
cnnFinale.Close


'Set cnnOriginale = Nothing
'Set recOriginale = Nothing
Set cnnFinale = Nothing
Set recFinale = Nothing

Unload Me
End Sub

2 réponses

cs_ITALIA Messages postés 2169 Date d'inscription vendredi 20 avril 2001 Statut Membre Dernière intervention 30 juin 2009 9
16 nov. 2004 à 09:38
ton code est franchement pas lisible....
poses question par question et vire les commentaires inutiles à ton premier souci....
Peu de monde prendrons la peine de lire ton post vu la longueur...

c'est normal que ca ne fonctionne pas quand tu click la premiere fois sur cmdTransfert ca te crée ton enregistrement ...si tu reclick il y a un risque de doublon sur le No identification..

change se champ en num Auto dans ta base et vire cette ligne de code : recFinale.Fields("No identification") = "1"

It@li@
0
amerok Messages postés 2 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 16 novembre 2004
16 nov. 2004 à 19:38
Salut,
je sais qu'il est franchement pas lisible, j'ai voulu utiliser la fonction "code" pour le mettre dans ma question mais ça n'a pas marché...
Et après je ne pouvais plus éditer mon message... mais c'est bon j'ai résolu mon problème.... l'erreur était le chemin d'accès à la base : j'en avais deux exemplaires : D:\Test.mdb et D:\Tests\Test.mdb par exemple et je modifiais la mauvaise... d'où le doublon : je l'avais déjà créé....

Sinon pour ceux qui veulent créer des enregistrements à l'aide de VB et d'ADO pour remplir une table à partir d'une autre, voici comment faire :


' Déclaration des variables
Dim cnnOriginale As New ADODB.Connection
Dim cmdOriginale As New ADODB.Command
Dim recOriginale As New ADODB.Recordset   

Private Sub Form_Load()
    
    ' Connexion à la base de données
    cnnOriginale.Provider = "Microsoft.jet.OLEDB.4.0"
    cnnOriginale.ConnectionString = "D:\Path\Originale.mdb"
    cnnOriginale.Open
    
    ' Commande SQL à envoyer à la base de données 
    cmdOriginale.ActiveConnection = cnnOriginale
    cmdOriginale.CommandText = "SELECT * FROM Ma_Table"
    
    ' Curseur sur le recordset 
    recOriginale.CursorLocation = adUseClient
    recOriginale.CursorType = adOpenDynamic
    recOriginale.Open cmdOriginale  

   ' On fait la même chose pour la base (vide) qui recevra les données
    
    cnnFinale.Provider = "Microsoft.jet.OLEDB.4.0"
    cnnFinale.ConnectionString = "D:\Path\Finale.mdb"
    cnnFinale.Open
    
    ' Commande SQL à envoyer à la base de données pour ouvrir un pointeur sur les cas d'arrivée
    cmdFinale.ActiveConnection = cnnFinale
    cmdFinale.CommandText = "SELECT * FROM Table_Destination"
    
    ' Curseur sur le recordset de destination
    recFinale.CursorLocation = adUseClient
    recFinale.CursorType = adOpenDynamic
    recFinale.LockType = adLockOptimistic
    recFinale.Open cmdFinale

End Sub

Private Sub cmdTransfert_Click()
    
    ' Copie champ à champ et enregistrement à enregistrement
    While Not recOriginale.EOF
    
          recFinale.AddNew
          recFinale.Fields("Monchamp") = recOriginale.Fields("AutreChamp")
          recFinale.Fields("MonChamp2") = recOriginale.Fields("AutreChamp2")
          ' Et ainsi de suite....
          recFinale.Update
          recOriginale.MoveNext
     Wend
  
End Sub

' A la fermeture ne pas oublier de fermer tout ça
recOriginale.Close
cnnOriginale.Close
Set cnnOriginale = Nothing
Set recOriginale= Nothing
 
recFinale.Close
cnnFinale.Close
Set cnnFinale = Nothing
Set recFinale = Nothing


Et voilà... si il y a des erreurs ou si ce n'est pas clair n'hésitez pas...
0
Rejoignez-nous