Question Question of a way to have a flex code

Hi guys,

Running OE10.2B

I know that the subject don't say that much so I will try to explain what I'm trying to do.
I'm working on our MPS.

So this is my code :
Code:
DEFINE TEMP-TABLE TTREF
    FIELD proref AS CHARACTER
    FIELD prodes AS CHARACTER.
   
DEFINE TEMP-TABLE TTNEED
    FIELD proref AS CHARACTER
    FIELD numweek AS INTEGER
    FIELD numann  AS INTEGER
    FIELD needqty AS DECIMAL.

For one TTREF -> Many TTNEED . If display it in a browse, I will have them displayed in a row like this
refnumweeknumannneedqty
182019150
192019100
28201990
29201955
If want to display the data like this

refnumweek[1]numann[1]needqty[1]numweek[2]numann[2]needqty[2]
18201915092019100
282019909201955
My main issue in this is that one day I can have 3 weeks and the over 15. But I can't make variable extent in a temp-table fields.


Do you have a solution ? Or idea ? Maybe POO ?

Best Regards,

BobyIsProgress
 
Last edited:

TomBascom

Curmudgeon
Instead of using an array use a temp-table. Either add another field for the array index to your existing TT or join a new temp-table to the old one.
 

Cringer

ProgressTalk.com Moderator
Staff member
You could build a dynamic temp table from the original temp table with the columns you want. If you're talking about a classic GUI browse widget then it's not actually that hard to attach a dynamic query to an empty browse and display the columns.
 

Stefan

Well-Known Member
Additionally, your example is incorrect, your input data does not have ref 2 week 9.
Adding unique indexes to your example also helps in illustrating intent.
 
Hi,

Some update on my progress:
Code:
/*------------------------------------------------------------------------------
  Purpose: Création de la table temporaire dynamique   
  Parameters:  <none>
  Notes:       
------------------------------------------------------------------------------*/
DEFINE VARIABLE cmpt      AS INTEGER     NO-UNDO.
DEFINE VARIABLE avance    AS INTEGER     NO-UNDO.
DEFINE VARIABLE ordout    AS INTEGER     NO-UNDO.

DEFINE VARIABLE myBrowse  AS HANDLE      NO-UNDO.
DEFINE VARIABLE myColumn  AS HANDLE      NO-UNDO.
DEFINE VARIABLE myUpdate  AS HANDLE      NO-UNDO.
DEFINE VARIABLE myField   AS HANDLE      NO-UNDO.

DEFINE VARIABLE lstLabel  AS CHARACTER   NO-UNDO.

DEFINE BUFFER BUFBES FOR TTBES .

/*setup de la liste des labels pour les types de valeurs */
lstLabel = "PIC" + ",":U + "Commande":U + ",":U + "Stck Date":U + ",":U + "Couverture" + ",":U + "Stock"
           + ",":U + "Prod" .
 /* creation de la table temporaire  */
CREATE TEMP-TABLE TTFIN.
TTFIN:ADD-NEW-FIELD("indnumenr":U,"INTEGER":U) .
TTFIN:ADD-NEW-FIELD("proref":U,"CHARACTER":U) .
TTFIN:ADD-NEW-FIELD("va1ref":U,"CHARACTER":U).
TTFIN:ADD-NEW-FIELD("ordout":U,"INTEGER":U).
TTFIN:ADD-NEW-FIELD("labelout":U,"CHARACTER":U).
TTFIN:ADD-NEW-FIELD("nbjcouv":U,"INTEGER":U).
TTFIN:ADD-NEW-FIELD("nbjouvr":U,"INTEGER":U).
TTFIN:ADD-NEW-FIELD("stockini":U,"DECIMAL":U).
TTFIN:ADD-NEW-FIELD("output":U,"DECIMAL":U,profondeur) . /* profondeur = valeur de l'extent pour le champs */
TTFIN:ADD-NEW-INDEX("I01":U,TRUE,TRUE). /* Setup de l'index primaire de la table */
/* Ajout des champs dans l'ordre souhaité de l'index */
TTFIN:ADD-INDEX-FIELD("I01":U,"proref":U).
TTFIN:ADD-INDEX-FIELD("I01":U,"va1ref":U).
TTFIN:ADD-INDEX-FIELD("I01":U,"ordout":U).
TTFIN:ADD-NEW-INDEX("I02":U).
TTFIN:ADD-INDEX-FIELD("I02":U,"indnumenr":U).
TTFIN:TEMP-TABLE-PREPARE("fin":U) . /* Attribution du nom de la table temporaire */

/* Récupération des buffers handle pour manipulation */
ASSIGN
    BUFFIN  = TTFIN:DEFAULT-BUFFER-HANDLE
    BUFPIC  = TTFIN:DEFAULT-BUFFER-HANDLE .
/* Création de la requête pour la mise à jour du champs output */
CREATE QUERY myUpdate .
myUpdate:SET-BUFFERS(BUFPIC) . /* Attribution du buffer de table employé */

FOR EACH TTREF NO-LOCK :
    /* visualisation de l'avancement dans le process */
    avance = avance + 1.
    PROCESS EVENTS.
    IF avance MODULO 10 = 0 THEN
        myInfo:SCREEN-VALUE = STRING(avance) + " / " + STRING(nbproduit) .

    /* Début de la transaction */
    DO TRANSACTION :
        DO cmpt = 1 TO NUM-ENTRIES(lstLabel) : /* Création des lignes de table en fonction des différentes données à afficher par ref */
            BUFPIC:BUFFER-CREATE() .
            ASSIGN
                BUFPIC:BUFFER-FIELD("indnumenr":U):BUFFER-VALUE = TTREF.indnumenr
                BUFPIC:BUFFER-FIELD("proref":U):BUFFER-VALUE    = TTREF.proref
                BUFPIC:BUFFER-FIELD("va1ref":U):BUFFER-VALUE    = TTREF.va1ref
                BUFPIC:BUFFER-FIELD("nbjcouv":U):BUFFER-VALUE   = TTREF.nbjcouv
                BUFPIC:BUFFER-FIELD("nbjouvr":U):BUFFER-VALUE   = TTREF.nbjouvr
                BUFPIC:BUFFER-FIELD("stockini":U):BUFFER-VALUE  = TTREF.stock
                BUFPIC:BUFFER-FIELD("ordout":U):BUFFER-VALUE    = cmpt
                BUFPIC:BUFFER-FIELD("labelout":U):BUFFER-VALUE  = ENTRY(cmpt,lstLabel) .
        END.
        
        ASSIGN cmpt = 0 .   
                    
        FOR EACH TTBES WHERE TTBES.indnumenr = TTREF.indnumenr NO-LOCK: /* parcours des besoins */
            cmpt = cmpt + 1.
            /* préparation de la requête */
            myUpdate:QUERY-PREPARE("FOR EACH fin WHERE fin.indnumenr = ":U + STRING(TTBES.indnumenr) + " NO-LOCK":U) .
            myUpdate:QUERY-OPEN. /* Ouverture de la requête */
            REPEAT:
                myUpdate:GET-NEXT. /* Récupérer le premier enregistrement */
                IF myUpdate:QUERY-OFF-END THEN LEAVE. /* Si plus de data on quitte la boucle repeat */
                myUpdate:GET-CURRENT(EXCLUSIVE-LOCK) .
                ordout = BUFPIC:BUFFER-FIELD("ordout":U):BUFFER-VALUE . /* Récupération de ordout car ne passe pas dans l'instruction Case */
                CASE ordout :
                    WHEN 1 THEN DO: /* Besoin issue du PIC */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.besoinPic .
                    END.
                    WHEN 2 THEN DO: /* Besoin issue des CDE */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.besoinCde .
                    END.
                    WHEN 3 THEN DO: /* Besoin issue du stock a date */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.besoinSad .
                    END.
                    WHEN 4 THEN DO: /* Couverture */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.couverture .
                    END.
                    WHEN 5 THEN DO: /* Stock */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.Stock .
                    END.
                    WHEN 6 THEN DO: /* Prod */
                        BUFPIC:BUFFER-FIELD("output":U):BUFFER-VALUE(cmpt) = TTBES.prod .
                    END.
                END CASE.
                
            END. 
            myUpdate:QUERY-CLOSE . /* Fermeture de la requête */
        END.
    END.
END.                                                           

CREATE QUERY dispQuery . /* Création de la requête d'affichage dans le BROWSE */
dispQuery:SET-BUFFERS(BUFFIN). /* Attribution du/des buffer/s exploités par la requête */
dispQuery:QUERY-PREPARE("FOR EACH fin NO-LOCK":U) . /* Inscription de la requête */

ASSIGN
    myBrowse = BROWSE-8:HANDLE IN FRAME F-Main /* récupération du handle de browse */
    myBrowse:QUERY = dispQuery /* Ajout de la requête au browse */
    myBrowse:READ-ONLY = FALSE
    /* création des colonnes */
    myColumn = myBRowse:ADD-LIKE-COLUMN("fin.labelout":U)
    myColumn:LABEL = "Type"
    /* myColumn:FORMAT = "X(12)":U */
    myColumn:WIDTH-PIXELS = func-widthcolumn(myColumn) + 100
    myColumn = myBRowse:ADD-LIKE-COLUMN("fin.proref":U)
    myColumn:LABEL = "Référence"
    myColumn:WIDTH-PIXELS = func-widthcolumn(myColumn)
    myColumn = myBRowse:ADD-LIKE-COLUMN("fin.va1ref":U)
    myColumn:LABEL = "Variante"
    myColumn:WIDTH-PIXELS = func-widthcolumn(myColumn)
    myField  = BUFFIN:BUFFER-FIELD("output"):HANDLE
    myColumn = myBRowse:ADD-LIKE-COLUMN(myField)
    myColumn:READ-ONLY = FALSE
    cmpt = 4
    myBrowse:NUM-LOCKED-COLUMN = 3 .

FOR EACH TTWEEK NO-LOCK: /* mise à jour des labels de colonne pour l'extent*/
    ASSIGN
        myColumn = myBrowse:GET-BROWSE-COLUMN(cmpt)
        myColumn:NAME = "COL" + STRING(cmpt - 3) /* attribution d'un code unique non visible */
        myColumn:LABEL = STRING(TTWEEK.weekann) + " - ":U + STRING(TTWEEK.weeknum)
        myColumn:WIDTH-PIXELS = func-widthcolumn(myColumn)
        myColumn:READ-ONLY = FALSE .
        cmpt = cmpt + 1.
END.
cmpt = 1 .
myColumn = myBrowse:GET-BROWSE-COLUMN(cmpt).

DO WHILE VALID-HANDLE(myColumn) :
    CREATE TTCOL.
    ASSIGN
        TTCOL.mycol = myColumn:HANDLE
        cmpt = cmpt + 1
        myColumn = myBrowse:GET-BROWSE-COLUMN(cmpt) NO-ERROR .     
END.

dispQuery:QUERY-OPEN .

I'm facing an issue (I think it is).
For information this code work very well .

In the top after preparing the dynanmic temp-table, I set buffers of this dynamic temp-table.
If I remember correctly buffers for static temp-table work like this:
Code:
DEFINE TEMP-TABLE TT1
    FIELD numenr AS INTEGER
    FIELD text1     AS CHARACTER .
    
DEFINE BUFFER hello  FOR TT1.
DEFINE BUFFER chose FOR TT1.

CREATE TT1.
ASSIGN
    numenr = 1
    text1   = "hello" .

CREATE TT1.
ASSIGN
    numenr = 2
    text1  = "by" .
    
FIND hello  WHERE hello.numenr = 1 NO-LOCK NO-ERROR .
FIND chose WHERE chose.numenr = 2 NO-LOCK NO-ERROR .

MESSAGE hello.text1 SKIP
        chose.text1
    VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
/* This will prompt
hello
by
*/

But with my dynamic temp-table :
BUFFIN = TTFIN:DEFAULT-BUFFER-HANDLE .
BUFPIC = TTFIN:DEFAULT-BUFFER-HANDLE .

If I do the same thing the message will be :
by
by

So I'm looking for a way to have the same thing with dynamic temp-table . Maybe it's not possible .

Best Regards,

- BobyIsProgress -
 
Ok, I found the answer to my question :

Code:
DEFINE VARIABLE TTFIN AS HANDLE      NO-UNDO.
DEFINE VARIABLE bH1 AS HANDLE      NO-UNDO.
DEFINE VARIABLE bH2 AS HANDLE      NO-UNDO.

DEFINE VARIABLE qh1 AS HANDLE      NO-UNDO.
DEFINE VARIABLE qh2 AS HANDLE      NO-UNDO.

CREATE TEMP-TABLE TTFIN .
TTFIN:ADD-NEW-FIELD("numenr","INTEGER").
TTFIN:ADD-NEW-FIELD("valeur","CHARACTER").

TTFIN:TEMP-TABLE-PREPARE("TTFIN") .

CREATE BUFFER bH1 FOR TABLE TTFIN .
CREATE BUFFER bH2 FOR TABLE TTFIN .

bH1:BUFFER-CREATE .
bH1:BUFFER-FIELD("numenr"):BUFFER-VALUE = 1 .
bH1:BUFFER-FIELD("valeur"):BUFFER-VALUE = "hello" .


bH2:BUFFER-CREATE .
bH2:BUFFER-FIELD("numenr"):BUFFER-VALUE = 2 .
bh2:BUFFER-FIELD("valeur"):BUFFER-VALUE = "by" .

MESSAGE bH1:BUFFER-FIELD("valeur"):BUFFER-VALUE SKIP
        bH2:BUFFER-FIELD("valeur"):BUFFER-VALUE
    VIEW-AS ALERT-BOX INFO BUTTONS OK.
 

Stefan

Well-Known Member
Did you know that you can also use a short-hand form when working with dynamic fields?
Code:
bH1:BUFFER-CREATE().
bH1::numenr = 1 .
bH1::valeur = "hello" .

bH2:BUFFER-CREATE() .
bH2::numenr = 2 .
bh2::valeur = "by" .

MESSAGE
   bH1::valeur SKIP
   bH2::valeur
VIEW-AS ALERT-BOX.
Not only does it save typing, but more importantly, it unclutters your code.
 
Last edited:
Thank you @Stefan ,

I didn't notice while searching for information. I will update my code ASAP.

Also one thing I'm surprised is how fast it works. I remember reading somewhere that dynamic table/query where more more slower than static one .
But dosen't look that way for me .
 
Top