Partekatu bidez


X++-en makroak

Oharra

Komunitatearen interes taldeak Yammer-etik Microsoft Viva Engage-ra mugitu dira. Viva Engage komunitate batean sartzeko eta azken eztabaidetan parte hartzeko, bete Eskatu Finantza eta Eragiketak Viva Engage komunitatearen sarbidea inprimakia eta aukeratu sartu nahi duzun komunitatean.

Artikulu honetan X++-n makroak nola sortu eta erabili azaltzen da.

Aurrekonpilatzailearen zuzentarauak, hau da, makroak, kontzeptualki prozesatzen dira kodea konpilatu aurretik. Zuzentarauek makroak eta haien balioak deklaratu eta kudeatzen dituzte. Zuzentarauak izendatzen duten edukiarekin ordezkatzen dira, beraz, konpilatzaileak ez ditu inoiz topatuko. X++ konpilatzaileak zuzentarauek X++ kodean idatzitako karaktereen sekuentzia soilik ikusten du.

Abisua

Makroak ezaugarri zaharrak dira eta etorkizuneko bertsioetan zaharkituta egon daitezke. Erabili hizkuntza-eraikuntzak horren ordez: Makroen ordez, erabili hizkuntza-eraikuntza hauek:

Makroak definitzea

Izendatutako makro bat definitzen duzu behean agertzen den sintaxia erabiliz

  • #define. MyMacro(Value) makro bat sortzen du aukerako balio batekin.
  • #if. MyMacro-k makro bat definituta dagoen egiaztatzen du.
  • #undef. MyMacro-k makroaren definizioa kentzen du.

#define eta #if zuzentarauak

Aurrekonpilatzailearen zuzentarau eta sinbolo guztiak karakterearekin # hasten dira.

Definitu makro bat honako sintaxiarekin:

#define.MyMacro(Value) // creates a macro with a value.
#define.AnotherMacro() // creates a macro without a value.

Makro bat defini dezakezu zure kodearen edozein lekutan. Makroak karaktere-sekuentzia bat izan dezake, baina ez du baliorik izan behar. Zuzentarauak #define aurrekonpilatzaileari makro aldagaia sortzeko agintzen dio, aukeran balio bat sartuta.

Zuzentarauak #if aldagaia definituta dagoen egiaztatzen du eta, aukeran, balio zehatz bat duen ala ez, ondorengo adibidean erakusten den bezala:

#if.MyMacro
  // The MyNaacro is defined.
#endif

#ifnot.MyMacro
  // The MyNaacro is not defined.
#endif

X++ aurrekonpilatzailearen zuzentarauak, definitzen dituzten makroen izenak eta zuzentarauen balioen probak #if ez dira maiuskulak eta minuskulak bereizten. Hala ere, definitu letra maiuskulaz hasten diren makro-izenak.

#undef zuzentaraua

Erabili zuzentaraua #undef lehendik #definedagoen makro-definizio bat kentzeko.

#undef.MyMacro
#if.MyMacro
   // The macro is not defined, so this is not included
#endif

Kendu #undef duzun makro-izen bat birdefini dezakezu beste #define.

Erabili makro-balioa

Makro-izen bat balio bat izan dezan defini dezakezu.

#define.Offset(42)
...
print #Offset; // 42

Makro balio batek ez du datu mota jakin bat, karaktere-sekuentzia bat besterik ez da. Esleitu balio bat makro bati, zuzentarau baten #define.MyMacro amaieran parentesi artean sartutako balioa emanez. Erabili makroaren ikurra X++ kodean balioa agertzea nahi duzun lekuan. Makro ikurra makroaren izena da, # karakterea aurrizki gisa gehituta. Ondorengo kode-adibidean makro ikurra erakusten #MyMacro. Ikurra makroaren balioarekin ordezkatzen da.

Probatu makroaren balioa

Makro bat probatu dezakezu balioren bat duen ala ez jakiteko. Bere balioa karaktere-sekuentzia jakin baten berdina den ere zehaztu dezakezu. Proba hauek aukera ematen dizute kode-lerroak X++ programan baldintzapean sartzeko. Ez modurik makro definitu batek balio bat duen ala ez egiaztatzeko. Makroaren balioa balio zehatz batekin bat datorren ala ez soilik egiazta dezakezu. Praktika egoki gisa, definitu beti balio bat definitzen duzun makro-izen batentzat, edo inoiz ez definitu baliorik. Modu horien artean txandakatzen duzunean, zure kodea ulertzeko zaila bihurtzen da.

#defInc eta #defDec zuzentarauak

#defInc #defDec eta makro baten balioa interpretatzen duten zuzentarau bakarrak dira. Aurrekonpilatzaileak int mota formalera bihur dezakeen balioa duten makroei soilik aplikatzen zaie. Zuzentarau hauek makro baten zenbakizko balioa aldatzen dute konpilazio garaian. Balioak zenbakiak soilik eduki ditzake. Onartzen den karaktere ez-numeriko bakarra hasierako zeinu negatiboa da (-). Osoko balioa X ++ int gisa tratatzen da, ez int64 gisa. Zuzentarauak erabiltzen dituen makro izenen #defInc kasuan, #define makroa sortzen duen zuzentarauak ez luke klase deklarazio batean egon behar. Kasu horietan jokabide #defInc aurreikusezina da. Horren ordez, defini makro horiek metodo batean bakarrik. Erabili #defInc eta #defDec zuzentarauak osoko balioa duten makroetarako soilik. Aurrekonpilatzaileak arau #defInc bereziak jarraitzen ditu makroaren balioa zenbaki osoa ez denean edo balioa ezohikoa edo muturrekoa denean. Ondorengo taulan zero (0) bihurtzen diren balioak #defInc agertzen dira, eta, ondoren, gehitu egiten direnak. Balio bat 0 bihurtzen denean #defInc , ezin duzu jatorrizko balioa berreskuratu, ezta #defDec.

Makroaren balioa defInc-en balioa Portaera
(+55) 56 Zeinu positiboa (+) aurrizkiak aurrekonpilatzaileak balio hau zenbakiz kanpoko kate gisa tratatzen du. Aurrekonpilatzaileak zenbakizkoak ez diren kate guztiak 0 gisa tratatzen ditu (edo #defInc) zuzentarau bat #defDec kudeatzen duenean.
("3") 1 Komatxo artean sartutako zenbaki osoak 0 bezala tratatzen dira.
( ) 1 Zuriune-kate bat 0 gisa tratatzen da.
() 1 Zero luzera duen katea 0 gisa tratatzen da.
(Ausazko katea) 1 Zenbakizkoak ez diren karaktere-kate guztiak 0 gisa tratatzen dira.
(0x12) 1 Zenbaki hamaseitarrak zenbakizkoak ez diren kate gisa tratatzen dira. Beraz, aurrekonpilatzaileak 0 bihurtzen ditu.
(-44) -43 Zenbaki negatiboak onargarriak dira.
(2147483647) -2147483648 Gehienezko int balio positiboa gutxieneko int negatiboaren baliora gainditzen da #defInc.
(999888777666555) 1 Edozein kopuru handi, int eta int64 ahalmenetik haratago.
(5.8) 1 Zenbaki errealak 0 bezala interpretatzen dira.
1 Zuzentarauari #define.MyValuelessMacro baliorik eta parentesirik ematen ez zaionean, balioa 0 da.

#globaldefine zuzentaraua

Zuzentaraua #globaldefine zuzentarauaren #define antzekoa da. Erabili #define ordez #globaldefine.

#localmacro eta #macro zuzentarauak

Zuzentaraua #localmacro aukera ona da makro batek hainbat lerro dituen balioa izatea nahi duzunean, edo zure makro-balioak itxiera parentesi bat duenean, iturburu-kodearen zatiak edukitzeko hautagai onak bihurtuz.

    #macro.RetailMatchedAggregatedSalesLine(
                %1.price            == %2.price
        &&      %1.businessDate     == %2.businessDate
        &&      %1.itemId           == %2.itemId
        &&      ((((%3) && (%1.qty <= 0)) || ((! %3) && (%1.qty > 0))) || (%4))
    )
    #endmacro

Zuzentaraua #localmacro honela #macroidatzi daiteke. Hala ere, #localmacro gomendatutako terminoa da. Zuzentaraua #if erabiliz, makro-izen bat zuzentarauarekin #define deklaratzen den ala ez egiazta dezakezu. Hala ere, ezin duzu egiaztatu makroaren izena zuzentarauarekin #localmacro deklaratzen den. Zuzentaraua #define erabiliz deklaratutako makroei soilik eragiten diete #undef zuzentarauak. Zuzentarau batean #define , dagoeneko esparruan #localmacrodagoen izen bat zehaztu dezakezu. Efektua da baztertu eta #localmacro makro bat #define sortzea. Hau kontrako sekuentziari ere aplikatzen zaio, hau da, a-k #localmacro a birdefinitu #definedezake. A-k #localmacro (makro-izen bat eta balio bat dituena) izen bera duen aurrekoa #localmacro gainidazten du beti. Arazo bera gertatzen da #globaldefine. Makro baten #define eta makro baten #localmacro arteko desberdintasun nagusia haien sintaxia nola amaitzen den da. Amaierak honako hauek dira:

  • #define - Amaitu egin da - )
  • #localmacro - Amaitu egin da - #endmacro

#localmacro Aukera hobea da lerro balio anitz dituzten makroetarako. Lerro anitzeko balioak normalean X ++ edo SQL kodearen lerroak dira. X++ eta SQLk parentesi ugari dituzte, eta horiek goizegi amaituko lukete #define. Biak #define eta #localmacro lerro bakarrean edo ondorengo lerroetan deklaratu eta amaitu daitezke. Praktikan, the deklaratuta #define dagoen lerro berean amaitzen da. Praktikan, ondorengo #localmacro lerro batean amaitzen da.

Makroen parametroak

Makroen balioak defini ditzakezu parametroen ikurrak sartzeko. Lehenengo parametroaren sinboloa %1, bigarrena %2, eta abar. Parametroen balioak pasatzen dituzu hedapenaren makro-ikurraren izena erreferentzia egiten duzunean. Makro parametroen balioak mota formalik gabeko karaktere-sekuentziak dira, eta komaz mugatuta daude. Ez modurik koma bat parametro baten balio gisa pasatzeko. Igarotako parametro kopurua makroaren balioa jasotzeko diseinatuta dagoen parametro kopuruaren txikiagoa, handiagoa edo berdina izan daiteke. Sistemak desadostasunak onartzen ditu pasatutako parametro kopuruan. Makroak espero duena baino parametro gutxiago pasatzen badira, alde batera utzitako parametro bakoitza zero luzera karaktere-sekuentzia gisa tratatuko da.

Makroen ikurrak habiaratzea

Aurrekonpilatzailearen definizio-zuzentarauak kanpoko definizio-zuzentarau baten barruan habia egin ditzakezu. Definizio nagusiak hauek dira #define : eta #localmacro.

Zuzentarau bat #define zuzentarau baten #localmacro barruan eman daiteke, eta a #localmacro zuzentarau baten #definebarruan egon daiteke.

#macrolib zuzentaraua

Aplikazioen esploratzailean, Kodea nodoko Makroak nodoan, liburutegiko nodo asko daude makro zuzentarau multzoak dituztenak. Biak eta #define askotan #localmacro makro liburutegi horien edukietan agertzen dira. Erabil dezakezu #macrolib. MyAOTMacroLibrary , makro-liburutegi baten edukia X++ kodean sartzeko. #if Eta #undef jarraibideak ez zaizkie #macrolib izenei aplikatzen. Hala ere, makro baten #define edukia diren zuzentarauei aplikatzen zaizkie.#macrolib Zuzentaraua #macrolib. MyAOTMacroLibrary #MyAOTMacroLibrary gisa ere idatzi daiteke . Aurrizkia #macrolib gomendatzen da, inoiz ez baita anbiguoa gero kodea irakurtzen duen pertsona batentzat.

#linenumber zuzentaraua

Zuzentaraua #linenumber erabil dezakezu kodea garatzeko eta araztean. Kode-fitxategiko lerro zenbaki fisikoarekin ordezkatzen da makro hedapen baten aurretik.

Makroaren esparrua

Makro bat erreferentzia dezakezun barrutia makroa definitzen duzun lekuaren araberakoa da. Klase batean, klase gurasoan definitzen dituzun makroei erreferentzia egin diezaiekezu. Aurrekonpilatzaileak klase ume bat kudeatzen duenean, lehenik eta behin herentzia-katea erro-klasera eramaten du. Ondoren, aurrekonpilatzaileak zuzentarau guztiak prozesatzen ditu erroko klasetik konpilatzen ari den klaseraino. Makro guztiak eta haien balioak bere barne-tauletan gordetzen ditu. Klase deklarazio bakoitzeko zuzentarauen emaitzak herentzia-katean lehenago aurkitutako zuzentarauetatik beteta dauden barne-taulei aplikatzen zaizkie.

Hala ere, aurrekonpilatzaileak metodo bakoitza bereizita kudeatzen du. Bere barne taulak eguneratzen ditu, taulen egoera uneko metodoa prozesatu aurretik zeuden bezala berreskuratu ahal izateko. Aurrekonpilatzaileak lehenengo metodoa kudeatu ondoren, barneko taulak berreskuratzen ditu hurrengo metodoa kudeatu aurretik.

Testuinguru honetan, metodo bat aplikazio objektuen zuhaitzean (AOT) metodo-nodo baten edukia bezala definitzen da. AOTn, Klaseak nodoa zabal dezakezu, klase nodo bat zabaldu, metodo-nodo batean eskuineko botoiarekin klik egin, eta, ondoren, hautatu Editatu. Ondoren, lerro bat gehi dezakezu metodoaren #define.MyMacro("abc") deklarazioaren aurretik. Aurrekonpilatzaileak zuzentarau hau #define metodoaren zati gisa tratatzen du, nahiz eta metodoaren #define bloketik {} kanpo gertatzen den.