voir plus bas
voir plus bas
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 :
OK. ca fonctionne bien.
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;
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 ?
En principe tu doit d'abord créer ta facture avant d'indentifier ces lignes.
Comment exécute tu cette tes requêtes?
Amicalement
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
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 ?
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
Encore faudrait que cdfacture soit un numéro auto ou tout autre chose qui permet d'identifier le dernier ou le plus grand.
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) ....
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
pour ca , pas de probleme . pour le moment c'est du monoutilisateur
je ne saisi pas a quel moment doit intervenir le formulaire.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
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 ?
Ok je vois.
Essayons
PS : J'ai saisi comme ca à la volet. Corriges au besoin.
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))")
Amicalement
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
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).
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");
merci de ton aide !!
En fait il fallait juste ajouter un Where dans la première requête
PS : Je suis pas sur de ca.
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))")
Amicalement
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é.
Amicalement
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é.
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.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.
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 ...
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 !!
c'etait simple comme bonjour et moi seul pouvais le solutionner. j'avance en SQL et c'est aussi grace a vous ...
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager