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 :

HChangeRep non respecté en C/S


Sujet :

WinDev

  1. #41
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par xavier.ninane Voir le message
    Je suis (mal)heureusement arrivé à créer un projet ab initio qui permet de reproduire exactement le soucis que je rencontre.
    Cool ...

    Bon alors en 51t.
    Je confirme, en prenant l'exemple tel quel, ca merde.
    Pour être précis:
    - oui: 3 produits sont supprimé de ".\1\Compta\2015\Produit.FIC" et non pas dans ".\1\Compta\Produit.FIC" comme attendu.
    - oui HChangerep() retourne Vrai, oui Produit..Répertoire est le bon ensuite
    - oui, très bizzare: si on passe en pas à pas sur le code, tout va bien.
    - oui un changeconnexion permet de contourner le problème.
    - contrairement a vos indications, je ne tombes jamais sur le message "enregistrement supprimé", ni le STOP
    - J'ai systématiquement l'erreur de modification de donnés que vous indiqué, mais la valeur de ma modif est vide (normal vu que la ligne est commentée)

    Je pense cerner le problème:
    Un Hferme() ne change rien.
    En revanche, un HOuvre() ou un HCréationSiInexistant() après le HChangeRep() résout le problème.

    Le déroulement:
    1. Ouverture de la connexion
    2. chemin = ".\"
    3. HChangeRep(Produit, ".\1\Compta\")
    4. a priori ok, mais fichier pas utilisé
    5. HChangeRep(Produit, ".\1\Compta\2015\")
    6. Changement bien effectif (avec des contenus différents c'est plus simple a voir)
    7. HChangeRep(Produit, ".\1\Compta\")
    8. Windev dis que c'est bon, mais pas vraiment
      1. Si on fait rien, la suppression sera dans le 2015: pas bien
      2. si on lit d'abord une données: Youpi on est dans le bon fichier, la suppression ce fera on bon endroit!
    9. Par contre, vous effacer dans LigneFacture
    10. HChangeRep(LigneFacture, ".\1\Compta\")
    11. Windev dit que c'est bon, mais pas vraiment
    12. on fait comme pour Produits et c'est réglé ? Heu, et bien ca marche pas ... le changement ne ce fait pas ...




    Mon analyse est qu'il semble que PCSoft est oublié certains cas de réouverture automatique d'un fichier lors de son premier accès.
    De même qu'une simple case à cocher dans les propriétés du projet permet d'oublier la fonction HCréationSiInexistant()

    Au final, j'ai surcharger la fonction HChangeRep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PROCEDURE HChangeRep(sdNomFic est une Source de Données, sRep est une chaîne)
     
    SI WL.HChangeRep(sdNomFic, sRep) = Faux ALORS Erreur("Impossible de changer le rep: " + sdNomFic)
    // créer le fichier si besoin ET OUVRE le fichier // HOuvre fera le même effet
    SI HCréationSiInexistant(sdNomFic) = Faux ALORS Erreur("Impossible d'ouvrir: " + sdNomFic)
    Ainsi, l'(ré)ouverture du fichier est explicite et cela ne pose plus de problème.
    Le changementConnexion a le chemin = ".\" à l'ouverture de la connexion.


    HChangeRep() indique que tout ce passe bien, c'est le cas quand le fichier pointé au paravent n'existait pas ou n'as j'amais été ouvert/accéder.
    Ainsi, HChangeRep() peut ne pas avoir d'effet.

    Par ailleurs les exemples de HChangeRep() sous tous accompagné d'un HCréation() ou HCréationSiInexistant() ...
    Il a peu-être obligation implicite d’enchaîner ces deux fonctions.


    Bon aller, un pause maintenant

  2. #42
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par yoshi570 Voir le message
    Cool ...

    Bon alors en 51t.
    Je confirme, en prenant l'exemple tel quel, ca merde.
    Ouf : c'est bien une hérésie Windevienne

    Citation Envoyé par yoshi570 Voir le message
    - contrairement a vos indications, je ne tombes jamais sur le message "enregistrement supprimé", ni le STOP
    Le test ne lance pas le debug à la ligne 55 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SI Produit.IDProduit = 9 ALORS STOP
    Autrement dit, le comportement diffère entre chez vous et chez moi

    Citation Envoyé par yoshi570 Voir le message
    - J'ai systématiquement l'erreur de modification de donnés que vous indiqué, mais la valeur de ma modif est vide (normal vu que la ligne est commentée)
    Cela confirmerait que le comportement n'est pas reproduit à l'identique.


    Citation Envoyé par yoshi570 Voir le message
    Mon analyse est qu'il semble que PCSoft est oublié certains cas de réouverture automatique d'un fichier lors de son premier accès.
    Votre théorie est séduisante. Je vous avoue que je suis un peu fatigué et que je n'ai pas le recul pour l'analyser plus finement.
    Notamment en regard du fait que si la procédure stockée n'est pas utilisée (en lieu et place, on utilise une procédure propre au projet), tout se déroule correctement.
    Et cette apparition d'un "utilisateur fantôme" est tout de même intriguant...

    Citation Envoyé par yoshi570 Voir le message
    Par ailleurs les exemples de HChangeRep() sous tous accompagné d'un HCréation() ou HCréationSiInexistant() ...
    Il a peu-être obligation implicite d’enchaîner ces deux fonctions.
    Je pense pouvoir être catégorique en affirmant qu'il ne faut pas utiliser explicitement ces fonctions, en tout cas avec un HEnregistre, dans la mesure où j'utilise le HEnregistre à de nombreux endroits après avoir fait un HChangeRep et sans HCréation, et que jamais je n'ai noté d'erreur de pointage vers le fichier concerné.

    Je garde l'intuition que l'appel à une procédure stockée, laquelle utilise une connexion, fout le berzingue dans le cœur de HFSQL.

    En tout cas merci de votre contribution et d'avoir pris la peine de tester le projet !

  3. #43
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Effectivement, le projet en l'état ne peut fonctionner. Déjà, pas de Hferme avant la modification du répertoire, puis, pas de factorisation du changement de répertoire pour les fichiers...
    Mais le projet modifié fonctionne avec deux ou trois bricoles que j'ai ajouté. Je laisse le soin à Xavier de nous faire un retour sur la philosophie du projet modifié.
    Si tel n'était pas le cas, je vous posterais alors l'ensemble des modifications.
    Bon Dev!!!!!!
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  4. #44
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par EDM-TAHITI Voir le message
    Mais le projet modifié fonctionne avec deux ou trois bricoles que j'ai ajouté. Je laisse le soin à Xavier de nous faire un retour sur la philosophie du projet modifié.
    Bon Dev!!!!!!
    Bonjour Eric,

    Ta contribution est telle que je serais très mal venu de mettre un quelconque veto sur la publication de tes modifications.
    De prime abord, l'attaque qui est faite du schéma de données en arborescence est différente. En cela, je considère que c'est une contribution très intéressante.

    Je teste et triture ton code et reviendrai plus amplement plus tard.

    Bien à toi.

    X.

  5. #45
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello Xavier,
    Comme toujours, mes contributions restent à la discrétion des membres du forum. En effet, sur la problématique de départ, il se peut que des modifications interviennent.
    aussi, tu es le seul à pouvoir maitriser et apporter ici les solutions que tu juges opportunes.
    J'ai ajouté des fonctions qui sont commentées (et les traces qui listent les actions) afin que le projet soit en mesure dès l'installation, de réaliser l'ensemble des concepts de l'analyse sans qu'un informaticien doivent intervenir (gniarf, sale bête).
    WinDev a des fonctions très puissantes qui nous permettent de faire le plus simple possible (mais que c'est dure!)
    J'y ai mis un peu de mes concepts que j'espère simple, un peu de factorisation, un peu de calculs mais le fond reste le tien.
    Allez, nous attendons avec impatience ton retour.
    Un jour peut-être, je posterais certains concepts de WinDev qui nous permettent d'aller très vite (si, si).
    Bon dev!
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  6. #46
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut Suivi du projet d'Éric
    Bonjour à tous,

    Je remercie encore vivement Éric qui a consacré son temps et son savoir.

    Je me suis attaché à l'analyse du code de son projet. Il utilise les perso dossiers. Et j'avais un peu peur que ce soit cet aspect qui solutionne le problème : cette solution est difficile à mettre en place pour une partie de mon modèle de données.
    Mais ce n'est pas, semble-t-il, cet aspect qui résout le problème

    En effet, je découvre que le HChangeRep (factorisé) utilise en pratique un HcréationSiInexistant placé après le HChangeRep...
    (Pour la petite info, je factorise aussi mes HChangeRep, mais via une indirection. Pas fait dans ce cas-ci, car je devais aller à l'essentiel)

    Pour l'honnêteté intellectuelle et un grand merci également, cette analyse rejoint celle yoshi570 que je n'avais pas eu le temps d'analyser en profondeur (il était tard hier...)

    Je me pose la question (c'est ma 1e nature ) : pourquoi créer des fichiers qui... existent déjà ?
    La philosophie d'Éric est cependant emprunte de sagesse et d'une prudence de sioux : autant s'assurer que les fichiers soient ouverts, et tant qu'à faire créés.

    Hop, hop, j'ajoute 3 HCréationSiInexistant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HChangeRep(Facture,".\" + gnDossierEnCours + "\Compta\")
    HChangeRep(LigneFacture,".\" + gnDossierEnCours + "\Compta\")
    HChangeRep(Produit,".\" + gnDossierEnCours + "\Compta\")
    HCréationSiInexistant(Facture)
    HCréationSiInexistant(LigneFacture)
    HCréationSiInexistant(Produit)
    Et...

    Pour info : je n'ai pas fait précéder d'un HFerme. PCSoft indique dans la documentation que la fonction HChangeRep procède automatiquement à la fermeture des fichiers concernés.

    Je continue à réfléchir : outre créer le fichier, la fonction HCréationSiInexistant équivaut à la fonction Houvre (documentation PCSoft : "Si le fichier de données existe, ouvre le fichier de données.")
    Testons : Je remplace le HCréationSiInexistant par un Houvre.

    Et là :

    Moi y'en a pas comprendre, mais alors vraiment pas.

    Je pense qu'après avoir enquiquiné la communauté, je vais laisser ce Post en l'état : j'ai des solutions de contournement qui ne m'obligent pas de manipuler la connexion existante (et me ferait perdre tous les contextes liés à celle-ci !) :

    1/ passer par des requêtes SQL en dur de type DELETE, etc. (Merci Nico_tournai)
    2/ faire suivre ce HChangeRep du HCréationSiInexistant avec un mix de factorisation telle que proposée par EDM-TAHITI et yoshi570

    J'ai cependant l'intention de griller une de mes 15 cartouches auprès du ST car ce comportement est imprévisible, non documenté et pose quand même de sérieuses questions (le retour du ..répertoire, l'utilisateur "fantôme", le fait que ce problème ne se pose que lors d'un appel à une procédure stockée, etc.). Je pense qu'on doit raisonnablement considérer que c'est une sérieuse anomalie, voire un bug.

    Je ne mets donc pas ce post en résolu : je le ferai après le retour (ou pas ) de PCSoft !

    Belle journée à tous.

  7. #47
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    914
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 914
    Points : 1 496
    Points
    1 496
    Par défaut
    Bonjour.
    N'ayant pas la version 21 je ne suis pas intervenu avant.
    Je suis interrese par la possible solution car j'ai un cas semblable de comportement incomprehensible sur des repertoires mais en local sur serveur 2003.
    J'ai adopte une solution de contournement mais si la raison est semblable a votre probleme j'aimerai essayer de resoudre mon cas.
    Des que je peux je fais un projet d'essai mais en Wd15.
    Serait-il possible avoir une version de la solution en Wd15 ?
    Merci.

  8. #48
    Membre chevronné Avatar de EDM-TAHITI
    Homme Profil pro
    Directeur Service informatique et projet développement
    Inscrit en
    Janvier 2010
    Messages
    994
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Directeur Service informatique et projet développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2010
    Messages : 994
    Points : 1 995
    Points
    1 995
    Par défaut
    Hello,
    Citation Envoyé par xavier.ninane Voir le message
    Je continue à réfléchir : outre créer le fichier, la fonction HCréationSiInexistant équivaut à la fonction Houvre (documentation PCSoft : "Si le fichier de données existe, ouvre le fichier de données.")
    Testons : Je remplace le HCréationSiInexistant par un Houvre.

    Et là :

    Moi y'en a pas comprendre, mais alors vraiment pas.
    Le Houvre se comporte très différemment sur un point : il ne prend pas en compte la propriété ..repertoire du fichier alors que hcreationsiinexistant SI!
    Et donc, comment ouvrir un fichier dont on ne connait pas l'emplacement, hein?
    Voilà, on est bien chez PCSoft....
    Allez, bon dev!
    le savoir est dans les livres, 'the magic touch F1'
    Amicalement
    Eric

  9. #49
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par EDM-TAHITI Voir le message
    Le Houvre se comporte très différemment sur un point : il ne prend pas en compte la propriété ..repertoire du fichier alors que hcreationsiinexistant SI!
    Et donc, comment ouvrir un fichier dont on ne connait pas l'emplacement, hein?
    Voilà, on est bien chez PCSoft....
    J'avoue que c'est... déroutant !

    Je me demande combien ont développé 10 fois moins vite à cause de ce type d'incohérence ?

    Bonne continuation.

  10. #50
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par Yusep Voir le message
    Des que je peux je fais un projet d'essai mais en Wd15.
    Serait-il possible avoir une version de la solution en Wd15 ?
    Merci.
    Je ne pourrai malheureusement pas vous aider : je n'ai WD que depuis la V19 et je n'ai pas de serveur 2003 (pour tester)
    Désolé.

  11. #51
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par EDM-TAHITI Voir le message
    Le Houvre se comporte très différemment sur un point : il ne prend pas en compte la propriété ..repertoire du fichier alors que hcreationsiinexistant SI!
    Et donc, comment ouvrir un fichier dont on ne connait pas l'emplacement, hein?
    Bonjour,

    Sur quoi vous basez-vous pour dire ça?
    Chez moi, houvre marche aussi bien que hcreationsiinexistant dans le cas de ce sujet.

    Comme je disais a xavier en mp, l'appel a la procédure stockée fait le premier accès au fichier Produit et donc génère une connexion/ouverture sur ce fichier marqué en tant que application, visible dans le centre de controle.
    Cela est très étrange car si l’exécution ce fait sur le serveur, pourquoi une connexion est-elle générer par l'application ?
    Et c'est cette connexion fantôme qui continue a être utilisés par les fonctions H tant que un hcreationsiinexistant n'est pas exécuter après le Hchangerep pour vraiment le prendre en compte.

    Pour preuve, si on fait un HOuvre("*") avant l'appel de la PS, le code fonctionne parfaitement, car la connexion est réellement ouverte par l'application, par conséquence Hchangerep fait bien sont travail.
    On a donc bien un fonctionnement "bizzare" du a la PS qui manipule des fichiers qui n'était pas encore ouvert directement par le programme.

  12. #52
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 117
    Points : 90
    Points
    90
    Par défaut Tout en nuance et en complexité
    Citation Envoyé par yoshi570 Voir le message
    Bonjour,

    Sur quoi vous basez-vous pour dire ça?
    Chez moi, houvre marche aussi bien que hcreationsiinexistant dans le cas de ce sujet.

    Comme je disais a xavier en mp, l'appel a la procédure stockée fait le premier accès au fichier Produit et donc génère une connexion/ouverture sur ce fichier marqué en tant que application, visible dans le centre de controle.
    Cela est très étrange car si l’exécution ce fait sur le serveur, pourquoi une connexion est-elle générer par l'application ?
    Et c'est cette connexion fantôme qui continue a être utilisés par les fonctions H tant que un hcreationsiinexistant n'est pas exécuter après le Hchangerep pour vraiment le prendre en compte.

    Pour preuve, si on fait un HOuvre("*") avant l'appel de la PS, le code fonctionne parfaitement, car la connexion est réellement ouverte par l'application, par conséquence Hchangerep fait bien sont travail.
    On a donc bien un fonctionnement "bizzare" du a la PS qui manipule des fichiers qui n'était pas encore ouvert directement par le programme.
    Compte tenu de l'implication de certains, j'ai pris le parti de tester l'ensemble des proposition et hypothèses.

    Et le comportement est vraiment "tordu" car chez moi voici ce qui se produit :
    1/ Si le HOuvre est placé tout en amont, avant l'appel de la procédure stockée, ce HOuvre suffit ;
    2/ Si le HOuvre est placé après l'appel à la procédure stockée, il ne permet pas de contourner l'incident. Seul le HCréationSiInexistant opère alors le contournement.

    Bref

    Je rappelle, à toutes fins utiles, que ces problème n'existent qu'avec un appel à une procédure stockée.
    Si le code de la procédure stockée est rapatrié dans le traitement, nus besoin de HOuvre ou HCréeSiInexistant...

    Quant à la connexion que j'ai dans le centre de contrôle, je n'en ai qu'une, celle déclarée à l'initialisation du projet.

  13. #53
    Membre actif
    Homme Profil pro
    Ingé Indus
    Inscrit en
    Juillet 2014
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingé Indus
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 107
    Points : 241
    Points
    241
    Par défaut
    Citation Envoyé par xavier.ninane Voir le message
    Quant à la connexion que j'ai dans le centre de contrôle, je n'en ai qu'une, celle déclarée à l'initialisation du projet.
    Oui, je n'ais pas précisé et ce n'est pas forcement très visible, mais dans le Centre de Controle il y a un onglet (vertical) "Connexions" pour tout les éléments
    Ainsi il est possible de voir toutes les connexions sur le serveur, toutes celles d'une base de données et cela, jusqu'au fichier.

    Vous pouvez alors observer au moment de l'erreur de modification, qu'il existe une connexion sur les fichiers "Compta" ET "Compta\2015"
    Et avec le Houvre bien placé ou HCréationSiInexistant, vous verrez que a la fin du traitement il y a un connexion seulement sur les fichiers "Compta"

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