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

Requêtes et SQL. Discussion :

requete insert dans 2 tables


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut requete insert dans 2 tables
    voir plus bas

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut requete insert sur 2 tables
    BOnjour,
    je reformule ma question précédement posée dans le meme post.

    j'ai 4 tables pour gérer la facturation d'annexe (de contrat):

    Pièce jointe 21713

    dans un premier temps, je transforme les enregistrements de la table service_annexe en ligne_facture par la requete insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO ligne_facture ( cdservice, cdannexe, montantlignefacture )
    SELECT services_annexe.cdservice, annexe.cdannexe, service.PUservice
    FROM service INNER JOIN (annexe INNER JOIN (services_annexe LEFT JOIN ligne_facture ON services_annexe.cdservice=ligne_facture.cdservice) ON annexe.cdannexe=services_annexe.cdannexe) ON service.typeservice=services_annexe.typeservice
    WHERE (((services_annexe.date_fin)>Date()) AND ((annexe.etatannexe)=1) AND ((ligne_facture.cdservice) Is Null))
    GROUP BY services_annexe.cdservice, annexe.cdannexe, service.PUservice;
    OK. ca fonctionne bien.

    dans un deuxieme temps je crée les enregistrements dans la table facture pour regrouper les ligne_facture appartenant a la meme annexe par la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO facture ( typefacture, montantHT, datecreation, datecomptabilisation, dateecheance )
    SELECT "F-" & Right([annexe.typeannexe],2) AS Expr1, Sum(ligne_facture.montantlignefacture) AS Expr2, Date() AS Expr3, Date() AS Expr4, (Date()+30) AS Expr5
    FROM annexe INNER JOIN (services_annexe LEFT JOIN ligne_facture ON services_annexe.cdservice=ligne_facture.cdservice) ON annexe.cdannexe=services_annexe.cdannexe
    GROUP BY "F-" & Right([annexe.typeannexe],2);

    Mon probleme est que je n'arrive pas à relier les ligne_facture aux enregistrements factures. C'est a dire que dans ma table ligne_facture , je ne sais pas comment renseigner les champs cdfacture rétroactivement a la création des enregistrements dans facture.

    Est ce possible a faire dans ma seconde requete ? dois je changer de méthode pour réaliser ce que je souhaite ?

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    En principe tu doit d'abord créer ta facture avant d'indentifier ces lignes.
    Comment exécute tu cette tes requêtes?
    Amicalement

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par DMboup Voir le message
    Comment exécute tu cette tes requêtes?
    pour le moment je les execute moi meme par l'interface access.
    le moment venu, je les intégrerai dans un code pour automatiser le process

    Citation Envoyé par DMboup Voir le message
    En principe tu doit d'abord créer ta facture avant d'indentifier ces lignes.
    tu veux dire que je dois d'abord créer l'entete avant les lignes ?
    pourquoi pas , je peux créer les factures ainsi que les lignes_factures a partir des infos des services.
    mais j'ai l'impression que mon probleme reste identique car je ne sais tjs pas comment renseigner la clé etrangere cdfacture dans ligne_facture.

    as tu une pistE ?

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    C'est vrai qu'en passant par des requête il est un peu difficile de le faire mais toujours possible avec une organisation rigoureuse tout de même.

    Ce que tu peux faire c'est récupérer le numéro de la dernière facture créée par ta requête. Pour cela tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DMax(cdfacture...)
     
    ou Dlast("cdfacture";"Facture";"Critere")
     
    ou Select Max(cdfacture) ....
    Encore faudrait que cdfacture soit un numéro auto ou tout autre chose qui permet d'identifier le dernier ou le plus grand.
    Le problème : Si plusieurs personnes mettent à jour en même temps, ca peut tout chambouler.

    Je précise mon "En principe" facture et puis ligne facture
    SI tu utilises un formulaire et un sous formulaire, tu rempli le formulaire (basé sur la facture) ensuite tu exécute ta requête de création des lignes en récupérant cette fois le numéro de facture dans ton formulaire principal. Du coup plus de soucis.
    Amicalement

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par DMboup Voir le message
    Encore faudrait que cdfacture soit un numéro auto ou tout autre chose qui permet d'identifier le dernier ou le plus grand.
    Le problème : Si plusieurs personnes mettent à jour en même temps, ca peut tout chambouler.
    pour ca , pas de probleme . pour le moment c'est du monoutilisateur



    Je précise mon "En principe" facture et puis ligne facture
    SI tu utilises un formulaire et un sous formulaire, tu rempli le formulaire (basé sur la facture) ensuite tu exécute ta requête de création des lignes en récupérant cette fois le numéro de facture dans ton formulaire principal. Du coup plus de soucis
    je ne saisi pas a quel moment doit intervenir le formulaire.
    Dans mon cas, il s'agit de facturer des services inclus dans l'annexe d'un contrat. j'ai donc mes tables annexe et service_annexe déja renseignées.
    Il me faut donc transformer ces services en factures une fois qu'ils sont échus de maniere automatique sans saisie.
    Mon probleme réside donc dans le regroupement des lignes de services dans des entetes de factures avec une numérotation auto pour le codefacture.

    Me suis tu ?

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Ok je vois.

    Essayons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE LigneFacture Set cdFacture=DMax("CdFcature","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))")
    PS : J'ai saisi comme ca à la volet. Corriges au besoin.
    Amicalement

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par DMboup Voir le message
    Ok je vois.

    Essayons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE LigneFacture Set cdFacture=DMax("CdFcature","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))")
    PS : J'ai saisi comme ca à la volet. Corriges au besoin.

    Cette requete va attribuer a toutes les lignes le dernier code facture pour les lignes du jour.
    Mais je sens poindre une piste...

    j'ai plutot pensé a ceci mais aucune ligne n'est mise a jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Ligne_Facture SET Ligne_Facture.cdfacture = DMax("cdfacture","facture"," Ligne_facture.cdannexe = facture.cdannexe");
    En francais, il faudrait mettre a jour le champ cdfacture de ligne_facture par le max de cdfacture ou le code annexe est le meme. (pour cela j'ai rajouté le champ cdannexe dans facture).


    merci de ton aide !!

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    En fait il fallait juste ajouter un Where dans la première requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE Ligne_Facture SET Ligne_Facture.cdfacture = DMax("CdFcature","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))") Where Ligne_facture.cdannexe=DLookup("cdannexe","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))")
    PS : Je suis pas sur de ca.
    Amicalement

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par DMboup Voir le message
    En fait il fallait juste ajouter un Where dans la première requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE Ligne_Facture SET Ligne_Facture.cdfacture = DMax("CdFcature","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))") Where Ligne_facture.cdannexe=DLookup("cdannexe","Facture","((datecreation=Date()) and (datecomptabilisation=Date()) and (dateecheance=Date+30))")
    PS : Je suis pas sur de ca.

    tu as raison, la clé viens d'un where mais pas comme ici je pense.
    J'ai effectué cette derniere requete (sans les critères de date qui ne sont pas utiles a mon sens). il ne me met a jour que le dernier enregistrement et pas avec la bonne données.

    est il possible d'inclure la fonction where (ou un select) dans le fonction Dmax ?
    c'est a dire , rechercher le cdfacture max des enregistrements facture ayant le meme cdfacture que l'enregistrement ligne_facture concerné.

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par gui-llaume Voir le message
    ... rechercher le cdfacture max des enregistrements facture ayant le meme cdfacture que l'enregistrement ligne_facture concerné.
    En principe non puisque la ligne facture n'a pas encore son champ cdfacture rempli. C'est l'objet de la mise à jour.

    Il faut qu'on arrive à identifier les lignes à mettre à jour en fonction de quelque chose. Reste à trouver quoi? Et ca y a que toi qui puisse y répondre.
    Amicalement

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par gui-llaume Voir le message
    est il possible d'inclure la fonction where (ou un select) dans le fonction Dmax ?
    c'est a dire , rechercher le cdfacture max des enregistrements facture ayant le meme cdfacture que l'enregistrement ligne_facture concerné.
    j'ai ecrit trop vite . il m'aurait fallu dire :
    rechercher le cdfacture max des enregistrements facture ayant le meme CDANNEXE que l'enregistrement ligne_facture concerné.

    Il faut qu'on arrive à identifier les lignes à mettre à jour en fonction de quelque chose. Reste à trouver quoi? Et ca y a que toi qui puisse y répondre.
    justement , je pense que c'est le code annexe (élément rassemblant les services entre eux) qui est le pivot de cette mise a jour.

    En francais, j'ecrirais ma requete comme ceci :
    pour chaque enregistrement de la table ligne_facture, rechercher la valeur max du champ cdfacture de la table facture où ligne_facure.cdannexe = facture.cdannexe. et mettre a jour ligne_facture.cdfacture avec la valeur retournée (max de cdfacture)

    grand merci pour ton aide !! je pense que c'est vraiment la bonne piste.
    encore faut il mettre la syntaxe au point ...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    super. j'ai la solution .

    GRAND MERCI A DMBOUP POUR SA PRECIEUSE AIDE !!!


    finalement , la jointure se fait sur l'annexe et aussi la date de création !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE Ligne_Facture, facture SET Ligne_Facture.cdfacture = facture.cdfacture
    WHERE ligne_facture.cdannexe=facture.cdannexe And ligne_facture.datecreationlignefacture=facture.datecreation;
    c'etait simple comme bonjour et moi seul pouvais le solutionner. j'avance en SQL et c'est aussi grace a vous ...

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

Discussions similaires

  1. [MySQL] Insertion dans une table des résultats d'une requete
    Par PooSoft dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 01/06/2012, 14h22
  2. Requete d'insertion dans une table
    Par jkamelin dans le forum WinDev
    Réponses: 1
    Dernier message: 28/12/2009, 16h17
  3. requete update et insertion dans 2 tables
    Par croke dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/05/2008, 12h45
  4. Requete insertion dans une table sous delphi?
    Par EssaiEncore dans le forum Bases de données
    Réponses: 5
    Dernier message: 09/01/2006, 15h12
  5. Détection insertion dans une Table
    Par abelman dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/07/2004, 14h24

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