Crystal Report® & VFP® - 3parte

 

© Articolo di: Franco Felosi - Brescia 11 Luglio 2002 - Riproduzione vietata

<parte1><parte2><parte3>

In questo caso è stata scelta come destinazione "applicazione" e come formato "excel 7.0", sono previste numerose possibilità; in fase di distribuzione in base alle DLL fornite all'utente potrò decidere in quali formati potrà esportare.

Per quel che riguarda il click del pulsante "Stampa" basta eliminare le proprietà relative al layout della finestra anteprima e cambiare la destinazione del report.

mtb="C:\WINDOWS\TEMP\"+substr(sys(2015), 3, 10)+".TMP"
use arti in 0 noupdate
select arti
copy to (mtb) fields code,desc,grum,cate,marc,famg fox2x
close table
with thisform.crw1
        .reportfilename = thisform.Text2.value
        .reporttitle = thisform.Text3.value
        .datafiles(0) = (mtb)
        .discardsaveddata = 1
        .printername=left(thisform.prnset,at(",",thisform.prnset,1)-1)
        .printerport=right(thisform.prnset,len(thisform.prnset)-at(",",thisform.prnset,2))
        .printerdriver=substr(thisform.prnset,at(",",thisform.prnset,1)+1,;
                -at(",",thisform.prnset,1)+(at(",",thisform.prnset,2)-1))
        .printerselect
        if messagebox("Conferma ?",36," conferma stampa ")=6
                        destination = 1
                        .action = 1
        endif
endwith

Nota: .printerselect attiva api win per scegliere la stampante, in caso contrario la destinazione è la stampante predefinita, quella "visualizzata" in Text1.

Considerazioni

Pur utilizzando il metodo più "barbaro" per ottenere il report, i risultati sono accettabili.

In termini di velocità ho ottenuto in 55" un'anteprima di 3200 pagine con 236000 record, compreso il tempo "speso" per creare la tabella locale Fox2x (i dati risiedono su un server NT).

In applicazioni reali non utilizzo questo metodo ma accedo alle tabelle "temporanee" Visual FoxPro standard utilizzando driver ODBC (procedimento illustrato in seguito) con risultati sicuramente migliori.

Report semplice (una sola tabella libera - passaggio di variabili)

Ovviamente Crystal non "conosce" direttamente il valore d'alcuna variabile dichiarata in FoxPro ma c'è la possibilità, utilizzando formule, di scambiare dati fra un ambiente e l'altro.

Il primo passo è la creazione di una formula in Crystal.

Utilizzando l'apposito editor è possibile scrivere formule complesse, dichiarare variabili (stabilendone l'area di visibilità), si tratta di un vero e proprio linguaggio (ben documentato in inglese) con tanto di if..then, choose, switch …..

Nel nostro report:
inserisci->formula
Ctrl+N (nuova formula)
Nome formula (Es.miaformula)
Nell'editor scriviamo:
                  stringVar MVARIABILE := ""; && abbiamo semplicemente dichiarato una variabile

Trasciniamo @miaformula in una sezione del report e usciamo salvando.

Nel click del pulsante anteprima possiamo scrivere:

           .formulas(0)=[miaformula="]+variabilefox+["]

Dove: formulas(0) indica che agisco sulla prima (e unica) formula del report
            miaformula specifica il nome della formula
            +variabilefox serve per assegnare alla formula il valore di variabilefox definita in precedenza

La sintassi è: [form.]Report.Formulas(ArrayIndex)[= "FormulaName= FormulaText"]

E' possibile creare formule relative a raggruppamento ed ordinamento dati:

Modifichiamo il report c:\windows\temp\report1 eliminando il gruppo (menù->modifica->elimina gruppo)
Creiamo una nuova formula che chiameremo miogruppo
Nell'editor formula selezioniamo dalla sezione campi report articoli.FAMG
Salviamo la formula e creiamo un nuovo gruppo scegliendo come criterio di raggruppamento @miogruppo
Salviamo il report

Variamo il click del pulsante anteprima aggiungendo dopo .reporttitle = thisform.Text3.value

          .formulas(0)=[miogruppo="Gruppo merceologico: "+{articoli.GRUM}]

Lanciamo il form ed utilizzando "Anteprima"

otterremo il report con i dati raggruppati in base al campo GRUM (gruppo merceologico).

Report (due tabelle libere relazionate - ODBC)
Per realizzare un report che acceda ai dati mediante ODBC:
creare con odbc (pannello di controllo) un origine dati utente utilizzando come driver Microsoft Visual FoxPro driver, indicare come nome, ad esempio: Prova Fox, scegliere come database type free table directory ed indicare come cartella "c:\windows\temp".

Supponiamo di avere, oltre alla tabella ARTI utilizzata finora, una tabella TAGEN che contiene tutte le descrizioni di gruppi merceologici e categorie identificati da "tipo" e "code" dove tipo assume "GM" per le descrizioni dei gruppi merceologici e "CT" per le descrizioni delle categorie.

Come al solito dobbiamo creare delle tabelle "virtuali" per realizzare il report

Dalla "finestra comandi" di Visual FoxPro:
select arti.* from arti into table c:\windows\temp\articoli
select tagen.* from tagen into table c:\windows\temp\tabelle where tagen.tipo = "GM"

La tabelle sono "standard", non utilizzeremo più il formato fox2x.

Nel creare il report, sempre utilizzando l'esperto "standard", scegliamo come origine ODBC "Prova fox".
Aggiungiamo prima il file articoli ed in seguito il file tabelle
Il wizard per il "collegamento" propone una relazione "sbagliata" (è basata sul nome dei campi)
Cancelliamo il collegamento e, in modo visuale, colleghiamo il campo grum del file articoli con il campo code del file tabelle.

Con "Opzioni" è possibile impostare il tipo di join utilizzato e con "Successivo" sceglieremo i campi da includere nel report:
                                              code, desc, grum dal file articoli
                                     des1 dal file tabelle

Inseriamo un gruppo utilizzando articoli.grum e spostiamo il campo des1 dalla sezione "dettaglio" alla sezione "intestazione di gruppo …", formattiamo il report, aggiungiamo qualche "casella" e salviamo

Il click del pulsante anteprima:

mtb1="C:\WINDOWS\TEMP\"+substr(sys(2015), 3, 10)+".TMP"
select * from arti into table (mtb1) where !empty(grum) && selezione da file arti.dbf
use in arti
mtb2="C:\WINDOWS\TEMP\"+substr(sys(2015), 3, 10)+".TMP" && selezione da tagen.dbf
select * from tagen into table (mtb2) where tagen.tipo = "GM"
close table && chiudo tabelle
with thisform.crw1
               .reportfilename = thisform.Text2.value
               .datafiles(0) = (mtb1) && definisco la prima tabella del report (articoli)
               .datafiles(1) = (mtb2) && definisco la seconda tabella del report (descr. Gruppi merceologici)
               .discardsaveddata = 1
               .printername=left(thisform.prnset,at(",",thisform.prnset,1)-1)
               .printerport=right(thisform.prnset,len(thisform.prnset)-at(",",thisform.prnset,2))
               .printerdriver=substr(thisform.prnset,at(",",thisform.prnset,1)+1,;
                              -at(",",thisform.prnset,1)+(at(",",thisform.prnset,2)-1))
               .windowtitle = "Anteprima di stampa "+.reportfilename
               .WindowShowExportBtn = 1
               .WindowShowCancelBtn = 1
               .WindowShowCloseBtn = 1
               .WindowShowGroupTree = 1
               .WindowAllowDrillDown = 1
               .destination = 0
               .action = 1
endwith

Anche in questo caso con poche righe di codice, investendo un quarto d'ora per la creazione del report si ottengono risultati accettabili.


Considerazioni:

L'argomento non si esaurisce qui, ulteriori possibilità vengo offerte da report parametrici, subreport, subreport a richiesta, report con mappe geografiche, report con collegamenti ipertestuali …penso che i report allegati rendano l'idea di ciò che è possibile, con un po' di pazienza, realizzare.
I report non sono, normalmente, modificabili dall'utente finale, o meglio, l'utente che acquisterà Crystal Report per personalizzarsi le stampe è di livello piuttosto alto (rispetto allo standard) ed ha in ogni caso bisogno del supporto dello sviluppatore per documentare i campi delle tabelle (può essere economicamente vantaggioso offrire a pagamento assistenza, corsi …).

Con le versioni attuali viene anche fornito il controllo RDC integrabile nell'applicazione per modificare report a livello run-time (Naturalmente è fatto per Visual Basic ma affermano che potrà funzionare anche con "altro" non meglio specificato).

E' interessante la possibilità d'installare (ad esempio al manager aziendale) un report eseguibile: "cliccando" sull'icona ottiene il bilancio, magari con un subreport grafico senza utilizzare l'applicativo gestionale.

Per quanto riguarda la distribuzione si dovrà fornire all'utente un activex e qualche libreria in più, personalmente utilizzo "installmaker" della wise solutions che, dato il progetto, "si arrangia" a cercare tutto ciò che serve (o, forse, anche qualcosa in più) verificando addirittura se esistono in internet versioni più recenti dei file distribuiti, il tutto condizionato dal S.O. sul quale "girerà" l'applicazione.

Anche con il wizard di Visual FoxPro si riesce, comunque, a distribuire tutto ciò che serve.

Conclusione:

L'investimento non è indifferente ma penso che valga la pena, l'importante è capire la filosofia del prodotto, VFP prepara i dati e Crystal lì "presenta".

La possibilità di utilizzare più di 200 funzioni suddivise per categoria, comprendenti strutture di controllo tipo "valuta l'espressione mentre stampi o mentre leggi i record", "if … then …else", "do while", "select case","for next" permette di estendere la flessibilità del report.

Le capacità grafiche sono notevoli ed anche utilizzando i soli wizard si ottiene un risultato decente.In un'applicazione gestionale si possono riscontrare difficoltà nella gestione delle "vecchie" stampanti ad aghi.

La velocità è buona ed il risultato finale ha un impatto notevole in fase di dimostrazione commerciale al cliente finale.
Nelle versioni developer e professional sono presenti numerosi tools per l'integrazione con interdev e per il "web reporting" e s'integra perfettamente con Microsoft Office.

Superate le difficoltà iniziali, legate soprattutto alla documentazione in inglese ed al lavoro per "capire" gli esempi orientati a Delphi o Visual Basic, ritengo sia un prodotto piuttosto utile per lo sviluppatore che vuole offrire report "personalizzati" ai propri clienti, non penso, invece, che sia un prodotto adatto all'utente finale medio.
Link utili:

http://support.crystaldecisions.com/samples/
http://www.innovationsltd.com/crystal1.htm
http://support.crystaldecisions.com/updates/
http://www.questar.it/
http://forums.belution.com/en/crystal/
http://www.tek-tips.com/
http://support.crystaldecisions.com/forums/

 

© Articolo di: Franco Felosi - Brescia 11 Luglio 2002 - Riproduzione vietata

© FoxPro e Visual FoxPro sono un marchi registrati da Microsoft Corporation
© Crystal Report è un marchio di proprietà SEAGATE TECNOLOGY LLC

 



Data: 13/07/2002
webmaster@foxitaly.com

 

dal 22 Giugno 1999