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