Newsgroup: it.comp.lang.delphi
Titolo: report "flessibile"

supponiamo di avere un DB con 10 tabelle il mio problema è creare un report con un numero flessibile di tabelle....
per fare un esempio supponiamo che l'utente decida di fare una certa scelta, questa scelta porta alla generazione di un report con la tabella 1,2,3,4.
se l'utente invece fa un'altra scelta bisogna generare un report con le tabelle 1,2
se fa un'altra scelta ancora bisogna generare un report con le tabelle 9,10
 
ecc......
 
esiste qualche report, preferibilmente free per delphi 6.00 che mi permetta generare report con un numero di tabelle non fisse o meglio non note a design time?

 esiste qualche report, preferibilmente free per delphi 6.00 che mi permetta generare report con un numero di tabelle non fisse o meglio non note a design time?
 
Delphi 6 non include *RAVE Reports*?
 
Probabilmente, puoi creare un report con più pagine con il "RAVE Designer" e dedicare una tabella a ogni pagina del report.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 

 il mio problema è creare un report con un numero flessibile di tabelle....
 
Molto comoda, come cosa.....
 
Sai di certo che lavorando in questo modo non puoi assolutamente progettare a monte un layout eccessivamente articolato. 
Ancor prima di pensare al "come" e al "cosa usare", la prima domanda è:
 
Il tuo cliente cosa si aspetta di ottenere? 
 
Senza questa informazione è difficilie ipotizzare una soluzione...
 
A.

non è possibile ipotizzare di utilizzare più pagine di report ognuna delle quali abbia una combinazione diversa perchè le combinazioni le tabelle da visualizzare nel report non sono assolutamente note a design time ma dipendono dalle scelte dell'utente.
spiego meglio quello che voglio ottenere
il programma, tra le altre cose, deve stampare un report fatto in maniera diversa a seconda di come l'utente fa o meno delle scelte.
Per esempio, nel programma c'è una lista di persone, ad ogni persona sono associate tramite apposite relazioni nel DB delle tabelle. la presenza o meno di ciascuna persona nelle tabelle è modificabile a piacere dall'utente quindi quando scrivo il codice non so e non posso sapere se l'utente PIPPO è associato (è presente o meno) nella tabella 1 o nella 2 e di conseguenza non posso realizzare un report dove per l'utente PIPPO metto la tabella 1 e la 2.
Quando l'utente utilizzerà il programma inserirà la persona PIPPO ad esempio nella tabella 3 e nella 4 mentre la persona pluto nella tabella 1, nella 10 e nella 12
quindi dovrò stampare i miei report che saranno:
per PIPPO - tabella 1 e 2
per PLUTO - tabella 1 - 10 e 12
 
ma come fare visto che il layout dovrebbe essere flessibile per numero e per tipologia di tabelle?

 per PLUTO - tabella 1 - 10 e 12
 
 
si..ok...ma ripeto: l'utente che tipo di layout si aspetta? 
 
 
A.


l'utente si aspetta che se seleziona PIPPO avrà u report fatto con tabella 1 e tabella 2
se invece selezione pluto il remport sarà composto da tabella 1, 10 e 12
il problema è che a priori in no so quante persone ci sono nel DB e non so neppure per ciascuna persona quante tabelle sono state associate

 il problema è che a priori in no so quante persone ci sono nel DB e non so neppure per ciascuna persona quante tabelle sono state associate
 
La maggior parte delle persone che progetta report non sa quanti sono i record al suo interno, altimenti i tool di reporting sarebbero molto più semplici di quello che in realtà sono. :)
 
Ma hai letto la mia prima risposta?
 
Se non dai un feedback ai suggerimenti che ti vengono dati (che siano positivi o negativi) e continui a riproporre la domanda, non si va da nessuna parte.


 fatto con tabella 1 e tabella 2
 
Il problema non è mettere insieme questi dati.
Il problema è la loro rappresentazione SU CARTA.
 
Che significa "fatto con tabella 1 tabelle 2tc"?
Fatto COME?  
Tabellare , ad albero, testata/righe, pagina di giornale o che altro?
 
A.

 ma come fare visto che il layout dovrebbe essere flessibile per numero e per tipologia di tabelle?
 
Le N tabelle hanno tutte struttura diversa o sono, in qualche modo, 
ristrutturabili in un'unica tabella con dei campi che possono fare da 
filtro?
 
-- 
@WarpTen10

per marco breveglieri
si ho letto la tua risposta e ti ho anche risposto... non posso creare tante pagine quante sono le tabelle perchè le combinazioni sono veramente tante.. e il problema non sono i rerod presenti in una tabella ma le molteplici tabelle
 
per alberto salvati
""
Che significa "fatto con tabella 1 tabelle 2tc"? 
Fatto COME?   
Tabellare , ad albero, testata/righe, pagina di giornale o che altro? 
""" 
tabellare, alla fine il mio report deve essere di tipo tabellare ossia semplicemente una successione di tabelle (ma non so a priori quante tabelle)
 
per Warp 10
le tabelle hanno tutte o quasi una struttura diversa
 
in pratica quello che servirebbe a me è qualcosa del tipo.....
 
if condizione soddisfatta then
  inserisci tabella nel report
else
  non inserisci tabella e passa al punto successivo
 
 

Do per scontato che non esista un tool che fa quello che ti serve.
Se esiste, qualcuno posti un link.
 
Immaginando che non esiste, io farei cosi:
 
 
 
Crea una tabella sul database. Questa tabella, deve avere almeno:
 
a) id numerico della riga
 
b) livello
 
c) id della riga "master". I record al top avranno questo campo impostato a -1 
o null
 
d) un campo che contiene il dato da stampare, pronto e denormalizzato. 
Ad esempio, nel caso degli indirizzi quest'unico campo conterrà tutti insieme via, numero civico, citta, capo, provincia etc. Nel caso di dati anagrafici di una persona contterà cognome, nome, data di nascita, codice fiscale etc.
 
e) almeno un campo identificativo del processo di stampa.
Se usi oracle, firebird, interbase o db2, puoi usare un ID generato tramite una sequence o un generator.
Se ui un db che non prevede questi meccanismi, usa una tabella di contatori.
Niente GUID (non garantiscono univocita  e sono complicati da digitare e da leggere....), niente dati casuali (una branca della legge di murphy prevede cose agghiacciantio su quello che puo' andare storto usando numeri generati a caso da un computer). 
Nome utente e nome workstation solo cme dati di supporto.
Pensa al caso di un utente che usa la tua app da 2 client diversi o piu' utenti che usano la tua app sulla stessa workstation da 2 diverse sessioni terminal...
 
A fronte delle selezioni dell'utente popoli questa tabella.
Questa tabella la usi per un report scemo, gestibile da qualsiasi tool: rb, fastreport, freereport, qquickreport, crystal....
Ovviamente, ma non per tutti, la query saà del tipo:
 
select * from tabella 
where  
identificativoreport = qualcosa // punto (e)
order 
by idriga, idrecordmaster, livello
 
Non insultero il to QI spiegando quanto è importante usare un order by fatto cosi'...
 
Questo report avrà una sola banda di tipo dettaglio. 
...si..ovviamente sotto le solie cose (data ora etc....)
 
In fase di stampa, in funzione del livello la riga sarà spostata piu' verso sinistra. La riga punterà ovviamente al campo (d).
 
Esempio:
l'utente sceglie clienti, sedi, fatture
 
1) fai una query che legge solo i clienti (niente join!)
fai una insert nella tabella. come valre da stampare metti ragione sociale, e partita iva. 
Il livello sarà :0
Tieni da parte l'id di questo record
 
2) per il cliente al punto 1 fai una query sulle sedi
INserisci un record nella tabella.
IDmaster è ID della riga del cliente al punto 1.
Il dato da stampare sara, indirizzo, citta, provincia etc etc etc
Il livello sarà :1
Tieni da parte l'id di questo record
 
3) per la sede al punto 2 fai una query sulle fatture
INserisci un record nella tabella.
IDmaster è ID della riga della sede al punto 2.
Il dato da stampare sara, numero data, importo iva...
Il livello sarà :2
 
etc etc etc
 
 
idrecordmaster e livello si prestano alla perfezione anche per gestire salti di pagina e altre amenità del genere.
Infine, se hai tabella allo stesso livello, aggiungi alla tabella un altro campo (sotto-livello).
 
A.
 
 
 
 
 
 

   non inserisci tabella e passa al punto successivo
 
Ah, non avevo mica capito dal tuo primo messaggio...
 
Per fare una cosa del genere in quickreport (suppongo che in altri
motori di report si possa fare qualcosa di simile...) noi abbiamo
risolto cosi':
 
Le N tabelle opzionali sono altrettante bande SubDetail con 
GroupHeader e GroupFooter per mettere le intestazioni delle 
colonne e gli eventuali totali in fondo.
 
Nel report abbiamo messo un set che contiene le opzioni.
Questo set viene riempito in base alle opzioni del cliente
prima di lanciare il report.
 
  type
    TClientePrintOption = (STAMPA_CONTATTI, STAMPA_XXX, ...)
 
  TStampaClientiQR = class( TQuickReport ) 
    ...
    PrintOptions : set of TClientePrintOption ;
 
Poi nell'evento "BeforePrint" delle varie Bande abbiamo
messo gli if del caso:
 
procedure TListaClientiQR.ContattiBeforePrint(Sender: TQRCustomBand;
  var PrintBand: Boolean);
begin
  // stampa la banda solo se il flag corrispondente e' settato
  PrintBand := (STAMPA_CONTATTI in Self.PrintOptions);
end;
 
Se il sotto-report va stampato in base non a dei flag fissi ma in
base al valore di determinati campi del record principale puoi
cambiare la condizione di IF senza problemi, comunque l'evento
viene valutato durante la stampa del report, non all'inizio,
quindi i valori dei dataset del report li hai gia' a disposizione.
 
ciao
Giacomo
 
 
 

ok, assodato che la cosa è fattibile con qreport conoscete dove poter scaricare una guida.. possibilmente in italiano ?
grazie

 il problema � che a priori in no so quante persone ci sono nel DB e non so neppure per ciascuna persona quante tabelle sono state associate
 
Questo � un caso che risolverei mettendo una tabella nel database che
contiene queste regole.
 
Chiaramente deve essere chiara l'analisi, e su questo vedo che non lo
sei abbastanza. HAi presente cos`� un class diagram?
Sarebbe molto pi� utile se riuscissi a rappresentare le classi e
spiegarcele in modo esaustivo.
 
Chiarito questo, non vedo poi cos� difficile mettere le regole sul
database in modo che possano crescere e modificarsi dinamicamente, con
l'evoluzione dei dati di dominio.
 
-- 
morde
Android
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database
 

[...] 
 
E' una buona soluzione che sfrutta la potenza del report engine.
 
Cos� per curiosit�: potizzate di voler mettere queste regole in una
tabella di database, sarebbe pi� facile e fattibile secondo te?
Attualmente quanto vi costa modificare le regole sul report? Immagino
che sia una modifica rapida ma non banale, dovendo tenere conto di tutti
i punti dove intervenire sugli if nel codice del report e sulle sotto bande.
 
BTW, anche l'idea di MArco iniziale di creare n subreport non � male.


 l'evoluzione dei dati di dominio.
 
Perdonatemi se uso il ng per i miei cazzi: Morde, ci sei ancora su Skype? :)
 
 
-- 
Jax

a questo punto la soluzione è mettere tutte le regole che servono nel DB per tirare fuori un'unica tabella che verrà inserita nel report.
la soluzione potrebbe essere fattibile ma il problema è che all'interno di questa tabella ogni tot dati (a priori non so ogni quanti record) devo andare a fare la somma di un campo numerico dei record che si trovano al di sopra del record specificato.
mi spiego meglio
supponiamo di avere una tabella fatta così
valore regola
100        A
150        A
125        A
200       B
250        B
125        B
a priori non so quante regole ho nella mia tabella (nell'esempio ho solo due regole A e B) e non so neppure quanti record ci sono per ciascuna tabella, comunque il mio report dovrebbe essere qualcosa di questo tipo
100 A
150 A
125 A
375 SOMMA DI A
200 B
250 B
125 B
575 SOMMA DI B
950 SOMMA DI A E B

Cos'altro c'e' oltre al non conoscere a priori in numero di tabelle e relazioni e questa storia dei totali?
Dare le info a pezzettini non ci aiuta ad aiutarti.
 
 
A.
 
 

 950 SOMMA DI A E B
 
Se non ho capito male questa � la mia proposta.
 
Parlo di QuickReport perch� uso quello.
 
SOMMA DI... � una band di tipo rbGroupFooter collegata ad un TQRGroup 
che puoi creare ma non visualizzare e che t'azzera la SOMMA del gruppo.
 
SOMMA DI ... E ... � un rbSummary all'interno del quale mostri una 
TQRLabel con i valori sommati delle varie band di tipo rbDetail, una per 
ogni record della tabella che deve essere ordinata per il campo da 
raggruppare, ovviamente.
 
-- 
@WarpTen10

 che puoi creare ma non visualizzare e che t'azzera la SOMMA del gruppo.
 
Pardon, la SOMMA devi azzerarla dopo aver stampato la band 
rbGroupFooter, ovviamente.
 
-- 
@WarpTen10


hai ragione.. comunque questo è tutto... intanto provo la soluzione di warp10 al quale chiedo anche se ci sono tutorial possibilmente in italiano di qreport
e a voi se ci sono altre soluzioni.
grazie
 

 se ci sono tutorial possibilmente in italiano
 
Trovi molti tutorial su YT e l'help di QR � sufficientemente esaustivo.
 
Il problema � che sono in inglese ma, se vuoi fare della programmazione 
la tua attivit� principale, la conoscenza di questa lingua � fondamentale.
 
-- 
@WarpTen10

 
 
 
-- 


 i punti dove intervenire sugli if nel codice del report e sulle sotto bande.
 
Esatto. Il problema e' un po' quello che i controlli sono polverizzati
nei vari eventi BeforePrint delle diverse bande. A volte le condizioni
sono trasversali in base anche alle scelte dell'utente nella form
di opzioni di stampa. Comunque niente di troppo complesso.
 
ciao
Giacomo

> Perdonatemi se uso il ng per i miei cazzi: 
 
 
..e come kaz di permetti ti usare il ng per I k@@@I tuoi??? LOL....
 
A.