Report

Ciao a tutti! Sono alle prime armi con Xojo (vengo da VB6), per cui anche la più semplice delle cose può rappresentare una difficoltà.
Sono alle prese con la preparazione di un report: a livello di Body dovrei stampare il risultato della somma dei valori di tre campi presenti sul record, e non riesco a capire come fare (senza modificare il database nè la query che genera il recordset.
Qualcuno mi può dare una mano?
Grazie.

Nedi

La stampa su Xojo demandata al sistema per la gestione grafica, ed un bel mattone.
io personalmente, oramai con i tempi che corrono, ricorro a file PDF, penso che sia una scelta che oramai stanno affrontando tutti.
Comunque.
mettiamo caso che hai dichiarato un recordset con tre campi di tipo double ( anche se preferisco utilizzare currency per via degli arrotondamenti alla 4^ cifra decimale )
i campi si chiamano uno, due, tre… e il recordset rsitem, dalla tabella ‘tabella’

dim db as new MySQLCommunityServer
db.DatabaseName = "prova"
db.Host = "127.0.0.1"
db.Port = "3306"
db.Username = "prova"
db.Password = "prova"

If Not db.Connect() then
  msgbox("errore nella lettura del database " : + db.errormessage)
else
  Dim sql As String
  sql = "Select rowid, uno, due, tre from tabella "
  Dim rsitem as recordset
  rsitem = db.sqlselect(sql)
  if db.error then 
     msgbox("Errore durante la selezione dei dati da tabella : " + db.errormessage)
     exit sub
  end if

  Dim ps As New PrinterSetup
  If ps.PageSetupDialog Then
     Dim page As Graphics
     page = OpenPrinterDialog(ps)
     If page <> Nil Then
        page.DrawString("Uno : " + format(rsitem.field("uno").CurrencyValue,"-#,###,###,###.00") , ps.HorizontalResolution, ps.VerticalResolution)
        page.DrawString("Due : " + format(rsitem.field("due").CurrencyValue,"-#,###,###,###.00") , ps.HorizontalResolution, ps.VerticalResolution)
        page.DrawString("Tre : " + format(rsitem.field("tre").CurrencyValue,"-#,###,###,###.00") , ps.HorizontalResolution, ps.VerticalResolution)
        // somma 
        dim somma as currency 
        somma = somma + rsitem.field("uno").CurrencyValue
        somma = somma + rsitem.field("due").CurrencyValue
        somma = somma + rsitem.field("tre").CurrencyValue
        page.DrawString("Somma : " + format(somma,"-#,###,###,###.00") , ps.HorizontalResolution, ps.VerticalResolution)
        page.NextPage
     End If
  End If
End If

oppure in alternativa, come indicato sopra, utilizzo la libreria FPDF che puoi trovare qui altrimenti in XOJO esiste un sistema di report, che ti dir la verit … non ho mai usato.

Grazie per la risposta, Massimiliano.
In effetti sto utilizzando il Report Designer interno, perch vorrei evitare di scrivere del codice per stampare il campo A alle coordinate X e Y, il campo B alle coordinate W e Z ecc. (lo facevo quando programmavo in Clipper sotto DOS, in un mondo che di visuale non aveva nulla).
Sto per incontrando delle difficolt (sicuramente dovute alla mia inesperienza) nell’utilizzare il Report Designer: spero di venirne fuori.

Grazie ancora.

Funziona come il bancomat quando manca la corrente…
Prova a scrivere una tabella in html … fai prima
in pratica ti crei una window dove metti il codice per visualizzare il repor, magari nell’evento open
aggiungi il componente HTMLViewer che chiami HTMLViewer1 o come vuoi tu
un pulsante e nel’evento action ci metti :

HTMLViewer1.Print(True)

nell’open il codice per aprire il db, per parsare il recordset e ci infili il codice per creare html…

Dim html As String = "<html><body></body></html>" HTMLViewer1.LoadPage(html, GetTemporaryFolderItem)

ci metti poco più di 10 minuti … e sei apposto

Se ti mostro un report con fpdf ti verr la pelle d’oca… ma non scoraggiarti, in vb6 ho fatto di peggio.
Almeno in clipper usavi la stampante ad aghi … . e se avevi dbsee4 facevi i miracoli…

dim row as DatabaseRecord

rsitem.movefirst

’ stampa il PDF
dim pdf as StampaRegistriIva
dim posy as Double
dim posx as double
dim oldposy as double
dim oldposx as double

’ P sta per Portrait
pdf = new StampaRegistriIva(“L”)
pdf.descrizionestampa = self.descrizionestampa
pdf.AliasNbPages()
pdf.SetEnconding(encodings.WindowsLatin1)
pdf.AddPage()

pdf.SetFont(“Courier”,“B”,8)
if txtregistro.testo <> “” then
else
pdf.Cell(10,5," “,1,0,“L”)
pdf.Cell(30,5,” “,1,0,“L”)
pdf.Cell(20,5,” “,1,0,“L”)
pdf.Cell(55,5,“Registro Iva”,1,0,“L”)
pdf.Cell(30,5,” “,1,0,“L”)
pdf.Cell(28,5,” “,1,0,“R”)
pdf.Cell(28,5,” “,1,0,“R”)
pdf.Cell(28,5,” “,1,0,“R”)
pdf.Cell(50,5,” ",1,0,“L”)
pdf.ln()
end if
pdf.Cell(10,5,“Riga”,1,0,“L”)
pdf.Cell(30,5,“N.Doc”,1,0,“L”)
pdf.Cell(20,5,“Data Doc…”,1,0,“L”)
pdf.Cell(55,5,“Ragione Sociale”,1,0,“L”)
pdf.Cell(30,5,“Tipo”,1,0,“L”)
pdf.Cell(28,5,“Totale Doc.”,1,0,“R”)
pdf.Cell(28,5,“Imponibile”,1,0,“R”)
pdf.Cell(28,5,“I.V.A.”,1,0,“R”)
pdf.Cell(50,5,“Codice Iva”,1,0,“L”)
pdf.ln()

dim descrcau as string
dim trovato as integer
descrcau = “”

while not rsitem.eof
row = new DatabaseRecord
row.Column(“codice”) = rsitem.field(“codiva”).StringValue.trim
row.Column(“descrizione”) = cercafield(“codice”,“descrizione”,“aliquoteiva”,rsitem.field(“codiva”).StringValue)

riga = riga + 1
pdf.SetFont("Courier","",7)

if txtregistro.testo = "" then 
  pdf.Cell(10,5," ",1,0,"L")
  pdf.Cell(30,5," ",1,0,"L")
  pdf.Cell(20,5," ",1,0,"L")
  pdf.Cell(55,5,rsitem.field("codreg").StringValue + " " + cercafield("codice","descrizione","registri",rsitem.field("codreg").StringValue),1,0,"L")
  pdf.Cell(30,5," ",1,0,"L")
  pdf.Cell(28,5," ",1,0,"R")
  pdf.Cell(28,5," ",1,0,"R")
  pdf.Cell(28,5," ",1,0,"R")
  pdf.Cell(50,5," ",1,0,"L")
  pdf.ln()
end if

pdf.Cell(10,3.5,CStr(riga),"LR",0,"R")
pdf.Cell(30,3.5,rsitem.field("numrif").utfValue,"LR",0,"L")
if rsitem.field("datarif").StringValue.trim <> "" then
  pdf.Cell(20,3.5,rsitem.field("datarif").DateValue.dataitalia,"LR",0,"L")
else
  pdf.Cell(20,3.5," ","LR",0,"L")
end if
if rsitem.Field("codicecf").utfValue.Trim <> "" then 
  pdf.Cell(55,3.5,left(cercafield("codice","ragionesociale","clientifornitori",rsitem.Field("codicecf").utfValue),35),"LR",0,"L")
else
  pdf.Cell(55,3.5,left(cercafield("codice","descrizione","conti",rsitem.Field("codconto").utfValue),35),"LR",0,"L")
end if

pdf.Cell(30,3.5,cercafield("codice","descrbreve","causali",rsitem.field("causale").utfValue),"LR",0,"L")

dim rdetraibile as Currency
dim rindetraibile as currency
dim rdetvalore as Double
dim rindetvalore as double

if rsitem.Field("saldo").CurrencyValue > 0 then
  pdf.Cell(28,3.5,format(rsitem.Field("imponibile").CurrencyValue + rsitem.Field("saldo").CurrencyValue ,"#,###,###,###.00"),"LR",0,"R")
  pdf.Cell(28,3.5,format(rsitem.Field("imponibile").CurrencyValue,"#,###,###,###.00"),"LR",0,"R")
  pdf.Cell(28,3.5,format(rsitem.Field("saldo").CurrencyValue,"#,###,###,###.00"),"LR",0,"R")
  
  row.CurrencyColumn("imponibile") = rsitem.Field("imponibile").CurrencyValue
  row.CurrencyColumn("imposta") = rsitem.Field("saldo").CurrencyValue
  
  rdetvalore = Cercafielddouble("codice","detraibile","aliquoteiva",rsitem.field("codiva").StringValue)
  rindetvalore = Cercafielddouble("codice","indetraibile","aliquoteiva",rsitem.field("codiva").StringValue)
  row.CurrencyColumn("detraibile") = rsitem.Field("saldo").CurrencyValue * rdetvalore / 100
  row.CurrencyColumn("indetraibile") = rsitem.Field("saldo").CurrencyValue * rindetvalore / 100
  
  if round(rdetvalore * 1000) = 0 AND round(rindetvalore * 1000) = 0 then 
    row.CurrencyColumn("nonimponibile") = rsitem.Field("imponibile").CurrencyValue
  else
    row.CurrencyColumn("nonimponibile") = 0.00
  end if
  
else
  dim rtotale as Currency
  dim rsaldo as Currency
  dim rimponibile as Currency
  dim saldo as Currency
  saldo = -rsitem.Field("saldo").CurrencyValue
  rtotale = saldo + rsitem.Field("imponibile").CurrencyValue
  rtotale = -rtotale
  rimponibile = -rsitem.Field("imponibile").CurrencyValue
  
  row.CurrencyColumn("imponibile") = rimponibile
  row.CurrencyColumn("imposta") = rsaldo
  rsaldo = rsitem.Field("saldo").CurrencyValue
  
  row.CurrencyColumn("imponibile") = rimponibile
  row.CurrencyColumn("imposta") = rsaldo
  
  rdetvalore = Cercafielddouble("codice","detraibile","aliquoteiva",rsitem.field("codiva").StringValue)
  rindetvalore = Cercafielddouble("codice","indetraibile","aliquoteiva",rsitem.field("codiva").StringValue)
  row.CurrencyColumn("detraibile") = rsaldo * rdetvalore / 100
  row.CurrencyColumn("indetraibile") = rsaldo * rindetvalore / 100
  
  if round(rdetvalore * 1000) = 0 and round(rindetvalore * 1000) = 0 then
    row.CurrencyColumn("nonimponibile") = rimponibile
  else
    row.CurrencyColumn("nonimponibile") = 0.00
  end if
  
  pdf.Cell(28,3.5,format(rtotale ,"#,###,###,###.00"),"LR",0,"R")
  pdf.Cell(28,3.5,format(rimponibile,"#,###,###,###.00"),"LR",0,"R")
  pdf.Cell(28,3.5,format(rsaldo,"#,###,###,###.00"),"LR",0,"R")
end if
pdf.Cell(50,3.5,rsitem.field("codiva").StringValue.trim + " " + left(cercafield("codice","descrizione","aliquoteiva",rsitem.field("codiva").StringValue),25) ,"LR",0,"L")
pdf.ln()

[/code]

Test Valentina ADK for XOJO is the best for now

[quote=342868:@Nedi Freguglia]Ciao a tutti! Sono alle prime armi con Xojo (vengo da VB6), per cui anche la più semplice delle cose può rappresentare una difficoltà.
Sono alle prese con la preparazione di un report: a livello di Body dovrei stampare il risultato della somma dei valori di tre campi presenti sul record, e non riesco a capire come fare (senza modificare il database nè la query che genera il recordset.
Qualcuno mi può dare una mano?
Grazie.

Nedi[/quote]
inserisci il field nel body
nell’evento BeforePrinting di questo campo: (ad esempio devi sommare i valori interi presenti nei campi campo1 e campo2)
dim somma as integer=self.datasource.field("campo1).integerValue + self.datasource.field(“campo2”).integerValue
me.text=format(somma, “#,##0”)

In parole povere nel momento in cui il report viene eseguito hai a disposizione il suo datasource e puoi accedere ai vari campi (indipendentemente dal formato originale della sorgente)

Grande Antonio!! Lo sapevo che tu mi avresti indicato la strada giusta!!
Era il self.datasource che mi mancava…
Quindi l’accesso al datasource pu avvenire solo nel Body?

Grazie mille!!

No, pu avvenire in qualsiasi momento, ma nel body il record corrente.
Nei group header e footer devi controllare (dovrebbe essere corrente nell’header, successivo nel footer ma per questo ti avevo gi suggerito come fare per avere un valore dell’ultimo campo del body)