private void ReportProductStockLimitForm_Load(object sender, EventArgs e)
 {
     DataSet dsTempReport = new DataSet();
     try
     {
         string appPath = "";
         appPath = Directory.GetCurrentDirectory() + "\\" + globalConstants.ProductStockLimitXML;
         dsTempReport.ReadXml(@appPath);
         //prepare report for preview                
         ReportProductStockLimit rptXMLReport = new ReportProductStockLimit();
         CrystalDecisions.CrystalReports.Engine.TextObject txtReportHeader1, txtReportHeader2;
         txtReportHeader1 = rptXMLReport.ReportDefinition.ReportObjects["NamaTokoLabel"] as TextObject;
         txtReportHeader2 = rptXMLReport.ReportDefinition.ReportObjects["InfoTokoLabel"] as TextObject;
         //baca database untuk nama toko
         String nama, alamat, telepon, email;
         if (!gutil.loadinfotoko(2, out nama, out alamat, out telepon, out email))
         {
             //reset default opsi = 1
             if (!gutil.loadinfotoko(1, out nama, out alamat, out telepon, out email))
             {
                 nama = "TOKO DEFAULT";
                 alamat = "ALAMAT DEFAULT";
                 telepon = "0271-XXXXXXX";
                 email = "*****@*****.**";
             }
         }
         txtReportHeader1.Text = nama;
         txtReportHeader2.Text = alamat + Environment.NewLine + telepon + Environment.NewLine + email;
         rptXMLReport.Database.Tables[0].SetDataSource(dsTempReport.Tables[0]);
         crystalReportViewer1.ReportSource = rptXMLReport;
         crystalReportViewer1.Refresh();
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message);
     }
 }
 public virtual CrystalDecisions.CrystalReports.Engine.ReportDocument CreateReport() {
     ReportProductStockLimit rpt = new ReportProductStockLimit();
     rpt.Site = this.Site;
     return rpt;
 }