[SQL + Access] Nom generique pour designer le formulaire en cours ?

Nom generique pour designer le formulaire en cours ? [SQL + Access] - Programmation

Marsh Posté le 08-07-2001 à 23:46:42    

Alors voila.
 
J'au les tables :
 
trg(#CodeCellule,#date,tempsCycle,TempsOuverture,t
rg)
fabriquer(#codecellule,#date,scrap,qteprod)
Arret(#CodeArret,duree,datearret)
 
Je voudrais avoir pour une date (sachant qu'il y a plusieurs enregistrements par date) les resultats suivants :
 
Ai = ((Somme(arret.duree))/(somme(trg.tempsouverture)))*100
Nq = ((somme(trg.scrap)*somme(trg.tempscycle))/(somme(trg.tempsouverture)))*100
EC = 100-(Moy(trg) + Ai + Nq))
 
Si quelqu'un arrive à me faire ca, ca serait vraiment SUPER sympa ! Là j'ai trop de mal avec les dates !  Si qqun trouve que je ne donne pas assez de precision, demandez moi ce dont vous avez besoin pour pour parvenir a trouver la requete.
 
un GRAND merci ! ;)

 

[edtdd]--Message édité par Jesus Army--[/edtdd]

Reply

Marsh Posté le 08-07-2001 à 23:46:42   

Reply

Marsh Posté le 08-07-2001 à 23:54:38    

euh... erratum. Ce sont les resultats pour un mois que je veux. et je n'arrive po à faire coordiner les dates des differentes tables et du coup tout est compté 20x ! :(

Reply

Marsh Posté le 09-07-2001 à 23:32:02    

up ! j'y arrive toujours po :(

Reply

Marsh Posté le 10-07-2001 à 00:58:39    

Dans la formule de Nq, tu parle de somme(trg.scrap), or scrap est un champ de fabriquer !
 
J'ai fait 4 requetes, avec comme mois de référence 06/2001 :  
c_Ai, c_Nq, c_Moy et c_Ec
 
cAi :
SELECT Sum([duree])/Sum([TempsOuverture])*100 AS Ai
FROM Arret, trg
WHERE (((Month([datearret]))=6) AND ((Month([trg].[date]))=6) AND ((Year([datearret]))=2001) AND ((Year([trg].[date]))=2001));
 
c_Nq :
SELECT Sum([scrap])*Sum([tempsCycle])/Sum([TempsOuverture])*100 AS Nq
FROM fabriquer, trg
WHERE (((Month([trg].[date]))=6) AND ((Month([fabriquer].[date]))=6) AND ((Year([trg].[date]))=2001) AND ((Year([fabriquer].[date]))=2001));
 
c_Moy :
SELECT Avg(trg.trg) AS Moy
FROM trg
WHERE (((Month([trg].[date]))=6) AND ((Year([trg].[date]))=2001));
 
et enfin c_EC :
SELECT 100-([Moy]+[Ai]+[Nq]) AS EC
FROM c_AI, c_Moy, c_Nq;
 
A voir donc si scrap est dans la bonne table !

 

[edtdd]--Message édité par Mara's dad--[/edtdd]


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 10-07-2001 à 23:07:31    

tu as raison, je me suis planté ! le scrap est bien dans la table fabriquer et pas trg....
 
Je n'ai malheureusement pas la base sur ce pc pour pouvoir tester tout de suite, mais tes requetes me plaisent ;)
 
J'espère que tout va marcher impec...
 
Je te suis infiniment reconnaissant de m'avoir repondu et d'avoir fait ces requetes !
 
Encore merci !
 
a+

Reply

Marsh Posté le 11-07-2001 à 10:30:28    

En fait ca pose toujours problème. :(
 
Mais je pense que c'est l'organisation de la base qui est en cause !
 
J'ai viré la table trg, car elle ne sert en fait à rien. le calcul du trg s'obtient grace au tempscycle et au temps d'ouverture que j'ai transféré dans la table Fabriquer.
 
J'ai donc maintenant les tables :  
 
Fabriquer(#CodeCellule,#Date,#ReferencePiece,Quant
iteProduite,scrap,tempsouverture,tempscycle)
Arret(#CodeArret,duree,datearret)
 
Je pense que je dois faire quelque chose en ce qui concerne les date car là j'obtiens le problème suivant :
Quand je fais, par exemple, la somme des arrets dans une requete du type :
 
Select sum(duree) from arret;
 
j'obtiens la somme coreecte, mais lorsque que j'utilise une requete qui fait intervenir les 2 tables comme :
 
SELECT Sum(duree),Sum([duree])/Sum([TempsOuverture])*100 AS Ai  
FROM Arret, trg  
WHERE (((Month([datearret]))=6) AND ((Month([trg].[date]))=6) AND ((Year([datearret]))=2001) AND ((Year([trg].[date]))=2001));
 
j'obtiens un chiffre halucinant pour la duree (+ de 300 fois plus grand que la somme "normale"...)
 
Comme j'ai toujours du mal avec la gestion des dates je pense que le problème vient de là...
 
J'attends vos conseils ;)

Reply

Marsh Posté le 11-07-2001 à 10:34:37    

Je pense qu'il manque au minimum une jointure entre tes tables, qui résulte en un produit cartésien... et donc ta requête part en sucette.

Reply

Marsh Posté le 11-07-2001 à 10:41:09    

C a d ? Je suis pas un pro en gestion de bases...
 
Je dois faire quel type de jointure ?
Avec un INNER JOIN sur les dates ca n'a pas l'air de marcher non plus. :(

Reply

Marsh Posté le 11-07-2001 à 11:13:09    

Tu ne peut pas faire de jointure, si tu n'a pas de champ à mettre en corespondance dans tes tables.
Dans Fabriquer, tu as un CodeCellule, il faudrait par exemple avoir quelque chose d'équivalent dans la table Arret pour faire la jointure.
 
Sinon, fait comme moi, avec des requetes intermédiaires.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 11-07-2001 à 11:21:31    

Qaund Fred999 te dis qu'il manque une jointure entre tes bases, cela signifie qu'il manque un élément pour faire correspondre un arrêt à une cellule donnée.
 
Ce qui signifie par exemple si dans la table Fabriquer tu as 3 enregistrements dont les code cellules sont CC1, CC2et CC3, et que dans Arrêt tu as 2 enregistrements CA1 et CA2, lorsque tu demandes à ton système de gestion de base de données de lancer la requête qui récupère tout, celui-ci n'a auune info sur comment rattacher un arrêt à un code cellule. Donc logiquement il te fait un produit cartésien :
 
Tu récupères alors 6 lignes :
CC1 - CA1
CC1 - CA2
CC2 - CA1
CC2 - CA2
CC3 - CA1
CC3 - CA2
 
Pas étonnant dès lors que ta somme soit monstrueuse !
 
Il faudrait que tu aies une info pour rattacher des codes cellules à des codes arrêts.
La date peut être une info, mais en plus des problèmes posés par les heures (il faudra qu'une date ET heure d'arrêt corresponde exactement à une date ET heure de Fabriquer), cela ne résoudra pas complètement le problème de produit cartésien à mon avis...

Reply

Marsh Posté le 11-07-2001 à 11:21:31   

Reply

Marsh Posté le 11-07-2001 à 11:30:47    

je ne gère pas les heures, donc je n'aurais pas de problèmes de ce coté là...
Mais en revanche il n'y a pas le meme nombre d'enregistrements pour une meme date dans la table Fabriquer et dans la table Arret...
 
Mais j'ai en fait la table TypeAi qui pourrait peut etre arranger un peu les chose. :??:
 
TypeAi(NumAi,libelleAi,#CodeCellule)
et la table arret contient en fait arret(CodeArret,Duree,DateArret,#NumAi)
 
Le fait que la table NumAi contienne le CodeCellule ne peut il pas arranger tout ca ?

Reply

Marsh Posté le 11-07-2001 à 11:41:42    

Si, normalement ça devrait fonctionner avec cette table de relation.

Reply

Marsh Posté le 11-07-2001 à 11:47:00    

J'en demande peut etre beaucoup mais comment je dois proceder ? ;)

Reply

Marsh Posté le 11-07-2001 à 11:51:57    

SELECT.....
FROM TypeAi,Arret,Fabriquer
WHERE Fabriquer.#CodeCellule = TypeAi.#CodeCellule
AND Arret.#NumAi = TypeAi.#NumAi
AND ...
 
Voilà la syntaxe de la jointure, à toi de rajouter ce qu'il te faut en plus comme critères...

Reply

Marsh Posté le 11-07-2001 à 11:57:32    

ok merci.
 
Je vais essayer ca... je croise les doitgs :)

Reply

Marsh Posté le 11-07-2001 à 13:06:58    

Ca a l'air de marcher.
 
Merci !!! ;)

Reply

Marsh Posté le 11-07-2001 à 14:35:41    

Sinon, je voulais savoir autre chose...
 
Quand je veux recuperer des valeurs depuis un formulaire (dans des textboxs par exemple), suis-je obligé d'ecrire à chaque à chaque fois le nom du formulaire dans la requete et de faire plein de requetes presques identiques (une pour chaque formulaire), ou il est possible de mettre un nom de formulaire "generique" (comme &me ou un truc ds le genre :??: )indiquant à Access qu'il sagit du formulaire actuellement ouvert ?

Reply

Marsh Posté le 11-07-2001 à 17:09:55    

Non, c'est pas possible, pour la bonne raison que tu peux avoir plusieurs formulaires ouverts en même temps et que tes requêtes peuvent utiliser un champs d'un autre formulaire.
 
La seule solution passe par du code VB.
1- ne pas mettre de requête sur le formulaire.
2- sur le champs contenant la donnée qui paramètre la requête, il faut mettre du code VB sur l'événement _Change() qui va se charger de générer la requête du formulaire et ensuite de la rafraichir. Exemple :
 
Private Sub Texte0_Change()
 
Me.RecordSource = "SELECT * FROM MaTable WHERE NOM='" + Texte0.Value + "';"
Me.Requery
 
End Sub
 
Dans ce cas, Me veut dire Le formulaire donc le champs texte fait partie !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 11-07-2001 à 23:31:35    

ok, ca me simplifira un peu les choses...
 
encore merci !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed