Italian community of Lazarus and Free Pascal

Programmazione => Componenti Aggiuntivi => Topic aperto da: petrusic - Marzo 19, 2022, 04:33:11 pm

Titolo: lazreport - primi passi
Inserito da: petrusic - Marzo 19, 2022, 04:33:11 pm
Dopo l'installazione delle funzioni di report, ho mosso il primo passo verso questo nuovo capitolo installando l'esempio riportato qui (http://www.lazaruspascal.it/index.php?page=47)
Ho estratto il contenuto del file .zip ed ho aperto il progetto ed i file .pas relativi.
Per vedere la Form dell'esempio coi suoi controlli ho premuto il tasto F12, ma mi sono beccato solamente il seguente messaggio d'errore:
Citazione
Impossibile trovare la classe componente "TDatasource".
Non è registrato tramite RegisterClass e nessun lfm trovato.
È richiesto dalla unit:
/media/dirdati/dativari/lazarus_progetti/SimpleAlbum/unit1.pas
Io volevo solo capire come costruire il mio primo oggetto di tipo Report.

Non capisco perchè F12 non funziona.
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Marzo 20, 2022, 12:26:12 pm
Il progetto è un pò datato: ha 11 anni, potrebbe essere che i componenti usati non siano più compatibili con quelli attuali, o forse (più plausibile) che il file del progetto non sia compatibile.

Se non trova il TDatasource è probabile che non carichi l'unità DB.

Provo a dare una occhiata ...
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Marzo 20, 2022, 01:52:23 pm
Progetto aggiornato.

Esegui il build, poi a linea di comando:

project1 dati.txt Config.ini

EDIT: il progetto è a 64 bit, con la dll di SQL (SQLite3.dll) a 64 bit. Se lavori a 32 bit devi sostituire la dll SQLite3.dll con la versione a 32 bit.
Qui trovi le "precompiled binaries" cioè le dll corrispondenti per i vari SO:

 https://www.sqlite.org/download.html (https://www.sqlite.org/download.html)

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 21, 2022, 04:04:33 pm
Progetto aggiornato.

Esegui il build, poi a linea di comando:

project1 dati.txt Config.ini

Il comando dovrebbe servire per creare l'archivio dati?

Se è così, non ti preoccupare. Io ho solo bisogno di capire la tecnica costruttiva del report e quindi di:
-  imparare a preparare l'insieme di dati da fornire a TfrReport (io sono abituato a costruire una stringGrid visuale, corrispondente alla pagina PDF finale)
-  imparare quali parametri passare per il formato della pagima Pdf, il Font con le sue caratteristiche di modello,e altezza e stile
-  non so se posso anche predisporre i colori delle varie porzioni di testo col corrispondente sfondo.
-  come potrei disegnare una griglia sulla pagina PDF, impostando anche il colore della linea, insieme all'altezza e la larghezza di ciascuna riga e alla larghezza di ciascuna colonna.

Ho guardato le proprietà dell'oggetto TfrReport, ma non ho trovato o non saputo trovare niente di tutto questo.

Esiste una guida che illustri dettagliatamente come e dove impostare i parametri occorrenti per produrre una pagina Pdf?
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Marzo 21, 2022, 04:28:20 pm
Mi dispiace, ma di report di Lazarus ne sò meno che niente.

Confidiamo in un aiuto o un consiglio dai membri del forum.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: xinyiman - Marzo 21, 2022, 04:48:06 pm
Se il tuo oggetto TfrReport si chiama MyReport puoi generare il pdf come segue. Nella form devi trascinare un oggetto TfrTNPDFExport (che chiami frTNPDFExport1) e anche  un oggetto TSaveDialog (che chiami SaveDialog1)

poi con un codice simile dovresti riuscirci

Codice: [Seleziona]
               MyReport.LoadFromFile(qui metti il path del file lrf);
               if MyReport.PrepareReport then
               begin
                    SaveDialog1.Filter:='PDF files (*.pdf)|*.pdf';
                    SaveDialog1.FileName:='Album_' + StringReplace(DateToStr(Now()),'/','', [rfReplaceAll]) + '_' + StringReplace(TimeToStr(Now()) ,':','.', [rfReplaceAll]);
                    if SaveDialog1.Execute then
                    begin
                         if uppercase(ExtractFileExt(SaveDialog1.FileName))='.PDF' then
                         begin
                              //non faccio niente, il nome è già corretto
                              NomePDF:=SaveDialog1.FileName;
                         end
                         else
                         begin
                              //il nome non è corretto, quindi ci aggiungo il .pdf alla fine
                              NomePDF:=SaveDialog1.FileName + '.pdf';
                         end;
                         Screen.Cursor := crHourglass;
                         MyReport.ExportTo(TFrTNPDFExportFilter, NomePDF);
                         Screen.Cursor := crDefault;
                         ShowMessage('Creazione del file PDF terminata.');
                    end;
               end;
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 21, 2022, 04:57:32 pm
Se il tuo oggetto TfrReport si chiama MyReport puoi generare il pdf come segue. Nella form devi trascinare un oggetto TfrTNPDFExport (che chiami frTNPDFExport1) e anche  un oggetto TSaveDialog (che chiami SaveDialog1)
Fin qui avevo capito, comunque grazie.
Citazione da: xinyiman
poi con un codice simile dovresti riuscirci
Codice: [Seleziona]
               MyReport.LoadFromFile(qui metti il path del file lrf);
               if MyReport.PrepareReport then
               begin
. . .
Ci studio un pò sopra e ti faccio sapere.
Grazie ancora
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 22, 2022, 03:13:42 pm
Una delle funzioni del mio programma corrente è quella di compilare una StringGrid di cui si può estrarre una successiva StringGrid, ridotta alle sole colonne da riportare in stampa, e solo dopo averla mostrata  a video.
Quindi:
1) mostro a video la StringGrid riportata nell'allegato;
2) Dietro pressione di pulsante "Stampa" , mostro una StringGrid ESTRATTA dalla precedente  (con un numero minore di colonne);
3) Dietro pressione di nuovo pulsante "Avvia Stampa", dovrebbe formare un report con tutte le celle rappresentate nella 2a StringGrid.

Spero di essere stato chiaro, nell'illustrazione della sequenza degli oggetti da trattare.

Dato che lo scopo finale è quello di stampare una griglia non so se l'oggetto TFReport mi permette  di stampare una griglia, pensavo di compilare la StringGrid ESTRATTA dentro un TFrPrintGrid, però mi sono accorto che quest'ultimo è una DBGrid, quindi penso che rilevi automaticamente i dati da un DB.
Se è come ho capito, non fa al caso mio.

Allora non mi resta che creare una StringGrid ESTRATTA di tipo TStringGrid. Ma poi come trasferisco la StringGrid ESTRATTA con tutto il suo contenuto nell'oggetto TFReport?
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Marzo 22, 2022, 05:35:13 pm
Ciao, Lazreport stampa soprattutto quello che c'è dentro una tabella quindi a grandi linee il procedimento è questo:
Per stampare  una TStringGrid puoi riversare il suo contenuto in una tabella d'appoggio, io uso un tMemDataset, suppomiamo: Mgriglia.
All'interno di Mgriglia ovviamente dovranno esserci tutti i campi relativi alle colonne della griglia che ti interessa stampare.
Poi nel report crei una banda collegata a Mgriglia con all'interno tanti memo, ognuno che fa riferimento ad un campo di Mgriglia. Tramite le proprietà di questi memo poi potrai definire i bordi dei memo stessi per creare proprio la struttura di una griglia.
In questo momento non posso ma più tardi metto un esempio.
P.S. Non l'ho mai usato ma credo che con TFrPrintGrid ci siano problemi nel caso la griglia occupi più di una pagina.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 22, 2022, 10:24:12 pm
Ciao, Lazreport stampa soprattutto quello che c'è dentro una tabella quindi a grandi linee il procedimento è questo:
Per stampare  una TStringGrid puoi riversare il suo contenuto in una tabella d'appoggio, io uso un tMemDataset, suppomiamo: Mgriglia.
All'interno di Mgriglia ovviamente dovranno esserci tutti i campi relativi alle colonne della griglia che ti interessa stampare.
Poi nel report crei una banda collegata a Mgriglia con all'interno tanti memo, ognuno che fa riferimento ad un campo di Mgriglia. Tramite le proprietà di questi memo poi potrai definire i bordi dei memo stessi per creare proprio la struttura di una griglia.
Concettualmente ho capito ed il risultato finale è quello che cerco.
Citazione da: tito_livio
In questo momento non posso ma più tardi metto un esempio.
Mi faresti vertamente un grande regalo. Grazie
Citazione da: tito_livio
Non l'ho mai usato ma credo che con TFrPrintGrid ci siano problemi nel caso la griglia occupi più di una pagina.
Questa non me l'aspettavo.
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Marzo 22, 2022, 11:21:33 pm
Ciao,
in allegato il progetto di esempio per stampare un StringGrid con Lazreport.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 23, 2022, 10:03:12 am
@ tito_livio
Grazie per l'aiuto.
L'ho provato: bene! bene!

Ora dovrò studiarci sopra per capire meglio i vari meccanismi.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 23, 2022, 11:20:42 am
Nell'esempio ricevuto leggo:
Codice: [Seleziona]
Mgriglia.Append;     --> prepara l'oggetto TMemDataSet a ricevere l'accodamento di dati?
Mgriglia.Edit;           --> serve a preparare la formattazione dei valori float o  per rendere visibile il TMemDataSet?
Mgriglia.FieldByName('dare').Value := strtofloat(stringgrid1.Cells[2, i]);    --> perché é necessaria la conversione in float ?
Poi ho visto che nelle proprietà del TMemDataSet mancano i parametrisul dimensionamento delle celle e non solo.
Forse l'impostazione di detti parametri è presa in automatico attraverso le istruzioni di caricamento dei dati dalla StringGrid alla MemDataSet?

Scusa se ti chiedo qualche chiarimento, ma mi serve solo per capire. Infatti, non ho trovato documentazione in merito.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 23, 2022, 12:00:48 pm
Ho trovato la guida che cercavo qui (https://wiki-freepascal-org.translate.goog/LazReport_Documentation?_x_tr_sl=en&_x_tr_tl=it&_x_tr_hl=it&_x_tr_pto=sc).
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Marzo 23, 2022, 01:31:31 pm
Ciao,
le operazioni su Tmemdataset sono le stesse che si possono fare su qualsiasi tabella contenente dati, come se tu lavorassi su di una tabella di un database Sqlite o Firebird per esempio.
Quindi:
Mgriglia.append crea un nuovo record;
Mgriglia.edit pone Mgriglia in modalità scrittura;
Mgriglia.FieldByName('dare').Value := strtofloat(stringgrid1.Cells[2, i]); poteva anche scriversi:
Mgriglia.FieldByName('dare').Text := stringgrid1.Cells[2, i];  non è necessaria la conversione.
Per la larghezza e altre caratteristiche della cella che vuoi stampare devi aprire il file relativo alla stampa, in questo caso stampa1.lrf, e gestire le varie proprietà dei memo.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 25, 2022, 11:47:16 am
@ tito_livio

Ho preparato quasi tutto l'occorrente per produrre il modulo PDF, ma ho difficoltà nell'inserire i nomi delle colonne nella finestra di disegno del freport, finestra che ho riportato come allegato per farmi capire.

Nel tuo esempio sono caricati. Io non riesco a farlo, perché, cliiccando all'interno del quadrato bianco e cominciando a scrivere si apre una finestrella dove riesco a vedere quello che scrivo. Però, dopo avere scritto la testata della 1a colonna (Es. Data), premendo |INVIO|, la finestrella scompare e quello che ho scritto non viene riportato nel quadrato grande, dove invece come pensavo che finisse.

Ed infatti il programma, al momento in cui dovrebbe compilare le celle della griglia finale, va in ERRORE, perchè non trova il nome campo che si aspetta. Ecco il codice scritto per la compilazione della griglia finale:
Codice: [Seleziona]
procedure TForm6.BpulStamPdfClick(Sender: TObject);
var i, nuRg: integer;
begin
  nuRg := GridStmp.RowCount;
  if MGridPdf1.Active then
    MGridPdf1.Close;
  MGridPdf1.Clear(False);
  MGridPdf1.Open;
  for i := 1 to nuRg - 1 do
  begin
    MGridPdf1.Append;
    MGridPdf1.Edit;
    MGridPdf1.FieldByName('PR.').Text := GridStmp.Cells[1, i];       // quando esegue questa riga va in Errore
    MGridPdf1.FieldByName('DATA').Text := GridStmp.Cells[2, i];
    MGridPdf1.FieldByName('DESCRIZIONE').Text := GridStmp.Cells[3, i];
    MGridPdf1.FieldByName('D A R E').Text := GridStmp.Cells[4, i];
    MGridPdf1.FieldByName('A V E R E').Text := GridStmp.Cells[5, i];
    MGridPdf1.FieldByName('S A L D O').Text := GridStmp.Cells[6, i];
  end;
  frreport1.LoadFromFile('pdfOrd.lrf');
  frreport1.ShowReport;
end;                                               

Non capisco. Mi manca ancora qualche componente?
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Marzo 25, 2022, 08:42:55 pm
Ciao,
devi fare due cose:
1)Devi definire i campi MGridPdf1, campi che dovranno contenere i valori della StringGrid. Analogamente a quello che puoi vedere dalla prima immagine, devi agire sulla proprietà FieldDefs di MGridPdf1. Per ogni campo dovrai poi specificare il tipo (nel tuo caso stringa), e la lunghezza.
2)Per il problema del report, il tuo problema non mi è molto chiaro, provo a risolverlo.
Secondo me nel tuo report, dall'immagine che vedo, nella finestra di disegno del freport, mancano le band e i memo.
Prima di tutto devi mettere, nel report, le band e poi sopra le band devi mettere i memo. Come nella seconda immagine.
Nella band di tipo masterdata dovrai fare doppio click e selezionare la tabella MGridPdf1.
Poi facendo doppio click su ogni memo potrai inserire i campi di MGrdPdf1.
Stai attento che se il memo è troppo piccolo per la grandezza del font usato, non verrà visualizzato niente.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Marzo 26, 2022, 10:59:54 am
Ciao,
devi fare due cose:
1)Devi definire i campi MGridPdf1, campi che dovranno contenere i valori della StringGrid. Analogamente a quello che puoi vedere dalla prima immagine, devi agire sulla proprietà FieldDefs di MGridPdf1. Per ogni campo dovrai poi specificare il tipo (nel tuo caso stringa), e la lunghezza.
Questo l'ho capito e l'ho fatto.  :)
Citazione da: tito_livio
2)Per il problema del report, il tuo problema non mi è molto chiaro, provo a risolverlo.
Secondo me nel tuo report, dall'immagine che vedo, nella finestra di disegno del freport, mancano le band e i memo.
Prima di tutto devi mettere, nel report, le band e poi sopra le band devi mettere i memo.
Stamattina sono riuscito a trovare nel wiki qualche indicazione per arrivare a creare band e memo, anche se non ho capito fino ad ora a che cosa servono e come usarle.
Ho cercato di crearle, come puoi vadere dalla finestra allegata, ma mi sono beccato il seguente errore:
Citazione
Unable to open dataset frDBDataSet1.
Mi aspettavo, secondo quello che ho letto qui (Report Designer)  (https://wiki.freepascal.org/LazReport_Documentation), che sarebbe bastato premere il tasto |OK| per proseguire senza problemi.
Suppongo, a questo punto, che avrei dovuto fare qualcos'altro prima.

Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Marzo 26, 2022, 11:27:19 pm
Ciao,
oltre che per il Lazreport anche per altri tipi di strumenti per reportistica, le band costituiscono le parti di una stampa. Così ci può essere una band per l'intestazione, una per i dati ed una per i totali parziali o complessivi.
All'interno della band poi si devono mettere delle cose da stampare che sono i memo. I memo potranno contenere delle stringhe o dei riferimenti a dei campi di una tabella.
Questi due strumenti si devono prendere dalla parte sinistra del designer e posizionare sul foglio che rappresenta la stampa.
Penso però che ti puoi chiarire meglio le idee con un dei tanti video su youtube che parlano del lazreport.
Buon lavoro.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 07, 2022, 06:50:17 pm
oltre che per il Lazreport anche per altri tipi di strumenti per reportistica, le band costituiscono le parti di una stampa. Così ci può essere una band per l'intestazione, una per i dati ed una per i totali parziali o complessivi.
All'interno della band poi si devono mettere delle cose da stampare che sono i memo. I memo potranno contenere delle stringhe o dei riferimenti a dei campi di una tabella.
Questi due strumenti si devono prendere dalla parte sinistra del designer e posizionare sul foglio che rappresenta la stampa.
Si, ai due strumenti Includi Intestazioni e Includi Bande ci sono arrivato , seguendo anche più attentamente la guida (https://wiki-freepascal-org.translate.goog/LazReport_Documentation?_x_tr_sl=en&_x_tr_tl=it&_x_tr_hl=it&_x_tr_pto=op,sc) del wiki, al paragrafo "Report Designer"

Dopo avere ripercorso, con la guida a portata di mano, il lavoro fatto ed avere aggiunto il file xxx.lrf ho avviato l'esecuzione del mio programma.

Riporto la parte del programma relativa all'evento BpulStamPdfClick
Codice: [Seleziona]
procedure TForm6.BpulStamPdfClick(Sender: TObject);
. . .
begin                                 
. . .
  for i := 1 to nuRg - 1 do
  begin
    MGridPdf1.Append;
    MGridPdf1.Edit;
    MGridPdf1.FieldByName('nuProg').Text := GridStmp.Cells[0, i];
    MGridPdf1.FieldByName('data').Text := GridStmp.Cells[1, i];
    MGridPdf1.FieldByName('descriz').Text := GridStmp.Cells[2, i];
    MGridPdf1.FieldByName('dare').Text := GridStmp.Cells[3, i];
    MGridPdf1.FieldByName('avere').Text := GridStmp.Cells[4, i];
    MGridPdf1.FieldByName('saldo').Text := GridStmp.Cells[5, i];
  end;
  frreport1.LoadFromFile('pdfOrd.lrf');
  frreport1.ShowReport;                                                         

Il ciclo for viene eseguito apparentemente bene. Alla fine però fallisce l'esecuzione dell'istruzione
Codice: [Seleziona]
frreport1.LoadFromFile('pdfOrd.lrf'); 
con questo tipo di Errore:
Citazione
Il progetto DomusRatio ha sollevato una eccezione di classe 'ElazReportException' con messaggio : Erroire while loading report: File not found (pdfOrd.lrf).
Non capisco l'errore perchè ho creato il file .lrf nella stessa directory del programma, così come riportato nella guida:
Codice: [Seleziona]
petrus@petrus-pc:/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio$ ls
Appunti_programma    frm2.pas     frmmain.pas
backup               frm3.lfm     griglia_e_matita.jpg
DomusRatioForm2.png  frm3.pas     grigliaMovvCto_2.png
DomusRatio.ico       frm4.lfm     grigliaMovvCto.png
DomusRatio.lpi       frm4.pas     grigliaMovv.png
DomusRatio.lpr       frm5.lfm     img1_domuRatio.png
DomusRatio.lps       frm5.pas     img_domuRatio2.png
DomusRatio.res       frm6.lfm     img_domuRatio.jpg
DomusRatio.tar.xz    frm6.pas     img_domuRatio.png
ErroreOpen_piancont  frm7.lfm   

 pdfOrd.lrf

frm2_20211026.pas    frm7.pas     Querymovimgg.ods
frm2.lfm             frmmain.lfm

Riporto anche in allegato la finestra del Report Designer dove ho lavorato oggi.

Citazione da: tito_livio
Penso però che ti puoi chiarire meglio le idee con un dei tanti video su youtube che parlano del lazreport.
Ho trovato solo guide in lingua inglese.  Non sono adatte alla mia quasi non conoscenza della lingua inglese.



Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 08, 2022, 01:00:40 pm
Ciao,
dalla lista di file che hai postato mi sembra che tu abbia salvato il report col nome " pdfOrd.lrf" e non "pdfOrd".lrf". C'è uno spazio prima del nome del file.

Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 08, 2022, 03:21:36 pm
Ciao,
dalla lista di file che hai postato mi sembra che tu abbia salvato il report col nome " pdfOrd.lrf" e non "pdfOrd".lrf". C'è uno spazio prima del nome del file.
Non capisco da dove tu abbia dedotto quanto hai citato.

Comunque, visto che in esecuzione non viene trovato il nome del file, ho modificato l'istruzione
frreport1.LoadFromFile('pdfOrd.lrf');
impostando il percorso completo:
Codice: [Seleziona]
frreport1.LoadFromFile('/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/pdfOrd.lrf');
ed ha funzionato, come puoi vedere dall'allegato.

Non capisco perchè sia successo ciò, nè come sia possibile che il programma d'esempio che mi hai passato funzioni ed il mio ha bisogno di tutto il percorso per trovare il file .lrf.

Nella pagina di anteprima, ho trovato il pulsantino per ottenere la stampa del documento, vi ho cliccato sopra e la stampa s'è avviata in maniera perfettamente trasparente.

Resterebbe quindi soltanto da capire se e come si può evitare di indicare tutto il percorso del file .lrf.


Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 08, 2022, 04:39:27 pm
Forse indicazione stupida, ma conoscendo Linux (sono sarcastico  ;) ) potrebbe essere che il file lo devi identificare come './pdfOrd.lrf'

In alternativa, la directory completa potresti ottenerla con:

Codice: [Seleziona]
var Percorso, FileReport: string;
Percorso := ExtractfilePath(Application.ExeName);
FileReport := Percorso + 'pdfOrd.lrf';

N.B.: non ricordo se in Linux c'è l'ExtractFilePath, però c'è nel forum una discussione (vado a memoria) su questo.

Ciao

Titolo: Re:lazreport - primi passi
Inserito da: nomorelogic - Aprile 08, 2022, 05:52:57 pm
Non capisco perchè sia successo ciò, nè come sia possibile che il programma d'esempio che mi hai passato funzioni ed il mio ha bisogno di tutto il percorso per trovare il file .lrf.

ciao
giusto per curiosità, prima di fare il LoadFromFile, potresti visualizzare il risultato di:
Codice: [Seleziona]
ExpandFileName('pdfOrd.lrf');
Titolo: Re:lazreport - primi passi
Inserito da: bonmario - Aprile 08, 2022, 06:04:54 pm
Non sempre la "directory corrente" è quella dove sta girando il programma.
Per andare sul sicuro, segui il consiglio di @DragoRosso, in quel modo, vai sempre sul sicuro ... anche in Windows !!!

Ciao, Mario
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 08, 2022, 11:13:17 pm
giusto per curiosità, prima di fare il LoadFromFile, potresti visualizzare il risultato di:
Codice: [Seleziona]
ExpandFileName('pdfOrd.lrf');

Eccolo
Citazione
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux/pdfOrd.lrf

Ma non è corretto (vedi allegato)

quello corretto è
Codice: [Seleziona]
petrus@petrus-pc:/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio$ ls
Appunti_programma    frm2.pas     frmmain.pas
backup               frm3.lfm     griglia_e_matita.jpg
DomusRatioForm2.png  frm3.pas     grigliaMovvCto_2.png
DomusRatio.ico       frm4.lfm     grigliaMovvCto.png
DomusRatio.lpi       frm4.pas     grigliaMovv.png
DomusRatio.lpr       frm5.lfm     img1_domuRatio.png
DomusRatio.lps       frm5.pas     img_domuRatio2.png
DomusRatio.res       frm6.lfm     img_domuRatio.jpg
DomusRatio.tar.xz    frm6.pas     img_domuRatio.png
ErroreOpen_piancont  frm7.lfm     pdfOrd.lrf
frm2_20211026.pas    frm7.pas     Querymovimgg.ods
frm2.lfm             frmmain.lfm

 ??? (**?**)
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 09, 2022, 11:26:13 am
ExpandFileName non cerca ne testa il "nomfile". Ti propone solo dove dovrebbe "essere" se aperto da un SYSTEM UTILITY.

Ovviamente normalmente il file lo "vuole" nella directory di esecuzione, e quella directory verrà sempre indicata dall funzione (a meno che non si usino funzioni particolari di cambio directory di lavoro).

Consiglio spassionato, ma che indica anche una buona organizzazione della logica del programma:

- caricate DB, Report, INIFIles, XML in una sottodirectory della cartella di escuzione, ad esempio "Database" in modo da riferirla sempre in modo univoco (in relativo ./Database/........... o in assoluto come ho accennato in un precedente post).

N.B.: Io uso sempre la path assoluta, perchè in particolari condizioni (ad esempio con tecniche di impersonificazione di profili) può accadere che la directory corrente sia diversa da quella di esecuzione. Da quando usai tali tecniche, con l'"assoluta" non ho mai avuto problemi.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 09, 2022, 11:41:27 am
Forse indicazione stupida, ma conoscendo Linux (sono sarcastico  ;) ) potrebbe essere che il file lo devi identificare come './pdfOrd.lrf'

In alternativa, la directory completa potresti ottenerla con:
la directory completa potresti ottenerla con:
Codice: [Seleziona]
var Percorso, FileReport: string;
Percorso := ExtractfilePath(Application.ExeName);
FileReport := Percorso + 'pdfOrd.lrf';


1a prova:
Citazione
Codice: [Seleziona]
 percorso:= ExtractfilePath(Application.ExeName);
  fileReport:= percorso + 'pdfOrd.lrf';
  WriteLn('fileReport= |' + fileReport + '|');
  frreport1.LoadFromFile(fileReport);                     
fileReport= |/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux/pdfOrd.lrf|
L'istruzione do LoadFromFile da Errore d'eccezione di classe "Error While loading report: File not found(/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux/pdfOrd.lrf) , per le regioni che ho spiegate nel mio post precedente.

2a prova:
Codice: [Seleziona]
  frreport1.LoadFromFile('./pdfOrd.lrf');     

Anche quest'istruzione produce un Errore d'eccesione per file NON trovato.

Mi pare che'unica via sicura percorribile sia quella di indicare il percorso completo del file .lrf
Titolo: Re:lazreport - primi passi
Inserito da: bonmario - Aprile 09, 2022, 11:51:03 am

Mi pare che'unica via sicura percorribile sia quella di indicare il percorso completo del file .lrf

Che però ti dovresti ricordare di modificare se metti l'eseguibile da un'altra parte.
Se invece fa quello che ti è stato suggerito ieri, qualche post più sopra, il tuo codice non avrà più problemi, indipendentemente da dove salvi l'eseguibile.

Ciao, Mario
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 09, 2022, 11:57:17 am
Chiarito il concetto sull'individuazione del file .lrf tramite il percorso completo (o directory assoluta), mi resta ancora da capire il meccanismo di funzionamento  delle band e dei memo, cosa che non sono riuscito assolutamente a capire nemmeno entrando in profondità nel contenuto dell'esempio di programma che mi ha così gentilmente inviato tito_livio
dove, secondo me, avrei dovuto trovare gli oggetti per costruite l'intestazione del report, ma non ho trovato niente, . . . o non ho saputo leggere.
 ??? ::) :-\
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 09, 2022, 12:00:36 pm

Mi pare che'unica via sicura percorribile sia quella di indicare il percorso completo del file .lrf

Che però ti dovresti ricordare di modificare se metti l'eseguibile da un'altra parte.
Se invece fa quello che ti è stato suggerito ieri, qualche post più sopra, il tuo codice non avrà più problemi, indipendentemente da dove salvi l'eseguibile.

Ciao, Mario

Sono d'accodo con te e, teoricamnte, non fa una grinza, ma, come ho dimostrato nei miei post precedenti, l'istruzione ExtractfilePath, e non capisco perché,  NON ha funzionato. Quindi non mi posso fidare.
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 09, 2022, 12:08:18 pm

Mi pare che'unica via sicura percorribile sia quella di indicare il percorso completo del file .lrf

Che però ti dovresti ricordare di modificare se metti l'eseguibile da un'altra parte.
Se invece fa quello che ti è stato suggerito ieri, qualche post più sopra, il tuo codice non avrà più problemi, indipendentemente da dove salvi l'eseguibile.

Ciao, Mario

Sono d'accodo con te e, teoricamnte, non fa una grinza, ma, come ho dimostrato nei miei post precedenti, l'istruzione ExtractfilePath, e non capisco perché,  NON ha funzionato. Quindi non mi posso fidare.

Ti ho già spiegato perchè non ha funzionato. E anche consigliato come fare affinchè nel futuro non si riverifichi più il problema.
La problematica delle directory di lavoro e dei file ausiliari abbinati deve essere risolta con l'organizzazione.

I file devono essere raccolti in  "posti" noti e certi. La path assoluta non la imposti a programma, ma la rilevi a runtime. In questo modo non avrai alcun problema.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 09, 2022, 12:42:04 pm
Ciao,
io penso che tu abbia il progetto in una cartella ed il report (il file .lrf) in un'altra.
Se è successo questo è perché, quando crei un nuovo report, il designer di lazreport, di default, lo salva nell'ultima cartella utilizzata (per esempio da un altro progetto) che può differire dalla cartella dell'eseguibile.
E' uno scherzetto che faceva pure il Delphi, almeno nelle versioni che ho usato io.
Quindi secondo me tu apri il progetto che si trova in:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux
mentre il report, insieme ad altre cose, in:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 09, 2022, 03:26:33 pm
La problematica delle directory di lavoro e dei file ausiliari abbinati deve essere risolta con l'organizzazione.

I file devono essere raccolti in  "posti" noti e certi. La path assoluta non la imposti a programma, ma la rilevi a runtime. In questo modo non avrai alcun problema.
Forse ho capito cosa vuoi dire. Credo che tu ti riferisca alla finestra Opzioni Progetto -> Percorsi
Ho visto che tutti gli eseguibili dei progetti prodotti sono finiti in :
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux

in base alla seguente impostazione di base relativa alla destinazione:
../bin/$(TargetCPU)-$(TargetOS)/DomusRatio

Ma io mi sono addentrato nella suddetta finestra solo una volta per aggiungere il percorso relativo alle mie procedure di utilità. Per il resto non mi sono mai preoccupato di nient'altro, pensando che la directory di lavoro per ciascun mio progetto venisse assunta automaticamente all'interno del percorso indicato al momento del 1° salvataggio di un nuovo progetto, cioè:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/Nome_Nuovo_progetto

Ora mi tocca scoprire quale parte di percorso sia attribuita a  $(TargetCPU) e $(TargetOS).

io penso che tu abbia il progetto in una cartella ed il report (il file .lrf) in un'altra.
Quindi secondo me tu apri il progetto che si trova in:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux
mentre il report, insieme ad altre cose, in:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio.
Si, alla luce di quanto emerso oggi e di cui non avevo mai avuto percezione, è così, come hai  dedotto tu.

 :-[


Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 09, 2022, 03:52:10 pm
Ho rivisto le impostazioni interni alla finestra Opzioni Progetto -> Percorsi che ho modificato per puntare sempre alla directory del progetto corrente (DomusRatio) ed allego le immagini relative al suo contenuto di prima e dopo.
Spero che non ci sia altro da modificare.

Poi ho riportato l'istruzione LoadFromFile allo stato iniziale:
Codice: [Seleziona]
  frreport1.LoadFromFile('pdfOrd.lrf');
ed ho riavviato il progetto per verificarne il funzionamento.

Ora non da più Errore per file pdfOrd.lrf non trovato.
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 09, 2022, 06:19:12 pm
ExpandFileName non cerca ne testa il "nomfile". Ti propone solo dove dovrebbe "essere" se aperto da un SYSTEM UTILITY.

Ovviamente normalmente il file lo "vuole" nella directory di esecuzione, e quella directory verrà sempre indicata dall funzione (a meno che non si usino funzioni particolari di cambio directory di lavoro).

Consiglio spassionato, ma che indica anche una buona organizzazione della logica del programma:

- caricate DB, Report, INIFIles, XML in una sottodirectory della cartella di escuzione, ad esempio "Database" in modo da riferirla sempre in modo univoco (in relativo ./Database/........... o in assoluto come ho accennato in un precedente post).

N.B.: Io uso sempre la path assoluta, perchè in particolari condizioni (ad esempio con tecniche di impersonificazione di profili) può accadere che la directory corrente sia diversa da quella di esecuzione. Da quando usai tali tecniche, con l'"assoluta" non ho mai avuto problemi.

Ciao

L'importante è risolvere .... io intendevo questo (penso che tu abbia saltato di leggerlo) ...
Usa sempre la path assoluta, ma ricavata come ti avevo indicato ... a runtime .... così non puoi sbagliare.

Poi setta pure come hai fatto le path nelle opzioni progetto. Però, secondo me, METTI il file ".lrf" in una sottodirectory. Il tutto verrà più pulito, con l'eseguibile e le eventuali librerie dinamiche in una cartella, e in una sottocartella il file lrf, eventuali DB e altri file di ausilio (json, xml, ini).

Ad esempio, seguendo quello che hai riportato:

/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/                                      <---- File di Progetto
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio             <---- Eseguibile
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio/Dati/    <---- Dati (come .lrf, DB, .xml, .ini)

Copiando solo la cartella "bin" e le sottocartelle avrai così il "binario" del tuo progetto che girerà ovunque tu lo metta.

Se usi la path assoluta a runtime, ovunque sia la tua cartella (completa di sottocartella) il tuo programma verrà sempre eseguito.
La path assoluta a runtime non sbaglia mai.

Puoi usare la path relativa comunque se non fai "cose strane".
 
Ciao
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 09, 2022, 06:37:22 pm
Giusto come esempio (vedi allegato):

Directory principale solo con eseguibili e DLL, sottocartelle con il resto. A destra l'unica sottocartella importante, DATABASE che contiene i file dati e di configurazione (e anche l'HELP in linea).

Le altre cartelle vengono create a runtime e contengono file ausiliari (log, video generati, etc ....).

Nessuno ti obbliga a fare così, ma in questo modo è più "pulito" il tutto e quando devi distribuire il tuo SW non puoi sbagliare.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 10, 2022, 03:34:32 pm
Se usi la path assoluta a runtime, ovunque sia la tua cartella (completa di sottocartella) il tuo programma verrà sempre eseguito.
La path assoluta a runtime non sbaglia mai.

Sapere razionalizzare significa dare ordine pratico e mentale al proprio ambiente e aiutare a ricordare più facilmente in futuro. Ma per potere razionalizzare bisogna imparare.
Per me imparare significa anche capire ciò che mi si consiglia per organizzarmi.
Quindi, come prima operazione da compiere, dovrei capire come agire per generare la path assoluta a runtime. É la prima volta che sento parlare di un tale criterio di organizzazione propria.
Pensavo di avere capito agendo in ciascun programma Lazarus in: Opzioni Progetto -> Percorsi, ma da quello che mi dici vedo che sono completamente fuori strada.
Dando per scontato per tutti che il Percorso assoluto è quello che comincia dalla radice (/), quello che non riesco a capire come posso generare un percorso assoluto a runtime (runtime del SO. o di Lazarus ?)
Allora ti prego di essere paziente e spiegarmi con semplicità cosa dovrei fare per arrivare a generare il
"Percorso Assoluto a RunTime"
a cui ti riferisci
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 10, 2022, 04:09:52 pm
Quando lanci un eseguibile lo stesso usa per default la cartella dove ESISTE per fare tutte le attività "standard", come ricerca delle librerie dinamiche, apertura e chiusura di file, database, etc ....

Questa cartella la trovi a RUNTIME con:
Codice: [Seleziona]
var Percorso: string;
Percorso := ExtractfilePath(Application.ExeName);

Percorso, in esecuzione varrà (per esempio nel tuo caso):

Codice: [Seleziona]
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/

perchè il file eseguibile si trova li.

Se tu lo copiassi in "/tmp" ad esempio e lanciassi il file da "/tmp" la variabile avrebbe come valore "/tmp/"

Quindi, se tu a runtime davanti al nome dei file che devi aprire di preponi la variabile "Percorso" non avrai problem perchè aprirai i file nella stessa cartella dell'eseguibile, ovunque sia.

Nel tuo caso accadrebbe che:

Codice: [Seleziona]
var Percorso, FileReport: string;
Percorso := ExtractfilePath(Application.ExeName);
FileReport := Percorso + 'pdfOrd.lrf';

aprirebbe il file
Codice: [Seleziona]
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/pdfOrd.lrf"

Se invece lo lanci da "/tmp" (ovviamente eseguibile e lrf devono esistere in "/tmp") il codice sarà uguale ma:

Codice: [Seleziona]
var Percorso, FileReport: string;
Percorso := ExtractfilePath(Application.ExeName);  <---- Percorso varrebbe '/tmp/'
FileReport := Percorso + 'pdfOrd.lrf';

aprirebbe il file
Codice: [Seleziona]
/tmp/pdfOrd.lrf"

A runtime quindi puoi avere la "path" assoluta semplicemente nel modo che ti ho indicato. Vale per tutto e in tutte le condizioni.

Ora, aggiungendo un passo in più, per PULIZIA dell'ambiente è opportuno che il file "pdfOrd.lrf" non stia nella cartella dell'eseguibile a in una sottocartella (ad esempio Dati). In questo caso dovrai cambiare in Lazreport (PER LA PARTE PROGETTUALE) la directory di destinazione del LRF e cambiare il tuo codice affinchè a runtime vi ci acceda in:

Codice: [Seleziona]
var Percorso, FileReport: string;
Percorso := ExtractfilePath(Application.ExeName);
FileReport := Percorso + 'Dati/pdfOrd.lrf';

Ma questo è un passo in più.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 10, 2022, 10:18:07 pm
Allora ti prego di essere paziente e spiegarmi con semplicità cosa dovrei fare per arrivare a generare il
"Percorso Assoluto a RunTime"
a cui ti riferisci

Il percorso  di Lazarus (ossia del progetto) lo scegli tu, ed è quello che hai fatto settando l'ambiente di compilazione del progetto in DOMUSRATIO.

E' il runtime dell'eseguibile che deve rilevare questo. Anzi come ti ho spiegato rileva da dove l'eseguibile viene lanciato, consentendoti di non settare path "assolute" nel codice stesso.

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 11, 2022, 03:20:39 pm
Poi setta pure come hai fatto le path nelle opzioni progetto. Però, secondo me, METTI il file ".lrf" in una sottodirectory. Il tutto verrà più pulito, con l'eseguibile e le eventuali librerie dinamiche in una cartella, e in una sottocartella il file lrf, eventuali DB e altri file di ausilio (json, xml, ini).

Ad esempio, seguendo quello che hai riportato:

/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/                                      <---- File di Progetto
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio             <---- Eseguibile
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio/Dati/    <---- Dati (come .lrf, DB, .xml, .ini)

Copiando solo la cartella "bin" e le sottocartelle avrai così il "binario" del tuo progetto che girerà ovunque tu lo metta.

Ho fatto come mi hai consigliato. Ho però dovuto impostare il percorso di destinazione dell'eseguibile, perchè ho provato a non impostarlo ed ho notato che l'eseguibile è stato salvato in:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/bin/x86_64-linux.

Riporto pertanto in allegato l'immagine relativa alla finestra Opzioni progetto > Percorsi
riporto qui sotto la tree della direcotry DomusRatio, dove puoi vedere l'organizzazione data alla varie sottodirectory
Codice: [Seleziona]
petrus@petrus-pc:~$ tree /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio
├── Appunti_programma
│   ├── BilancioFineAnnoù.odt
│   ├── ContDomgli.ods
│   └── PianoConti_struttura_teorica.pdf
├── backup
│   ├── DomusRatio.lpi
│   ├── DomusRatio.lpi.bak
│   ├── DomusRatio.lpr
│   ├── DomusRatio.lps
│   ├── DomusRatio.lps.bak
│   ├── frm21.lfm
│   ├── frm21.pas
│   ├── frm21.pas.bak
│   ├── frm2_20211026.pas
│   ├── frm2.lfm
│   ├── frm2.pas
│   ├── frm2ricmovv.lfm
│   ├── frm2ricmovv.pas
│   ├── frm2RicMovv.pas
│   ├── frm3.lfm
│   ├── frm3.pas
│   ├── frm4.lfm
│   ├── frm4.pas
│   ├── frm5.lfm
│   ├── frm5.lfm.bak
│   ├── frm5.pas
│   ├── frm5.pas.bak
│   ├── frm6.lfm
│   ├── frm6.pas
│   ├── frm6.pas.bak
│   ├── frm7.lfm
│   ├── frm7.pas
│   ├── frmmain.lfm
│   ├── frmmain.lfm.bak
│   ├── frmmain.pas
│   └── frmmain.pas.bak
├── bin
│   └── DomusRatio
│       ├── Dati
│       │   └── pdfOrd.lrf
│       ├── DomusRatioRun
│       └── DomusRatioRun.dbg
├── DomusRatioForm2.png
├── DomusRatio.ico
├── DomusRatio.lpi
├── DomusRatio.lpr
├── DomusRatio.lps
├── DomusRatio.res
├── frm2_20211026.pas
├── frm2.lfm
├── frm2.pas
├── frm3.lfm
├── frm3.pas
├── frm4.lfm
├── frm4.pas
├── frm5.lfm
├── frm5.pas
├── frm6.lfm
├── frm6.pas
├── frm7.lfm
├── frm7.pas
├── frmmain.lfm
├── frmmain.pas
├── griglia_e_matita.jpg
├── grigliaMovvCto_2.png
├── grigliaMovvCto.png
├── grigliaMovv.png
├── imgdef_domusRatio.png
└── img_domuRatio.jpg

5 directories, 64 files

Devo chiederti tuttavia qual'é l'utilità di destinare l'eseguibile in fondo al percorso: /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio             <---- Eseguibile

No sarebbe bastato fare:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/Dati/    <---- Dati (come .lrf, DB, .xml, .ini)
 ::)
Titolo: Re:lazreport - primi passi
Inserito da: DragoRosso - Aprile 11, 2022, 06:06:49 pm

Devo chiederti tuttavia qual'é l'utilità di destinare l'eseguibile in fondo al percorso: /media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio             <---- Eseguibile

No sarebbe bastato fare:
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/Dati/    <---- Dati (come .lrf, DB, .xml, .ini)
 ::)

C'è stato un malinteso, così dovrebbe essere:

Citazione

/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/                                    <--- Cartella dell'eseguibile con sottocartelle dei dati   
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/DomusRatio.EXE          <---- Eseguibile NEL SENSO DI FILE ESEGUIBILE NON DI DIRECTORY (in Linux si chiamera DomusRatio ... senza ".EXE" è per quello che l'avevo chiamato così ....
/media/dirdati/dativari/lazarus_progetti/lazarus_progetti_miei/DomusRatio/bin/Dati/                            <---- Cartella contenente i file dei Dati (come .lrf, DB, .xml, .ini)

Nella configurazione del progetto (compilazione) in "Nome File destinazione (-o):" ci metti

Citazione
../DomusRatio/bin/DomusRatio.EXE

Ciao
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 11, 2022, 06:56:46 pm
Nella configurazione del progetto (compilazione) in "Nome File destinazione (-o):" ci metti

Citazione
../DomusRatio/bin/DomusRatio.EXE

Si, ho già fatto così. Ora ci siamo. Però .Exe non mi piace. Il file eseguibile l'ho chiamato DomusRatioRun, tanto per avere un riferimento mnmonico immediato,  per impostare da questo momento un criterio univoco personale.

Grazie!
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 13, 2022, 07:01:50 pm
Purtroppo ho ancora difficoltà a compilare il report di stampa.
Nel mio primo report di stampa ho definito:
- una Band per il titolo del Report, contenente una Memo
- una Band per l'intestazione di pagina, contenente più Memo
- una Band per i Dati principali, contenente più Memo.

I campi interni alla Memo, nella Band per il titolo del Report ho inserito, oltre alle costanti, anche i nomi dei campi dichiarati nella Form6. Il primo é interno all'oggetto frReport1.Title, gli altri due sono stati dichiarati nella sezione Implementation della Form.

L'ho fatto dopo avere letto nel manuale "REPORT GENERATOR - FreeReport v2.32 - for LAZARUS, al capitolo 6.2":
Citazione
Using strings and variables
You can use string constants in expressions. As in Pascal, string is a sequence of characters,
rounded by single quotes, for example: ‘Hello, World!'. If a string contains a single quote, it is necessary
to duplicate it: ‘What's new' becomes ‘What''s new'.
You can also use variables or DB fields in expressions, for example: “[Total amount] / 2” is a
valid expression. A valid variable can be a field from any accessible table. Reference to a field should
have the following format: [FormName.TableName.”FieldName”], where FormName is form name or
data module name, where the table is located; TableName is name of the table; FieldName is a field
name in the table. If a field name does not contain blanks, then the quotes may be omitted. If the
parameter FormName is not used, FR searches for the table on the current form (or data module). If the
parameter TableName is not used, FR search for FieldName in current table (current for band, in which
expression is contained).


Ebbene, in esecuzione, ottengo un errore che ho riportato nella 2a immagine allegata, mentre la 1a, é quella relativa al Designer del report.

Probabilmente c'é un errore sintattico, ma rileggendo il manuale, non l'ho capito.
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 13, 2022, 07:27:30 pm
Ciao, per il titolo, e per tutto quello che non dipende da un campo di una tabella, devi usare le variabili del report.
Più tardi metto un esempio.
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 13, 2022, 11:58:27 pm
Ciao,
per creare le variabili nel designer del report devi cliccare: file | lista delle variabili | variabili.
Qui poi devi scrivere una riga con il nome del gruppo di variabili che vuoi creare e poi nelle righe sottostanti i nomi delle variabili.
I nomi delle variabili devono essere precedute da uno spazio.
Una volta create le variabili le puoi inserire nel memo tramite il bottone variabile.
A questo punto nel progetto devi scrivere il codice necessario al riempimento delle variabili. Per fare questo devi andare nell'evento OnGetValue del report, e potrai scrivere per esempio:
Codice: [Seleziona]
if parname='nome_stampa' then
    parvalue:=frreport1.Title;
dove nome_stampa è il nome della variabile.
Ti allego il progetto, che ho allegato prima, modificato per l'aggiunta dell'uso delle variabili nel report.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 20, 2022, 06:51:10 pm
Grazie Lilvio.
Ho compreso il tuo messaggio e l'ho messo in pratica con successo.

Tuttavia, non riesco a fare comparire nella colonna della data il valore relativo, nonostante che venga regolarmente compilato nella rispettiva cella di ciascuna riga.
il codice di caricamento è:
Codice: [Seleziona]

procedure TForm6.BpulStamPdfClick(Sender: TObject);
var
  i, nuRg: integer;

  fileReport, striMia, titolo: String;

begin
  nuRg := GridStmp.RowCount;
  if MGridPdf1.Active then
    MGridPdf1.Close;
  MGridPdf1.Clear(False);
  MGridPdf1.Open;
  for i := 1 to nuRg - 1 do
  begin
    MGridPdf1.Append;
    MGridPdf1.Edit;
    MGridPdf1.FieldByName('nuProg').Text := GridStmp.Cells[0, i];
    MGridPdf1.FieldByName('dtCont').Text := GridStmp.Cells[1, i];                         // <-- sembra NON funzionare
    MGridPdf1.FieldByName('descriz').Text := GridStmp.Cells[2, i];
    MGridPdf1.FieldByName('dare').Text := GridStmp.Cells[3, i];
    MGridPdf1.FieldByName('avere').Text := GridStmp.Cells[4, i];
    MGridPdf1.FieldByName('saldo').Text := GridStmp.Cells[5, i];
    WriteLn('MGridPdf1.nuProg= ' + MGridPdf1.FieldByName('nuProg').Text);
    WriteLn('GridStmp.Cells[1, '+ IntToStr(i) + ']= ' + GridStmp.Cells[1, i]);
    WriteLn('MGridPdf1.dtCont= ' + MGridPdf1.FieldByName('dtCont').Text);
  end;
  fileReport:= percorso + '/Dati/pdfComune.lrf';
  frReport1.LoadFromFile(fileReport);
  frReport1.ShowReport;                         
Citazione
MGridPdf1.nuProg=        1   -----------------> cella valorizzata correttamente     
GridStmp.Cells[1, 1]= 05/01/2022
MGridPdf1.dtCont=              -----------------> cella NON valorizzatA
MGridPdf1.nuProg=        2
GridStmp.Cells[1, 2]= 05/01/2022
MGridPdf1.dtCont=
MGridPdf1.nuProg=        3
GridStmp.Cells[1, 3]=

Inizialmente funzionava.
Dopo quasi una settimana di prove e riprove, mi sono arreso: Io non vedo anomalie.


Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 20, 2022, 07:18:47 pm
Ciao,
credo che lo spazio, che tu hai riservato alla colonna data, sia troppo piccolo.
Prova ad allargarlo a scapito di un altro campo.
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 21, 2022, 09:47:36 am
Ciao,
credo che lo spazio, che tu hai riservato alla colonna data, sia troppo piccolo.
Prova ad allargarlo a scapito di un altro campo.

Rispondo subito alla tua riflessione, perchè l'ho fatta già io ed ho provato ad aumentare  la larghezza della colonna di circa la metà, ma non é cambiato niente.

Poi, se guardi bene le istruzioni di Writeline riportate nel mio post precedente e che ripeto qui sotto, per chiarezza, puoi notare che il campo di colonna "MGridPdf1.dtCont" è sempre vuoto, mentre il corrispondente della griglia di partenza  "GridStmp.Cells[1, i]" contiene una data:
Citazione
MGridPdf1.nuProg=        1   -----------------> cella valorizzata correttamente     
GridStmp.Cells[1, 1]= 05/01/2022
MGridPdf1.dtCont=              -----------------> cella NON valorizzatA
MGridPdf1.nuProg=        2
GridStmp.Cells[1, 2]= 05/01/2022
MGridPdf1.dtCont=
MGridPdf1.nuProg=        3
GridStmp.Cells[1, 3]=

Quindi, credo proprio che ci sia un altro problema, ma non capisco dove e quale.

Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 21, 2022, 10:21:43 am
Di che tipo è il campo dtCont?
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 21, 2022, 04:29:40 pm
Di che tipo è il campo dtCont?
I campi interni all'oggetto MGridPdf1 sono tutti di tiupo ftString
Titolo: Re:lazreport - primi passi
Inserito da: petrusic - Aprile 21, 2022, 04:40:40 pm
L'ho trovato.

La tua domanda mi ha costretto ad andare a rivedere i parametri della singola colonna di MGridPdf1 e, dopo avere guardato il DataType, mi sono accorto che il size era impostato a zero, l'unico ad essere impostato a zero.
Ho modificato il size, portandolo a 120, come per le colonne dare, avere, saldo, ed ho rieseguito il programma.
Ora la data c'è tutta.

Grazie!  :D
Titolo: Re:lazreport - primi passi
Inserito da: tito_livio - Aprile 21, 2022, 10:10:26 pm
Prego! :D