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 :

Principe de Htransaction()


Sujet :

WinDev

  1. #1
    Membre émérite
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Par défaut Principe de Htransaction()
    Bonjour à tous!

    je souhaiterai avoir quelques précisions sur le principe d'utilisation des transactions.

    Imaginons 2 fenetres FEN_A et FEN_B

    Sur le bouton de Validation de la fenetre FEN_A j'utilise une transaction :


    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
    HTransactionDébut(gsRepExe+"Transaction.trs")
    HLitRecherchePremier(FichierA,IDFichierA,VariableA)
    SI HTrouve(FichierA) ALORS
        // affectation ....
        // ...
        HModifie(FichierA)
        SI ErreurDétectée ALORS
            HTransactionAnnule()
            Erreur("Le fichier A n'a pas été mis à jour!",HErreurInfo())
            RETOUR    
        FIN
    FIN
    
    HLitRecherchePremier(FichierB,IDFichierB,variableB)
    SI HTrouve(FichierB) ALORS
        // affectation ....
        // ...
        HModifie(FichierB)
        SI ErreurDétectée ALORS
            HTransactionAnnule()
            Erreur("Le fichier B n'a pas été mis à jour!",HErreurInfo())
            RETOUR    
        FIN
    FIN
    
    ouvre(FEN_B)
    
    Htransactionfin()
    Ensuite au niveau de la fenêtre FEN_B, j'ai encore la même transaction que je débute, des modif sur des fichiers C et D et même A ou B et si tout s'y passe bien j'y fais également un Htransactionfin()

    Ma question est la suivante :

    Si dans la fenêtre FEN_B la transaction est annulée, cela suffit -il pour annuler celle de la FEN_A (vu que c'est la même transaction?)

    Merci d'avance pour l'aide

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Commencez par lire l'aide des fonctions HTransactionXXX.

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Bonjour,
    Pour moi si c'est la même transaction, peu importe où se trouve le hTransactionAnnule(), toute la transaction est annulée.
    Celà étant dit, j'ai pour principe de n'avoir aucune action sur l'interface utilisateur dans une transaction:
    Je début une transaction
    Je lance les mises à jour
    Je valide/annule la transaction
    ENSUITE seulement j'interagis avec l'utilisateur.

    Le but est de rendre la transaction la plus courte possible, pour éviter les conflits de verrouiillage.

    Tatayo.

  4. #4
    Membre émérite
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Par défaut
    @Tatayo
    Merci pour ces précisions!

    @Vmolines
    J'avais déjà regardé l'aide mais cette phrase m'a découragé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Il est impossible d'imbriquer les transactions (c'est-à-dire d'appeler la fonction HTransactionDébut dans une transaction). Dans ce cas, l'erreur 70031 est générée.

    Et j'ai absolument besoin d'en imbriquer dans le cas suivant.
    J'ai un BL déjà enregistré, je clique droit sur le BL puis "annuler et remplacer le BL" permet d'effectuer l'action suivante :

    1- Débute Transaction
    2- Récupération des infos du BL et de Lignes_BL
    3- Ouverture fenetre Nouveau BL avec toutes les infos pour Modifications
    4- Validation Nouveau BL
    5- Débute Transaction pour cette validation (Et la problème car une transaction est déjà en cours- et si je mets un htransactionfin avant, cela fonctionne mais en cas de problème dans la validation du nouveau BL les opérations précédant le nouveau BL sont validées)
    6- Si validation OK - Terminer la transaction
    7- Modifier Le BL d'origine avec la mention annulé
    8- Si tout est ok Terminer la transaction

    Je ne sais pas si ces explications sont claires

    erci d'avance pour le temps que vous prenez

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    C'était exactement la ligne de l'aide qu'il fallait repérer .

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Tout à fait d'accord avec vmonlines. Je n'avais pas percuté sur le fait que tu voulais ouvrir une deuxième transaction dans la fenêtre.
    Je changerai ton code ainsi:
    1- Récupération des infos du BL et de Lignes_BL
    2- Ouverture fenetre Nouveau BL avec toutes les infos pour Modifications
    3- Début de la transaction
    4- Validation Nouveau BL
    5- Modifier Le BL d'origine avec la mention annulé
    6- Si tout est ok Terminer la transaction

    Pour moi la modification des DEUX documents doit être atomique.

    Tatayo.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 140
    Par défaut
    bonjour

    je me greffe à la discution car elle m'interpelle aussi.

    sur une fenetre (sans rad), j'ai des champs provenant de plusieurs fichiers différents.
    ex:
    fournisseur,
    adresse,
    contact,


    si je modifie le fournisseur et adresse et contact...

    comment gérer vous les transactions?
    là je coince.

  8. #8
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Si l'ensemble de ces modifications doivent être atomiques:
    1. J'ouvre une transaction
    2. Je lance les modifications
    3. Je valide/annule la transaction

    Tatayo.

  9. #9
    Membre émérite
    Inscrit en
    Avril 2008
    Messages
    1 129
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 1 129
    Par défaut
    Salut Tatayo,

    C'est un ordre qui ne m'arrange pas beaucoup

    Pour la simple raison, qu'avant l'ouverture du nouveau BL, il y a eu une modif du Stock dû au retour des lignes_bl du BL annulé.
    Je risque de me voir refuser la validation du BL à cause "d'insuffisance en stock"!

    Par contre, est-il possible de créer et gérer 2 "fichiers" de transactions différentes?

    Du genre :

    HTransactionDébut(gsRepExe+"Transaction_AnnuleBL.trs")

    et

    HTransactionDébut(gsRepExe+"Transaction_ValideBL.trs")

    Peut-on imbriquer deux transactions différentes?

    Merci d'avance

  10. #10
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 371
    Par défaut
    Citation Envoyé par zouzoukha Voir le message
    C'est un ordre qui ne m'arrange pas beaucoup

    Pour la simple raison, qu'avant l'ouverture du nouveau BL, il y a eu une modif du Stock dû au retour des lignes_bl du BL annulé.
    Je risque de me voir refuser la validation du BL à cause "d'insuffisance en stock"!
    Là, il y a quelquechose que je ne comprends pas:
    Le fait d'annuler un BL doit normalement faire ENTRER des produits en stock, non ? Qui plus est, le fait de tout faire dans une transaction ne change pas grand chose à ce niveau.

    Citation Envoyé par zouzoukha Voir le message
    Par contre, est-il possible de créer et gérer 2 "fichiers" de transactions différentes?

    Du genre :

    HTransactionDébut(gsRepExe+"Transaction_AnnuleBL.trs")

    et

    HTransactionDébut(gsRepExe+"Transaction_ValideBL.trs")
    Aucune idée, je n'utilise pas les ordres h*, mais:

    Citation Envoyé par zouzoukha Voir le message
    Peut-on imbriquer deux transactions différentes?

    Merci d'avance
    L'aide en ligne dit clairement que ce n'est pas possible, donc je dirai non.

    Je ne vois que deux possibilités:
    1. Soit l'annulation du BL et la création de sont remplaçant est atomique, et tout doit être dans une transaction
    2. Soit les deux sont "indépendant", dans le sens ou la "non mise à jour" de l'un n'influe pas sur l'autre, et il te faut deux transactions distinctes, non imbriquées

    Mais je penche pour la première solution.

    Tatayo.

  11. #11
    Membre chevronné
    Développeur informatique
    Inscrit en
    Avril 2010
    Messages
    256
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2010
    Messages : 256
    Par défaut
    Bonjour,

    J'ai le même problème entre 2 applis Windev.
    L'appli 1 contrôle le BL (qté manquantes, etc..)
    elle passe la main à l'appli2 qui fait le colisage (poids, étiquettes, etc...)
    puis repasse la main à l'appli1 qui édite le Bl, met à jour le stock...

    Le problème est que l'appli2 a besoin d'avoir connaissance des
    eventuelles modifs faites dans les fichiers par l'appli1.
    Au retour, l'appli1 a besoin des modifs effectuées dans les fichiers
    par l'appli2.

    L'appli1 est obligée de valider la transaction, sinon les enregs sont
    toujours vérrouillés et ne seront pas disponibles pour l'appli2,
    idem pour l'appli2.

    Le fait d'avoir une transaction de chaque côté ne résoud rien
    (le même problème se produirait si votre fenêtre s'ouvrait dans un contexte
    différent: On pourrait débuter une nouvelle transaction mais
    les enregs resteraient vérrouillés si la 1ere transaction n'est pas terminée)

    Pour l'instant je ne vois qu'une solution:
    - Copier les enregs à modifier dans des fichiers temporaires
    (si dans la même appli, on peut aussi travailler en mémoire (table mémoire par ex.)
    - Modifier les fichiers temp de chaque côté (ou les tables mémoire)
    - Ouvrir une transaction
    - Modifier les enreg dans la vraie base (BL, stock, mouvements, etc...)
    - Valider/annuler la transaction
    - Vider les fichiers temporaires

    Qu'en pensez-vous ?

  12. #12
    Membre Expert Avatar de klbsjpolp
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 065
    Par défaut
    Citation Envoyé par SevenSoftware Voir le message
    Qu'en pensez-vous ?
    Il y a plein de solutions pour passer les données d'une application à une autre (comme d'une fenêtre à une autre). La zone mémoire partagée, un fichier sur disque, les sockets, les fichiers de bd...
    Si tu veux utiliser un fichier de base de donnée, tu peux utiliser HDéclare ou HDécritFichier afin de créer dynamiquement ton fichier de données pour le supprimer ensuite.

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  2. [HARDWARE] Principe de fonctionnement d'un touchpad
    Par Cyspak dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 26/12/2003, 01h47
  3. barre de menu principal
    Par norfelt dans le forum IHM
    Réponses: 10
    Dernier message: 27/10/2003, 11h37
  4. projet suivant le principe de MSN
    Par Walm dans le forum Développement
    Réponses: 2
    Dernier message: 30/09/2003, 12h36
  5. Directive, principe delphi
    Par Arrown dans le forum Débuter
    Réponses: 3
    Dernier message: 09/09/2003, 18h32

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