Sage X3 – How to use ATEXTRA
What is ATEXTRA ?
ATEXTRA table exist since Adonix (1997) to store a part of translated text of the application.
The weak point of this method is the size limitation, specificaly the maximum lenght of the boxes.
It is not possible to store more than 80 characters for a box within this method.
You can find usage example in [M:ITM0] and [M:ITM1] screen.
Standard provides you 4 types of variable according to the lenght you need
AX1 = max 12 Character
AX2 = max 20 Character
AX3 = max 30 Character
AXX = max 80 Character, this type allow you to define the limit directly in the screen It is useless to input a lenght biger than 80 because you have a limitation in the ATEXTRA.src 4GL source code also and your text will be truncated
How does the system store the translated data in ATEXTRA table ?
CODFIC : Table concerned by the translation
ZONE : Name of the screen box
LANGUE : Translation language (FRA, ENG …)
LANORI : Original language (optional)
IDENT1 : 1st index
IDENT2 : 2nd index
TEXTE : Trsnalated text
The most important part are the index (IDENT1 + IDENT2), they are different for each table and they are the index that allow the system to retrieve the correct translation from the database.
For standard table already using ATEXTRA this index cannot be changed.
Example of usage for this identifier
GACCOUNT : Account (GESGAC)
IDENT1 = GACCOUNT.COA
IDENT2 = GACCOUNT.ACC
VATBOX : VAT Cases (GESVTB)
IDENT1 = VATBOX.VATFNC
IDENT2 = VATBOX.LEG + «~» + VATBOX.LIN
GTYPACCENT : Document type (GESGTE)
IDENT1 = GTYPACCENT.TYP
IDENT2 = GTYPACCENT.LEG
TABVACBPR : BP tax rule (GESTVB)
IDENT1 = TABVACBPR.VACBPR
IDENT2 = TABVACBPR.LEG
TABVACITM : Tax level (GESTVI)
IDENT1 = TABVACITM.VACITM
IDENT2 = TABVACITM.LEG
TABVAC : Tax determination (GESTVC)
IDENT1 = TABVAC.COD
IDENT2 = TABVAC.LEG
TABVAT : Tax rate (GESTVT)
IDENT1 = TABVAT.VAT
IDENT2 = TABVAT.LEG
How to use ATEXTRA ?
Standard read of ATEXTRA
Example screen [M :ITM0]
4GL read ATEXTRA with 4GL
# Method 1 : Reading ATEXTRA with 2 index
Call LECTEXTRA([M :XS4L1]DES1AXX(nolign-1), »XSTRXX4L », »DES1AXX »,[L]XIDENT1,[L]XIDENT2) From ATEXTRA # Method 2 : Reading ATEXTRA with 2 index [M :XS4L1]DES1AXX([F :XS4L1]LIN-1) = func AFNC.TEXTRA(« XSTRXX4L », »DES1AXX »,[L]XIDENT1,[L]XIDENT2) [M :XS4L1]DES2AXX([F :XS4L1]LIN-1) = func AFNC.TEXTRA(« XSTRXX4L », »DES2AXX »,[L]XIDENT1,[L]XIDENT2) [M :XS4L1]DES3AXX([F :XS4L1]LIN-1) = func AFNC.TEXTRA(« XSTRXX4L », »DES3AXX »,[L]XIDENT1,[L]XIDENT2) # Method 3 : Reading ATEXTRA with 1 index Call CHARGE_DEFITMDES(« DES1AXX »,GLANGUE,[F :XS4LD]INDX,[M :XS4L1]DES1AXX(nolign), « [F :XS4LD] ») From TRTX3 # Method 4 : Reading ATEXTRA with 1 index Call CHARGE_ITMDES(« DES1AXX »,GLANGUE,[F :XS4LD]INDX,[M :XS4L1]DES1AXX([F :XS4LD]LIN)) From TRTX3 # Method 5 : Reading ATEXTRA with 1 index Call GET_ATEXTRA(« XSTRXX4LD », »DES1AXX »,GLANGUE,[M :XS4L1]DES1AXX([F :XS4LD]LIN)) From TRTX3TEX |
4GL import specific table in ATEXTRA with 4GL
$IMP_ATEXTRA
If [F:XX4LSTR]LIN > 0 [L]XIDENT1 = [F:XX4LSTR]COA+[F:XX4LSTR]RPTCOD+num$([F:XX4LSTR]YEA) [L]XIDENT2 = [F:XX4LSTR]RPTBOX Read [F:AXX] AXX0=”XX4LSTR”;”DES1AXX”;[L]XLANGUE;[L]XIDENT1;[L]XIDENT2 [F:AXX]TEXTE = left$([M:XX4LSTR1]DESAXX([F:XX4LSTR]LIN-1),80) If !fstat Rewrite [F:AXX] Else Gosub ATEXTRA_HEADER [F:AXX]ZONE = “DES1AXX” Write [F:AXX] Endif If len(mid$([M:XX4LSTR1]DESAXX([F:XX4LSTR]LIN-1),81,80)) > 0 Read [F:AXX] AXX0=”XX4LSTR”;”DES2AXX”;[L]XLANGUE;[L]XIDENT1;[L]XIDENT2 [F:AXX]TEXTE = mid$([M:XX4LSTR1]DESAXX([F:XX4LSTR]LIN-1),81,80) If !fstat Rewrite [F:AXX] Else Gosub ATEXTRA_HEADER [F:AXX]ZONE = “DES2AXX” Write [F:AXX] Endif Endif If len(mid$([M:XX4LSTR1]DESAXX([F:XX4LSTR]LIN-1),161,80)) > 0 Read [F:AXX] AXX0=”XX4LSTR”;”DES3AXX”;[L]XLANGUE;[L]XIDENT1;[L]XIDENT2 [F:AXX]TEXTE = mid$([M:XX4LSTR1]DESAXX([F:XX4LSTR]LIN-1),161,80) If !fstat Rewrite [F:AXX] Else Gosub ATEXTRA_HEADER [F:AXX]ZONE = “DES3AXX” Write [F:AXX] Endif Endif Endif Return |