<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://kb.sagedev.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=5.90.131.245</id>
	<title>SageDev KB - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://kb.sagedev.it/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=5.90.131.245"/>
	<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php/Special:Contributions/5.90.131.245"/>
	<updated>2026-04-18T10:20:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=420</id>
		<title>Crystal Report</title>
		<link rel="alternate" type="text/html" href="https://kb.sagedev.it/index.php?title=Crystal_Report&amp;diff=420"/>
		<updated>2021-04-19T16:07:14Z</updated>

		<summary type="html">&lt;p&gt;5.90.131.245: /* Formule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Le istruzioni devono terminare con un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;, eccetto l'ultima per cui è facoltativo. L'ultima istruzione rappresenta il valore di ritorno di una formula.&lt;br /&gt;
&lt;br /&gt;
In caso di istruzioni raggruppate con parentesi tonde (come per esempio negli &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;), tale gruppo rappresenta un'istruzione e in caso di istruizioni successive deve anch'esso essere seguito da un &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Condizioni ==&lt;br /&gt;
&lt;br /&gt;
if &amp;lt;condition&amp;gt; &lt;br /&gt;
then &amp;lt;then&amp;gt; &lt;br /&gt;
else &amp;lt;else&amp;gt; &lt;br /&gt;
&lt;br /&gt;
dove &amp;lt;condition&amp;gt;, &amp;lt;then&amp;gt; e &amp;lt;else&amp;gt; sono tutte espressioni singole. Se dopo &amp;lt;then&amp;gt; o &amp;lt;else&amp;gt; sono presenti più espressioni, convertirle in singole espressioni racchiudendole tra parentesi. Ad esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if {SDELIVERY_1.YSDHNUM_0}&amp;lt;&amp;gt;&amp;quot;&amp;quot; then&lt;br /&gt;
(&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
  crRed;&lt;br /&gt;
)&lt;br /&gt;
else&lt;br /&gt;
  lastValue := {Branch_View.Branch_ID};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Condizioni particolari ===&lt;br /&gt;
&lt;br /&gt;
Se un testo deve comparire solo se è l'ultimo record di dettaglio dell'ordine, per esempio la dicitura &amp;quot;NON APPROVATO&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (OnLastRecord or (Next({PORDER.POHNUM_0}) &amp;lt;&amp;gt; {PORDER.POHNUM_0})) then&lt;br /&gt;
    //siamo dopo l'ultimo record di dettaglio dell'ordine&lt;br /&gt;
    if {PORDER.APPFLG_0}&amp;gt;=3 then&lt;br /&gt;
        //l'ordine è stato approvato, quindi sopprimo questa sezione&lt;br /&gt;
        true&lt;br /&gt;
    else&lt;br /&gt;
        //l'ordine NON è stato approvato, quindi questa sezione deve comparire, NON devo sopprimerla&lt;br /&gt;
        false&lt;br /&gt;
else &lt;br /&gt;
// non è l'ultimo record dell'ordine; sopprimo la sezione&lt;br /&gt;
    true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire un'intestazione solo sulla prima pagina del gruppo, mettere nella condizione Sopprimi della sezione l'istruzione:&lt;br /&gt;
&amp;lt;pre&amp;gt;InRepeatedGroupHeader&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per far comparire qualcosa solo nell'ultima pagina, mettere nella condizione Ometti:&lt;br /&gt;
&amp;lt;pre&amp;gt;PageNumber &amp;lt;&amp;gt; TotalPageCount&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conversioni ==&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToWord(Dossier, Lingua, CodiceValuta, Importo&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo numerico&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;AmountToDigit(Dossier, Lingua, CodiceValuta, ImportoInLettere&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
permette di convertire in lettere nella lingua voluta, un importo espresso in stringa numerica&lt;br /&gt;
&lt;br /&gt;
== Formule ==&lt;br /&gt;
Per inserire un a capo in una stringa:&lt;br /&gt;
&amp;lt;code&amp;gt;testo := testo &amp;amp; ChrW (10)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per inserire una formula in un'altra formula usare la sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;{@ySageDev_Formula}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio: &amp;lt;code&amp;gt;RiferimentoDDT := RiferimentoDDT &amp;amp; &amp;quot;  -  &amp;quot; &amp;amp; {@ySageDev_RiferimentoPCKLIST}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio di indirizzo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
whilePrintingRecords;&lt;br /&gt;
global stringVar Indirizzo;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  trim({SORDER.BPDADDLIG_0}) &amp;amp; &amp;quot;  &amp;quot; &amp;amp; trim({SORDER.BPDADDLIG_1});&lt;br /&gt;
&lt;br /&gt;
if trim({SORDER.BPDADDLIG_2})&amp;lt;&amp;gt;&amp;quot;&amp;quot;  then &lt;br /&gt;
    Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; trim({SORDER.BPDADDLIG_2});&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
//&amp;amp; {SORDER.BPDSAT_0} &lt;br /&gt;
//&amp;amp; {SORDER.BPDCRY_0}&lt;br /&gt;
&lt;br /&gt;
Indirizzo:=  Indirizzo &amp;amp; chrw(10) &amp;amp; chrw(13) &amp;amp; {SORDER.BPDPOSCOD_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCTY_0} &amp;amp; &amp;quot;  &amp;quot; &amp;amp; {SORDER.BPDCRYNAM_0};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Momento di valutazione ===&lt;br /&gt;
&lt;br /&gt;
BeforeReadingRecords: prima di recuperare i record dal database&lt;br /&gt;
WhileReadingRecords: durante la lettura dei record del database ma prima del raggruppamento, dell’ordinamento e del riepilogo &lt;br /&gt;
WhilePrintingRecords: durante la stampa dei record (raggruppamento, ordinmento e riepilogo)&lt;br /&gt;
EvaluateAfter()&lt;br /&gt;
&lt;br /&gt;
== Formato Date ==&lt;br /&gt;
Se il valore data è in un campo:&lt;br /&gt;
ToText({MYFIELDNAME }, &amp;quot;dd-MMM-yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
Se è il risultato di una formula:&lt;br /&gt;
CSTR({?@ck_date}, &amp;quot;dddd, MMMM d, yyyy&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
ToText({Command.EffectiveDate} , &amp;quot;dd-MM-yyyy hh:mm:ss&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
I vari formati d dd ddd dddd M MM MMM MMMM yy yyyy&lt;br /&gt;
&lt;br /&gt;
== Barcode ==&lt;br /&gt;
Vai qui: [[CrystalReport_Barcode | Barcode]]&lt;br /&gt;
&lt;br /&gt;
== Traduzioni ==&lt;br /&gt;
=== Avviso ===&lt;br /&gt;
Le formule qui esposte di Crystal Repor recuperano le traduzioni dai file &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;\DOSSIERS\&amp;lt;nome dossier&amp;gt;\textraita&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
(se italiano) oppure &amp;lt;code&amp;gt;textrafra&amp;lt;/code&amp;gt; se francese, ecc. &lt;br /&gt;
&lt;br /&gt;
Affinché questi file siano aggiornati (quindi ogni volta dopo modifiche su campi di tipo AXX) e’ necessario eseguire la funzione di aggiornamento:&lt;br /&gt;
&lt;br /&gt;
'''''Sviluppo-&amp;gt;Strumenti-&amp;gt;Diversi-&amp;gt;Aggiornamento Testi traducibili'''''&lt;br /&gt;
&lt;br /&gt;
Le tabelle contenenti i campi traducibili usati in Crystal devono avere il '''flag &amp;quot;Generazione testi traducibili&amp;quot;''' attivo.&lt;br /&gt;
&lt;br /&gt;
=== Testi traducibili (tabella ATEXTRA) ===&lt;br /&gt;
;X3TranslatedText&lt;br /&gt;
Per recuperare una traduzione dalla tabella '''''ATEXTRA''''' utilizzare la seguente sintassi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;NOMETABELLA~NOMECAMPO~&amp;quot;+VALORECAMPO+&amp;quot;~~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In caso di dubbi verificare direttamente nella tabella ATEXTRA i vari campi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;stringVar X3TEX := &amp;quot;CODFIC_0~ZONE_0~IDENT1_0~IDENT2_0~&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&amp;lt;pre&amp;gt;stringVar X3TEX := &amp;quot;TABCOUNTRY~CRYDES~&amp;quot;+{SINVOICEV.BPDCRY_0}+&amp;quot;~~&amp;quot;;&lt;br /&gt;
stringVar PaeseTradotto := X3TranslatedText ({?X3DOS}, lang_trad, X3TEX);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Altro esempio con il testo da recuperare che consiste in un valore di una '''tabella diversa''' (vedi funzione '''''GESADI''''' da F7 in sage):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WhilePrintingRecords;&lt;br /&gt;
stringVar X3TEX := &amp;quot;ATABDIV~LNGDES~20~&amp;quot;+{SORDERP.TSICOD_0}+&amp;quot;~&amp;quot;;&lt;br /&gt;
X3TranslatedText ({?X3DOS}, {@P_lang_trad},X3TEX)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Invece di ''LNGDES'' mettere ''SHODES'' se si vuole la descrizione breve.&lt;br /&gt;
&lt;br /&gt;
=== Menù locali (tabella APLSTD) ===&lt;br /&gt;
;TextOfChapter (accesso diretto, con i numeri)&lt;br /&gt;
&lt;br /&gt;
Nella formula '''''TextOfChapter''''' si trovano in genere tutte le istruzioni per recuperare le traduzioni necessarie, con righe del tipo:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;global stringVar txtcondiV1 := TextOfChapter ({?X3DOS},   lang_trad,2281,50);&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
dove lang_trad è la variabile che contiene la lingua in cui tradurre, 2281 è il capitolo del menu (vedi funzione '''''TXT''''' da F7 in sage), e 50 è l'indice del testo da recuperare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;TextForCode (con nome campo)&lt;br /&gt;
Per recuperare la descrizione associata ad un valore di menu locale (nella lingua dell'utente):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TextForCode(&amp;quot;Dossier;server;porta;versione&amp;quot;, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Per recuperare una traduzione nella lingua voluta&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( Dossier, Lingua, &amp;quot;Tabella.Campo&amp;quot;, Valore)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esempio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TranslatedTextForCode( {?X3DOS}, {?X3LAN}, &amp;quot;{ITMMASTER.STOMGTCOD_0}&amp;quot;, ITMMASTER.STOMGTCOD_0 )&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formattazioni ==&lt;br /&gt;
&lt;br /&gt;
=== Stili ===&lt;br /&gt;
&lt;br /&gt;
Costanti di stile delle linea: si possono usare all'interno delle formule&lt;br /&gt;
&lt;br /&gt;
* ''crNoLine''  Nessuna linea di bordo&lt;br /&gt;
* ''crSingleLine''  Una sola linea di bordo&lt;br /&gt;
* ''crDoubleLine''  Doppia linea di bordo &lt;br /&gt;
* ''crDashedLine''  Linea di bordo tratteggiata&lt;br /&gt;
* ''crDottedLine''  Linea di bordo punteggiata&lt;br /&gt;
&lt;br /&gt;
== Connessione ODBC ==&lt;br /&gt;
&lt;br /&gt;
Da esperto database, tab Dati, su Connessioni personali, cliccare sul + della connessione voluta; nella finestra che esce:&lt;br /&gt;
* selezionare l'origine dati voluta e cliccare AVANTI&lt;br /&gt;
* come ID utente mettere il nome del dossier (attenzione a maiuscolo/minuscolo)&lt;br /&gt;
* cliccare FINE e attendere che il db compaia sotto la connessione personale scelta&lt;br /&gt;
* inserire la solita password&lt;br /&gt;
&lt;br /&gt;
== Cause di lentezza ==&lt;br /&gt;
&lt;br /&gt;
* una possibile causa di estrema lentezza può essere un'istruzione &amp;quot;WhilePrintingReports&amp;quot; su un campo di dettaglio; meglio puntare su una vista ben relazionata che risolve molte cose in modo più performante.&lt;/div&gt;</summary>
		<author><name>5.90.131.245</name></author>
	</entry>
</feed>