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 :

[Windev 11] Manipulation dynamique de LiaisonFichier


Sujet :

WinDev

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut [Windev 11] Manipulation dynamique de LiaisonFichier
    Bonjour,

    Je cherche à manipuler dynamiquement les liaisons d'une table.
    Je veux en fait créer une fenêtre qui soit capable de gérer plusieurs tables ayant la même structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    gsTableEnCours = "Fction"
    TABLE_Param..FichierParcouru = gsTableEnCours
    TABLE_Param.COL_ID..LiaisonFichier = Fction.Fction_ID
    TABLE_Param.COL_Valide..LiaisonFichier = Fction.Fction_Valide
    TABLE_Param.COL_Code..LiaisonFichier = Fction.Fction_Code
    TABLE_Param.COL_Lib..LiaisonFichier = Fction.Fction_Lib
    HFiltre(gsTableEnCours,gsTableEnCours+"_ID",0,999999999,gsTableEnCours+"_Valide  <= 2")
    TableAffiche(MoiMême)
    Ceci est mon code pour l'instant, mais je ne comprends pas ce qui cloche.
    La table affiche des #### une fois ce code éxecuté.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Ce ne serait pas plus simple d'utiliser les plans ?

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Pas glop les plans!
    Je voudrais une fenêtre qui sache gérer plusieurs fichiers (les fichiers de paramêtres en fait, et ils sont assez nombreux)
    Tous mes fichiers de paramêtres ont la même structure:
    <NomFichier>_ID
    <NomFichier>_Valide
    <NomFichier>_Code
    <NomFichier>_Lib
    Ces fichiers sont indépendant les uns des autres.
    Le but est que je passe le <NomFichier> à ma fenêtre, et qu'elle gère le fichier completement.

    C'est pourquoi je dis: pas glop les plans. Dans le cas extreme où je ne pourrais pas du tout gérer plusieurs fichiers dans une même fenêtre, je ferais plusieurs fenêtres.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Ok
    Ça ne devrait pas poser de problème, mais il ne faut évidemment pas une table liée.
    Parmi les solutions possibles, un requête avec le nom de fichier en paramètre de la requête.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    C'est ce que j'ai fait au début, et puis je me suis dit
    Citation Envoyé par Moimême
    Mais pourquoi ne pas utiliser les tables liées
    Puisque en fait toutes les fonctionnalités sont déjà prêtes.
    J'ai donc créé une table, liée à ma table Fction
    Pour l'instant je change ma table dans le code, mais je remets bien la même chose qu'avant (en gros, pour les premiers tests je ré-écris Fction)
    J'ai commencé à le faire par le code, et je pense que ça va être bcp plus long.
    Par contre, si tu as une explication sur "pourquoi ça ne fonctionne pas avec les liaisons?" je suis preneur.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    En fait, le code pour remplir la liste est prêt, mais je ne vois pas bien comment faire pour la mise à jour des données:
    Ma table ne sert qu'en affichage, en haut de la fenêtre, et j'ai le détail en bas.
    Pour l'instant je remplis ma table comme ceci:
    Code déclarations globales de la fenêtre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GLOBALE
    	gsTableEnCours est une chaîne 	//nom de la table que l'on est en train de traiter
    Code Initialisation de la fenêtre : 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
    sSQL est une chaîne
    sdQuery est une Source de Données
     
    gsTableEnCours = "Fction"
     
    sSQL = [
    	select %1_ID as ID,
    	%1_Valide as Valide,
    	%1_Code as Code,
    	%1_Lib as Lib
    	from %1
    	where %1_Valide in (1, 2)
    	order by 1 desc
    ]
    sSQL = ChaîneConstruit(sSQL,gsTableEnCours)
     
    HExécuteRequêteSQL(sdQuery,sSQL)
     
    HLitPremier()
    TANTQUE PAS HEnDehors()
    	TableInsèreLigne(TABLE_Param,1,sdQuery.ID,sdQuery.Valide,sdQuery.Code,sdQuery.Lib)
    	HLitSuivant()
    FIN
    Code Sélection d'une ligne de TABLE_Param : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    COMBO_Validite..Valeur = COL_Valide
    SAI_Code..Valeur = TABLE_Param.COL_Code
    SAI_Libellé..Valeur = TABLE_Param.COL_Libellé
    Par contre, le code que je ne trouve pas, étant donné que les champs ne sont plus liés aux données, c'est celui qui peut remplacer celui-çi:
    Code Sortie de SAI_Libellé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fction.Fction_Lib = MoiMême
    HModifie(Fction)
    TableAffiche(TABLE_Param,taCourantBandeau)

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    Citation Envoyé par Bowen Voir le message
    je ne vois pas bien comment faire pour la mise à jour des données
    Est-ce bien nécessaire ?
    Non, j'rigole

    Effectivement, ça va poser problème puisque la Table n'est pas liée au fichier.

  8. #8
    Membre averti Avatar de Le Shadow
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 265
    Points : 305
    Points
    305
    Par défaut
    Sers-toi du 'Update' en sql

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    C'est une bonne idée le update sql, il ne me manque que le caractère d'échappement pour les apostrophes.
    J'ai testé en les doublant mais ça ne donne rien, j'ai testé avec des fonctions comme car() ou caract mais ça ne semble pas marcher non plus.
    et la recherche de échapement dans l'aide ne donne rien non plus...

    Une idée?

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    apostrophe ou guillemet ?
    caract(34) = "
    caract(39) = '

    [Édit] posté trop vite
    c'est quoi ta chaîne ?

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Comme la procédure n'est pas trop longue, je te la mets en entier:
    Code de la procédure stockée : 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
    PROCEDURE stoMAJ_Param(sNomTable est une chaîne, xID est un numérique, xValide est un numérique, sCode est une chaîne, sLib est une chaîne)
    LOCAL
    	sSQL est une chaîne
    	sdQuery est une Source de Données
     
    sLib = Replace(sLib,"'","'+ Caract(39) +'")
     
    sSQL = [
    Update %1 set
    %1_Valide = %3,
    %1_Code = '%4',
    %1_Lib = '%5'
    where  %1_ID = %2
    ]
    sSQL = ChaîneConstruit(sSQL,sNomTable, xID, xValide, sCode, sLib)
    RENVOYER HExécuteRequêteSQL(sdQuery,sSQL) + sSQL //+ sSQL est là pour le débogage
    Comme tu le vois, la chaine sLib est suceptible de recevoir des guillemets. Par contre, le code n'est pas éxecuté en sql.
    J'ai testé avec car(39) et caract(39)
    La seule mise à jour qui fonctionne c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sLib = Replace(sLib,"'","''")
    Mais ça me positionne deux cotes au lieu d'une.

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Bon, je crois que je le tiens: c'est \'
    (comme en javascript en fait)

    Par contre, ça me donne un nouveau problème du coup: il est impossible de taper la séquence suivante dans une chaine: \'
    Si quelqu'un sait où trouver la doc sur les caractères d'échappement hyperfile je suis preneur...

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    19 647
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 19 647
    Points : 32 889
    Points
    32 889
    Par défaut
    \' = caract(92)+caract(39) ça ne fonctionne pas ?

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Non, c'est ce code là qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sLib = Replace(sLib,"'","\'")
    Il fait le remplacement du échap. Par contre le sql refuse la fonction caract(), et même la fonction car().

  15. #15
    Membre averti Avatar de Le Shadow
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 265
    Points : 305
    Points
    305
    Par défaut
    en fait, la fonction caract() ne devrait pas se trouver dans ton instruction, mais devrait plutot servir a la construire

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cond est une chaine
     
    cond = "update ..... set ..... "+caract(xx)+Carcat(xx)+" ....."
     
    hexecuterequetesql(req1,cond)

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Impossible:
    ta solution me donnerait le résultat suivant:
    update Fction
    set Fction_Lib = 'mon nou'veau Lib'
    (en admettant que je veuilles mettre un ' au milieu du mot nouveau)
    ça couperait la chaine sql au milieu, et ça donnerait une instruction sql non valide.
    ma solution donne:
    set Fction_Lib = 'mon nou\'veau Lib'
    La chaine n'est pas coupée, et une fois en base elle devient:
    'mon nou'veau Lib'
    Par contre, je n'ai pas le moyen d'entrer ceci en base:
    'mon nou\'veau Lib'

  17. #17
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Bon, je commence à désespérer.
    J'ai beau chercher dans les forums pcsoft, dans l'aide, dans les forums sql de developpez.com, rien n'y fait.
    Es-ce que hyperfile n'aurait pas de vraie gestion des caractères d'échappement?
    J'ai beau retourner les combinaisons de \ et ' dans tous les sens, en les doublant ou les mettant une seule fois, je n'arrive à obtenir:
    bouteille d\\'eau
    bouteille d\''eau
    bouteille d\\''eau

  18. #18
    Membre averti Avatar de Le Shadow
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    265
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 265
    Points : 305
    Points
    305
    Par défaut
    Tu veux sauvegarder bouteille d\'eau dans ton fichier ?

    Serait-tu mieux a ce moment d'utiliser les opérateurs {}.. pour ton nom et ta rubrique de fichier ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {nomFichier+".Description"} = "Bouteille d\'eau"
     
    hmodifie(nomfichier)

  19. #19
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    C'est une idée à creuser, mais je n'ai pas l'habitude de cette syntaxe pour l'instant.
    Par contre, promis je testerai.
    En attendant, j'ai trouvé une solution: j'utilise la fonction HExécuteRequêteSQL avec le paramètre hModifieFichier
    Code de la procédure stockée : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE stoUPD_Param(sNomTable est une chaîne, xID est un numérique, xValide est un numérique, sCode est une chaîne, sLib est une chaîne)
    LOCAL
    	sSQL est une chaîne
    	sdQuery est une Source de Données
     
    sSQL = "select %1_Valide as valide, %1_Code as Code, %1_Lib as Lib from %1 where %1_ID = %2"
    sSQL = ChaîneConstruit(sSQL,sNomTable, xID)
     
    HExécuteRequêteSQL(sdQuery,hModifieFichier,sSQL)
    HLitPremier(sdQuery)
    sdQuery.Valide = xValide
    sdQuery.Code = sCode
    sdQuery.Lib = sLib
    RENVOYER HModifie(sdQuery)
    En tous cas, merci beaucoup à tous ceux qui ont pris le temps de se pencher sur mon problème.

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

Discussions similaires

  1. Manipulation dynamique de contrôles
    Par BlackAlpha dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/12/2013, 14h21
  2. Réponses: 5
    Dernier message: 15/03/2011, 10h23
  3. Réponses: 2
    Dernier message: 02/06/2009, 17h27
  4. Réponses: 2
    Dernier message: 17/01/2008, 11h47
  5. Réponses: 3
    Dernier message: 05/01/2007, 11h49

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