Sales Return Import/Export Template

SUGGESTED

Does Sage X3 has import/export template for Sales Return. Since we have integration to third party Sales application, this is becoming a challenge on the Sales Return front. Currently its integrated directly using Web services. System is having performance issues on a regular front. Please advise.

  • 0

    I am having a similar requirement.  I ended up using the sales return as a web service, but there is a pop-up for LOT information if it's lot controlled, and that causes the web service to fail.  

  • 0 in reply to Denise Hartman

    This is currently a big concern, when transactions are high. Record locking is a regular issue, not other options.

  • 0
    SUGGESTED

    Hello,

    Disclaimer: Development knowledge is necessary. This is mainly to serve as a template/basis and may have some issues on your system depending on customizations/version. Please use a test/dev environment and test these types of templates for all possible cenarios to insure everything works properly.

    I had same problem and, like Denise, I tried WS but in batch mode it was not working...

    So I adapted the special import source for purchase returns (IMPPTHS in X3 folder) into YIMPSRHS. 

    In my case, I only need to return customer deliveries so I started by simulating picking in special import and then had a debugging battle with X3 until it worked.

    Steps I did / Notes:
    -Changed classes/masks to sales return context (PTH -> SRH, etc...)
    -Changed transaction to sales transaction (SLT)
    -Changed global variables for sales return context / stock type
    -Remove most of unneeded tables abreviations
    -Simulate picking for delivery line ($SEL1 @ SUBSRHC). Since standard may change [F:SRD] content when checking for previous returns, I am using an extra abreviation/class to store original information being imported into [F:YSRDIMP] @ $AP_IMPORT and after simulating picking, I restore the context ([F:SRD] = [F:YSRDIMP])
    -When a return is created, it gets populated in a global variable [V]GYNEW_SRHNUM, since in my case I am using IMPORTSIL and need to know which return was created for logging and other purposes.
    -I only need lot information at the moment (no SERNUM or CCE fields tested)

    Template:




    Code:

    $ACTION
    If dim(GSTK_TRACE)>0 & GSTK_TRACE=2 & [L]ACTION<>"IMP_ZONE" & [L]ACTION<>"EXP_ZONE"
      GSTK_ACT=[L]ACTION : GSTK_PGM="YIMPSRHS" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    Case [L]ACTION
      When "IMP_AVANT_OUVRE"
        If dim(GYNEW_SRHNUM)>0 : Kill GYNEW_SRHNUM : Endif
        If clalev([F:YSRDIMP])=0 : Local File SRETURND [F:YSRDIMP] : Endif
        #If !clalev([F:CFL])  Local File CPTFOOTLNK [fCFL] : Endif
      When "IMP_COMPILE"   : Gosub IMP_COMPILE
      When "IMP_TRTSUP"    : Gosub IMP_TRTSUP
      When "IMP_ZONE"      : Gosub IMP_ZONE
      When "AP_IMPORT"     : Gosub AP_IMPORT
      When "IMP_FERME"     : Gosub IMP_FERME
      #-----
    #  When "EXP_OUVRE"     : Gosub EXP_OUVRE   #From IMPPTH
    #  When "EXPORT"        : Gosub EXPORT      #From IMPPTH
    #  When "EXP_ZONE"      : Gosub EXP_ZONE    #From IMPPTH
    Endcase
    Return
    
    
    ###########################################################################
    #                                 IMPORT                                  #
    ###########################################################################
    
    $IMP_COMPILE
    Return
    
    $IMP_TRTSUP
    Return
    
    $AP_IMPORT
    If GSTK_TRSTYP<>12    # Issue 96008 GA 11/2014 restore parameters after EO receipt
       GSTK_BASTAB="[M:SRH1]NBLIG" : # Nom variable bas tableau
       GSTK_TRSTYP=12              :# 12 = shipment return: # Type mouvement (M.704)
       GSTK_VCRTYP=13              :# 13 = customer return : # Type pièce (M.701)
    Endif
    
    Case IMPFIC
      When "SRD"
        [F:YSRDIMP] = [F:SRD] : # Backup data for SAIMSK/IMP_ZONE
      When "STJ"
    
    #    If [V]GSTK_TRACE=2
    #        Call ECR_TRACE("SRH1 idx = "+num$(nolign-1)+": SDDLIN="+num$([M:SRH1]SDDLIN(nolign-1))-"ITMREF="+num$([M:SRH1]ITMREF(nolign-1))-"QTY="+num$([M:SRH1]QTY(nolign-1))-"EXTQTY="+num$([M:SRH1]EXTQTY
    #& (nolign-1))-"DLVQTY="+num$([M:SRH1]DLVQTY(nolign-1)),0) From GESECRAN
    #        Call ECR_TRACE("Adding STJ: QTY="+num$([F:STJ]QTYPCU)-"LOT="+num$([F:STJ]LOT),0) From GESECRAN
    #    Endif
    
    Endcase
    
    Return
    
    
    #-----------------------------------------------------------------#
    # Début import, étiquette appelée directement depuis le SUBIMPOBJ #
    #-----------------------------------------------------------------#
    $OUVRE
    # sr 08.11 bug 75878
    If dim(GSRH_SYMBOL2) < 0
        Global Char     GSRH_SYMBOL2(30)  : # Sauvegarde de la commande sur la ligne en cours de saisie pour unlock si escape
    Endif
    # Issue 106508 - 2015-06-04 by SR : Landed Cost
    If dim(GCLE) > 0 : Raz GCLE : Endif
    
    GABREV="SRH"
    If clalev([F:SLT])=0 : Local File SALTRS [F:SLT] : Endif
    #----- Sélection de la transaction de réception -----#
    Call PARAM("","SRHTRS",GBIDC3) From ADOVAL : GSLTNUM=GBIDC3
    Read [SLT]SLT0=6;GSLTNUM
    If fstat
      Filter [SLT] Where [SLT]STRTYP=6 & [SLT]ENAFLG=2
      Read [SLT] First
      Filter [SLT]
      If fstat
        If GTRACE<>""
          Call ECR_TRACE(mess(301,194,1),1) From GESECRAN
        Endif
        OK=0 : Return
      Endif
      GSLTNUM=[SLT]STRNUM
    Endif
    GFLAG=GSLTNUM      : # Transaction de saisie sélectionnée
    [SLT]STKFLG   =2 : # On force l'autorisation d'une réception à qua
    [SLT]DOCFLG   =1
    [SLT]PRNCOD1  =1 : # On force l'impression d'étiquettes à "Non"
    [SLT]PRNNBFLG1=1 : # On force le nbre d'impression à "Non"
    #----- Les classes écrans SRH0, PTH1 et PTH2 ne sont pas ouvertes en mode test -----#
    If !clalev([M:SRH0])  Local Mask SRH0   [SRH0] : Endif
    If !clalev([M:SRH1])  Local Mask SRH1   [SRH1] : Endif
    If !clalev([M:SRH2])  Local Mask SRH2   [SRH2] : Endif
    
    #-----
    [L]ACTION="OUVRE"   : Gosub ACTION From GOBJSUB : Gosub DEFAUT From WOSRH
    If !clalev([M:ADB])   Local Mask ADRBPR  [ADB] : Endif
    Gosub FLD_MODELE From TRTX3IMP
    #----- Principaux contrôles sur le modèle -----#
    If !find("[F:SRH]STOFCY(0)",[M:AOE2]ZONMSK1)
      #----- Le site de réception est obligatoire -----#
      OK=0 : GERR=1 : GMESSAGE=mess(323,199,1)-"([F:SRH]STOFCY)" : Return
    Elsif !find("[F:SRH]BPCORD(0)",[M:AOE2]ZONMSK1)
      #----- Le fournisseur est obligatoire -----#
      OK=0 : GERR=1 : GMESSAGE=mess(323,199,1)-"([F:SRH]BPCORD)" : Return
    Elsif  find("[F:SRD]SDHNUM(0)",[M:AOE2]ZONMSK1) &
    &     !find("[F:SRD]SDDLIN(0)",[M:AOE2]ZONMSK1) &
    &     !find("[F:SRD]ITMREF(0)",[M:AOE2]ZONMSK1)
      #----- Si no commande, la ligne ou l'article est obligatoire -----#
      OK=0 : GERR=1 : GMESSAGE=mess(323,199,1)-"([F:SRD]SDHNUM / [F:PTD]ITMREF)" : Return
    Elsif  find("[F:SRD]SDHNUM(0)",[M:AOE2]ZONMSK1) &
    &     !find("[F:SRD]SDDLIN(0)",[M:AOE2]ZONMSK1)
      #----- Si no livraison , la ligne est obligatoire -----#
      OK=0 : GERR=1 : GMESSAGE=mess(323,199,1)-"([F:SRD]SDHNUM)" : Return
    Endif
    #----- Variables locales -----#
    Local  Integer  WNOL, I, J, K, L
    Local  Char     SYMBOL2(30)
    Local  Char     WGRPDEB(GLONVCR)
    #----- Variables locales spécifiques aux composants de sous-traitance -----#
    Local  Shortint NOL, SAVNOLIGN
    Global Shortint GMFGTRACE : # à virer ! (dépend de la GP)
    
    Global Integer  GCCE_STJ
    #----- Test si besoin d'importer les axes analytiques avec l'écran STOANA [STA] -----#
    Raz GCCE_STJ
    For J=1 To GNBDIE
    #  If evalue("find('[F:STJ]CCE"+num$(J)+"(0)',[M:AOE2]ZONMSK1)")          # hcb 70092
       If evalue("find('[F:STJ]CCE("+num$(J)+")',[M:AOE2]ZONMSK1)")           # hcb 70092
         GCCE_STJ=1 : Break
      Endif
    Next J
    
    #----- Gestion des textes -----#
    Gosub DECLARE_TEXTE From TRTX3IMP
    G_IMPORT=1 : #Gosub OUVRE_TEXTE From IMPPTH
    #----- Globales à definir pour import stock -----#
    Global Char     GSTK_ACTION(20)                               : # Nom de l'action
    Global Char     GSTK_BASTAB(20) : # Nom variable bas tableau
    Global Libelle  GSTK_TRSTYP     : # Type mouvement (M.704)
    Global Libelle  GSTK_VCRTYP     : # Type pièce (M.701)
    Global Libelle  GSTK_TRACE      : GSTK_TRACE =1               : # Trace détaillée si =2
    
     GSTK_BASTAB="[M:SRH1]NBLIG" : # Nom variable bas tableau
     GSTK_TRSTYP=12              :# 12 = shipment return: # Type mouvement (M.704)
     GSTK_VCRTYP=13              :# 13 = customer return : # Type pièce (M.701)
    
    If GSTOTRACE>2  GSTK_TRACE=2 : Endif
    If GSTK_TRACE=2
      Call ECR_TRACE(mess(27,115,1)-"OUVRE"+space$(17)+"From YIMPSRHS",0) From GESECRAN
    Endif
    GSTK_ACTION="OUVRE" : Gosub ACTION From STKIMP
    
    [L]WSTK_ABRTTR="SLT" : # Abréviation table transaction de saisie
    
    #-----
    Return
    
    
    
    $RAZCRE
    If GSTK_TRACE=2
      GSTK_ACT="RAZCRE" : GSTK_PGM="YIMPSRHS" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    GREP="C"
    Raz [M:SRH0], [M:SRH1],[M:SRH2] :#, [M:PTH2], [M:PTH9], [M:PCEE]
    If GSTK_TRACE=2
      GSTK_ACT="RAZCRE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    [L]ACTION="RAZCRE"   : Gosub ACTION From GOBJSUB : Gosub DEFAUT From WOSRH
    GSTK_ACTION="RAZCRE" : Gosub ACTION From STKIMP
    Return
    
    
    $SAIMSK
    If GOK < 1 : Return : Endif
    
    If GREP="A"  Return : Endif
    If GSTK_TRACE=2
      GSTK_ACT="SAIMSK" : GSTK_PGM="YIMPSRHS" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    Case IMPFIC
      When "SRH"
        If GSTK_NBLIG
          GSTK_ACTION="RUPT_LIGDOC" : Gosub ACTION From STKIMP : # Autres articles gérés stock
        Endif
        #-----
        #Gosub IMPORT_TEXTE From IMPPTH : # Import des textes entête, pied
        Default File [SRH]  : # Voir si utile ?
        #----- Ecran entête réception -----#
        If GSTK_TRACE=2
          GSTK_ACT="SAIMSK" : GSTK_PGM="W0SRH0" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        Default Mask [SRH0]
        GNBAFF=0
        Setmode INBAFF,IAFFCOD,IAFFMASK,IAFFCHP,IAFFIND,IAFFTXT,IAFFRANG,IAFFOPT1,IAFFOPT2
        Call SAIMSK("SRH","IMP_ZONE","SUBIMPOBJ") From W0SRH0
        If mkstat  NBERR+=1 : Call TRACE2(2,GMESSIMP,-10) From SUBIMPOBJ : Endif
        Setmode
        If GREP="A"  Return : Endif
        If mkstat  GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
        #----- Ecran lignes réception -----#
        If GSTK_TRACE=2
          GSTK_ACT="SAIMSK" : GSTK_PGM="W0SRH1" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        Default Mask [SRH1]
        GNBAFF=0
        Setmode INBAFF,IAFFCOD,IAFFMASK,IAFFCHP,IAFFIND,IAFFTXT,IAFFRANG,IAFFOPT1,IAFFOPT2
        Call SAIMSK("SRH","IMP_ZONE","SUBIMPOBJ") From W0SRH1
        If mkstat  NBERR+=1 : Call TRACE2(2,GMESSIMP,-10) From SUBIMPOBJ : Endif
        Setmode
        If mkstat  GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
    
        #----- Ecran valorisation réception -----#
        If GSTK_TRACE=2
          GSTK_ACT="SAIMSK" : GSTK_PGM="W0SRH2" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        Default Mask [SRH2]
        GNBAFF=0
        Setmode INBAFF,IAFFCOD,IAFFMASK,IAFFCHP,IAFFIND,IAFFTXT,IAFFRANG,IAFFOPT1,IAFFOPT2
        Call SAIMSK("SRH","IMP_ZONE","SUBIMPOBJ") From W0SRH2
        If mkstat  NBERR+=1 : Call TRACE2(2,GMESSIMP,-10) From SUBIMPOBJ : Endif
        Setmode
        If mkstat  GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
      When "SRD"
        # Standard had this set to 3 to skip some controls, going to test with correct 12 first, if there is a problem, try standard
        #GSTK_TRSTYP = 3
        If [M:ENT]ITMREF <> ""
            If [F:ITM]ITMREF<>[M:ENT]ITMREF
               Read [ITM] ITM0=[M:ENT]ITMREF
               If fstat  Raz [F:ITM] : Endif
            Endif
            If [F:ITF]ITMREF<>[M:ENT]ITMREF | [F:ITF]STOFCY<>[M:ENT]STOFCY
               Read [F:ITF] ITF0=[M:ENT]ITMREF;[M:ENT]STOFCY
               If fstat  Raz [F:ITF] : Endif
            Endif
         Endif
        #----- Test rupture sur ligne document -----#
        If GSTK_NBLIG
          GSTK_ACTION="RUPT_LIGDOC" : Gosub ACTION From STKIMP : # Autres articles gérés stock
        Endif
    
        nolign=[M:SRH1]NBLIG+1 : indice=nolign-1
    
        #----- Traitement champs invisibles référence livraison -----#
        If find("[F:SRD]SDHNUM(0)",[M:AOE2]ZONMSK1) & [F:SRD]SDHNUM<>""
          [M:SRH1]DETSDHNUM(nolign-1)=[F:SRD]SDHNUM : # Numéro livraison inter-sites
          [F:SDD]SDHNUM=[F:SRD]SDHNUM
          [M:SRH1]SDDLIN(nolign-1)=[F:SRD]SDDLIN : # Ligne livraison inter-sites
          [F:SDD]SDDLIN=[F:SRD]SDDLIN
    
          Local Integer AUX_NBLIG : AUX_NBLIG = [M:SRH1]NBLIG
    
          If GSTK_TRACE=2
            Call ECR_TRACE("Before picking: nblig = "+num$([M:SRH1]NBLIG)-"",0) From GESECRAN
          Endif
          Default Mask [M:SRH0]
          Default Mask [M:SRH1]
          Default Mask [M:SRH2]
    
          # Standard picking
          Gosub SEL1 From SUBSRHC
    
          [F:SRD] = [F:YSRDIMP]: # Restore data for SAIMSK/IMP_ZONE
    
          If mkstat  GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
          # No line picked, abort
          If AUX_NBLIG=[M:SRH1]NBLIG
              If GMESSAGE=""
                  GMESSAGE = "Line not picked: "+[F:SRD]SDHNUM-num$([F:SRD]SDDLIN)
                  [V]GMESSIMP="~"+GMESSAGE
                  NBERR+=1
              Endif
              Call ECR_TRACE(GMESSAGE,1) From GESECRAN
              GREP="" : REP="" : mkstat=0 : GOK=0 : mkstat=0 : GOK=0
              Return
          Endif
    
          nolign=[M:SRH1]NBLIG : indice=nolign-1
    
          # Delete automatic stock selection for the current line, since it is going to be specified with import on STJ file
          Local Integer YI
          If [M:SRH1]WSTOSEQ(nolign-1)<>0
              For YI=[M:ENTW]NBLIG-1 To 0 Step-1
                  If [M:SRH1]WSTOSEQ(nolign-1)=[M:ENTW]WSTOSEQ(YI)
                      Dela YI,1 [M:ENTW]NBLIG
                  Endif
              Next
          Endif
    
          [F:SRD]DLVQTY=[M:SRH1]DLVQTY(nolign-1)
    
          status=75
        Else
          status=73
        Endif
    
        #-----
        WNOL=nolign-1       : # Utile pour le traitement de "CAL"
        Default File [SRD]  : # Voir si utile ?
        If GSTK_TRACE=2
          GSTK_ACT="SAI_NBLIG" : GSTK_PGM="W0SRH1" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
    
        GNBAFF=0
        Setmode INBAFF,IAFFCOD,IAFFMASK,IAFFCHP,IAFFIND,IAFFTXT,IAFFRANG,IAFFOPT1,IAFFOPT2
        Call SAI_NBLIG("SRD","IMP_ZONE","SUBIMPOBJ") From W0SRH1
        If mkstat  NBERR+=1 : Call TRACE2(2,GMESSIMP,-10) From SUBIMPOBJ : Endif
        # sr 08.11 bug 75878 délocker la commande si besoin
        If mkstat & GSRH_SYMBOL2<>""
            Unlock=GSRH_SYMBOL2
        Endif
        Setmode
        If mkstat  GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
    
      When "STJ"
          Default File [STJ]
          GSTK_ACTION="SAIMSK" : Gosub ACTION From STKIMP
          If mkstat : GREP="" : REP="" : mkstat=0 : GOK=0 : Return : Endif
          # Issue X3-53666 - 2017-11-09 by SR : Délocker la commande si erreur
          If GOK = 0  & GSRH_SYMBOL2<>""
              Unlock=GSRH_SYMBOL2
          Endif
    Endcase
    Return
    
    
    $IMP_ZONE
    If GREP="A"  Return : Endif
    If dim([L]WTST_CHAMP)<1  Local Libelle  WTST_CHAMP : Endif
    Case IMPFIC
      When "SRH"
          Local Char YIMPZON(30)
          Raz YIMPZON
          Default Mask [M:SRH0]
          Case IMPZON
            When "ENTRTNDAT" :# IMPZON = mask field, which might be different from table buffer
                YIMPZON="RTNDAT"
            When Default :# For fields for F class = M class
                If find("[F:SRH]"+IMPZON+"(0)",[M:AOE2]ZONMSK1) | IMPMSK="ADRBPR"
                    If GSTK_TRACE=2
                      GSTK_ACT="IMP_ZONE("+IMPZON+")" : GSTK_PGM="YIMPSRHS"
                      Gosub TRACE_DETAILLEE From STKIMP
                    Endif
                    Case IMPMSK
                      When "SRH0","SRH1"
                        If evalue("[M:"+IMPMSK+"]"+IMPZON+"("+num$(indice)+")")<>evalue("[F:SRH]"+IMPZON)
                          Assign "[M:"+IMPMSK+"]"+IMPZON+"("+num$(indice)+")" With evalue("[F:SRH]"+IMPZON)
                          IMPMOD=1
                        Endif
                        OK=0
                    Endcase
                Endif
          Endcase
          If YIMPZON<>""
              If find("[F:SRH]"+YIMPZON+"(0)",[M:AOE2]ZONMSK1)<>0
                    If GSTK_TRACE=2
                      GSTK_ACT="IMP_ZONE("+IMPZON+")" : GSTK_PGM="YIMPSRHS"
                      Gosub TRACE_DETAILLEE From STKIMP
                    Endif
              Endif
              Case IMPMSK
                When "SRH0"
                  If evalue("[M:SRH0]"+IMPZON+"("+num$(indice)+")")<>evalue("[F:SRH]"+YIMPZON)
                    Assign "[M:SRH0]"+IMPZON+"("+num$(indice)+")" With evalue("[F:SRH]"+YIMPZON)
                    IMPMOD=1
                  Endif
                  OK=0
              Endcase
          Endif
      When "SRD"
        Case IMPZON
          When Default
            If find(IMPZON,"GROPRI","QTYUOM","QTYVOU","QTYWEU","UOM","WEU","VOU")
    
            Endif
            If find("[F:SRD]"+IMPZON+"(0)",[M:AOE2]ZONMSK1)
              If GSTK_TRACE=2
                GSTK_ACT="IMP_ZONE("+IMPZON+")" : GSTK_PGM="YIMPSRHS"
                Gosub TRACE_DETAILLEE From STKIMP
              Endif
              If evalue("[M:SRH1]"+IMPZON+"("+num$(indice)+")<>[F:SRD]"+IMPZON)
                Assign "[M:SRH1]"+IMPZON+"("+num$(indice)+")" With evalue("[F:SRD]"+IMPZON)
    
                IMPMOD=1
              Endif
              OK=0
            Endif
        Endcase
      When "CAL"
        #----- La zone présente dans le modèle a déjà été chargée par IMPORT_ACCCCE du $SAIMSK
        If find("[F:CAL]"+IMPZON+"(0)",[M:AOE2]ZONMSK1)
          If GSTK_TRACE=2
            GSTK_ACT="IMP_ZONE("+IMPZON+")" : GSTK_PGM="YIMPSRHS"
            Gosub TRACE_DETAILLEE From STKIMP
          Endif
          IMPMOD=1
        Endif
        OK=0
        #-----
      When "STJ"
          GSTK_ACTION="IMP_ZONE" : Gosub ACTION From STKIMP
    Endcase
    Return
    
    
    #----------------------------------------------------------------------------#
    # Enregistrement du document importé, appelé directement depuis le SUBIMPOBJ #
    #----------------------------------------------------------------------------#
    $VALID
    If GSTK_TRACE=2
      GSTK_ACT='VALID(GREP="'+GREP+'")' : GSTK_PGM="YIMPSRHS" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    If GREP=""  Raz GSTK_NBLIG  : Return : Endif
    [L]OK=1 : Raz GERREUR
    If GREP="C"
      #----
      GSTK_ACTION="VALID" : Gosub ACTION From STKIMP
      If ![L]OK
        If GMESSAGE<>""  Call ECR_TRACE(GMESSAGE,1) From GESECRAN : Raz GMESSAGE : Endif
        GOK=0 : Goto FIN_GENSRH
      Endif
      #-----
      # Issue X3-59162 - 2017-10-27 by SR : Peut avoir été changé pour la SST
      Default Mask [M:SRH1]
      Default Mask [M:SRH2]
      Default Mask [M:SRH0]
      If GSTK_TRACE=2
        GSTK_ACT="VERIF_CRE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="VERIF_CRE" : Gosub ACTION From GOBJSUB
      #--- Bug 71029
      If ![L]OK  GOK=0 : Goto FIN_GENSRH : Endif
      #If ![L]OK  GOK=0 : Gosub TRACE_CTL From SUBIMPOBJ : Goto FIN_GENSRH : Endif   # hcb 87116
      #---
    Elsif GREP="A"
      If GSTK_TRACE=2
        GSTK_ACT="LIENS" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="LIENS" : Gosub ACTION From GOBJSUB
      If [M:SRH1]NBLIG=0  GOK=0 : Goto FIN_GENSRH : Endif
      [L]SYMBOL2="SRH"+[M:SRH0]SRHNUM : Lock=[L]SYMBOL2
      If fstat
        Call ECR_TRACE("$SRETURN"-[M:SRH0]SRHNUM-mess(10,100,1),1) From GESECRAN
        GOK=0 : Goto FIN_GENSRH
      Endif
      If GSTK_TRACE=2
        GSTK_ACT="VERF_ANU" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="VERF_ANU" : Gosub ACTION From GOBJSUB
      If ![L]OK
        If GMESSAGE<>""  Call ECR_TRACE(GMESSAGE,1) From GESECRAN : Raz GMESSAGE : Endif
        Unlock=[L]SYMBOL2
        GOK=0 : Goto FIN_GENSRH
      Endif
    Endif
    Call DEBTRANS From GLOCK
    #-----
    $TR_GENPTH
    GOK=1
    Raz WGRPDEB : #71600
    If GSTK_TRACE=2
      GSTK_ACT="Trbegin" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    Trbegin [SRH], [SRD]
      If GREP="C"
        Raz [F:SRH], [F:SRD]
        [F:SRH]=[M:SRH0]
        Default File [SRH]
        Default Mask [M:SRH1]
        Default Mask [M:SRH2]
        Default Mask [M:SRH0]
    
        If GSTK_TRACE=2
          GSTK_ACT="INICRE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        [L]ACTION="INICRE"   : Gosub ACTION From GOBJSUB
        If GOK<0  Goto ROLL_GENSRH  Elsif !GOK  Goto AB_GENSRH : Endif
        If GSTK_TRACE=2
          GSTK_ACT="Write [SRH]" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        [F:SRH]CREUSR=GUSER
        [F:SRH]CREDAT=date$
        Write [SRH]
        If fstat  GOK=0 : Call FSTA("SRH") From GLOCK : Goto AB_GENSRH : Endif
        If GSTK_TRACE=2
          GSTK_ACT="CREATION" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        [L]ACTION="CREATION" : Gosub ACTION From GOBJSUB
        If GOK<0  Goto ROLL_GENSRH  Elsif !GOK  Goto AB_GENSRH : Endif
        #----- Mise à jour du suivi workflow -----#
        #71600
        If GOK=1
          Call WRKGLOB(170,[F:SRH]SRHNUM,"SRETURN","") From GOBJACT
          Call WORKPLUS(2,"SRH","C",[F:SRH]SRHNUM,"",0,1,0,WGRPDEB) From AWRK
          If GOK<0  Goto ROLL_GENSRH  Elsif !GOK  Goto AB_GENSRH : Endif
        Endif
        #-----
        If GSTK_TRACE=2
          GSTK_ACT="Commit" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
         #GMESSAGE="---"-mess(5,126,1)-"Commit ("+mess(117,198,1)-[F:SRH]SRHNUM-mess(224,197,1)+")"
         #Call ECR_TRACE(GMESSAGE,0) From GESECRAN : Raz GMESSAGE
        Endif
      Elsif GREP="A"
        Default Mask [SRH0]
        Default File [SRH]
        If GSTK_TRACE=2
          GSTK_ACT="ANNULE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        [L]ACTION="ANNULE" : Gosub ACTION From GOBJSUB
        If GOK<0  Goto ROLL_GENSRH  Elsif !GOK  Goto AB_GENSRH : Endif
        If GSTK_TRACE=2
          GSTK_ACT="Delete [SRH]" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        Delete [SRH] Where [SRH]SRHNUM=[M:SRH0]SRHNUM
        If fstat  GOK=0 : Call FSTA("SRH") From GLOCK : Goto AB_GENSRH : Endif
        If GSTK_TRACE=2
          GSTK_ACT="Commit" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
      Endif
    Commit
    Case GREP
      When "C" : Call TRACE( 0,mess(6,701,1)-[F:SRH]SRHNUM)  From SUBIMPOBJ
      When "M" : Call TRACE( 1,mess(6,701,1)-[M:SRH0]SRHNUM) From SUBIMPOBJ : # Pas activé !
      When "A" : Call TRACE(-1,mess(6,701,1)-[M:SRH0]SRHNUM) From SUBIMPOBJ
    Endcase
    If GREP="C"
      If [F:SRH]SRHNUM<>""
          If dim(GYNEW_SRHNUM)<0
              Global Char GYNEW_SRHNUM(30)
          Endif
          GYNEW_SRHNUM = [F:SRH]SRHNUM
      Endif
    
      If GSTK_TRACE=2
        GSTK_ACT="APRES_CRE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="APRES_CRE" : Gosub ACTION From GOBJSUB
      #----- Envoi des messages groupe workflow -----#
      #71600
      If WGRPDEB<>""  Call ENVOI_GROUPE(WGRPDEB) From AWRK : WGRPDEB="" : Endif
      #-----
    Elsif GREP="A"
      Unlock=[L]SYMBOL2
      If GSTK_TRACE=2
        GSTK_ACT="AP_ANNULE" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="AP_ANNULE" : Gosub ACTION From GOBJSUB
      #----- Mise à jour du suivi workflow -----#
      #71600
      Call WRKGLOB(172,[M:SRH0]SRHNUM,"PRECEIPT","") From GOBJACT
      Call WORKFLOW(2,"PTH","A",[M:SRH0]SRHNUM)      From AWRK
      #-----
    Endif
    Goto FIN_GENSRH
    #-----
    $ROLL_GENSRH
    If GSTK_TRACE=2
      GSTK_ACT="Rollback" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    Rollback
    Call ROLL From GLOCK
    If GROLL
      If GREP="C"
        If GSTK_TRACE=2
          GSTK_ACT="AB_CREATION" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
        Endif
        [L]ACTION="AB_CREATION" : Gosub ACTION From GOBJSUB
      Elsif GREP="A"
        Unlock=[L]SYMBOL2
      Endif
      Goto FIN_GENSRH
    Else
      Goto TR_GENPTH
    Endif
    #-----
    $AB_GENSRH
    If GSTK_TRACE=2
      GSTK_ACT="Rollback" : GSTK_PGM="" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    Rollback
    If GREP="C"
      If GSTK_TRACE=2
        GSTK_ACT="AB_CREATION" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
      Endif
      [L]ACTION="AB_CREATION" : Gosub ACTION From GOBJSUB
      #----- Suppression des message groupe workflow -----#
      #71600
      If WGRPDEB<>""  Call VIRE_GROUPE(WGRPDEB)  From AWRK : WGRPDEB="" : Endif
      #-----
      Goto FIN_GENSRH
    Elsif GREP="A"
      Unlock=[L]SYMBOL2
    Endif
    #-----
    $FIN_GENSRH
    Return
    #------------#
    # Fin import #
    #------------#
    $IMP_FERME
    GREP=""
    If GSTK_TRACE=2
      GSTK_ACT="FERME" : GSTK_PGM="GOBJSUB" : Gosub TRACE_DETAILLEE From STKIMP
    Endif
    [L]ACTION="FERME"       : Gosub ACTION From GOBJSUB : Gosub DEFAUT From WOSRH
    GSTK_ACTION="IMP_FERME" : Gosub ACTION From STKIMP
    # sr 08.11 Bug 75878
    If dim(GSRH_SYMBOL2)>0    Kill GSRH_SYMBOL2    : Endif
    Kill GSTK_ACTION, GSTK_BASTAB, GSTK_TRSTYP, GSTK_VCRTYP, GSTK_TRACE
    
    Return
    ##########################################################################
    #                                   EXPORT                               #
    ##########################################################################
    
    $EXP_OUVRE
    #TODO if needed in the future
    Return
    $EXPORT
    #TODO if needed in the future
    Return