Guardian,
Oui, en effet, les données viennent de la base
Concernant l'ID, je vais travaillé sur cette piste
Merci
Version imprimable
Guardian,
Oui, en effet, les données viennent de la base
Concernant l'ID, je vais travaillé sur cette piste
Merci
Bonjour à Tous,
Maintenant j'ai un autre souci:
Je tente de faire apparaitre dans une table mémoire le contenu d'un rectangle
Partant du code suivant dans "clic sur image1":
J'ai pensé renvoyé un paramètre à une requête mise dans une procédure, mais je n'arrive pas à trouver, j'ai tenté:Code:
1
2
3
4
5
6
7 oPointClic est un CPoint(SourisPosX(), SourisPosY()) oZoneClic est un CZonePlanRectangle dynamique = oPlan:ZoneRectangleDepuisPoint(oPointClic) SI oZoneClic <> Null ALORS Message("Vous êtes sur : " +oZoneClic:slibellé) FIN
Dans d'autres cas, j'arrive de la façon suivante:Code:Détail_Stocks(IMG_Image1..Valeur)
Code:Détail_Stocks("LE CHAMP"..ValeurAffichée)
J'ai ajouté une procédure "Détail_Stocks" contenant le code suivant:
Cette procédure étant située dans le code d'initialisation de la fenêtreCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 PROCEDURE Détail_Stocks(Emplacement="") sClauseWhere est une chaîne TableSupprimeTout(TABLE_STOCKS) SI Emplacement="" ALORS sClauseWhere="" SINON sClauseWhere=" AND STOC_EMPLACEMENT='"+Emplacement+"' " FIN //Cette requête interroge les tables ARTICLES, STOCKS et PLANS_ZONES1 //avec comme liaisons: le code article et l'emplacement sRequêteStocks est une chaîne sRequêteStocks="SELECT PLZ_SITE,PLZ_AFFECTATION,ART_NOMAPPEL,ART_CODIM1,ART_CODIM2,STOC_QUANTITE,ART_CODE,ART_CODEBARRE,ART_PRIXACHAT, "+... "ART_PRIXVENTE,ART_PAYSORIGINE "+... "FROM ARTICLES,STOCKS,PLANS_ZONES1 "+... "WHERE ART_CODE=STOC_ARTICLE AND PLZ_AFFECTATION=STOC_EMPLACEMENT "+sClauseWhere+... "GROUP BY PLZ_SITE,PLZ_AFFECTATION,ART_NOMAPPEL,ART_CODIM1,ART_CODIM2,STOC_QUANTITE,ART_CODE,ART_CODEBARRE,ART_PRIXACHAT,ART_PRIXVENTE,ART_PAYSORIGINE " SI EnModeTest() ALORS Trace(sRequêteStocks) SI SQLExec(sRequêteStocks,"ReqStocks") ALORS SQLTable("ReqStocks",TABLE_STOCKS) FIN
Mais cela ne fonctionne pas.
Auriez vous une idée ?
Merci
Bonjour,
Vous avez lié un stock à une zone dans votre base de données par l'intermédiaire de la chaine "emplacement". On préfère d'habitude utiliser des clés primaire numériques pour faire les liens entre tables mais passons, ce n'est pas le sujet.
Donc lorsque vous cliquez sur une zone, vous avez besoin de lister tous les éléments stockés de la zone. En pseudo SQL :
Le problème que vous rencontrez, c'est que la donnée emplacement n'existe pas dans la classe CZoneRectangle. Pour l'instant, il y a des coordonnées et un libellé. Si vous rajoutez l'emplacement, quand vous cliquez sur une zone vous pourrez lancer la requête qui chercher les éléments de la zone.Code:Tous les éléments stockés pour lesquels l'emplacement est <paramètre>
Je vois que vous avez essayé de bricoler avec la valeur de l'image. L'image ne sait rien des zones qui la compose. Vous avez déjà un code qui vous retourne la zone cliquée, c'est vers cette voie qu'il faut aller.
C'est clair ?
Bonjour Vmolines,
Ce n'est pas clair.............c'est limpide.
Et bien je continue sur cette voie et je vous donne le résultat
Très bonne journée
Re bonjour,
Vu que je n'allais y passer la journée........j'ai assimilé ce que m'a dit Vmolines.
- Vu que le libellé correspond en fait au nom de la travée dans la table PLANS_ZONES.
- J'ai donc pensé intercepter l'information
Du coût:
Je mets le résultat en pièce jointeCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 oPointClic est un CPoint(SourisPosX(), SourisPosY()) oZoneClic est un CZonePlanRectangle dynamique = oPlan:ZoneRectangleDepuisPoint(oPointClic) SI oZoneClic <> Null ALORS Message("Vous êtes sur : " +oZoneClic:slibellé) sRequêteStocks est une chaîne TableSupprimeTout(TABLE_STOCKS) sRequêteStocks="SELECT PLZ_SITE,PLZ_AFFECTATION,ART_NOMAPPEL,ART_CODIM1,ART_CODIM2,STOC_QUANTITE,ART_CODE,ART_CODEBARRE,ART_PRIXACHAT, "+... "ART_PRIXVENTE,ART_PAYSORIGINE "+... "FROM ARTICLES,STOCKS,PLANS_ZONES1 "+... "WHERE ART_CODE=STOC_ARTICLE AND PLZ_AFFECTATION=STOC_EMPLACEMENT AND PLZ_AFFECTATION = '"+oZoneClic:slibellé+"' "+... "GROUP BY PLZ_SITE,PLZ_AFFECTATION,ART_NOMAPPEL,ART_CODIM1,ART_CODIM2,STOC_QUANTITE,ART_CODE,ART_CODEBARRE,ART_PRIXACHAT,ART_PRIXVENTE,ART_PAYSORIGINE " SI EnModeTest() ALORS Trace(sRequêteStocks) SI SQLExec(sRequêteStocks,"ReqStocks") ALORS SQLTable("ReqStocks",TABLE_STOCKS) FIN FIN
Maintenant, je vais tenté de mettre les rectangles possédant au moins un article en couleur.
Ceci afin que l'utilisateur puisse voir d'un seul coup d'œil les zones occupées.
Bonjour,
Je me cite:
Et bien je pensais y arriver, mais non !Code:Maintenant, je vais tenté de mettre les rectangles possédant au moins un article en couleur.
Voici mon raisonnement:
- Vu que je souhaite faire apparaître les zones possédant une quantité > 0 en couleur
- Vu que j'ai une requête dont le résultat s'affiche dans une table mémoire indiquant les quantités par zones (rectangles).
- De là, j'ai pensé mettre le code suivant dans le code d'initialisation de la fenêtre:
J'ai tenté "dRemplissage", sans résultat.Code:
1
2
3
4
5 SI TABLE_PLANS_ZONES.COL_QUANTIE > 0 ALORS Mais alors quoi ! , je ne trouve pas la solution FIN
J'y arrive avec ce code lorsque je clic sur une zone, mais ce n'est pas le résultat souhaité
Nul doute que ma logique n'est pas la bonne.
Auriez vous une piste à me donner
Par avance merci
Bonjour...
J'ai pas suivi ton post depuis le début et je l'ai lu en travers...
Si j'ai compris tu commences par tracer tes rectangles et ensuite tu veux les coloriés en fonction du stock???
Pourquoi ne cherche tu pas le stock correspondant lors de la création de ton rectangle ainsi tu passe en paramètre de ta PROCEDURE Dessiner() la couleur de remplissage en fonction du stock???
Bonjour Mail.Spam,
Superbe idée.
Pour le moment, je ne vois pas comment insérer une requête dans la classe et trouver la commande de remplissage des zones concernées
Bonne après midi
Dans la classe CZonePlanRectangle :
- ajouter un membre QteStock est un entier
- faites en sorte que le constructeur de la classe valorise le nouveau membre
- dans la méthode Dessiner, tenez compte de la quantité pour utiliser une couleur spécifique
Dans le code de chargement depuis la BDD :
- passez la quantité en stock lors de l'ajout des zones
Bonjour Vmolines,
Merci pour ta réponse.
Bon...
Dans le code de déclaration de la classe
Constructeur:Code:
1
2
3
4
5 CZonePlanRectangle est une classe hérite de CRectangle slibellé est une chaîne QteStock est un entier FIN
Dans la méthode de la classe CRectangleCode:
1
2
3
4 PROCEDURE Constructeur(poPoint1 est un CPoint dynamique, poPoint2 est un CPoint dynamique, LOCAL psLibelle est une chaîne, LOCAL psStock est un entier) Constructeur CRectangle(poPoint1, poPoint2) slibellé = psLibelle QteStock = psStock
pour le moment:
Mais là, je sécheCode:
1
2 dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,RougeFoncé)
Ca m'embête si vous n'avez pas vu la finalité.
Je prends le problème en partant de l'objectif afin que vous saisissiez la démarche :
1) afficher les zones en rouge si la quantité dépasse une valeur
2) la zone doit avoir l'information de quantité d'éléments qu'elle stocke pour se dessiner de la bonne couleur
3) on doit indiquer cette quantité à la création d'une zone
Et d'un point de vue technique / implémentation, il vous manque les points suivants :
1) Dans la méthode dessiner d'une zone, on connait la quantité donc on peut faire un cas si qté = 0 et si qté > 0
3) on lie la bdd pour créer les zones, c'est à ce moment qu'on ajoute l'information de quantité stockée. Je ne sais pas où vous allez la chercher mais vous oui.
le 2) vous l'avez déjà implémenté
Vmolines,
9a commence à venir....
Une question:
Est ce à dire que je dois mettre dans la méthode "dessiner":
Ensuite, via une requête à la base de donnée SQL, créer les zones au même titre que la méthode actuelleCode:
1
2
3
4
5
6
7
8
9
10
11 Si QteStock = 0 ALORS dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,BleuFoncé) SINON SI QteStock > 0 ALORS dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,RougeFoncé) FIN
Désolé, mais je préfère poser la question avant modification.
Te toute manière, j'ai sauvegardé au cas où
Par avance merci
C'est bon pour le code de dessiner.
Bonsoir Vmolines,
Je pense que je m'approche de la solution, pour autant, je n'affiche maintenat que les zones possédant un stock > 0
Je m'explique:
Code:
1
2
3
4
5 CZonePlanRectangle est une classe hérite de CRectangle slibellé est une chaîne QteStock EST UN ENTIER FIN
Code:
1
2
3
4 PROCEDURE Constructeur(poPoint1 est un CPoint dynamique, poPoint2 est un CPoint dynamique, LOCAL psLibelle est une chaîne)//, local psStock est un entier) Constructeur CRectangle(poPoint1, poPoint2) slibellé = psLibelle QteStock = psStock
Et pour finir, vu que j'interroge une table SQLServerCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 PROCEDURE Dessiner() QteStock est un entier SI QteStock = 0 ALORS dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,BleuFoncé) SINON SI QteStock > 0 ALORS dRectangle(:oPoint1:X, oPoint1:Y, oPoint2:X, oPoint2:Y,Transparent,RougeFoncé) FIN FIN
Mais, du cout, seul les rectangles possédant une quantité > 0 sont créesCode:
1
2
3
4
5
6
7
8
9
10 sRequetePLZ1 est une chaine sRequetePLZ1="SELECT PLZ_AFFECTATION,PLZ_X1O,PLZ_Y1O,PLZ_X2O,PLZ_Y2O,STOC_QUANTITE FROM PLANS_ZONES1,STOCKS WHERE STOC_EMPLACEMENT=PLZ_AFFECTATION " SI EnModeTest() ALORS Trace(sRequetePLZ1) SI SQLExec(sRequetePLZ1,"ReqPLZ") ALORS SQLTable("ReqPLZ",TABLE_STOCKS) POUR TOUTE LIGNE DE TABLE_STOCKS oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(TABLE_PLZ.COL_PLZ_X10,TABLE_PLZ.COL_PLZ_Y10),allouer un CPoint(TABLE_PLZ.COL_PLZ_X20,TABLE_PLZ.COL_PLZ_Y20),TABLE_PLZ.COL_PLZ_AFFECTATION)) FIN FIN
- Je suis bien obligé de relier les tables de cette manière (enfin je ne connais que cette seule solution)
Par avance merci pour une idée
Il faut utiliser une jointure externe dans votre requête
De cette manière s'il n'y a pas de donnée dans STOCKS qui correspond à la ligne PLANS_ZONES1, une valeur NULL est ramenée par la requête pour les rubriques de STOCKS (ici la quantité).Code:
1
2
3
4
5
6
7
8
9
10 SELECT PLANS_ZONES1.PLZ_AFFECTATION, PLANS_ZONES1.PLZ_X1O, PLANS_ZONES1.PLZ_Y1O, PLANS_ZONES1.PLZ_X2O, PLANS_ZONES1.PLZ_Y2O, PLANS_ZONES1.STOC_QUANTITE FROM PLANS_ZONES1 LEFT JOIN STOCKS ON STOCKS.STOC_EMPLACEMENT = PLANS_ZONES1.PLZ_AFFECTATION
Votre requête fait une "equi jointure" pour donner le terme exact. Si la liaison n'existe pas dans la table STOCKS, la ligne n'est pas ramenée.
Bonsoir Raptor92
Sans parler du contenu de la requête (vmolines (que je salue au passage) l'a déjà fait) essaye cette syntaxe pour tes requêtes :C'est plus lisible, notamment grâce à coloration syntaxique de WindevCode:
1
2
3
4
5
6 sRequetePLZ1 est une chaîne sRequetePLZ1 = [ SELECT PLZ_AFFECTATION, PLZ_X1O, PLZ_Y1O, PLZ_X2O, PLZ_Y2O, STOC_QUANTITE FROM PLANS_ZONES1, STOCKS WHERE STOC_EMPLACEMENT = PLZ_AFFECTATION ]
Bonne soirée et bon courage
Bonsoir Hpascal,
Toujours ravi de converser avec toi.
Dans le cas présent, les crochets ne fonctionne pas, et si tu les enlèves on reviens à la requête que j'ai utiliser et qui n donne que les zones dont la qté >0
Et en m'adressant également à Vmolines:
Votre requête fonctionne parfaitement et donne le résultat recherché, ce qui vient de me dire que cela m'ouvre d'intéressantes perspectives car je n'utilisais pas ce type de code.
(Pas de honte.......je ne connaissais pas)
L'avantage avec e type d'explication, c'est la compréhension que j'en tire..et la leçon.
Bon, à part cela, je n'ai plus d'erreur de code.
Il me reste à passer le paramètre de la classe "QteStock" afin que la condition de la classe soit prise en compte (QtStock > 0 et =0 )
Bonne fin de soirée
hpascal (que je salue aussi :) ) parlait uniquement de la manière de taper vos chaines dans le code, pas de la requête.
Quand on a des chaines longues qu'on souhaite formatter dans le code par souci de lisibilité, il est bienvenu d'utiliser la syntaxe des chaines délimitées par des crochets et plus des doubles quotes. Les chaines SQL sont le meilleur exemple.
Concernant le SQL, je vous invite à lire les cours de SQLPro sur ce même site.
Et enfin pour le passage de la couleur des zones, c'est le chainon manquant, vous devriez vous en sortir.
Bonjour Vmolines,
Vu que j'ai passé une partie de la nuit à depanner un serveur capricieux, je dois être fatigué.
Concernant le passage du dernier paramètre, j'ai un doute
Sommes nous d'accord que je dois le passer à cet endroit:
Très bonne journéeCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 //CONSTRUCTION DE L'IMAGE oPlan est un CPlan(IMG_Image1..Nom) sRequetePLZ est une chaîne sRequetePLZ="SELECT PLANS_ZONES1.PLZ_AFFECTATION, PLANS_ZONES1.PLZ_X1O, PLANS_ZONES1.PLZ_Y1O, PLANS_ZONES1.PLZ_X2O, PLANS_ZONES1.PLZ_Y2O, "+... "STOCKS.STOC_QUANTITE "+... "FROM PLANS_ZONES1 "+... "LEFT JOIN STOCKS "+... "ON STOCKS.STOC_EMPLACEMENT = PLANS_ZONES1.PLZ_AFFECTATION " SI EnModeTest() ALORS Trace("Construction", sRequetePLZ) SI SQLExec(sRequetePLZ,"ReqPLZ") ALORS SQLTable("ReqPLZ",TABLE_PLZ) POUR TOUTE LIGNE DE TABLE_PLZ oPlan:AjouterZonePlanRectangle(allouer un CZonePlanRectangle(allouer un CPoint(TABLE_PLZ.COL_PLZ_X10,TABLE_PLZ.COL_PLZ_Y10),allouer un CPoint(TABLE_PLZ.COL_PLZ_X20,TABLE_PLZ.COL_PLZ_Y20),TABLE_PLZ.COL_PLZ_AFFECTATION,TABLE_PLZ.COL_QUANTITE)) FIN FIN oPlan:Dessiner()
Le code appelant est bon. Je suppose que vous avez déclaré ce nouveau paramètre dans AjouterZonePlanRectangle et le constructeur de la zone.
Pour retracer le chemin de la quantité dans le code :
Code appelant (lecture BDD) -> AjouterZonePlanRectangle -> Constructeur zone -> membre QteStock
Je ne sais pas si toutes ces étapes vous semblent naturelles ou alambiquées mais je vous assure que découper son code rend le travail plus facile.