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 :

Faire communiquer des variables entre plusieurs process


Sujet :

4D

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut Faire communiquer des variables entre plusieurs process
    Bonjour,

    j'ai une méthode dans laquelle je verrouille une table [UBO] sur un enregistrement.

    Avant de stocker cet enregistrement j'ai besoin de savoir s'il n'existe pas dans cette table un autre enregistrement qui possède les mêmes champs [UBO]Nom et [UBO]Prenom.

    Pour cela j'ai écrit ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $process:=Numero du process courant
     $result:=Faux
     
     $proc:=Nouveau process("Test_UBO_Exist";128*1024;"Test si UBO existe";[UBO]Nom;[UBO]Prenom;$result;$process)
     
    SUSPENDRE PROCESS($process)
     
    // suite de ma méthode
    où j'aimerais que $result me retourne une valeur VRAI ou FAUX.

    La méthode Test_UBO_Exist effectue correctement la recherche et retourne dans $5 la valeur VRAI ou FAUX mais une fois que je reviens dans mon process. Voici le code de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    TOUT SELECTIONNER([UBO])
    CHERCHER([UBO];[UBO]Nom=$1)
    Si (Enregistrements trouves([UBO])>0)
      CHERCHER DANS SELECTION([UBO];[UBO]Nom_Jeune_Fille=$2)
      Si (Enregistrements trouves([UBO])>0)
        CHERCHER DANS SELECTION([UBO];[UBO]Prenoms=$3)
        Si (Enregistrements trouves([UBO])>0)
          $4:=Vrai
     
        Sinon 
          $4:=Faux
     
        Fin de si 
     
      Sinon 
      $4:=Faux
     
      Fin de si 
     
    Sinon 
      $4:=Faux
     
    Fin de si 
     
    REACTIVER PROCESS($5)
    Merci pour votre aide

    Ma version : 4D Serveur Win V12 64bits.

  2. #2
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    bonsoir,

    tu te compliques là vie pour tester si un enregistrement existe déjà.
    un "fixer destination recherche" serait plus simple...

    Mais pour répondre à ta question un variable globale s'écrit avec <>

    dans ta méthode d'appel tu pose ton drapeau :
    <>drapo:=-1
    tu lances ton process qui à un moment ou à un affectera 0 ou autre chose à <>drapo
    puis tu boucles dans ta méthode d'appel
    jusque <>drapo>-1) | (timeout)

    le timeout sert à ne pas boucler sans fin s'il y avait un problème...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par ZeFiF Voir le message
    bonsoir,

    tu te compliques là vie pour tester si un enregistrement existe déjà.
    un "fixer destination recherche" serait plus simple...

    Mais pour répondre à ta question un variable globale s'écrit avec <>

    dans ta méthode d'appel tu pose ton drapeau :
    <>drapo:=-1
    tu lances ton process qui à un moment ou à un affectera 0 ou autre chose à <>drapo
    puis tu boucles dans ta méthode d'appel
    jusque <>drapo>-1) | (timeout)

    le timeout sert à ne pas boucler sans fin s'il y avait un problème...

    P.S
    Merci pour ta réponse,

    si tu as un exemple avec ta solution je suis encore plus preneur
    si tu as le temps bien sur !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 8
    Points : 10
    Points
    10
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    $nom:=[UBO]Nom
    $Nom_Jeune_Fille:=[UBO]Nom_Jeune_Fille
    $Prenoms:=[UBO]Prenoms
     
    ` nous pouvons arrêter la recherche dès que nous avons trouvé au moins 1 enregistrement`
     
    FIXER LIMITE RECHERCHE(1)
    ` La recherche retournera le nombre d'enregistrements dans la variable $vlTrouvé `
    ` sans changer l'enregistrement courant ni la sélection courante`
     
    FIXER DESTINATION RECHERCHE(Vers variable ;$vlTrouvé)
     
    ` Construire la recherche `
     
    CHERCHER([UBO];[UBO]Nom=$nom)
    Si (Enregistrements trouves([UBO])>0)
    	CHERCHER DANS SELECTION([UBO];[UBO]Nom_Jeune_Fille=$Nom_Jeune_Fille)
    	Si (Enregistrements trouves([UBO])>0)
    		CHERCHER DANS SELECTION([UBO];[UBO]Prenoms=$Prenoms)
    	Fin de si 
    Fin de si
     
     ` Rétablir le mode standard de recherche`
    FIXER DESTINATION RECHERCHE(0)
    ` Enlever la limite sur la recherche`
    FIXER LIMITE RECHERCHE(0)
    `Traiter le résultat `
    Si ($vlTrouvé>0)
    	....

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    merci pour le bout de code

    Je vais tester ça ce WE et je te dirai si j'arrive

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut
    J'ai modifié ma méthode (en virant l'appel à un nouveau process) et je suis partit sur le bout de code fournit par zegilooo. J'obtiens effectivement le résultat escompté.

    Merci pour le coup de main :-)

    Par contre cela ne règle pas mon problème initial qui est d'appeler un nouveau process et récupérer de celui-ci la valeur d'une variable de retour.
    L'idée est que ma méthode d'appel boucle en permanence et que dans celle-ci j'appelle un nouveau process qui traite un certain nombre de données et me retourne un résultat et durant l'exécution de ce nouveau process ma boucle doit se mettre en pause.

    Voici dans les grandes lignes mon code actuel de la méthode d'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
     $process:=Numero du process courant
     $result:=Faux
     
     // je définis mes critères initiaux //
     $critere1:=valeur1
     $critere2:=valeur2
     
    $proc:=Nouveau process("Test_Values";128*1024;"Test sur valeurs";$critere1;$critere2;$process)
     // $critere1 et $critere2 sont passés en paramètre //
     // il faudrait que je puisse récupérer de ce process une variable appelée $result //
     
    $controle:=Vrai
    Tant que ($controle=Vrai)
     
     SUSPENDRE PROCESS($process)
     
     Si($result=Vrai)
      // je fais mes actions qui affectent les valeurs 1 et 2 //
     $critere1:=valeur1_modifiée
     $critere2:=valeur2_modifiée
     // je dois informer le process "Test sur valeurs" que $critere1 et $critere2 ont changé
     Sinon
      $controle:=Faux
     Fin de si
     
    Fin tant que
    et voici un exemple de méthode Test_Values appelée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     // la table [table1] est actualisée par des opérateurs de saisie sur lesquels je nai pas la maîtrise de leurs actions //
     TOUT SELECTIONNER [table1]
     CHERCHER ([table1];[table1]=$1;*)
     CHERCHER ([table1]; | ; [table1]=$2)
     Si(Enregistrements trouves ([table1])>0)
       $result:=vrai)
     Fin de si
     
     REACTIVER PROCESS($3)
    Mon problème est que je ne sais pas comment faire pour récupérer la valeur de la variable $result dans la méthode d'appel et aussi comment faire pour informé le process appelé que les critères ont changé.

    Merci pour votre aide

  7. #7
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    comme indiqué plus haut tu dois utiliser des variables globales, les variables locales sont connues uniquement par le process courant...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par ZeFiF Voir le message
    comme indiqué plus haut tu dois utiliser des variables globales, les variables locales sont connues uniquement par le process courant...
    Merci pour ta réponse, c'est ce que je pensais faire mais je voulais savoir s'il existait une méthode plus propre car une variable globale est commune à tous les utilisateurs et je voudrais éviter cela si c'est possible.

  9. #9
    Membre confirmé Avatar de ZeFiF
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 303
    Points : 486
    Points
    486
    Par défaut
    salut !

    relis la doc sur la portée des variables.
    les variables sont propres à chaque poste sauf si elles sont écritent sur le serveur...

    tu peux aussi passer par un enregistrement si tu le souhaites...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 103
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par ZeFiF Voir le message
    salut !

    relis la doc sur la portée des variables.
    les variables sont propres à chaque poste sauf si elles sont écritent sur le serveur...

    tu peux aussi passer par un enregistrement si tu le souhaites...
    Merci beaucoup pour ce retour aux bases, effectivement en relisant la doc sur les variables et les process j'ai trouvé mon bonheur

    Entre autre les commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LIRE VARIABLE PROCES
    ECRIRE VARIABLE PROCES
    VARIABLE VERS VARIABLE

Discussions similaires

  1. Faire communiquer des classes entre elles?
    Par aurelie689 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 02/05/2009, 11h46
  2. Partager des variables entre plusieurs actions ds un controlleur
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 11/10/2007, 09h38
  3. Faire des liens entre plusieurs table
    Par gibea00 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/01/2007, 18h01
  4. Partage de variables entre plusieurs pages
    Par bud_gw dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 27/12/2005, 15h42
  5. [Securité] Faire communiquer 2 serveurs entre eux
    Par Wookai dans le forum Hébergement
    Réponses: 2
    Dernier message: 10/08/2005, 00h13

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