Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[ALG/C#] Het slim afdrukken van variabele hoeveelheid data *

Pagina: 1
Acties:

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Voor een applicatie die ik aan het maken ben heb ik een print functie nodig. Vroeger outputte ik alle data dan naar een HTML pagina en kon je die via je browser printen. Dit gaf helaas de nodige problemen als er in een tekstvak bijvoorbeeld wat meer date stond. (rare overgangen van pagina's of te brede pagina's). Dit was allemaal wel te voorkomen door checks maar echt netjes was het niet.

Nu heb ik een programma met meerdere forms waarop data uit een database vermeld staat. Tijdens de 'loopbaan' van dit programma verwacht ik dat er meer forms gemaakt zullen worden, niet altijd door mijzelf.

Het is niet zo dat het programma zonder gehercompileerd te worden, of uberhaupt in Visual Studio geweest te zijn nieuwe forms kan gaan printen. Alle forms moeten nog netjes door een programmeur in elkaar gezet worden. Het hoeft dus niet extreem dynamisch maar het is natuurlijk wel handig als niet alles harcoded moet.

Om dit probleem op te lossen had ik zelf het idee om een soort van Layout en Anchor class te maken.

De Anchor class zou de volgende velden bevatten.
  • Control c; //het control zoals een tekstvak met data
  • String descr; // een string voor een label dat bij het printen bij het control geplaatst wordt
  • Enum descrPosition //Waar staat het label? Boven, Links, Rechts, Onder etc..
  • Font fdescr; // font van de description
  • Font f; //font van de data
  • int x,y; // Positie op de pagina
  • int maxWidth //Om te zorgen dat er gewordwrapped wordt en de pagina past.
  • int rank; //Als hoeveelste control deze geplaatst moet worden (rank 0 komt op pagina 1 en rank 1 ook zolang het nog past op die pagina, etc..)
De Class layout zou dan meerdere anchors bevatten en een soort van default template voor printen (bedrijfslogo boven, afsluiting onder) tussen dit logo en afsluiting zou dan een soort van canvas zitten waar de class layout alle anchors zou moeten plaatsen, of moeten kiezen om weer een extra pagina in te voegen.

Nu denk ik dat het op deze manier wel gaat lukken, maar ik heb het idee dat dit slimmer kan, helaas kan ik niets vinden op google over "Efficient printing techniques" "Dynamic Printing", "Printing of variable data" (vaak dan nog ergens C# of programming erbij als zoekterm natuurlijk).

Ik vroeg me af of er een betere (overzichtelijkere) manier is, en/of er een manier is om dit nog meer dynamisch te doen, (Misschien via een aangepast flowlayout object) Verder zouden ook technieken om alles in elkaar te passen heel welkom zijn, of extra parameters die handig zouden zijn.

~ Mijn prog blog!


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Wij gebruiken voor deze debug logs (los van de normale logmeldingen op verschillende niveaus) XML. Elke onderdeel logt zijn xml data. De laatste versie zet dit om naar XPS via xslt. Met XPS kun je vrij eenvoudiger headers en footers fabriceren en wordt data automatisch over meerdere pagina's uitgesmeert. Vorige versies gebruikte html welke ik toonde via een WebBrowser component (opslaan van html was ook mogelijk).

Wij zijn werkzaam in de financiele wereld en de berekening van bijvoorbeeld een lease prijs bestaat uit meerdere onderdelen, echter het resultaat is alleen een prijs. Alle intermediaire gegevens worden naar de 'debug' log geschreven en als men twijfelt aan de uitkomt, dan kan deze ingezien worden.

Door de xslt oplossing hoeft de programmeur zich niet bezig te houden met objecten als layout en anchor. Die roept alleen maar de debug methodes aan en geeft daaraan een beschrijving en een object mee. De debug class kijkt eerst of het object een DebugRenderer attribute heeft (waarmee een custom xml rendering kan worden gedaan) en anders wordt aan de hand van reflectie het object vertaald naar een xml element. De 'debugger' werkt min of meer op dezelfde manier als log4net.

If it isn't broken, fix it until it is..


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 17-11 21:39

mulder

ik spuug op het trottoir

Volgens mij moet je wiel niet opnieuw uitvinden en gewoon een reporting tool zoals Reporting Services of Crystal Reports gebruiken.

oogjes open, snaveltjes dicht


Verwijderd

Dit klinkt inderdaad naar Crystal Reports, en daarvan zit een extra gratis plugin bij je Visual Studio...probeer die eens uit :).

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Ehm, misschien ben ik niet duidelijk geweest, of heb ik een verkeerd beeld van wat Crystal reports is. Maar het gaat niet om logjes ofzoiets, maar om een database applicatie voor dagelijks gebruik in meedere kantoren er staan gewoon gegevens in zoals een algemeen dagjournaal en die moeten geprint worden (en eventueel daarna gemailed naar bijv. een school).

De mensen die ermee gaan werken zijn dus geen techneuten ofzo :). Ik zal wel even naar Crystal Reports kijken voor het geval dat ik een verkeerd beeld heb van het programma.

@mulder ik denk dat je in de war wordt gebracht door de post van Niemand_Anders ik had het zelf niet over reporting tools ofwhatsoever. Verder probeer ik juist expliciet niet het wiel opnieuw uit te vinden door te vragen naar handige manieren om zoiets te doen.

Om het even makkelijk /duidelijk te maken. Eigenlijk wil ik gewoon net als word iets kunnen printen, alleen moet ik zelf alle data layouten :).

[ Voor 27% gewijzigd door roy-t op 30-06-2008 14:25 ]

~ Mijn prog blog!


Verwijderd

Bij Crystal Reports kan je aan dit soort rapporten denken, welke vervolgens met 1 simpele methode naar PDF/DOC geschreven kunnen worden om te mailen bijvoorbeeld.
Afbeeldingslocatie: http://www.core-ct.state.ct.us/reports/images/crystal.gif

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Verwijderd schreef op maandag 30 juni 2008 @ 14:08:
Dit klinkt inderdaad naar Crystal Reports, en daarvan zit een extra gratis plugin bij je Visual Studio...probeer die eens uit :).
Ik heb even gegoogled maar ik krijg overal expliciet de melding dat Crystal Reports niet werkt in Visual Studio Express helaas heeft het bedrijf niet veel geld over voor het maken van dit programma en wordt er daarom door mij met de Express versies gewerkt, dan is Crystal Reports helaas dus geen optie. Wel interessant om te weten dat er dus veel meer mogenlijk is met Crystal Reports dan ik dacht. Wel jammer dat ik nu niet kan testen of Crystal Reports ook goed werkt met grote lappen tekst e.d.

Helaas dus geen optie zo te zien :( maar zoiets blijkt dus wel te zijn wat ik zoek, of een handige manier om zoiets snel te schrijven. :)

~ Mijn prog blog!


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 17-11 21:39

mulder

ik spuug op het trottoir

Wat jij wil is precies waar reporting tools voor zijn. Helaas zijn het vaak verschrikkelijke dingen om mee te werken, er zit bij mij in ieder geval nog wel wat oud zeer ;) Als je het zelf wilt doen is idd HTML nog de beste oplossing, maar je hebt zelf de problemen al ondervonden. Ik zag nog wel dat er een subset van Reporting Services bij de SQL Express Edition zit. Je nog eens kunnen rondkijken of er niet wat freeware/open source te vinden is, zoals bv deze: http://report.sourceforge.net/

Beetje jammer ook dat het bedrijf voor een dubbeltje op de eerste rang wil, vooral omdat het een applicatie is die dus veel gebruikt en nog uitgebreid gaat worden.

oogjes open, snaveltjes dicht


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
Het bedrijfje is een jeugd crisis opvang centrum, die hebben niet al te veel geld over. :P Ze deden alles nog op papier maar toen ik hun website even update en wat computers gerepareerd heb verteld ik dat ik wel eens programmeerde, toen vroegen ze of ik geen applicatie voor ze kon schrijven. Als naive 18jarige heb ik toen ja gezegt en een half jaar later een vrij primitieve VB6 applicatie neer gezet. Nu 2 jaar later studeer ik informatica en bouw ik een nieuw programma dat nogsteeds niet perfect zal zijn maar waar iig heel wat beginnersfouten uit gehaald zullen worden, het is nogsteeds niet ideaal maar ze waren al ontzettend blij met een crashende VB6 app. :P

Ik zal iig is zoeken op sourceforge en anders zal ik toch zelf wat moeten schrijven, al kost het me honderd uur dan is dat nogsteeds goedkoper dan een licentie op Active of Crystal reports :P.

Edit: dat report.net ziet er helemaal niet verkeerd uit btw :). Alleen weer heerlijk dat je niet op sourceforge of op de website van root tech kan downloaden :/. nvm wel via http://sourceforge.net/projects/report/

Edit2:

Hmm Report.net blijkt niet echt te zijn wat ik me had voorgesteld, bovendien zitten er veel fouten in en wordt het project niet meer geupdate. Eigenlijk wil ik het tooltje compleet in mijn programma verstoppen zodat er geen andere apps mee geleverd hoeven te worden en moet het generen helemaal via mijn programma gaan. report.net leek dat wel aardig te doen, maar helaas gaat het bij complexere pagina's al vaak fout zoals de bugs aangeven.

Het wordt toch verder zoeken voor mij vrees ik, of toch zelf iets coden volgens een handig paradigma of idee? Heeft iemand nog een visie op hoe je zoiets het best kunt designen? Het gaat echt om een extreem simpele print functie waar misschien 2 verschillende typen in staan: plaatjes en tekst. Hmm... *denkt*

[ Voor 36% gewijzigd door roy-t op 30-06-2008 16:10 ]

~ Mijn prog blog!


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
roy-t schreef op maandag 30 juni 2008 @ 14:24:
Ehm, misschien ben ik niet duidelijk geweest, of heb ik een verkeerd beeld van wat Crystal reports is. Maar het gaat niet om logjes ofzoiets, maar om een database applicatie voor dagelijks gebruik in meedere kantoren er staan gewoon gegevens in zoals een algemeen dagjournaal en die moeten geprint worden (en eventueel daarna gemailed naar bijv. een school).
Microsoft Reporting Services kan volgens mij precies wat jij wil.

* Enerzijds kun je vanuit Visual Studio een report maken op basis van een of meer SQL queries, die je vervolgens kunt opmaken, filteren, etc. De opmaakmogelijkheden zijn zeer ruim, en op basis van vb-achtige expressies kun je bv. conditioneel kleuren, font, positie en andere opmaak toepassen. Erg krachtig.
* Anderzijds is er ook nog de mogelijkheid om de Report Builder tool te gebruiken. Deze laat niet-technische users zelf een Report in elkaar klikken dmv drag and drop. Minder flexibel, maar goed te gebruiken voor een normale gebruiker met een beetje feeling voor computers. Vereist wel dat een technisch figuur (i.e. jij :P ) een report model maakt waar de Report Builder zijn metadata uithaalt om dit drag and drop mogelijk te maken.

Voor deze reports geldt:
- Zijn te benaderen via een web-interface via een soort mappenstructuur waarop ook rechten kunnen worden uitgedeeld.
- Data kan realtime door de gebruiker anders gesorteerd worden.
- Reports kunnen evt. geparametriseerd worden (gebruiker kiest zelf bijv. start- en einddatums van de periode waarover gegevens moeten worden getoond)
- Reports kunnen geexporteerd worden naar HTML, Excel, CSV, gif, xml, en nog wat formaten.
- Reports kunnen via een schedule automatisch doorgemaild worden, in elk formaat.

Ik vind het een erg mooi product, ben er zeer over te spreken (de Report Builder iets minder, maar soit). Als dit wat lijkt, kan ik je aanraden eens naar een goede boekhandel te gaan en eens door een boek over Reporting Services 2005 te bladeren om te kijken wat er precies mogelijk is, en hoe het eruit ziet.

[ Voor 9% gewijzigd door MrBucket op 03-07-2008 22:08 ]


  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37

ATS

Een oplossing die je ook zou kunnen overwegen is het gebruik van LaTeX als report output mechanisme. Je schrijft een output als een tekstfile, en laat deze compileren naar een PDF (of postscript, of...). De output kwaliteit daarvan is geweldig. Echter, je moet wel LaTeX op het systeem hebben staan, en van jouw (de programmeur) kant vereist het wel enige inspanning om bekend te raken met de syntax van LaTeX.

Het voordeel van deze oplossing is dat het volledig gratis te gebruiken is, en dat LaTeX erg goed is in het er netjes en professioneel laten uitzien van je output. Je moet wel de hele output zelf programmeren, en het is daarmee natuurlijk wel veel meer werk dan het gebruik van iets als Chrystal Reports, afhankelijk van wat voor rapporten je precies wil maken.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • PV85
  • Registratie: Juni 2008
  • Laatst online: 19-09 09:33
Je kan ook gewoon een template maken in Word of Excel en via automation deze vullen. Gratis, en genoeg voorbeeldcode te vinden. Enige wat je nodig hebt is Office op de machine.waarop je het programma gebruikt.

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 23:50
Aangezien we in software engineering and architecture zitten zeg ik:
Kijk eens naar het Model-View-Controller design pattern voor hoe je ontwerp eruit zou moeten zien.

Data en data behandeling loskoppelen van een of meerdere views om ernaar te kijken.
Je controller deel is simpel voor dit probleem, aangezien printen geen invloed op de data heeft.

[Iets meer aan de programmeer kant van de materie:]
Een uiteindelijke implementatie zou ik diverse dingen nog afwegen.

1. data in Access stoppen + forms

2. je data in een SQL database stoppen, en met HTML/PHP daarin gaan grutten.
Menig computer-enthousiasteling kan dit redelijk makkelijk leren als er al een paar voorbeeldjes gegeven zijn. Met copy-paste is zo iets nieuws gemaakt.

3. je data in XML beschikbaar maken (via een interface?), en met XML stylesheets hier de gewenste dingen uit halen.
Iets lastiger, maar ook zeker te doen.

Verder is HTML/XML voor de pure data in combinatie met CSS voor styles/opmaak dan denk ik de way-to-go, omdat daar al heel veel kennis van het goed leesbaar renderen van data achter zit, die je niet nog eens een keer moet gaan programmeren.

Wat denk ik het minste werk is, is om je output in HTML/XML te presenteren, waarbij de user ook nog een CSS resp. XSL style-sheet kan selecteren, al dan niet met preview ;)

  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 23:50
ATS schreef op zaterdag 05 juli 2008 @ 21:57:
Een oplossing die je ook zou kunnen overwegen is het gebruik van LaTeX als report output mechanisme. Je schrijft een output als een tekstfile, en laat deze compileren naar een PDF (of postscript, of...). De output kwaliteit daarvan is geweldig. Echter, je moet wel LaTeX op het systeem hebben staan, en van jouw (de programmeur) kant vereist het wel enige inspanning om bekend te raken met de syntax van LaTeX.

Het voordeel van deze oplossing is dat het volledig gratis te gebruiken is, en dat LaTeX erg goed is in het er netjes en professioneel laten uitzien van je output. Je moet wel de hele output zelf programmeren, en het is daarmee natuurlijk wel veel meer werk dan het gebruik van iets als Chrystal Reports, afhankelijk van wat voor rapporten je precies wil maken.
Ik ben het helemaal eens met de genoemde voor- en nadelen, maar denk dat die nadelen toch echt wel zwaarder wegen, en zou deze discussie puur academisch voeren.

  • ATS
  • Registratie: September 2001
  • Laatst online: 29-10 18:37

ATS

Nou, ik denk eigenlijk dat die nadelen wel mee vallen, vooral gezien het feit dat er al iets van een HTML output was. De manier waarop je de output uitvoert is niet zo heel verschillend. Bovendien hoeft dit niet breed gedistribueerd te worden, waardoor de beperking dat de target machine over LaTeX moet beschikken niet zo'n heel groot bezwaar hoeft te zijn.

In eerste instantie kan je gewoon complete LaTeX uitvoeren, maar als je er wat handiger mee wordt, dan kan je prima template achtige dingen doen waarmee een heel behoorlijke scheiding van data en presentatie kan bereiken en je je uitvoer kan beperken tot de data die in je rapporten moeten en de rest in standaard template files kan houden.

Het voordeel van LaTeX is dat het al gericht is op output in pagina's, in tegenstelling tot de door jouw genoemde XML en CSS/PHP oplossingen, die met dezelfde problemen kampen als de HTML oplossing die de TS zelf al had.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
ATS schreef op maandag 07 juli 2008 @ 14:25:
Nou, ik denk eigenlijk dat die nadelen wel mee vallen, vooral gezien het feit dat er al iets van een HTML output was. De manier waarop je de output uitvoert is niet zo heel verschillend. Bovendien hoeft dit niet breed gedistribueerd te worden, waardoor de beperking dat de target machine over LaTeX moet beschikken niet zo'n heel groot bezwaar hoeft te zijn.

In eerste instantie kan je gewoon complete LaTeX uitvoeren, maar als je er wat handiger mee wordt, dan kan je prima template achtige dingen doen waarmee een heel behoorlijke scheiding van data en presentatie kan bereiken en je je uitvoer kan beperken tot de data die in je rapporten moeten en de rest in standaard template files kan houden.

Het voordeel van LaTeX is dat het al gericht is op output in pagina's, in tegenstelling tot de door jouw genoemde XML en CSS/PHP oplossingen, die met dezelfde problemen kampen als de HTML oplossing die de TS zelf al had.
Leuk om het als Latex uit te voeren, maar deze hele discussie zit eigenlijk op een al veel te "laag (te dicht bij programmeer kant)" niveau.

Ik had inderdaad al een html ouput, maar dat was zo ondynamisch als het maar kon (hardcoded htmlpagina die gewoon strings waren met af en toe " + txt1.text + " er tussen :P. Dit kan ik natuurlijk ook in latex doen maar dat lost het probleem niet op.

Ik had zelf bedacht om een control te wrappen in een ander object (wat nu toch al gebeurt ivm de DataLinks) en dan een soort van layout mechanisme te maken maar dan zo dynamisch mogenlijk. Toen kwamen report tools er bij wat wel leuk is en wat misschien ook wel zou kunnen werken, echter, wil ik at runtime vanuit het programma de reports genereren en niet vanuit de persoon die achter de pc zit, die moet gewoon op print of export kunnen drukken.

Een WordSjabloon kan wel een beetje een optie zijn, maar blijft net zo ondynamisch als exporten naar HTML (zover ik weet).

~ Mijn prog blog!


  • PV85
  • Registratie: Juni 2008
  • Laatst online: 19-09 09:33
roy-t schreef op maandag 07 juli 2008 @ 15:54:
[...]


Leuk om het als Latex uit te voeren, maar deze hele discussie zit eigenlijk op een al veel te "laag (te dicht bij programmeer kant)" niveau.

Ik had inderdaad al een html ouput, maar dat was zo ondynamisch als het maar kon (hardcoded htmlpagina die gewoon strings waren met af en toe " + txt1.text + " er tussen :P. Dit kan ik natuurlijk ook in latex doen maar dat lost het probleem niet op.

Ik had zelf bedacht om een control te wrappen in een ander object (wat nu toch al gebeurt ivm de DataLinks) en dan een soort van layout mechanisme te maken maar dan zo dynamisch mogenlijk. Toen kwamen report tools er bij wat wel leuk is en wat misschien ook wel zou kunnen werken, echter, wil ik at runtime vanuit het programma de reports genereren en niet vanuit de persoon die achter de pc zit, die moet gewoon op print of export kunnen drukken.

Een WordSjabloon kan wel een beetje een optie zijn, maar blijft net zo ondynamisch als exporten naar HTML (zover ik weet).
Wat bedoel je nou precies met dynamisch?
Dynamisch in de vorm van omgaan met verschillende hoeveelheden data? In dat geval is Word of LaTex daar toch juist zo goed voor aangezien ze gemaakt zijn om data goed over verschillende pagina's te spreiden?

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
PV85 schreef op dinsdag 08 juli 2008 @ 13:18:
[...]


Wat bedoel je nou precies met dynamisch?
Dynamisch in de vorm van omgaan met verschillende hoeveelheden data? In dat geval is Word of LaTex daar toch juist zo goed voor aangezien ze gemaakt zijn om data goed over verschillende pagina's te spreiden?
Dubbel, ik heb een Form met daarop meerdere velden, het liefst zou ik van te voren niet hoevne te weten hoeveel velden er op het form staan, en hoeveel text/data er in het veld staat.

(Hoevel velden er op een form staan kan wel hardcoded in het programma komen maar het leek me mooier dat niet te doen en gewoon per control een bepaalde vorm van layout regels maken, evt zouden ook die controls dan als ze at runtime gemaakt worden dan at runtime een soort van layout wrapper object mee moeten krijgen.)

Wel is het natuurlijk zo dat word en latex een stuk beter om gaan met meerdere pagina's als html. Hoewel ik het liefst onafhankelijk ben van andere software. (stel iemand gebruikt open-office en dan hang je alweer)

~ Mijn prog blog!


  • pkuppens
  • Registratie: Juni 2007
  • Laatst online: 23:50
roy-t schreef op dinsdag 08 juli 2008 @ 13:54:
[...]


Dubbel, ik heb een Form met daarop meerdere velden, het liefst zou ik van te voren niet hoevne te weten hoeveel velden er op het form staan, en hoeveel text/data er in het veld staat.

(Hoevel velden er op een form staan kan wel hardcoded in het programma komen maar het leek me mooier dat niet te doen en gewoon per control een bepaalde vorm van layout regels maken, evt zouden ook die controls dan als ze at runtime gemaakt worden dan at runtime een soort van layout wrapper object mee moeten krijgen.)

Wel is het natuurlijk zo dat word en latex een stuk beter om gaan met meerdere pagina's als html. Hoewel ik het liefst onafhankelijk ben van andere software. (stel iemand gebruikt open-office en dan hang je alweer)
Ik kom na alles gelezen te hebben tot maar 1 conclusie:
Bekijk eens op w3schools.com de tutorials rond XSL/XSLT/XSL-FO/XPath.

Het werkt allemaal op xml data, die zul je wel moeten kunnen produceren, maar dan kun je naar hartelust transformeren (XSLT), formatteren (XSL-FO), en zelfs navigeren (XPath).

Mooi de-coupled. En transformeer gerust naar LaTeX als je wilt, maar html, zonder tabellen, zal ook prima werken. (Trouwens met LaTeX en grote tabellen ben je denk ik ook verloren.)

Het is ook flexibel, als je een keer een veld toevoegt aan je structuren kun je aangeven of je die wel of niet wilt renderen, door de goede transformaties of style-sheets te selecteren/combineren(!) heb je veel controle over zowel data inhoud als opmaak.
Pagina: 1