Avatar billede tigertool Nybegynder
27. april 2006 - 20:39 Der er 23 kommentarer og
1 løsning

Templates i .NET

Hej alle eksperter,

Jeg har i længe benyttet PrintDocument og PrintPreviewDialog til rapporter i et lille system jeg arbejder på.
Jeg er efterhånden træt af at jeg skal åbne koden og re-compile 'bare' for at ændre lidt i en rapport.
Så mit spørgsmål er nu - er der noget Template-smart i .NET jeg kan benytte, hvor jeg så benytter en template-fil til at danne min rapport ud fra? Hvis ja, er der nogle der har erfaringer de vil dele ud af? og hvordan kommer jeg i gang, eksempler her på eksperten ville være dejligt.
Avatar billede longshanks Nybegynder
28. april 2006 - 10:59 #1
Hvis du skal arbejde med formateret rapportering og .NET så kig på Crystal Reports api´et til .NET!  Det er rigtigt stært og inkluderer fulde rapporterings/formaterings komponenter til import!

Bare et hint

//Allan
Avatar billede tigertool Nybegynder
28. april 2006 - 22:30 #3
Jeg ville helst hvis jeg kunne undgå at benytte Crystal Reports.

Kunne man lave noget med XML/XSL?
Avatar billede innercitydk Nybegynder
28. april 2006 - 22:46 #4
Crystal reports er ellers ret genialt. Mange misforstår crystal reports og tror at de i sig selv skal forbinde til f.eks en database. Det kan de med fordel hvis man bruger dem standalone, men når man bruger dem via en kodet applikation er de helt geniale. Man kan oprette et dokument i crystal, som man så sender parametre til via applikationene. Det gør dem ekstremt fleksible og nemme at bruge i forhold til at printe via api.
Avatar billede tigertool Nybegynder
28. april 2006 - 23:04 #5
Ok -> jeg sidder faktisk og forsøger med CrystalReport lige nu. Problemet er bare at den guide som longshanks har postet benytter en MsSQL database, og jeg har kun adgang til en Firebird, hvilket åbenbart ikke er understøttet i CrystalReport
Avatar billede innercitydk Nybegynder
28. april 2006 - 23:11 #6
Du skal heller ikke tilgå databasen fra crystalreporten, men sende data programmatisk.. jeg har lavet et eksamensprojekt hvor vi brugte crystal reports på den måde.. finder det lige.
Avatar billede tigertool Nybegynder
28. april 2006 - 23:12 #7
tak -> jeg vil meget gerne se det projekt, hvis jeg må :)
Avatar billede innercitydk Nybegynder
28. april 2006 - 23:25 #8
Jeg kan sagtens sende dig hele projektet hvis du vil, men det er ret stort og kræver at du har styr på kode for at kunne finde rundt i det :)

Først laver du en ny rapport. Lav så mange nye parameter fields som du skal bruge og smid dem ind i rapporten. Herefter gemmer du rapporten.

http://nhlogic.aspdotnet.dk/pics/Crystal1.gif

Fra koden kalder jeg Printlejeaftale.cs med variablerne som input i constructoren:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports;
using CrystalDecisions.Shared;
using CrystalDecisions.ReportSource;

namespace DanBilUdlejning
{
    /// <summary>
    /// Summary description for Printlejeaftale.
    /// </summary>
    public class Printlejeaftale : System.Windows.Forms.Form
    {
        private CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer1;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public Printlejeaftale(
            string Lnr,
            string Knr,
            string Knavn,
            string Kadresse,
            string koerekortnr,
            string dato,
            string ekspederetaf,
            string Kategori,
            string Regnr,
            string Maerke,
            string Model,
            string koertkm,
            string mdrpris,
            string kmpris,
            string depositum,
            string aftalestart
            )
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
            ParameterFields paramFields = new ParameterFields();
            ParameterField paramField = new ParameterField();
            ParameterDiscreteValue discreteVal = new ParameterDiscreteValue();
            ParameterRangeValue rangeVal = new ParameterRangeValue();
            paramField.ParameterFieldName = "Lnr";
            discreteVal.Value = Lnr;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Knr";
            discreteVal.Value = Knr;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);
           
            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Knavn";
            discreteVal.Value = Knavn;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Kadresse";
            discreteVal.Value = Kadresse;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "koerekortnr";
            discreteVal.Value = koerekortnr;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "dato";
            discreteVal.Value = dato;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Ekspederetaf";
            discreteVal.Value = ekspederetaf;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Kategori";
            discreteVal.Value = Kategori;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Regnr";
            discreteVal.Value = Regnr;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Maerke";
            discreteVal.Value = Maerke;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "Model";
            discreteVal.Value = Model;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "koertkm";
            discreteVal.Value = koertkm;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "mdrpris";
            discreteVal.Value = mdrpris;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "kmpris";
            discreteVal.Value = kmpris;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "depositum";
            discreteVal.Value = depositum;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);

            paramField = new ParameterField();
            discreteVal = new ParameterDiscreteValue();
            paramField.ParameterFieldName = "aftalestart";
            discreteVal.Value = aftalestart;
            paramField.CurrentValues.Add(discreteVal); 
            paramFields.Add(paramField);
           
            crystalReportViewer1.ParameterFieldInfo = paramFields;
            crystalReportViewer1.ReportSource = "..\\..\\printlejekontrakt.rpt";
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Printlejeaftale));
            this.crystalReportViewer1 = new CrystalDecisions.Windows.Forms.CrystalReportViewer();
            this.SuspendLayout();
            //
            // crystalReportViewer1
            //
            this.crystalReportViewer1.ActiveViewIndex = -1;
            this.crystalReportViewer1.DisplayGroupTree = false;
            this.crystalReportViewer1.Location = new System.Drawing.Point(0, 0);
            this.crystalReportViewer1.Name = "crystalReportViewer1";
            this.crystalReportViewer1.ReportSource = null;
            this.crystalReportViewer1.ShowCloseButton = false;
            this.crystalReportViewer1.ShowExportButton = false;
            this.crystalReportViewer1.ShowGotoPageButton = false;
            this.crystalReportViewer1.ShowGroupTreeButton = false;
            this.crystalReportViewer1.ShowPageNavigateButtons = false;
            this.crystalReportViewer1.ShowRefreshButton = false;
            this.crystalReportViewer1.ShowTextSearchButton = false;
            this.crystalReportViewer1.Size = new System.Drawing.Size(864, 680);
            this.crystalReportViewer1.TabIndex = 0;
            //
            // Printlejeaftale
            //
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(864, 678);
            this.Controls.Add(this.crystalReportViewer1);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.Name = "Printlejeaftale";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Udskriv Lejeaftale";
            this.ResumeLayout(false);

        }
        #endregion
    }
}


Jeg vil gerne sende dig hele projektet hvis du er klar på det :) Det kan være det giver lidt mere mening når du selv kan se hvordan rapporten helt præcis er opbygget.

Vh
Avatar billede tigertool Nybegynder
28. april 2006 - 23:42 #9
Jeg er helt klar - bare send. Jeg plejer ikke at være tabt bag lidt kode - specielt ikke hvis det er godt-skrevet kode :)

BTW, hvad nu hvis man f.eks. skal have en faktura, hvor der skal være flere linier med produkter?
Avatar billede innercitydk Nybegynder
28. april 2006 - 23:52 #10
Man kan lave range på felterne, men det har jeg ikke prøvet. Det burde nu ikke være noget problem.
Her er koden:

http://nhlogic.aspdotnet.dk/DanBilUdlejning_med_rapport.rar

Når du kører programmet skal du logge ind med medarbejder nummer 1, og kode 1234

Når du opretter en lejeaftale skal du vælge kunde nr 3, Kategori A, Volvo, Rusten spand :) Når du så trykker på bekræft bliver rapporten dannet og er klar til udskrift..
Avatar billede innercitydk Nybegynder
28. april 2006 - 23:53 #11
Håber du kan bruge det til noget. Vi var 3 mand om at lave projektet. Det tog 3 uger, jeg har kodet det hele..
Avatar billede innercitydk Nybegynder
28. april 2006 - 23:55 #12
Jeg har ledt men jeg kan desværre ikke finde den rapport/dokumentation vi lavede i samme forbindelse så jeg håber du kan klare dig med koden.
Avatar billede tigertool Nybegynder
29. april 2006 - 00:11 #13
Takker - desværre kan jeg bare ikke åbne projectet, da jeg kun benytter VS.NET 2003 - men jeg kan sagtens se source-filerne :)
Avatar billede innercitydk Nybegynder
29. april 2006 - 00:18 #14
Åbn det projekt der ligger i den mappe der hedder backup.. Det skulle gerne være 2003 udgaven da det var det vi lavede det i :)
Avatar billede tigertool Nybegynder
29. april 2006 - 00:31 #15
Yeahh - BTW bliver CrystalReports altid 'embedded'? Jeg kunne godt tænke mig at mine reports var i .rpt-filer..
Avatar billede innercitydk Nybegynder
29. april 2006 - 00:37 #16
Hvis du kigger i filebrowseren kan du se at rapporten ligger som standalone rpt fil, men den tilgås via Printlejeaftale.cs
Avatar billede tigertool Nybegynder
29. april 2006 - 01:30 #17
Det ser jo altsammen meget godt ud - det eneste jeg ikke kan er at få flere rækker ud. Jeg har prøvet følgende:

            myParam.ParameterFieldName = "RullTest";

            myDiscreteValue.Value = "USA";
            myParam.CurrentValues.Add(myDiscreteValue);

            myDiscreteValue = new ParameterDiscreteValue();
            myDiscreteValue.Value = "Netherlands";
            myParam.CurrentValues.Add(myDiscreteValue);
            myParam.CurrentValues.Add(myDiscreteValue);
            myParam.CurrentValues.Add(myDiscreteValue);

            paramFields.Add(myParam);

Dog uden held..
Avatar billede innercitydk Nybegynder
29. april 2006 - 23:06 #18
Jeg har ledt lidt på nettet. Jeg har fundet et par links du måske kan bruge. Jeg har ikke prøvet at bruge den på denne måde, og ved desværre heller ikke om det er muligt uden at man skal lave forbindelse til db via rapporten.

http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=29659&lngWId=1
http://www.blytheco.com/mas90/crystal_sales_order1.asp
http://www.craigberntson.com/Articles/kb010.htm
http://www.codeguru.com/forum/archive/index.php/f-64-p-5.html
http://www.maricopa.edu/its/ent/CrystalReportFormatStandards.doc
http://www.bestsoftware.com/businessworks/support/trsg/modules/tech/tiptrick/crw/sw4759.pdf

Håber du kan bruge det til noget..
Avatar billede tigertool Nybegynder
15. juli 2006 - 22:08 #19
innercitydk > smid et svar :)
Avatar billede tigertool Nybegynder
13. september 2006 - 19:28 #20
innercitydk > smid et svar :)
Avatar billede tigertool Nybegynder
18. oktober 2006 - 22:36 #21
innercitydk > smid et svar :)
Avatar billede tigertool Nybegynder
02. december 2006 - 00:05 #22
innercitydk smid nu et svar!
Avatar billede tigertool Nybegynder
20. januar 2007 - 02:13 #23
innercitydk smid nu et svar!
Avatar billede tigertool Nybegynder
24. juni 2007 - 22:59 #24
nå, innercitydk, jeg lukker. Du ville åbenbart ikke have point...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester