347 lines
11 KiB
C#
347 lines
11 KiB
C#
/*********************************************************************************************
|
|
* Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
|
|
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
* ------------------------------------------------------------------------------
|
|
* $Workfile: CmpRpt.cs $ $Revision: 3 $
|
|
* $Author: Jsj $ $Date: 6/08/05 4:31p $
|
|
*
|
|
* $History: CmpRpt.cs $
|
|
*
|
|
* ***************** Version 3 *****************
|
|
* User: Jsj Date: 6/08/05 Time: 4:31p
|
|
* Updated in $/EXE/RefObj/CmpRpt
|
|
* cleanup
|
|
*
|
|
* ***************** Version 2 *****************
|
|
* User: Jsj Date: 1/08/04 Time: 2:51p
|
|
* Updated in $/EXE/RefObj/CmpRpt
|
|
* constructor of RODB() class changed
|
|
*
|
|
* ***************** Version 1 *****************
|
|
* User: Kathy Date: 11/11/02 Time: 7:17a
|
|
* Created in $/EXE/RefObj/CmpRpt
|
|
*********************************************************************************************/
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.IO;
|
|
using System.Data;
|
|
using RODBInterface;
|
|
using VlnStatus;
|
|
using System.Data.SqlClient;
|
|
using System.Xml;
|
|
using System.Xml.XPath;
|
|
using System.Xml.Schema;
|
|
|
|
// CmpRpt reads data for the RO database and puts the data into the
|
|
// temporary file, 'print.tmp'. After this, it is sorted and printed.
|
|
namespace CmpRpt
|
|
{
|
|
// Form1 just acts as the container for this app.
|
|
public class Form1 : System.Windows.Forms.Form
|
|
{
|
|
/// <summary>
|
|
/// Required designer variable.
|
|
/// </summary>
|
|
private System.ComponentModel.Container components = null;
|
|
|
|
public Form1()
|
|
{
|
|
//
|
|
// Required for Windows Form Designer support
|
|
//
|
|
InitializeComponent();
|
|
// B2019-082 set the date format on the VEPROMS.exe thread to U.S. for i/o of a date string
|
|
// this is to correct an issue for a UAE customer who could not open some procedures due to the desktop date setting using the "DD/MM/YYYY" instead of the "MM/DD/YYYY" format
|
|
// NOTE: not doing the "Using System.Threading;" statement at beginning of file because it conflicts with the declaration of the "Timer" variable
|
|
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
|
|
|
|
}
|
|
|
|
/// <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()
|
|
{
|
|
//
|
|
// Form1
|
|
//
|
|
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
|
|
this.ClientSize = new System.Drawing.Size(292, 273);
|
|
this.Name = "Form1";
|
|
this.Text = "Form1";
|
|
|
|
}
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// The main entry point for the application.
|
|
/// </summary>
|
|
[STAThread]
|
|
static void Main(string[] args)
|
|
{
|
|
if (args.Length <= 0) return; // nothing to do
|
|
bool success;
|
|
VlnXmlElement rootXml;
|
|
VlnXmlDocument myroXmlDoc;
|
|
string recid = null;
|
|
string tbl = null;
|
|
RODB myrodb = null;
|
|
// the next two lists contain group headers for the reports.
|
|
ArrayList headers = new ArrayList();
|
|
ArrayList reversehdrs = new ArrayList();
|
|
|
|
//if (args.Length <= 0) return;
|
|
//// if an RO directory path was passed in, then change the
|
|
//// current working directory to it.
|
|
//// this path will also be used to generate a connection string
|
|
//// for the Access database.
|
|
//if (args.Length == 2)
|
|
//{
|
|
// // MessageBox.Show(args[1],"args[1]");
|
|
// string path = args[0];
|
|
// Directory.SetCurrentDirectory(path);
|
|
// tbl = args[1].Substring(0, 4);
|
|
// //tbl = args[1].Substring(13,4);
|
|
// // recid = args[1].Substring(17,8);
|
|
// if (args[1].Length > 4)
|
|
// recid = args[1].Substring(4, 8);
|
|
// // myrodb = new RODB(path);
|
|
//}
|
|
//else
|
|
//{
|
|
// tbl = args[0].Substring(0, 4);
|
|
// recid = args[0].Substring(4, 8);
|
|
// // myrodb = new RODB(Directory.GetCurrentDirectory());
|
|
//}
|
|
/******/
|
|
// if an RO directory path was passed in, then change the
|
|
// current working directory to it.
|
|
// this path will also be used to generate a connection string
|
|
// for the Access database.
|
|
string roIdArg = BuildROList(args);
|
|
string[] roIDList = roIdArg.Split(',');
|
|
|
|
// If the args array contains more than 3 elements remove the extra ones. The fourth argument (PC=...) is handled in the BuildROList
|
|
// method above. If the args array contains more than 3 elements the working dir will not be correctly be set and the report will fail.
|
|
// The calling code file (DisplayReports.cs) at this time will only send up to 4 args.
|
|
|
|
//List<string> args2 = new List<string>(args);
|
|
//for (int i = 0; i < args2.Count; i++)
|
|
// {
|
|
// if (i > 2) {
|
|
// args2.RemoveAt(i);
|
|
// }
|
|
// }
|
|
////args2.RemoveAt(3);
|
|
//args = args2.ToArray();
|
|
|
|
//if (args.Length == 2 || args.Length == 3)
|
|
//{
|
|
string path = args[0];
|
|
Directory.SetCurrentDirectory(path);
|
|
//}
|
|
if (SqlConnectionStr != null)
|
|
myrodb = new SqlRODB(Directory.GetCurrentDirectory(), SqlConnectionStr, false);
|
|
else
|
|
{
|
|
myrodb = new AccessRODB(Directory.GetCurrentDirectory());
|
|
// if using access, be sure that the data has not been converted. When converted a record will be inserted w/ type = 8 and the info
|
|
// will contain the connection string.
|
|
string constring = myrodb.RODB_HasBeenConverted();
|
|
if (constring != null)
|
|
{
|
|
MessageBox.Show("This Referenced Object Database has been converted to sql. Attempting to use the sql version of the database. If this does not work, contact your Database Administrator", "RO access problem");
|
|
SqlConnectionStr = constring;
|
|
myrodb.dbProviderType = (int)RODB.DB_PROVIDER.SQL_SERVER;
|
|
myrodb = new SqlRODB(Directory.GetCurrentDirectory(), SqlConnectionStr, true);
|
|
}
|
|
}
|
|
VlnXmlElement rptele = null;
|
|
|
|
// Add the root to the tree
|
|
myroXmlDoc = myrodb.RODB_GetRoot();
|
|
|
|
rootXml = (VlnXmlElement)myroXmlDoc.FirstChild;
|
|
success = myrodb.RODB_GetRootGroups(rootXml);
|
|
if (success == false) return;
|
|
|
|
VlnStatusMessage showStat = null;
|
|
VlnStatusBar showStatBar = null;
|
|
int inc = 0;
|
|
int bmax = roIDList.Length;
|
|
if (roIDList.Length > 50)
|
|
{
|
|
showStatBar = new VlnStatusBar("Retrieving RO Information");
|
|
showStatBar.BarMax = bmax;
|
|
showStatBar.StatMsg = "Retrieving RO Information";
|
|
}
|
|
else
|
|
{
|
|
showStat = new VlnStatusMessage("Retrieving RO Information");
|
|
showStat.StatusMessage = "Reading RO Information";
|
|
}
|
|
Application.DoEvents();
|
|
foreach (string roid in roIDList)
|
|
{
|
|
if (showStatBar != null)
|
|
{
|
|
showStatBar.StatMsg = string.Format("Retrieving RO {0} of {1}", inc++, bmax);
|
|
showStatBar.BarValue = inc;
|
|
}
|
|
tbl = roid.Substring(0, 4);
|
|
recid = (roid.Length > 4) ? roid.Substring(4, 8) : null;
|
|
|
|
// if the table & recid = all zeros, we have a request
|
|
// for all ROs, otherwise it's a request for specific RO(s)
|
|
if (tbl == "0000" && recid != null && recid == "00000000")
|
|
{
|
|
// the report element becomes the root.
|
|
rptele = rootXml;
|
|
}
|
|
else
|
|
{
|
|
// from the input tbl string, get a table name.
|
|
int itbl = System.Convert.ToInt32(tbl, 16);
|
|
string stbl = System.Convert.ToString(itbl, 10);
|
|
string pstbl = stbl.PadLeft(6, '0');
|
|
string tbname = "RO" + pstbl;
|
|
|
|
// read in this element from the table.
|
|
rptele = myrodb.RODB_ReadRO(tbname, recid);
|
|
if (rptele != null)
|
|
{
|
|
VlnXmlElement parent;
|
|
string parentid;
|
|
parentid = rptele.GetAttribute("ParentID");
|
|
string rpteleParentid = parentid;
|
|
|
|
// walk up tree to get the path through the tree.
|
|
VlnXmlElement child = rptele;
|
|
while (parentid != null && parentid != "00000000")
|
|
{
|
|
parent = myrodb.RODB_ReadRO(tbname, parentid);
|
|
if (parent != null)
|
|
{
|
|
parentid = parent.GetAttribute("ParentID");
|
|
if (parentid == "00000000")
|
|
{
|
|
reversehdrs.Add(parent.InnerText);
|
|
break;
|
|
}
|
|
parent.AppendChild(child);
|
|
child = parent;
|
|
reversehdrs.Add(parent.GetAttribute("MenuTitle"));
|
|
}
|
|
else
|
|
parentid = null;
|
|
}
|
|
|
|
// Now hook this into the top part of tree by looking at the table
|
|
// names.
|
|
VlnXmlElement group = (VlnXmlElement)rootXml.FirstChild;
|
|
while (group != null)
|
|
{
|
|
string curtbname = group.GetAttribute("Table");
|
|
// hook it in here.
|
|
if (curtbname == tbname)
|
|
{
|
|
if (rpteleParentid != "00000000")
|
|
group.AppendChild(child);
|
|
else // if this is a top group, just reset rept ele
|
|
rptele = group;
|
|
break;
|
|
}
|
|
group = (VlnXmlElement)group.NextSibling;
|
|
}
|
|
// Set up the headers array, it's in reverse order since we walked
|
|
// up the tree, not down.
|
|
int cnt = reversehdrs.Count;
|
|
for (int i = cnt - 1; i >= 0; i--)
|
|
headers.Add(reversehdrs[i]);
|
|
myrodb.MyDBID = tbl;
|
|
rptele.Show(myrodb, headers, showStat, PCChildren); // this will write data to print.tmp file in the RO folder
|
|
Application.DoEvents();
|
|
headers.Clear();
|
|
reversehdrs.Clear();
|
|
}
|
|
}
|
|
}// end foreach roid
|
|
if (showStat != null)
|
|
showStat.Dispose();
|
|
if (showStatBar != null)
|
|
showStatBar.Dispose();
|
|
}
|
|
// C2017-003: use sql
|
|
static public string SqlConnectionStr = null;
|
|
static public SqlConnection ROAPP_SqlConnection
|
|
{
|
|
get
|
|
{
|
|
// Attempt to make a connection
|
|
SqlConnection cn = new SqlConnection(SqlConnectionStr);
|
|
try
|
|
{
|
|
cn.Open();
|
|
return cn;
|
|
}
|
|
catch (SqlException ex)
|
|
{
|
|
MessageBox.Show(ex.Message, "Could Not Make Connection To Database");
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
public static string[] PCChildren; //C2021-026 list of Parent/Child Children
|
|
private static string BuildROList(string[] args)
|
|
{
|
|
// when ro's in sql was added, an /sql parameter was introduced to allow the definition of the connection string. So
|
|
// go through list of args to find the one w/ /f= to find filename that has the ro list in it.
|
|
string roIdArg = null;
|
|
for (int i = 1; i<=args.Length-1; i++)
|
|
{
|
|
string parm2 = args[i];
|
|
if (parm2.StartsWith("/f="))
|
|
{
|
|
FileInfo fi = new FileInfo(parm2.Substring(3));
|
|
using (StreamReader sr = fi.OpenText())
|
|
{
|
|
roIdArg = sr.ReadToEnd();
|
|
sr.Close();
|
|
}
|
|
}
|
|
else if (parm2.StartsWith("/sql="))
|
|
{
|
|
SqlConnectionStr = parm2.Substring(5);
|
|
}
|
|
// C2021-026 get the list of P/C Children if it was passed in
|
|
else if (parm2.ToUpper().StartsWith("/PC="))
|
|
PCChildren = parm2.Substring(4).Split(','); //C2021-026 list of Parent/Child Children
|
|
else
|
|
roIdArg = parm2;
|
|
}
|
|
return roIdArg;
|
|
}
|
|
}
|
|
}
|