Newsgroup: it.comp.lang.delphi
Titolo: Problemuccio FuzzyReport 2.0

Salve,
nella mia applicazione avrei bisogno di stampare una tabella da un 
database.
Voi direte: eh che fesseria!
beh lo so che è una fesseria ma..il mio problema è che l'applicazione in 
questione permette al cliente di creare/eliminare/modificare i campi 
della tabella tramite le query "ALTER TABLE....." etc.
Quindi io non so al momento della composizione del report ne quanti campi 
sono, ne che nome hanno, ne tanto meno la loro lunghezza.
Possono essere 100 campi come può essere uno!
E' un problema, ma spero ci sia una soluzione.
Grazie anticipatamente
Carta Federico
--- posted by geoForum on 
http://www.delphiedintorni.it

Nel tuo report metti una banda di dettaglio vuota.
usi un oggetto di accesso ai dati per eseguire la query o leggere la 
tabella che ti interessa.
Apri il dataset, cicli sul''insieme fields e per ognuno di essi aggiunti 
una dbtext alla bda di dettaglio del report.
Assegni la prop dataset del report ed esegui il report.
Per creare dinamicamente delle dbtext, fai in modo che il tuo report 
esponga un metodo come questo:
public
   function AddDbText(const AFieldName: string): integer;
In questo modo deleghi la creazione degli oggetti al report stesso.
Se un domani passi ad esempio a qr, cambi solo il report ma non il 
codice che lo deve creare.
Vedi nella guida l'insieme fields.
Salvo casi particolari, non è molto bello che l'utente faccia i porci 
comodi sulla struttura del db, sia per lui che potrebbe fare qualche 
kazzata sia x te che poi ti troveresti nei casini x mettere le cose a posto.
Se vuoi fare il tecnologico, metti una checklistbox in un form e la 
popoli con i nomi dei campi. Poi, quando vai a creare il report aggiungi 
solo quelli con la checked a true....
Infine, oggi come oggi, guarerei avanti sui report, cercando di suare 
qualcosa che prevede una versione x .net, cosa che non credo valga x fuzzy.
AS


In pratica mi dici di listarmi con un ciclo tutti i campi della tabella e 
costruire il report a RunTime?


 costruire il report a RunTime?
si, xche non credo esistano alternative.
AS


Non riesco a capire come creare a run-time la banda e i rettangoli 
aasegnati al DB!ho letto la guida sulla creazione dei report a Run-TIme 
ma come aiuto mi da solo un frIn che sarebbe un oggetto  a cui si 
assegnano le proprietą ma non capisco come usarlo!
Grazie


 cui si assegnano le proprietą ma non capisco come usarlo!
Un veloce esempio
sulla form ho messo il componente report ed il componente frdesigner (che 
serve solo per test), ed un pulsante.
nelle uses (se non lo mette lui,  fr_class )
procedure TForm1.Button1Click(Sender: TObject);
Var Memo: TfrMemoView;
Begin
  // Pagina 0 del report frReport1
  With frReport1.Pages.Pages[0] Do
    Begin // frCreateObject crea un nuovo oggetto.
      // creo una banda di tipo titolo
     objects.Add(frcreateObject(gtband,'btreporttitle')); // trove le varie 
definizioni in fr_class
      Memo := Objects.Last;
      Memo.Left := 10;            // Setta il margine sinistro.
      Memo.Top := 50;             // Setta il margine superiore.
      Memo.Width := 800;          // Setta la larghezza.
      Memo.Height := 50;          // Setta l'altezza.
      Objects.Add (frCreateObject(gtMemo,''));      // gtMemo = Rettangolo 
di testo
      // Assegna a Memo l'ultimo oggetto inserito nel report.
      Memo := Objects.Last;
      Memo.Left := 37;            // Setta il margine sinistro.
      Memo.Top := 54;             // Setta il margine superiore.
      Memo.Width := 719;          // Setta la larghezza.
      Memo.Height := 21;          // Setta l'altezza.
      Memo.Caption := 'Testo';    // Setta il valore del testo.
      Memo.Alignment := frCenter; // Setta l'allineamento.
      Memo.Color := clTeal;       // Setta il colore di fondo.
      Memo.Font.Size := 12;       // Setta la dimensione del font.
      Memo.Font.Style := [fsBold];// Setta lo stile del font.
      Memo.Font.Color := clWhite; // Setta il colore del font.
    End;
  frreport1.DesignReport;
End;
Giulio 


ok e questo č per quanto riguarda l'oggetto gtMemo!
e per un oggetto Db?
Federico




 e per un oggetto Db?
Ma l'oggetto memo è l'oggetto db.. dipende tutto
da quello che metti dentro al memo...
se nell'oggetto memo metti:
[Table1."Campo"]
Ottieni il valore del "campo" della "table1" 


è proprio qui che volevo arrivare! come assegno il valore?
cioè come assegno all'oggetto memo in valore del field della tabella?
intendo dire a livello codice!
grazie!
Federico
--- posted by geoForum on 
http://www.delphiedintorni.it

 intendo dire a livello codice!
Hai provato con il mio esempio a mettere
memo.caption:='[table1."campo"]'    ??
Giulio


ok ma mi chiedevo: per mettere un oggetto di tipo memo collegato a un 
database si dovrebbe anche creare una banda principale anchessa collegata 
alla tabella ed in più piazzarci i memo dentro! o sbaglio?
a designe mode si fa cosi, poi non so!
riguardo alla creazione della banda:
objects.Add(frcreateObject(gtband,'btreporttitle')); 
questa crea una banda di tipo TITLE!e per una banda principale dati?
sulle proprietà del manuale non ho trovato niente a riguardo!
Grazie 1000!



Quindi? Niente a riguardo?


 sulle proprietà del manuale non ho trovato niente a riguardo!
Dopo molti smanettamenti ( e studio del codice del designer di fuzzy ....) 
ecco qualcosa , ma se vai in anteprima non mostra i record , comunque auguri 
...e buono studio ! :-)
procedure TForm1.Button1Click(Sender: TObject);
Var
   Memo: TfrMemoView;
   t: TfrView;
   TD: TfrDataSet;
Begin
  With frReport1.Pages.Pages[0] Do
    Begin
     Objects.Add(TfrBandView.Create(frReport1));
     t:= Objects.Last;
     TfrBandView(t).BandType:= TfrBandType(btDetailData);
     t.Height:=100;
     t.Width:=1000;
     t.Left:=10;
     t.Top:=10;
     TD := TfrDBDataSet.Create(nil);
     td.Name:='pippo';
     TfrDBDataSet(td).DataSet:=ibquery1;   <<<<<<<<<<<<<<<<------- il tuo 
dataset
     TfrDBDataSet(TD).Filtered := false;
     //TfrDBDataSet(TD).Filter := '';
     TD.RangeBegin := rbFirst;
     TD.RangeEnd := reLast;
     TD.RangeEndCount := 0;
     frReport1.DataSetList.AddObject(TD.Name, TD);
     T.FormatStr := TD.Name;
      Objects.Add (frCreateObject(gtMemo,''));
      // Assegna a Memo l'ultimo oggetto inserito nel report.
      Memo := Objects.Last;
      Memo.Left := 20;            // Setta il margine sinistro.
      Memo.Top := 12;             // Setta il margine superiore.
      Memo.Width := 600;          // Setta la larghezza.
      Memo.Height := 21;          // Setta l'altezza.
      Memo.Caption := '[CodiceArticolo]';    // Setta il valore del testo 
<<<-------------campo della query
      Memo.Alignment := frLeftJustify; // Setta l'allineamento.
      //Memo.Color := clBlack;       // Setta il colore di fondo.
      Memo.Font.Size := 12;       // Setta la dimensione del font.
      Memo.Font.Style := [fsBold];// Setta lo stile del font.
      Memo.Font.Color := clBlack; // Setta il colore del font.
    End;
  frreport1.DesignReport;
end;
/////////////////////////////////
Ps
In alternativa crei un report con le bande già associate ai db, e tu crei 
solo i memo posizionandoli
Giulio 


Pensato anche a questo :P
ma mi domando sempre: come posizioni questo memo dentro quella 
determinata banda? dovrà avere pure un nome sta banda giusto? :P
Grazie



Mi sbaglio?


 determinata banda? dovrà avere pure un nome sta banda giusto? :P
Ho provato ....
basta posizionare (top e left) sulla banda preesistente e si "associa" 
automaticamente.
Giulio 

Mi sbaglio?
Di fondo il tuo sbaglio e' nel quoting...
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/


ah in modo che venga sovrapposto sulla banda pre-esistente? ah buono non 
pensavo fosse cosi "versatile" :P
Grazie Giulio, proverò :)


Spiacente ma il problema persiste!
Non mi crea e non mi sovrappone nessun rettangolo in un report pre-
esistente.
Pasto un po di codice per chiarire l'idea.
procedure TStorico.printClick(Sender: TObject);
var
Memo: TfrMemoView;
nField : integer;
s : integer;
vLeft : integer;
begin
stampa.LoadFromFile('Storico.frf');
vLeft := 65;
nField := DbGrid4.Columns.Count -1;
With stampa.Pages.Pages[0] Do
    Begin
    for  s := 4 to nField do
    begin
    Objects.Add (frCreateObject(gtMemo,''));
    Memo := Objects.Last;
    Memo.Left := vLeft;
    Memo.Top := 28;
    Memo.Width := 31;
    Memo.Height := 6;
    Memo.Caption := DBGrid4.Columns.Items[s].Field.FieldName;
    Memo.Alignment := frCenter;
    Memo.Color := clWhite;
    Memo.Font.Size := 12;
    Memo.Font.Style := [fsBold];
    Memo.Font.Color := clBlack;
    vLeft := vleft + 31;
    end;
    end;
    Stampa.DesignReport;
    Stampa.ShowReport;
end;
Come mai non visualizzo niente nell'anteprima?
Spero possiate aiutarmi!
Grazie!


    Memo.Caption := DBGrid4.Columns.Items[s].Field.FieldName;
Credo il problema sia qui. Fuzzy per visualizzare un campo vuole
[tabella."nomecampo"]  (tabella è opzionale se è la stessa della banda 
dati).
Prova con
Memo.Caption := '["'+DBGrid4.Columns.Items[s].Field.FieldName+'"]';
se non va, per test se metti nella caption "pippo" lo visualizza ?
Giulio 


Beh ho fatto tutti i test da te indicati, non funziona in nessun caso 
neanche mettendo il "pippo" :P
Secondo me l'errore sta nella creazione/assegnazione dell'oggetto!
Tu che dici? Prova a fare un procedimento simile al mio..forse sbagliamo 
in qualche sintassi..!
Grazie



Dimenticavo di dire che ho assegnato alla proprietà CAPTION anche valori 
con [], [" "], ' ' , ma non vanno ugualmente neanche con un semplice 
normale testo!
Te hai provato?


>>> Spiacente ma il problema persiste!
Se sei d'accordo e mi dai una tua email , ti mando il mio progettino 
funzionante.
Giulio 


Eccome se lo sono :P
bbo...@libero.it
Grazie 1000!


Aspettando l'email...


 Aspettando l'email...
Dopo questo benevolo "cazziatone"  , ti ho risposto via email...
Giulio 


No figurati quale cazziatone..anzi..!
Potrei avere un esempio con Access?
E' quello che non mi convince.
Grazie


Scusa una cosa ma..
è cosi difficile in Access?
Perchè non ho ricevuto niente ancora..forse hai sbagliato mail!
La mail è 
bbo...@libero.it
Grazie in anticipo
Carta Federico
