Comment transférer les données d'une table vers une autre.

[Résolu]
Signaler
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Bonjour à tous,

J'ajoute (dans tablepanier) des produits au fur et à mesure qu'un client me le demande (par l'intermédiaire d'un bouton "Ajouter"). J'aimerai copier les données de la table tablepanier (contenant donc tous les produits que le client aura choisi) vers la table des ventes (tablevendre) puis supprimer les lignes insérées (uniquement elles car je suis en mode multi-utilisateur). En résumé, j'aimerai copier le contenu de la table tablepanier vers la table tablevendre puis supprimer dans la table panier les données qui avaient été copiées. Quelqu'un saurait-il comment le faire s'il vous plaît? Merci d'avance.

Voici ce que je propose :

select * into tablevendre from tablepanier where numpanier = ' " & txtnumvendre & " ' ;

NB : la table tablevendre possède 8 champs alors que la table tablepanier en compte 5.

Cordialement.

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Salut
Avarre de renseignement ...
Si numPanier est un champ défini comme numérique dans la DB, il ne faut pas de ' pour sa donnée.
Si tu as moins de champs dans Panier que Vente, il faudra quand même inventer ceux qui manquent, avec des Null.
En supporsant que tu utilises une connexion ADODB :

maConnexion.BeginTrans
MaRequeteSQL = "Insert Into TableVente " & _
         "      Select monChamp1Vente = TP.monChamp1, " & _
         "      monChamp2Vente = TP.monChamp2, " & _
         "      monChamp3Vente = TP.monChamp3, " & _
         "      monChamp4Vente = TP.monChamp4, " & _
         "      monChamp5Vente = TP.monChamp5, " & _
         "      monChamp6Vente = Null, " & _
         "      monChamp7Vente = Null, " & _
         "      monChamp8Vente = Null " & _
         " From TablePanier TP " & _
         "Where TP.numPanier = " & txtnumvendre.Text
maConnexion.Execute maRequeteSQL
MaRequeteSQL = "Delete * From TablePanier " & _
         "       Where numPanier = " & txtnumvendre.Text
maConnexion.Execute maRequeteSQL
maConnexion.CommitTrans
       

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
ça marche à présent et voici le code :

'Renvoi à l'étiquette xyz en cas d'erreur
On Error GoTo Echec

'Connexion à la BD
connect

'Début de la transaction permettant de copier le contenu de la table tablepanier vers la table tablevendre
cn.BeginTrans

Dim copydatas As String

copydatas = "INSERT INTO TablePanier " & _
" Select TV.numvendre, " & _
" TV.numproduit, " & _
" TV.numvente, " & _
" TV.qtevendre, " & _
" TV.remisevendre, " & _
" TV.montantvendre, " & _
" TV.numemp, " & _
" TV.numtva " & _
" FROM TableVendre TV " & _
" WHERE TV.numvendre = " & txtnumvendre.Text & " "

cn.Execute copydatas

'Procédure permettant de supprimer les données transférées de la table d'origine
deletedatas = "Delete * From TableVendre " & _
" Where numvendre = " & txtnumvendre.Text & ""

'Lancement de la transaction
cn.Execute deletedatas
'cn.Execute "delete * from TableVendre where numvendre = " & txtnumvendre.Text & " "

'Exécution de la transaction
cn.CommitTrans

'Cette procédure permet d'annuler la transaction en cas d'échec
Exit Sub
Echec:
cn.RollbackTrans
MsgBox Err.Description, , Err.Number
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour Jack et Merci pour ton sauvetage . En effet, numpanier est de type numérique (Merci d'avoir prévu ce cas). Tu as raison lorsque tu dis que j'ai été avare en information. Je m'en excuse et je tiens à me rattraper (en fait j'ai plutôt intérêt ). Voici les tables :

tablepanier (numvendre,numvente,numproduit,numemploye,numtva)


tablevendre(numvendre,qtevendre,numtypeclient,numtypevente,numvente,numproduit,numemploye,numtva)

Voici ma méthode:

- Choix d'un produit cliquer sur le bouton "Ajouter" (et enregistrement dans la table tablepanier) ;
- Choix d'un autre produit cliquer sur le bouton "Ajouter" (et enregistrement dans la table tablepanier) ;
- ... (et enregistrement dans la table tablepanier) ;
- Cliquer sur le bouton "Enregistrer" pour valider et enregistrer la vente (copie de tout le contenu de la tablepanier vers dans la table tablevendre, suppression des données copiées de la table tablepanier) ;


Telle est ma vision. Penses-tu qu'elle soit correcte? Si tu as des conseils n'hésites pas 'il te plaît. C'est la première fois que je fais ce type de programme. Merci d'avance.

NB : N'hésites pas si tu as besoin d'éclaircissement.

Cordialement.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Ok pour ces détails.
Il faut que tu te penches sur les Transactions SQL (Begin, Commit et Revoke). Elles permettent de lancer une suite de commandes (insersion puis suppression dans ton cas)et, si tout c'est bien passé, tu peux valider par Commit. Si tu as eu un problème, tu pourras faire un Revoke et les actions menées depuis le Begin ne seront pas validées dans la DB.
C'est primordial quand tu as plusieurs actions successives liées à faire.

Pour ce qui est de la syntaxe SQL, je te laisse consulter les doc adéquat.
Pour la structure de tes données, là aussi, il faut se rapprocher des méthodes d'analyse, style Meurise, pour essayer de stocker le minimum d'information, éviter le stockage d'une même info à plusieurs endroits.

Une chose m'étonne dans les champs de TablePanier : On n'y voit pas de quantité par article.
Pense aussi à l'évenir : les soldes ou les remises pour professionnels --> Un champ avec un coefficient serait utile, je pense.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour et Merci Jack pour tous ces très précieux conseils . Effectivement, je n'ai jamais bossé sur les transactions SQL, je m'y mets donc. Concernant la quantité des produits, elle s'appelle qtevendre, mais tu as raison elle n'est pas présente dans la table tablepanier et les remises sont stockées dans la table tablevente (et non tablevendre). Merci pour ta remarque. Sinon j'essayes de me mettre aussi à fond dans MERISE. J'ai juste deux dernières questions :

- Ne penses-tu pas qu'il serait préférable que tablepanier soit une table jumelle de tablevendre?
- Quels conseils peux-tu me donner pour bien concevoir une application multi-utilisateurs (je veux dire théoriquement bien entendu, concernant les sessions et les enregistrements qui pourrait se faire en même temps). Ce que je voyais c'était que dès qu'un utilisateur se connecte je récupère son login que je mets dans un textbox et je le fais passer de formulaire en formulaire chaque fois qu'il en ouvre un (de formulaire), ça c'est pour la gestion des sessions. Maintenant je ne sais vraiment pas comment faire pour éviter des problèmes en cas d'enregistrement en même temps. La seule chose à laquelle je pensais était d'enregistrer en premier (pour verrouiller) l'identifiant de la table (avant de commencer à faire les ajouts) comme ça lorsqu'un autre utilisateur veut enregistrer une nouvelle vente ce ne sera jamais (théoriquement) avec l'identifiant qui a été verrouillé. Après, je ne sais qu'est-ce que tu en penses ?

Merci pour tout. Excellente journée!

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Salut Jack,

désolé mais ta requête m'affiche l'erreur -2147217900 suivante : "Il n'y a pas de champ destination dans l'instruction INSERT INTO (tablepanier.numvendre = TV.numvendre). Voici ma requête :

Dim MaRequeteSQL As String

cn.BeginTrans

MaRequeteSQL = "Insert Into TablePanier " & _
" Select tablepanier.numvendre = TV.numvendre, " & _
" numproduit = TV.numproduit, " & _
" numvente = TV.numvente, " & _
" qtevendre = TV.qtevendre, " & _
" remisevendre = TV.remisevendre, " & _
" montantvendre = TV.montantvendre, " & _
" numemp = TV.numemp, " & _
" numtva = TV.numtva " & _
" From TableVente TV "

cn.Execute MaRequeteSQL

MaRequeteSQL = "Delete * From TablePanier "

cn.Execute MaRequeteSQL

cn.CommitTrans


Sais-tu pourquoi s'il te plaît?

Merci d'avance.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour,

quelqu'un pourrait-il m'aider s'il vous plaît? Merci d'avance.

Cordialement.