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

WinDev Discussion :

Remplir une table hiérarchique selon la langue


Sujet :

WinDev

  1. #1
    Membre à l'essai Avatar de lemagnifique20
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 64
    Points : 24
    Points
    24
    Par défaut Remplir une table hiérarchique selon la langue
    Salut la communauté,

    J'ai un petit soucis lors du remplissage d'une table hiérarchique par fichier dans mon projet multilingue.

    En fait, j'ai 2 fichiers en liaison (n-1) : continent et pays, qui contiennent les différents pays et continents.
    Dans chaque fichier, il y a une rubrique pour la dénomination en anglais et une rubrique pour la dénomination en français.

    J'aimerais ainsi que lorsque l'utilisateur lance l'application en l'une des deux langues, que la table hiérarchique charge la liste des continents et des pays en fonction de cette langue.

    Comment procéder pour le faire en remplissant la table par fichier ? J'ai fouillé en vain.

    Sinon quelqu'un aurait il un autre moyen afin d'arriver à ce même résultat ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 264
    Points
    5 264
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Une solution est donnée ici
    Une autre consiste à ajouter la langue dans la table (Il faut alors gérer la PK à la main (elle devient d'ailleurs Index) et créer une clé unique sur Intitulé+Langue (clé composée sous Windev))
    Reprenons l'exemple de frenchsting sur les légumes
    Table initiale : (PK_Légume,NDX_NomLégume,etcLegume)
    Table multilingue : (NDX_Légume,NDX_CodeNation,NDX_NomLégume,etcLegume)

    Exemple
    Table initiale
    PK_Légume NDX_NomLégume etcLegume
    1 Haricot etc
    5 Pomme de terre etc
    6 Carotte
    Table multilingue
    NDX_Légume NDX_CodeNation NDX_NomLégume etcLegume
    1 nationFrançais(valeur 5) Haricot etc
    1 nationAnglais(valeur 3) Bean etc
    5 nationFrançais Pomme de terre etc
    6 nationFrançais Carotte
    5 nationAnglais Potatoe etc
    6 nationAllemand(Valeur 1) Karotte
    6 nationAnglais Carrot
    1 nationAllemand Bohne usw
    5 nationAllemand Kartoffel usw
    Il suffit alors d'ajouter un
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE NDX_CodeNation = {pNation}
    pour récupérer la langue désirée.

    Je n'ai pas traité ton cas directement en exemple pour éviter la confusion CodeNation et CodePays (cf ISO3166) le code ISO est un candidat plus qu'acceptable à être PK et cela assurerait une portabilité ultérieure.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    En terme de programmation, la solution proposée par Voroltinquo est beaucoup plus légère que ton onrganisation, avec un libellé en Français et un autre en anglais sur la même ligne.

    Avec l'organisation que tu as actuellement (1 ligne, et 2 libellés dans les 2 langues), tu es obligé de mettre partout dans ton code : si langue=français alors ... sinon ...
    Et si par hasard, un jour, tu veux gérer une 3ème langue, tu devras faire plein de changements dans ton code.
    Ou tu peux utiliser des indirections, mais je me demande si ce n'est pas pire.

    La méthode de Voroltinquo est beaucoup plus standard.
    Et une autre option, en jouant avec les spécificités de Windev, c'est de jouer avec les répertoires.
    Tu crées un répertoire 'français' et un autre 'anglais', et en fonction de la langue, tu lis les données dans un répertoire ou l'autre. Donc une seule instruction au moment où l'utilisateur choisit sa langue, pour dire quel répertoire de données on veut lire.

    Pour la lecture des données, c'est très bien. Pour la préparation des données, c'est plus compliqué.

    Ca ne répond pas directement à ta question de table hiérarchique, mais à mon avis, c'est un sujet que tu dois traiter, avant de t'attaquer à ta table hiérarchique.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 264
    Points
    5 264
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    En terme de programmation, la solution proposée par Voroltinquo est beaucoup plus légère que ton onrganisation, avec un libellé en Français et un autre en anglais sur la même ligne.
    Elle a aussi l'avantage d'être quasiment invisible si la base existe déjà, il n'y a qu'une (2 avec la cc) rubrique à ajouter. Les liaison entre les tables restent les même, et il n'y a aucune liaison à ajouter.
    En ce qui concerne l'interface, il n'y a rien à modifier (éventuellement des boutons traduire.) Le champ Nom du légume reste lié à NDX_Nomlégume, pas de plan à gérer par langue.
    C'est aussi valable pour la table hiérarchique. Il suffit de la remplir via une requête sur codeNation, le Nom des rubriques liées ne change pas.

    Une autre solution dans ton cas est de ne rien traduire, mais d'utiliser des variable de type Pays et Continent puis la fonction NationFramework en fonction de la langue désirée. cela limite toutefois la traduction au français, à l'anglais et à l'espagnol.
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  5. #5
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 808
    Points : 5 264
    Points
    5 264
    Billets dans le blog
    1
    Par défaut
    Étudions le 2° cas. Cette solution peut être utilisée si Pays et Continent ne sont pas utilisés "ailleurs" i.e. il n'y a pas de relation dans le MLD sur Pays et sur Continent.
    Cette solution ne fonctionne qu'à partir de la version 25 de Windev

    1 Remarque préliminaires
    11-Limites de la solution
    Le résultat peut être lié à la version de Windev utilisée. En effet, s'il y a des changement de nom, de drapeau ou si de nouveau pays se créent entre 2 versions, le résultat peut être faussé. Toutefois ce genre de situation est très rare.
    12-Les variables de type Pays et de type Continent
    Ces type sont bien des variables (à priori composées) et non comme je l'ai cru au départ des structures ou des classes. Et, à priori, windev n'aime pas trop le data binding sur des tableau de variables composées.
    13-Format du drapeau
    La propriété Drapeau semble être rastérisée donc non gérée par le type image

    2 Préparation des variables
    On veut afficher dans une table hiérarchique la liste des pays ainsi que leur drapeau. Il faut bien une donnée supplémentaire à afficher, sinon, autant utiliser un arbre.
    Une solution serait de remplir la table par programmation. Toutefois, afin de ne pas trop ralentir l'affichage il est plus interessant d'utiliser le remplissage par variables.
    On peut indiféremment utiliser des tableaux de classes ou de structures. Toutefois, il est plus souple (à mon avis) d'utiliser les classes. En effet, si on doit modifier les données à gérer, il suffit de modifier la déclaration et le constructeur, sans avoir rien à modifier le reste du code.
    21- La classe CContinent
    211 Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CContinent est une Classe
    	m_saCode est une chaîne
    	m_saNomContinent est chaîne
    FIN
    212 Constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PROCÉDURE Constructeur(opContinent est un Continent=ContinentRécupère)
    :m_saCode=opContinent..Code
    :m_saNomContinent=opContinent..Nom
    22- La classe CPays
    221 Déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CPays est une Classe
    	m_saCodePays est chaîne
    	m_saNomPays est une chaîne
    	m_saCodeContinent	est chaîne
    	m_imDrapeau est Image
    FIN
    222 Constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCÉDURE Constructeur(opPays est Pays=PaysRécupère)
    :m_saCodePays=opPays..CodeISO2
    :m_saNomPays=opPays..Nom
    :m_saCodeContinent=opPays..Continent..Code                         //Relation Pays/Continent
    :m_imDrapeau=dChargeImage(opPays..Drapeau,imgConvertir) //La propriété Drapeau retourne un raster donc on est obligé de convertir
    Il nous reste à déclarer un tableau pour chaque classe. Ces tableaux devront être des variables globales. Avec au minimum une portée du niveau fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gtabContinent est tableau de CContinent
    gtabPays est tableau de CPays
    3- Initialisation des tableaux
    Rien de bien sorcier, on va en profiter pour gérer la traduction, c'est l'affaire d'une ligne (sans compter les message utilisateurs)
    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
    30
    31
    32
    33
    34
    35
    36
    PROCÉDURE InitTableaux(ocCodeNation est entier sans signe sur 1=nationFrançais,bTraduction est un booléen=Faux)
    oInitPays			est un Pays
    oInitContinent		est un Continent	//Achetez lui des couches
    clPaysTravail		est CPays
    clContinentTravail	est CContinent
    tabListeContinent	est tableau de Continents
    saMessageDébut		est une chaîne
    saMessageFin		est chaîne
    ocNationEnCours		est entier sans signe sur 1
     
    SI bTraduction ALORS
    	saMessageDébut	= "Traduction en cours"
    	saMessageFin	= "Traduction terminée"
    SINON
    	saMessageDébut	= "Chargement en cours"
    	saMessageFin	= "Fin du chargement"
    FIN
     
    TableauSupprimeTout(gtabContinent)
    TableauSupprimeTout(gtabPays)
     
    ocNationEnCours=NationFramework()	//On sauve la nation du projet
    NationFramework(ocCodeNation)	//C'est ici que se fait la traduction
     
    tabListeContinent=ContinentListe()
    ToastAffiche(saMessageDébut)
    POUR TOUT oInitContinent DE tabListeContinent
    	clContinentTravail=allouer un CContinent(oInitContinent)
    	TableauAjoute(gtabContinent,clContinentTravail)
    	POUR TOUT oInitPays DE PaysListe(oInitContinent)
    		clPaysTravail=allouer un CPays(oInitPays)
    		TableauAjoute(gtabPays,clPaysTravail)
    	FIN
    FIN
    ToastAffiche(saMessageFin)
    NationFramework(ocNationEnCours)	//On revient à la nation du projet
    3 L'interface
    Pour la sélection de la langue, j'ai choisi d'utiliser une combo, on aurait tout aussi bien pu utiliser des boutons radio ou tout autre moyen de sélection.
    31 La table
    Rien de bien sorcier. Tout se passe dans la partie contenu (pour la table et pour le drapeau)
    Nom : 2021-10-27_20h23_29.png
Affichages : 88
Taille : 32,8 Ko
    1-On choisit un remplissage par variable (1)
    2-On gère les sources (2) via Ajouter/Supprimer(3)
    3-On choisit les membres utilisés pour l'affichage et le parcours (4)
    4-On n'oublie pas de renseigner les membres utilisés pour la liaison entre Continent et Pays (5) en l'occurrence :m_saCode et :m_saCodeContinent

    32 La combo
    La encore rien de bien sorcier
    321 Initialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ListeAjoute(COMBO_Langue,"Français"+gLien(nationFrançais))
    ListeAjoute(COMBO_Langue,"English"+gLien(nationAnglais))
    ListeAjoute(COMBO_Langue,"Español"+gLien(nationEspagnol))
     
    MoiMême="5" //Français par défaut
    Attention de bien cocher la case "Utiliser la valeur renvoyée par gLien" dans la description
    322Sélection
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InitTableaux(Val(MoiMême))	//gLien renvoie une chaine et InitTableau attend un entier donc on transforme la chaine en entier
    TableAffiche(TABLEH_Pays)
    TableEnrouleTout(TABLEH_Pays)
    33 La fenêtre
    Fin d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    InitTableaux()
    TableAffiche(TABLEH_Pays)
    TableEnrouleTout(TABLEH_Pays)
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/08/2014, 07h48
  2. Selon réponse, remplir une table mais pas les autres
    Par laurent_42 dans le forum Modélisation
    Réponses: 4
    Dernier message: 06/03/2014, 08h12
  3. Remplir une table selon des pourcentages
    Par wassim_boy dans le forum Débuter
    Réponses: 15
    Dernier message: 05/01/2012, 15h46
  4. [SWT] Comment remplir une Table ?
    Par simon77 dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 23/08/2004, 10h31
  5. remplir une table avec UTL_FILE.GET_LINE
    Par delphim dans le forum SQL
    Réponses: 9
    Dernier message: 12/03/2004, 10h15

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