Extraire les données de ALISTER via abonnement

SOLVED

Bonjour,

Je suis sous SAGE X3 V6.

J'ai un abonnement mensuel sur une requête SQL.

Comment faire pour extraire dans un fichier séquentiel les données résultantes ?

Je n'ai rien trouvé dans les tâches pour faire cette extraction.

Apparemment il faudrait même faire un traitement spécifique pour réaliser cette extraction.

J'ai déjà compris comment sont stockées les données entre les tables ALISTED et ALISTER

mais je coince pour faire une boucle de sortie avec Wrseq.

Merci pour toutes les informations que vous pourrez partager.

JCB

  • +1
    verified answer

    Bonjour, bonjour,

    J'ai réussit à construire un traitement batchable pour extraire les informations des requêtes X3.

    Je vous présente mon code afin de récolter vos réactions sur le fond et la forme.

    Merci.

    Pour batcher ce traitement, il faut un écran, une fenêtre et une action

    #
    # JCB 2020-01-20
    # Extraction des lignes de données des tables ALISTE [H,D,R]
    #
    ######################################################################
    ######################################################################
        Local Char    PARMSK(250)(1..20) , SAVACT(20) , VALEUR
        SAVACT = GACTION : GACTION = "ZGTARIF"
        Call TRAITE_CHAR(VALEUR,PARMSK,"","ZEXPALH","ZEXPALH",3,"") From GTRAITE
        GACTION = SAVACT
    End
    
    
    Gosub INIT
    Gosub EXEC
    End
    
    
    $ACTION
        Case ACTION
            When "INIT"        : Gosub INIT
            When "INIT_DIA"    : Gosub INIT_DIA
            When "OUVRE_BATCH" : Gosub INIT
            When "EXEC"        : Gosub EXEC
            When "TERMINE"     : Gosub TERMINE
            When Default
        Endcase
    Return
    
    ######################################################################
    ######################################################################
    $INIT
        Gosub DECLARE
    Return
    
    $INIT_DIA
        Raz [M:DIA]
    Return
    
    $EXEC
        Y_TRA=1
    #--> Récupére les paramètres
        Gosub FILTRE
    
        If !GSERVEUR & GTRACE="" Then
            Call OUVRE_TRACE(W_TIT) From LECFIC
            Y_TRA = 0
        Endif
        Call TEMPON("o") From GESECRAN
    
    
    #--> Vérifie la requête
        Read[ALH]ALH0 = W_COD
        If fstat Raz[ALH] : End : Endif
        
        W_TYPREQ = [ALH]TYP
    
    #---> Ouvre fichier export 
        Gosub OUVRE_FICHIER_EXPORT
    
    #--> Choix du type de requête
        Case W_TYPREQ
            When 1,3      :# Normale, Graphique
            #--> Déclaration des variables
                Local Integer MAXCOL, NIVCUM
                    MAXCOL = 100
                    NIVCUM = 16
                Local Integer NBGRP, NBCOL, NBLIG
                Local Integer GRP(1..MAXCOL), COLGRP, SNSGRP
                Local Integer CUM(1..MAXCOL), TRI(1..NIVCUM)
                Local Char    AOBSIT, AOBACC, AOBFIC
    
            #--> Récupération des variables de la requête
                Gosub DEFVAR From ="WMM"+W_COD
    
            #---> Ouvre fichier et exporte les données
                Gosub OUVRE_FICHIER_EXPORT
                Gosub     REQ_NORMALE
    
            When 2        :# SQL
            #--> Récupération des variables de la requête
                Gosub DEFVAR From ="WMM"+W_COD
    
            #---> Ouvre fichier et exporte les données
                Gosub OUVRE_FICHIER_EXPORT
                Gosub     REQ_SQL
        Endcase
    
    #---> Fermeture du fichier exportation
        Gosub FERME_FICHIER_EXPORT
        Call TEMPOFF() From GESECRAN
    
    Return
    
    $TERMINE
        If !GSERVEUR & Y_TRA=0
            Call FERME_TRACE From LECFIC
            Call LEC_TRACE From LECFIC
            TRA = 1
        Endif
    Return
    
    
    ######################################################################
    ######################################################################
    $DECLARE
        #---> déclaration des variables
        Global Integer     W_ERR
        Local Char         W_TIT
        Local Char         W_FICHIER(250)
        Local Shortint     Y_TRA
    
        Local Char         W_COD(8)
        Local Char         W_USR(5)
        Local Shortint     W_NBRCOL
        Local Shortint     W_MAXNIV
    
        Local Integer      TADDEGAL,IEGAL,LLONGEGAL,TIMEXLS,CPTXLS
        Local Char         AEGAL
    
    
        #--> Ouverture des tables
        If !clalev([F:ALH]) : Local File ALISTEH        [ALH] : Endif
        If !clalev([F:ALD]) : Local File ALISTED        [ALD] : Endif
        If !clalev([F:ALR]) : Local File ALISTER        [ALR] : Endif
    
    Return
    
    $FILTRE
        W_COD=[M]COD
        W_USR=[M]USR
        W_TIT="Exportation données"-W_COD
    Return
    
    $OUVRE_FICHIER_EXPORT
    #--> Définition du fichier
        W_FICHIER    = filpath("D:\Export\_EXPRequete", W_COD+"_"+format$("D:YYYYMMDD", date$), "csv")
    
        Openo W_FICHIER,0 Using [ZOUT]
        adxifs = ";"
        adxirs = chr$(13)+chr$(10)
    Return
    
    $FERME_FICHIER_EXPORT
    #--->
        Openo Using [ZOUT]
    Return
    
    ######################################################################
    ######################################################################
    
    $REQ_NORMALE
    #--> Définit le niveau le plus bas pour l'extraction
        W_MAXNIV=NBGRP+1
    
    #--> Export des intitulés de colonnes
        For [ALD]ALD0 Where COD=W_COD & STREND<3
            If dim([F:ALD]NUMTEX)>0
                Wrseq toupper(ctrans(func AFNC.TEXTRA("ALISTED","INTITLIG",[F:ALD]COD,num$([F:ALD]NUMTEX)))); Using [ZOUT]
            Else
                Wrseq toupper(ctrans(func AFNC.TEXTRA("ALISTED","INTITLIG",[F:ALD]COD,num$([F:ALD]LIG)))); Using [ZOUT]
            Endif
        Next
        Wrseq Using [ZOUT]
    
    #--> Extraction des données
        Link [ALR] With [ALD]ALD0=[F:ALR]COD; [F:ALR]COL As [LALR]
        
        Filter [LALR] Where [ALR]COD=W_COD & [ALR]USR=W_USR & [ALR]NIV=W_MAXNIV & [ALR]LIG>0 & [ALD]STREND<3
        
    #-->
        For [LALR]ALR0(4)
            For [LALR]ALR0
                Case [ALR]TYP
                    When 7            :#Alphanumérique
                        LLONGEGAL=[F:ALD]LNG
                        If LLONGEGAL=0 or [F:ALD]CODTYP="ATX" : LLONGEGAL = len([F:ALR]VLR) : Endif
                        Wrseq  left$([ALR]VLR,LLONGEGAL); Using [ZOUT]
                    When 8            :#Date
                        Wrseq format$("D:"+GFMDAT4,[F:ALR]DAT); Using [ZOUT]
                    When Default      :# autres numérique
                        If [ALD]NOLIB>0
                            If [ALR]NUM>0
                                Wrseq left$(mess([F:ALR]NUM,[F:ALD]NOLIB,1),[F:ALD]LNG); Using [ZOUT]
                            Else
                                Wrseq ""; Using [ZOUT]
                            Endif
                        Elsif [F:ALD]LNG>0 & find([F:ALR]TYP,2,3)>0
                             Wrseq format$("N:"+num$([F:ALD]LNG),[F:ALR]NUM); Using [ZOUT]
                        Else
                             Wrseq vireblc(format$("N:28F",[F:ALR]NUM),2); Using [ZOUT]
                        Endif
                Endcase
            Next
            Wrseq Using [ZOUT]
        Next
        Filter [ALR]
    Return
    
    
    $REQ_SQL
    #--> Exportation des intitulés de colonnes
        For [F:ALD]ALD0 Where COD=W_COD & LIG<100
            If dim([F:ALD]NUMTEX)>0
                Wrseq toupper(ctrans(func AFNC.TEXTRA("ALISTED","INTITLIG",[F:ALD]COD,num$([F:ALD]NUMTEX)))); Using [ZOUT]
            Else
                Wrseq toupper(ctrans(func AFNC.TEXTRA("ALISTED","INTITLIG",[F:ALD]COD,num$([F:ALD]LIG)))); Using [ZOUT]
            Endif
        Next
        Wrseq Using [ZOUT]
        
    
    #--> Exportation des données
        Filter [F:ALR] Where COD=W_COD & USR=W_USR & NIV=1 & LIG>0 & COL>0
    
        For [F:ALR]ALR0(4)
            For [ALR]ALR0
                I=[ALR]COL        
                Case TYP(I)
                    When 1            :#Menu local
                        If NOLIB(I)>0
                            If [ALR]NUM>0
                                Wrseq left$(mess([F:ALR]NUM, NOLIB(I), 1), LONG(I)); Using [ZOUT]
                            Else
                                Wrseq ""; Using [ZOUT]
                            Endif
                        Else
                            Wrseq num$([F:ALR]NUM); Using [ZOUT]
                        Endif
    
                    When 2,3,4,5,6    :# Numérique
                        If LONG(I)>0 & find(TYP(I),2,3)>0
                             Wrseq format$("N:"+num$(LONG(I))+"#",[F:ALR]NUM); Using [ZOUT]
                        Else
                             Wrseq vireblc(format$("N:28F",[F:ALR]NUM),2); Using [ZOUT]
                        Endif
    
                    When 7            :# Alphanumérique
                        LLONGEGAL=max(0,LONG(I))  
                        If LONG(I)=0 : LLONGEGAL=len([F:ALR]VLR) : Endif
                        Wrseq  left$([F:ALR]VLR,LLONGEGAL); Using [ZOUT]
    
                    When 8            :# Date
                        Wrseq format$("D:"+GFMDAT4,[F:ALR]DAT) Using [ZOUT]
    
                Endcase
            Next
    
            # envoi les données
            Wrseq Using [ZOUT]
    
        #on continue
        Next
    
        Filter [ALR]
    Return
    
    

    1. Ecran
      1. Entête
      2. Champs
    2. Fenêtre
    3. Action

    Puis pour l'abonnement:

    1. Tâche
    2. Groupe de tâches
    3. Abonnement

      Sélections : 
      1. CALALH
      2. ZEXPALH

    En espérant que cela puisse vous aider à extraire des informations...

  • 0 in reply to JCh.BDL

    Merci beaucoup d'avoir partagé JCh.BDL :) c'est vraiment top

  • 0 in reply to Lea Fanchon

    Bonjour,

    N'hésitez-pas à me transmettre vos impressions. Je ne développe pas depuis longtemps :)

  • 0 in reply to JCh.BDL

    essayé et approuvé, merci beaucoup!

  • 0 in reply to JCh.BDL

    Bonjour, merci beaucoup pour tous ces éléments. Comment est paramétrée votre fonction ZEXPALH svp ? 

  • 0 in reply to Helene_TD

    Bonjour,

    En paramètre le code de la requête X3 (normale ou SQL) et l'utilisateur qui l'a générée.

    Le fichier est déposé dans un répertoire du serveur "D:\Export\_EXPRequete\".

    En v12, il faut privilégier l'utilisation des volumes.

    Bonne continuation.

  • 0 in reply to JCh.BDL

    Bonjour, vous avez développé la même chose en v12 ?

  • 0 in reply to Helene_TD

    Bonjour,

    Oui tout à fait. Le même traitement avec une adaptation pour la gestion des volumes.

  • 0

    Bonjour
    Avez vous pensé à passer par les modèles d'exports ?

  • 0 in reply to LAROA

    Bonjour,

    Oui tout à fait. Mais les exportations sont très limitées.

    Si l'on souhaite avoir des informations travaillées, il faut passer par une requête (standard, graphique ou SQL).

    D'où le traitement d'extraction des données ALISTER Slight smile

  • 0 in reply to JCh.BDL

    Pas forcément car nous pouvons lier un traitement dans le modèle et alimenter des variables. Nous utilisons régulièrement cela pour des exports/interfaces.

    par exemple: mettre *1 dans la colonne champ du modèle d'export.

    et dans le traitement associé avoir ceci : 

    $ACTION

    Case ACTION
    When "EXP_OUVRE" : Gosub EXP_OUVRE
    When "EXP_ZONE" : Gosub EXP_ZONE
    Endcase
    Return

    $EXP_OUVRE
    If !clalev ([F:ITM]) : Local File ITMMASTER [ITM] : Endif


    Return

    #######################################################################

    $EXP_ZONE
    Case EXPZON
    When "GIMP(1)" : Gosub E_GIMP1 : # désignation
    Endcase
    Return

    ########
    $E_GIMP1

    Read [ITM]ITM0=[F:STL]ITMREF
    If fstat=0
    GIMP(1)=[F:ITM]ITMDES1+[F:ITM]ITMDES2
    Endif
    Return