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

4D Discussion :

Formule de recherche et info à renvoyer sur message d'alerte


Sujet :

4D

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Formule de recherche et info à renvoyer sur message d'alerte
    Bonjour,j'ai un champ ou est répértorié des numeros de chambre, par exemple : 201 à 240.si une fiche contient le numéro de chambre elle est pour moi occupée.Si un numéro ne figure pas dans la liste la chambre est vide. je recherche la méthode pour trouver le numero de la chambre ou des chambres qui sont libres et renvoyer ce ou ces numéros dans une formule d'alerte.
    Merci de votre aide.
    Cordialement

  2. #2
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Salut,

    Personnellement, j'aurais plutôt créé toutes les chambres avec un booleen : Ocuppé - Libre.
    Dans ton cas une contrainte, une alerte est limitée à 255 caractères. Donc voir, suivant le nombre de chambres si cela passe.
    Sinon, plusieurs solutions, la plus simple à mettre en place. Tu crées un tableau avec toutes les chambres possibles. si les numéros se suivent tu peux passer par une boucle. tu peux également suivant la Qté créer un tableau interprocess. Nous dirons pour l'exemple que ton tableau se nomme MaList
    Ensuite tu créés un formulaire contenant une liste dont la variable correspond au nom du tableau MaList.
    Ensuite
    Tout selectionner([MaTable])
    valeurs distinctes([MaTable]MesChambres;$TabTemp)
    reduire selection([MaTable];0
    Boucle ($i;1;Taille tableau(TabTemp);1)
    $pos:=chercher dans tableau(MaList;TabTemp{$i})
    si($pos=-1)
    supprimer lignes(MaList;$Pos;1)
    fin de si
    Fin de boucle
    creer fenetre (.......)
    dialogue(Fomulaire précédent)
    fermer fenetre

    Voilà, une idée vite fait.
    Il y a surement d'autres solutions.

    A +

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci de ton aide précieuse, effectivement c'est une meilleure idée de créer des champs booléens pour toutes les chambres et renvoyer vrai ou faux si la fiche chambre 204,par exemple existe, ensuite je peux mieux trier les booléens.J'ai 80 chambres donc 80 champs de plus. Je peux aussi peut être indexer le champ booléen avec le champ numerique de la chambre?
    je vais tester car je ne voudrai pas trop alourdir.
    Merci

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Si quelqu'un a une idée encore plus simple ?
    Je suis preneur
    merci de votre particpation .

  5. #5
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Salut,
    En prenant en compte q'un booléen pèse 2 octets (si mes souvenirs sont bons), cela ne devrait pas alourdir ta base par contre. 80 enregsitrements, ce n'est pas cela non plus qui va pénaliser les temps de réponses. j'ai des bases avec prêt de 100 tables, certaines tables ont jusqu'à 60 champs. Je dépasse allègrement les 500 000 enregistrements et les données sont proches de 3 Go. le tout en client/serveur. Il y a probablement des bases plus volumineuses que cela. Donc je pense que tu peux aller vers le booléen sans crainte.
    Après, le traitement sera simple et rapide.
    Chercher dans al table les booleens qui à vrai (chambre vide),
    Valeurs distinctes des numéros de chambre.
    Affichage du tableau résultant dans une fenetre. En plus, via ce principe, tu pourras proposer de choisir la chambre que tu veux affecter à telle ou telle personne.

    A +

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    Je ne m'en sort pas, il faut te dire que je n'ai pas encore eu l'occasion de créer de tableau, je teste des choses mais c'est pas bon.
    Si tu as un peu de temps merci de m'indiquer la marche à suivre, je suis pas tout jeune et autodidacte et pour te donner un exemple "formulaire contenant une liste dont la variable correspond au nom du tableau MaList " pour moi c'est difficile, par contre methode formulaire - methode bouton - ça va. Si c'est trop lourd pour toi, c'est pas grave, je comprends. Mais je pense que c'est juste une question de langage qui m'échappe.
    Merci et à + peut être.

  7. #7
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Je viens de voir ton message mais je suis en réunion tout l'AM. je te donnerais tout ca demain matin. Pour l'age, rien de grave, surtout qu'à priori j'ai un an de plus que toi .

    A demain.

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Super
    Merci beaucoup à toi.

  9. #9
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Bien, on est parti.
    Tu as donc une table [Chambres]avec les champs.
    NumChambre
    Occupee (booleen)
    (il lpeut en exister d'autres mais on va utiliser ceux-ci).

    On crée un formulaire contenant un objet de type Zone de délfilement à laquelle on mets comem variable TabNumChambre. On rajoute également un bouton de validation (action générique Valider) et un bouton d'annulation (action générique Annuler). On dira que ce formulaire est dans la table [Interface] et qu'il se nomme DialChambVide.

    Dans le formulaire liste (ou ailleurs, pas d'importance) il y a un bouton 'Recherche Chambres vides'.
    Methode du bouton qui lance la récupération d'une chmabre sélectionnée.
    c_entier long($evt;$NumChambre)
    $evt:=evenement formulaire
    au cas ou
    $evt=sur clic souris)
    $NumChambre:=P_ChercheChambreVide
    si(NumChambre#0) ' j'ai bien quelque chose
    'je le traite
    fin de si
    fin de cas

    La méthode P_ChercheChambreVide
    ' on prépare le tableau
    tableau entier long(TabNumChambre;0)
    ' on va chercher que les chambres inoccupées
    chercher([Chambre];[Chambre]Occupee=faux)
    ' on a donc que les chambres vides, on envoi les numéros dans le tableau
    valeurs distinctes([Chambre]NumChambre;TabNumChambre)
    $Fen:=creer fenetre(largeur ecran;hauteur ecran)
    DIALOGUE([Interface];"DialChambVide")
    FERMER FENETRE($Fen)
    ' si validé et un élement sélectionné
    si((ok=1)&(TabNumChambre>0))
    'je renvoi ce qui a été choisi
    $0:=TabNumChambre{TabNumChambre}
    sinon
    ' rien de choisi ou annuler, je renvoi zéro.
    $0:=0
    fin de si


    Tu peux ajouter si besoin une méthode sur l'objet TabNumChambre.
    ceci permet de faire un double clic sur une ligne, donc de la selectionner et de valider le formulaire.

    c_entier long($evt)
    $evt:=evenement formulaire
    au cas ou
    $evt=sur double clic)
    si(self->{self->}#0)
    valider
    fin de si
    fin de cas

    Voila, il y a la possibilité d'améliorer plusieurs choses mais c'est fonctionnel. N'hésites si tu as d'auters soucis.

    A +

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Très sympa de ta part, j'ai de quoi travailler, je fonçe, je teste et je te tiens au jus.
    Merci beaucoup de ton aide, ce déblocage m' ouvre l'esprit
    a+

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bon c'est pas brillant, mais j'avance un peu, je récapitule.
    Dans la table patient, j'ai donc un champ chambre ou je saisi le numéro de chambre. j'ai créé dans la même table un champ booléen Occcupée.la méthode de mon formulaire de saisie de la table Patient est la suivante:
    Si (Avant)
    Si ([Patient]Code="")
    [Patient]Code:=Chaine(Numerotation automatique([Patient]))
    Fin de si
    Fin de si
    Si ([Patient];[Patient]Chambre>O)
    ([Patient];[Patient]Occupee:=Vrai)
    Sinon
    ([Patient];[Patient]Occupee:=Faux)
    Fin de si
    ' en fait si un numero de chambre est saisi, la chambre est occupée.
    ( je suis content, ça marche)

    J'ai ensuite crée le formulaire contenant la zone de defilement,
    puis la méthode P_ChercheChambreVide, la voici

    TOUT SELECTIONNER([Patient])
    CHERCHER([Patient];[Patient]Sortie=Faux;*) 'pour ne garder que les dossiers de Patient en cours d'hébergement

    TABLEAU ENTIER LONG(TabNumChambre;0)
    CHERCHER([Patient];[Patient]Occupee=Faux)
    VALEURS DISTINCTES([Patient]Chambre;TabNumChambre)
    $Fen:=Creer fenetre(20;100;500;400;8)
    DIALOGUE([Interface];"DialChambVide")
    FERMER FENETRE($Fen)
    Si ((ok=1)*&*(TabNumChambre>0))
    $0:=TabNumChambre{TabNumChambre}
    Sinon
    $0:=0
    Fin de si

    Lorsque j'execute cette methode , il vient à l'écran une fenetre formulaire avec la zone de défilement. Mais il y a dans la zone toute les chambres.
    Il ne me faut que les vides . et je voudrai renvoyer ces chambres vides dans une alerte du style:

    TOUT SELECTIONNER([Patient])
    CHERCHER([Patient];[Patient]Sortie=Faux;*)

    Si (Enregistrements trouves([Patient])=80)
    ALERTE("Toutes les Chambres de l'Etablissement sont occupées")
    Sinon
    ALERTE("Il faut Programmer"+Chaine(Enregistrements trouves([Patient])-80)+" Entrée(s) ")
    Fin de si
    Fin de si

    'ici l'alerte dit Il faut Programmer (nombre négatif chambre vide) car j'ai retiré
    80, je ne suis pas arrivé à trouver comment eliminer le signe moins !!!
    le mieux serait de donner le message suivant : Il faut programmer une entrée sur la(es) chambre(s) ......
    Tu vois c'est pas brillant. Pour une bricole je cale,mais je ne me décourage pas, j'aime chercher la solution, je teste et je reteste.
    Le pire c'est qu'il faut que je comprenne l'architecture et c'est pas toujours évident, la preuve malgré tes consignes précises.
    Par exemple je ne saisi pas l'utilité du bouton ' Recherche chambres Vides ' dans le processus de récupération de l'info par la méthode 'P_ChercheChambreVide

    Bon je ne sais pas si tout cela est clair pour toi, je l'espère.

    Te remerciant de ta lecture
    à+

  12. #12
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Désolé pour le délai de réponse mais, entre le boulot et les congés.
    Si il y a des chambres vides et que le formulaire s'affiche avec rien dedans c'est probabelemnt car la zone de défilement ne porte pas le bon nom de variable. Dans ton cas, il faut qu'elle se nomme TabNumChambre.

    Pour l'alerte :
    il vaudrait mieux écrire:

    CHERCHER([Patient];[Patient]Sortie=vrai) pas besoin de faire un tout sélectionner et il vaut mieux récupérer le Nbr de libre

    ' le fait de ne pas mettre 80, permet de ne pas revenir sur la méthode le jour ou l'on ajoute ou supprime des chanmbre

    Si (Enregistrements trouves([Patient])=0)' pas de chambre vide
    ALERTE("Toutes les Chambres de l'Etablissement sont occupées")
    Sinon
    ALERTE("Il faut Programmer"+Chaine(Enregistrements trouves([Patient]))+" Entrée(s) ")
    Fin de si

    Des petites précisions.
    la commande chercher s'execute sur l'ensemble des champs de la table. Donc pas la peine d'appelr la commande tout selectionner avant (Cela peut même être un élement de ralentissement si beuacoup de fiches).
    Si l'on mets un * à la fin de la commande chercher, c'est qu'il y a encore une commande de recherche qui Exemple
    chercher(matable;monchamp="toto";*)
    chercher(matable;& monchamp2="titi")
    si qu'une ligne : chercher(matable;monchamp="toto")

    Au lieu d'utiliser le si(avant), il vaudrait mieux utiliser le
    au cas ou
    evenement formulaire=sur chargement)


    fin de cas
    Cela permettra d'ajouter d'autres conditions sur d'autres evenements.

    L'utilité du bouton est de permettre à l'utilisateur de lancer la recherche et donc d'afficher les chambres vides à la demande. Par exemple, j'ai un client qui arrive, il veut une chambre. Je clique sur le bouton. Toutes occupées, désolé monsieur, nous sommes complet. Il en reste de libre, je peux lui en louer une.

    A +

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    Je tourne et retourne, impossible de m'en sortir.
    J'ai fait beaucoup d'améliorations, mais je n'arrive toujours pas à faire apparaître la ou les chambres libres.
    J'ai la version 4D 6.0.6
    La seule chose qui pourrait me sauver, c'est une ame charitable et comprehensive, avec un peu de temps libres pour m'écrire juste un petit bout de programme très simple, le minimum afin que je comprenne la logique. Ensuite j'appliquerai cette logique à mon développement.
    Je n'ose citer ici mon bienfaiteur MICHELS qui a déjà beaucoup participé.
    Enfin toute les bonnes volontés seront les bienvenues.
    Dans l'attente d'une bouée de sauvetage, cette fois je prends l'eau.
    Amicalement

  14. #14
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Oups, efectivement si tu as la version 6.0.x il est fort possible que ma méthode ne fonctionne pas. Je n'arrive pas à mettre la main sur une doc si ancienne (La plus ancienne que j'ai est la 6.5). Si quelqu'un a encore cette doc sous la main. Si tu as la doc, vérifie que la commande valeurs distinctes existait déjà et si oui, vérifie les parametres.

    A +

  15. #15
    Membre à l'essai
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 66

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Voila ce que j'ai sur l'aide de ma version 4D
    Dans l'attente de ton avis
    à+


    VALEURS DISTINCTES Commandes et sections pour Tableaux

    version 6.0 (Modifiée)

    _____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________


    VALEURS DISTINCTES (champ; tableau)


    Paramètre Type Description
    champ Champ | Sous-champ ® Champ ou sous-champ à utiliser
    tableau Tableau ¬ Tableau devant recevoir les données du
    champ indexé


    Description
    VALEURS DISTINCTES crée et remplit le tableau tableau avec toutes les valeurs distinctes provenant du champ champ pour la sélection courante de la table à laquelle le champ ou sous-champ appartient.

    Dans les versions précédentes de 4D, seuls les champs alphanumériques pouvaient être passés à cette commande. A partir de la version 6, vous pouvez passer tout type de champ ou de sous-champ indexé. Notez cependant que lorsqu'elle est appliquée à un champ booléen indexé, cette commande ne fait rien.

    Si vous passez un champ, VALEURS DISTINCTES analyse et extrait les valeurs distinctes pour les enregistrements sélectionnés uniquement. En revanche, si vous passez un sous-champ, VALEURS DISTINCTES examine tous les sous-enregistrements de chaque enregistrement sélectionné.

    Note : Si vous exécutez VALEURS DISTINCTES au sein d'une transaction, la commande ne prend pas en compte les enregistrements créés au cours de la transaction.

    Le tableau utilisé par VALEURS DISTINCTES doit être du même type que le champ ou sous-champ passé en premier paramètre, sinon le tableau est retypé. Il y a une exception à cette règle : si le champ est de type Heure, le tableau correspondant doit être de type Entier long.

    Après l'appel, la taille du tableau est égale au nombre de valeurs distinctes trouvées dans la sélection. La commande ne modifie pas la sélection courante ni l'enregistrement courant. Les éléments dans tableau sont triés par ordre croissant car VALEURS DISTINCTES utilise l'index du champ. Si cet ordre vous convient, vous n'avez donc pas besoin d'appeler TRIER TABLEAU après l'exécution de VALEURS DISTINCTES.


    ATTENTION : VALEURS DISTINCTES peut créer des tableaux de taille importante, en fonction de la taille de la sélection courante, ainsi que du type et de la taille des données à charger. Comme les tableaux résident en mémoire, il peut être utile de tester la taille des tableaux créés après l'exécution de la commande, ou d'utiliser une méthode projet d'interception d'erreurs installée par la commande APPELER SUR ERREUR.

    4D Server*: Cette commande est optimisée pour 4D Server. Le tableau est créé et les valeurs sont calculées sur le serveur. Seul le tableau est envoyé au client.

    Exemples
    (1) L'exemple suivant crée une liste de villes à partir de la sélection courante et indique à l'utilisateur le nombre de villes dans lesquelles la société dispose de magasins :


    TOUT SELECTIONNER([Revendeurs]) ` Créer une sélection d'enregistrements
    Þ VALEURS DISTINCTES([Revendeurs]Ville;taVilles)
    ALERTE("Cette société dispose de magasins dans " +Chaine(Taille tableau(taVilles))+" villes.")


    (2) L'exemple suivant retourne dans taMotsClés tous les mots-clés qui sont liés (à l'aide d'une sous-table) aux documents 4D Write stockés dans la table [Documentation] et dont le sujet est “Economie” :


    CHERCHER ([Documentation];[Documentation]Sujet="Economie")
    Þ VALEURS DISTINCTES([Documentation]MotsClés'Mot;taMotsClés)

    Une fois ce tableau construit, vous pouvez le réutiliser pour chercher rapidement les documents liés au mot-clé sélectionné en écrivant :


    CHERCHER ([Documentation];[Documentation]MotsClés'Mot=taMotsClés{taMotsClés})
    SELECTION VERS TABLEAU ([Documentation]Sujet;taSujets)
    ` ...

  16. #16
    Membre averti
    Homme Profil pro
    Bientôt retraité
    Inscrit en
    Juillet 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Bientôt retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 312
    Points : 385
    Points
    385
    Par défaut
    Donc, suivant la doc, il faut que:
    le champ contenant le numéro des chambres soit indexé.
    Lors du typage du tableau il faut que le type de celui-ci soit identique qque le type des champs. Donc, Si champs --> Entier - Tableau entier. Si champs --> Entier long - Tableau entier long.

    Si tu envisage de passer à une version plus récente, 2003 ou 2004, fais le, je pourrais t'aider un peu plus, mais là, je n'ai plus d'outils antérieurs.

    Désolé.

    A +

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

Discussions similaires

  1. rechercher des infos sur une page web
    Par Guenael2 dans le forum Langage
    Réponses: 6
    Dernier message: 08/12/2007, 18h32
  2. Réponses: 2
    Dernier message: 16/04/2007, 15h31
  3. Réponses: 0
    Dernier message: 30/03/2007, 12h50
  4. Réponses: 5
    Dernier message: 27/03/2006, 23h24

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