/*********************************************************************************************
* Copyright 2004 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------
* $Workfile: Proc.cs $ $Revision: 26 $
* $Author: Jsj $ $Date: 9/25/06 2:08p $
*
* $History: Proc.cs $
*
* ***************** Version 26 *****************
* User: Jsj Date: 9/25/06 Time: 2:08p
* Updated in $/LibSource/VEObject
* allow user to move a procedure in the approved list
*
* ***************** Version 25 *****************
* User: Jsj Date: 8/30/06 Time: 10:04a
* Updated in $/LibSource/VEObject
* Added Multi Procedure Data Checker
*
* ***************** Version 24 *****************
* User: Kathy Date: 5/01/06 Time: 11:17a
* Updated in $/LibSource/VEObject
* Fix B2006-018: single quote in proc number causes problem on data
* request
*
* ***************** Version 23 *****************
* User: Kathy Date: 2/23/06 Time: 10:52a
* Updated in $/LibSource/VEObject
* Fix B2006-006, use actual database field for column mode in set file
* during approve selected. Also, don't crash on saving of column mode
* from procedure properties if value was null
*
* ***************** Version 22 *****************
* User: Kathy Date: 8/16/05 Time: 2:56p
* Updated in $/LibSource/VEObject
* B2005-030: error if missing ndx
*
* ***************** Version 21 *****************
* User: Kathy Date: 7/28/05 Time: 2:08p
* Updated in $/LibSource/VEObject
* for mod proc number, copy data into/from correct file number for
* approve ind
*
* ***************** Version 20 *****************
* User: Kathy Date: 7/18/05 Time: 10:55a
* Updated in $/LibSource/VEObject
* Lib doc transition reference may be upper or lower case
*
* ***************** Version 19 *****************
* User: Kathy Date: 6/21/05 Time: 7:25a
* Updated in $/LibSource/VEObject
* clear variable for edit from approve
*
* ***************** Version 18 *****************
* User: Kathy Date: 5/25/05 Time: 10:32a
* Updated in $/LibSource/VEObject
* Allow edits for tmpchg
*
* ***************** Version 17 *****************
* User: Kathy Date: 5/19/05 Time: 11:07a
* Updated in $/LibSource/VEObject
* speed up approve
*
* ***************** Version 16 *****************
* User: Kathy Date: 5/11/05 Time: 9:29a
* Updated in $/LibSource/VEObject
* approve all selectinto
*
* ***************** Version 15 *****************
* User: Kathy Date: 4/26/05 Time: 10:23a
* Updated in $/LibSource/VEObject
* Check for dbnull on dates
*
* ***************** Version 14 *****************
* User: Kathy Date: 4/21/05 Time: 10:22a
* Updated in $/LibSource/VEObject
* remove upgrade2005 define
*
* ***************** Version 13 *****************
* User: Jsj Date: 4/15/05 Time: 9:44a
* Updated in $/LibSource/VEObject
* added check to see if proc number exists in set file before adding to
* dependency list
*
* ***************** Version 12 *****************
* User: Jsj Date: 4/08/05 Time: 10:55a
* Updated in $/LibSource/VEObject
* comment about enabling slave proc number/title changes
*
* ***************** Version 11 *****************
* User: Jsj Date: 4/07/05 Time: 11:17a
* Updated in $/LibSource/VEObject
* Unit Specific call
*
* ***************** Version 10 *****************
* User: Kathy Date: 3/22/05 Time: 10:03a
* Updated in $/LibSource/VEObject
* Remove chgbar
*
* ***************** Version 9 *****************
* User: Kathy Date: 3/08/05 Time: 1:50p
* Updated in $/LibSource/VEObject
* Approval
*
* ***************** Version 8 *****************
* User: Kathy Date: 1/31/05 Time: 11:06a
* Updated in $/LibSource/VEObject
* Fix B2005-005 (connection & delete directory errors). also, fix icon
*
* ***************** Version 7 *****************
* User: Kathy Date: 11/12/04 Time: 8:43a
* Updated in $/LibSource/VEObject
* B2004-056: no date update on set file record when procedure data change
*
* ***************** Version 6 *****************
* User: Jsj Date: 8/20/04 Time: 9:02a
* Updated in $/LibSource/VEObject
* Disable the main form when we spawn off to VFW.EXE so the user cannot
* select a different tree node while we are bringing up the procedure
* editor.
*
* ***************** Version 5 *****************
* User: Jsj Date: 8/19/04 Time: 11:37a
* Updated in $/LibSource/VEObject
* fixed typo in transition usage message displayed when trying to delete
* a procedure
*
* ***************** Version 4 *****************
* User: Jsj Date: 8/16/04 Time: 4:23p
* Updated in $/LibSource/VEObject
* RECID not incremented inserting new procdure
*
* ***************** Version 3 *****************
* User: Kathy Date: 8/10/04 Time: 3:42p
* Updated in $/LibSource/VEObject
* duplicate file names on new proc & proc has wrong rec ids on new
*
* ***************** Version 2 *****************
* User: Kathy Date: 8/04/04 Time: 11:12a
* Updated in $/LibSource/VEObject
* stop two vfw sessions from spawning on quick 2 double clicks
*
* ***************** Version 1 *****************
* User: Kathy Date: 7/27/04 Time: 8:53a
* Created in $/LibSource/VEObject
*********************************************************************************************/
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Diagnostics;
using System.Text;
using System.Data;
using System.IO;
using System.Messaging;
using System.Runtime.InteropServices;
using System.Collections;
using Utils;
using VDB;
using VDB_Proc;
using VDB_Set;
using VDB_TransUsage;
using VDB_ROUsage;
using VEMessageNS;
using ROFST_FILE;
namespace VEObject
{
///
/// VEO_Proc support procedure functionality
///
public class VEO_Proc: VEO_Base
{
public VEO_ProcExt procExt;
public string origDate;
public string origTime;
public string _Prcnum;
public string recid;
public ProcColumnOptions _ProcColumn;
public string _ProcCode;
public string origProcCode;
public DataRow pdatarow; // row from set file.
private string[] DBExtensions={"DBF","DBT","NDX","SCR","FIX","APL","PGN","TCX","LLF","RTF","INF"};
private bool[] AppExtensions={false,false,false,false,true,false,true,false,false,false,true};
public string _ModInfo;
protected string tmpTitle;
protected string tmpProcNum;
protected ProcColumnOptions tmpProcCol;
protected bool changeProcNum;
protected bool changeTitle;
protected bool changeProcCol;
private string PrevDirectory;
private Process myProcess;
private Form mainForm;
private bool activeEdit; // flag that vfw is currently being brought up - don't do twice, if delay
public VEO_Proc(string ilocaltitle, string ipath, string iprcnum, string irecid, VEO_Base.ProcColumnOptions format, string iprccode, DataRow dr, VEO_DummySet dset, bool inew)
{
activeEdit=false;
iconStates = new int[5] {26,26,26,26,26};
procExt=null;
_Title = ilocaltitle;
_Location = ipath;
_Prcnum = iprcnum;
_ProcCode = iprccode;
origProcCode = _ProcCode;
_ProcColumn=(VEO_Base.ProcColumnOptions)format;
recid = irecid;
pdatarow = dr;
parentObj = dset;
usrRunTime = dset.usrRunTime;
if(!inew)
{
if (dr["DATE"] is System.DBNull)
{
origDate = null;
origTime = null;
}
else
{
origDate = dr["DATE"].ToString().PadRight(8,' ');
origTime = dr["TIME"].ToString().PadRight(5,' ');
}
SetModString(dr["INITIALS"].ToString(),origDate,origTime);
DTI.SetDateTimeInit=origDate+origTime+dr["INITIALS"].ToString().PadRight(5,' ');
}
isNew = inew;
changeProcNum=false;
changeTitle=false;
changeProcCol=false;
VEObjectType = (int)VEObjectTypesDefs.Procedure;
LoadLockInfo();
icon = iconStates[(int) Lock.LockStatus];
}
[Description("FileName"),Category("Procedure"),ReadOnly(true)]public string File_Name
{
get{return _Location;}
set{_Location=value;}
}
[Description("Modification Information"),Category("Procedure"),ReadOnly(true)]public string Modification_Information
{
get{return _ModInfo;}
set{_ModInfo=value;}
}
[Description("Procedure Number"),Category("Procedure"),EditorAttribute(typeof(VESymbDlg), typeof(System.Drawing.Design.UITypeEditor))]public string Procedure_Number
{
get
{
if(!changeProcNum)
return _Prcnum;
else
return tmpProcNum;
}
set
{
changeProcNum=true;
tmpProcNum=value;
}
}
[Description("Procedure Title"),Category("Procedure"),EditorAttribute(typeof(VESymbDlg), typeof(System.Drawing.Design.UITypeEditor))]public string Title
{
get
{
if (!changeTitle)
return _Title;
else
return tmpTitle;
}
set
{
changeTitle=true;
tmpTitle=value;
}
}
[Description("Format"),Category("Procedure")]public ProcColumnOptions Procedure_Column
{
get
{
if(!changeProcCol)
return _ProcColumn;
else
return tmpProcCol;
}
set
{
changeProcCol=true;
tmpProcCol=value;
}
}
private void SetModString(string person, string sdt, string tm)
{
string outtm=null;
string outdt=null;
DateTime dt;
if (tm!=null && tm!="")outtm=tm.Substring(0,2)+":"+tm.Substring(2,2);
if (sdt !=null && sdt != "")
{
dt = System.Convert.ToDateTime(sdt);
outdt = dt.ToShortDateString();
}
_ModInfo = person + " " + outdt + " " + outtm;
}
private bool IsInSet(string fname)
{
VEO_DummySet ds = (VEO_DummySet) parentObj;
VEO_Proc prc = null;
foreach (Object chld in ds.Children)
{
prc = (VEO_Proc)chld;
if (prc._Location == fname)return true;
}
return false;
}
private void SetUpNewFileName()
{
int i=0;
StringBuilder newname = new StringBuilder();
if(!isOpen) Open();
while(i==0 || (File.Exists(newname.ToString())||IsInSet(newname.ToString())))
{
newname.Remove(0,newname.Length);
newname.Append("PROC");
string tmp = i.ToString();
newname.Append(i.ToString("d3"));
newname.Append(".dbf");
i++;
}
this._Location = newname.ToString().Substring(0,7);
}
public override bool PropertiesDlg(Object parent)
{
bool retval = false;
PrcProperties propdlg;
if (isNew) SetUpNewFileName();
propdlg = new PrcProperties(parent, this, procExt);
if (propdlg.ShowDialog() == DialogResult.OK)
{
SetModString(pdatarow["INITIALS"].ToString(),pdatarow["DATE"].ToString(),pdatarow["TIME"].ToString());
retval=true;
}
else this.Restore();
propdlg = null;
return retval;
}
public override void Restore()
{
changeProcNum=false;
changeTitle=false;
changeProcCol=false;
}
public override string GetTreeNodeText()
{
VEO_DummySet dset = (VEO_DummySet) this.parentObj;
string UnitSpecPrcNum = ROFST_FILE.ROProcessTools.UnitSpecific(Procedure_Number,0,0,dset.LargestNumber);
// return Procedure_Number + " " + Title;
return UnitSpecPrcNum + " " + Title;
}
public override bool Open()
{
isOpen = true;
PrevDirectory = Directory.GetCurrentDirectory();
VEO_DummySet ps = (VEO_DummySet) this.parentObj;
Directory.SetCurrentDirectory(ps._Location);
return true;
}
// The close method resets, if necessary from any multi-user settings and
// positions back to the datapath directory (which is a level above the
// current level)
public override bool Close()
{
isOpen = false;
Directory.SetCurrentDirectory(PrevDirectory);
return true;
}
#if Upgrade2005_Print
public override bool Read(bool ChkForChldOnly)
{
VEO_DummySet ds = (VEO_DummySet) parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
string pth = ps._curDirectory + "\\" + ps._Location + "\\" + this._Location + ".dbf";
if (ChkForChldOnly)
{
try
{
// vdb_Proc dbprc = new vdb_Proc(pth);
// int cnt = dbprc.GetCount("WHERE [SEQUENCE] like ' %'");
// if (cnt>0)
// {
VEO_Section sct = new VEO_Section("XX", "XXXX", "TEMP", "XX", "0XXXXXXX"); //, this, true);
this.Children.Add(sct);
// }
}
catch (Exception e)
{
MessageBox.Show("Could not get count of sections " + e.Message);
return false;
}
}
else
{
try
{
vdb_Proc dbprc = new vdb_Proc(pth);
DataSet sectset = dbprc.GetSortedByStepSeqType("WHERE [SEQUENCE] like ' %'");
/* see if in order, assuming they are because of get sorted query.. */
foreach (DataRow row in sectset.Tables[0].Rows)
{
// get properties of section & then create a section.
string Step = row["STEP"].ToString();
string Sequence = row["SEQUENCE"].ToString();
string Txt = row["TEXT"].ToString();
string Type = row["TYPE"].ToString();
string RecID = row["RECID"].ToString();
VEO_Section sct = new VEO_Section(Step, Sequence, Txt, Type, RecID, this, false);
Children.Add(sct);
}
}
catch (Exception e)
{
MessageBox.Show("Error reading sections for " + this._Prcnum + ", " + e.Message);
return false;
}
}
#else
public override bool Read(bool dummy)
{
//load procs from set.dbf
#endif
return true;
}
public override bool EditNode()
{
if(!isOpen) Open();
if (!activeEdit)
{
ExecVfw(null);
activeEdit=true;
}
return true;
}
public void ExecVfw(string appendarg)
{
StringBuilder sb = new StringBuilder();
sb.Append("/c start /separate /w ");
sb.Append(this.usrRunTime.ExeAdjust("@vfw.exe"));
sb.Append(" /u-");
sb.Append(this.usrRunTime.UserID); //user login/initials
sb.Append(" -o");
sb.Append(this.usrRunTime.sec.userid.ToString());
sb.Append(" -i"); // do initials
sb.Append(this.usrRunTime.sec.initials);
sb.Append(" -s\"");
sb.Append(this.usrRunTime.syspath);
sb.Append("\\vesam.opt\" -w");
sb.Append(System.Convert.ToString(VEMessage.Handle_16bit,16));
if (appendarg !=null && appendarg=="t")
sb.Append(" -t");
else if (appendarg !=null && appendarg=="a")
sb.Append(" -a");
sb.Append(" -new");
// execute vfw using cmd because process was not creating the vfw process in
// its own memory space, i.e. only one copy of vfw came up even if two browsers
// tried to spawn it.
myProcess = new Process();
myProcess.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
myProcess.StartInfo.FileName = "cmd";
myProcess.StartInfo.Arguments = sb.ToString();
myProcess.StartInfo.UseShellExecute = true;
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new System.EventHandler(MyExitFunc);
// When vfw exits, 'MyExitFunc' method gets called from the above eventhandler
// where form is made visible again & locking/connecting is checked.
try
{
IntPtr handle =
System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
mainForm = (Form)Form.FromHandle(handle);
mainForm.Enabled = false;
myProcess.Start();
}
catch (Win32Exception e)
{
MessageBox.Show(e.Message + ". Error on load of vfw.");
}
}
private void MyExitFunc(object sender, System.EventArgs e)
{
mainForm.Visible = true;
mainForm.Enabled = true;
TreeView tv = null;
foreach (Control ctl in mainForm.Controls)
{
if (ctl is TreeView) tv = (TreeView)ctl;
}
if (tv != null) tv.Focus();
VEO_DummySet ds = (VEO_DummySet) parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
// enter the connection (reenter). This will check for changes in locking, etc.
ps.Connection.Enter(false);
if (ps.Lock.LockStatus==VENetwork.Status.LockPending) ps.Lock.LockStatus=VENetwork.Status.Locked;
ps.icon = ps.iconStates[(int)ps.Lock.LockStatus];
ps.treeNode.ImageIndex = ps.icon;
ps.treeNode.SelectedImageIndex = ps.icon;
mainForm = null;
activeEdit=false;
ps.AppSelForEdit=null;
}
// see if the procedure can be deleted...
private bool canDelete()
{
// check for transitions to this procedure. If they exist, make
// up a search result list & use vfw to resolve.
VEO_DummySet pds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) pds.parentObj;
string pth = ps._curDirectory+"\\"+ps.Location+"\\tran.dbf";
vdb_TransUsage transusg = new vdb_TransUsage(pth);
DataSet ds = transusg.GetSortedByToTrans("[TONUMBER] = \'"+this._Prcnum.Replace("'","''")+"\'");
if (ds.Tables[0].Rows.Count !=0)
{
bool is_ext=false;
foreach(DataRow dr in ds.Tables[0].Rows)
{
if (dr["FROMNUMBER"].ToString() != this._Prcnum)
{
is_ext=true;
break;
}
}
if (is_ext)
{
MessageBox.Show("Delete Operation failed!\n\nYou need to remove transition references to this procedure.\n\nThe procedure editor will now display with a list of the transition locations.");
ExecVfw("t");
return false;
}
}
return true;
}
public override bool Delete()
{
if (!isOpen) Open();
// first see if the procedure can be deleted (if the procedure has
// transitions to it, it cannot be deleted). If so, do it.
if (canDelete()==false) return false;
VEO_DummySet pds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) pds.parentObj;
//Remove the transitions 'from' in the usage file.
string pth = ps._curDirectory+"\\"+ps.Location+"\\tran.dbf";
vdb_TransUsage transusg = new vdb_TransUsage(pth);
DataSet ds = transusg.GetSortedByFromTrans("[FROMNUMBER] = \'"+this._Prcnum.Replace("'","''")+"\'");
int ndr = ds.Tables[0].Rows.Count;
foreach (DataRow dr in ds.Tables[0].Rows) dr.Delete();
// if deleted any, need to save data & pack database
if (ndr>0)
{
transusg.DB_Data = ds.Tables[0].DataSet;
transusg.Pack();
}
// now, do the same for RO references
pth = ps._curDirectory+"\\"+ps.Location+"\\usagero.dbf";
vdb_ROUsage rousg = new vdb_ROUsage(pth);
ds = rousg.GetSortedByProc("[NUMBER] = \'"+this._Prcnum.Replace("'","''")+"\'");
ndr = ds.Tables[0].Rows.Count;
foreach (DataRow dr in ds.Tables[0].Rows)dr.Delete();
if (ndr>0)
{
rousg.DB_Data = ds.Tables[0].DataSet;
rousg.Pack();
}
// remove procedure files & related rtffiles
foreach(string str in DBExtensions)
{
// status update function - count);
string filename = pds._Location + "\\" + this._Location + "." + str;
if (File.Exists(filename)) File.Delete(filename);
}
RemoveAccessoryFiles(this._Location,"wpfiles");
RemoveAccessoryFiles(this._Location,"rtffiles");
// delete the record if the above goes ok.
pdatarow.Delete();
VEO_DummySet dset = (VEO_DummySet) this.parentObj;
dset.vdbSet.DB_Data = pdatarow.Table.DataSet;
// if there was a set extension record. Delete it too.
if(ps.hasExtensions)
{
procExt.drow.Delete();
dset.vdbSetExt.DB_Data = procExt.drow.Table.DataSet;
procExt=null;
}
// if parent dummy set only has this child, set its icon to empty
if (dset.Children.Count<=1) IsEmpty = true;
// Note that the database is not getting packed - so pack it, and
// then re-read in the data for the procs (from the parent node).
int whichone=0;
for (int i=0;iptlength?ptlength:tmpTitle.Length);
pdatarow["TITLE"] = tmpTitle;
_Title = tmpTitle;
changeTitle=false;
dchange=true;
if (tmpTitle.Length+1 > dset.LargestTitleForMenu)
{
dset.LargestTitleForMenu = tmpTitle.Length+1;
dchnglarge=true;
}
}
if (changeProcNum && (string)pdatarow["NUMBER"]!=tmpProcNum)
{
if(tmpProcNum.Length>20) tmpProcNum= tmpProcNum.Substring(0,20);
oldnumber=_Prcnum;
newnumber=tmpProcNum;
pdatarow["NUMBER"] = tmpProcNum;
_Prcnum = tmpProcNum;
dchange=true;
if (tmpProcNum.Length+1 > dset.LargestNumber)
{
dset.LargestNumber = tmpProcNum.Length+1;
dchnglarge=true;
}
if ((tmpProcNum.Substring(0,1)!=" ") && tmpProcNum.Length+1>dset.LargestNumberForMenu)
{
dset.LargestNumberForMenu = tmpProcNum.Length+1;
dchnglarge= true;
}
}
int itmpcol = (int)Procedure_Column+1;
string stmpcol=itmpcol.ToString();
// check that the internal temporary column wasn't set to a default value of 2,
// this is set when the FORMAT field = null or 0. The Browser (and original DMAS)
// did not look at the format file value PMODE, as it should, to determine
// the default. This cannot be fixed at this time because during the format files
// are not read/parsed to get the value of PMODE.
bool deflt = (pdatarow["FORMAT"] is System.DBNull || (string)pdatarow["FORMAT"]=="0")&&stmpcol=="2";
bool datadiff=false;
if (pdatarow["FORMAT"] is System.DBNull)
{
if (stmpcol!="2") datadiff=true;
}
else
datadiff = (string)pdatarow["FORMAT"]!=stmpcol;
if (changeProcCol && datadiff && !deflt)
{
pdatarow["FORMAT"] = stmpcol;
_ProcColumn=Procedure_Column;
changeProcCol=false;
dchange=true;
}
if(origProcCode != _ProcCode)
{
pdatarow["PROCCODE"] = _ProcCode;
dchange=true;
}
if(dchange)
{
try
{
// modify the first record if the largest string length changed.
if (dchnglarge)
{
DataRow recidrow = pdatarow.Table.Rows[0];
string padstr1 = dset.LargestNumber.ToString("d2").PadLeft(2,'0');
string padstr2 = dset.LargestNumberForMenu.ToString("d2").PadLeft(2,'0');
string padstr3 = dset.LargestTitleForMenu.ToString("d2").PadLeft(2,'0');
recidrow["NUMBER"] = padstr1 + " " + padstr2 + " " + padstr3;
}
dset.vdbSet.DB_Data = pdatarow.Table.DataSet;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
return false;
}
}
// see if this has a setext to save....
if (pset.hasExtensions)
{
bool ret = this.procExt.Write(dset);
if (!ret) return false;
}
// if the procedure number was changed, then need to update usage files
// with the new procnumber
if (changeProcNum && (newnumber != oldnumber))
{
//Remove the transitions 'from' in the usage file.
string pth = pset._curDirectory+"\\"+pset.Location+"\\tran.dbf";
vdb_TransUsage transusg = new vdb_TransUsage(pth);
transusg.UpdateProcNumber(oldnumber,newnumber);
transusg=null;
pth = pset._curDirectory+"\\"+pset.Location+"\\usagero.dbf";
vdb_ROUsage rousage = new vdb_ROUsage(pth);
rousage.UpdateProcNumber(oldnumber,newnumber);
rousage=null;
changeProcNum=false;
}
return true;
}
// Make an initial dummy step.
static void CreateInitStep(vdb_Proc prc)
{
// update the recid
DataTable tbl = prc.DB_Data.Tables[0];
DataRow recidrow = tbl.Rows[0];
string tmprecid = recidrow["RECID"].ToString();
int irecid = System.Convert.ToInt32(tmprecid.Substring(2,6));
irecid++;
tmprecid = tmprecid.Substring(0,2)+irecid.ToString("d6");
recidrow["RECID"]=tmprecid;
// add the new row for the first section
DataRow pdatarow = tbl.NewRow();
pdatarow["RECID"] = "00000002";
pdatarow["STEP"] = "A1";
pdatarow["SEQUENCE"] = "S";
pdatarow["TEXT"] = "Dummy Step";
pdatarow["TYPE"] = "01";
DateTime tm = System.DateTime.Now;
pdatarow["DATE"] = tm.ToString("MM/dd/yyyy");
pdatarow["TIME"] = tm.ToString("HHmm") + ":";
tbl.Rows.Add(pdatarow);
prc.DB_Data = pdatarow.Table.DataSet;
}
// Make an initial procedure step section.
static void CreateInitSection(vdb_Proc prc)
{
// update the recid
DataTable tbl = prc.DB_Data.Tables[0];
DataRow recidrow = tbl.Rows[0];
string tmprecid = recidrow["RECID"].ToString();
int irecid = System.Convert.ToInt32(tmprecid.Substring(2,6));
irecid++;
tmprecid = tmprecid.Substring(0,2)+irecid.ToString("d6");
recidrow["RECID"]=tmprecid;
// add the new row for the first section
DataRow pdatarow = tbl.NewRow();
pdatarow["RECID"] = "00000001";
pdatarow["STEP"] = "A0";
pdatarow["SEQUENCE"] = " 1X";
pdatarow["TEXT"] = "Procedure Steps";
pdatarow["TYPE"] = "01";
DateTime tm = System.DateTime.Now;
pdatarow["DATE"] = tm.ToString("MM/dd/yyyy");
pdatarow["TIME"] = tm.ToString("HHmm") + ":";
tbl.Rows.Add(pdatarow);
prc.DB_Data = pdatarow.Table.DataSet; //save the changed dataset info
}
// Create a new procedure.
public override bool SaveNew(string dummy)
{
try
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
// check for a valid name.
// create the new procedure file, create the initial section & initial step.
vdb_Proc newprc = new vdb_Proc("");
newprc.CreateTable(this._Location);
CreateInitSection(newprc); // Make procedure section
CreateInitStep(newprc); // Add a dummy step
// Add the record to the set file.
DataTable pdatatable = ds.vdbSet.DB_Data.Tables[0];
DataRow recidrow = pdatatable.Rows[0];
string currecid = recidrow["RECID"].ToString();
string tmprecid = currecid;
int irecid = System.Convert.ToInt32(tmprecid.Substring(2,6));
irecid++;
tmprecid = tmprecid.Substring(0,2)+irecid.ToString("d6");
recidrow["RECID"]=tmprecid;
pdatarow = pdatatable.NewRow();
// check whether to trim the number & title.
if (Procedure_Number.Length>20)Procedure_Number=Procedure_Number.Substring(0,20);
if (Title.Length>78)Title=Title.Substring(0,78);
pdatarow["RECID"] = currecid;
pdatarow["TITLE"] = Title;
pdatarow["NUMBER"] = Procedure_Number;
int itmpcol = (int)Procedure_Column+1;
pdatarow["FORMAT"] = itmpcol.ToString();
pdatarow["ENTRY"] = _Location;
DateTime tm = System.DateTime.Now;
pdatarow["DATE"] = tm.ToString("MM/dd/yyyy");
pdatarow["TIME"] = tm.ToString("HHmm") + ":";
pdatarow["PROCCODE"] = _ProcCode;
pdatatable.Rows.Add(pdatarow);
// See if this proc's data changes the largest numbers stored
// in the first record.
bool chg = false;
if (Procedure_Number.Length+1 > ds.LargestNumber)
{
chg=true;
ds.LargestNumber = Procedure_Number.Length+1;
}
if ((Procedure_Number.Substring(0,1)!=" ") && (Procedure_Number.Length+1>ds.LargestNumberForMenu))
{
chg=true;
ds.LargestNumberForMenu = Procedure_Number.Length+1;
}
if (Title.Length+1 > ds.LargestTitleForMenu)
{
chg=true;
ds.LargestTitleForMenu = Title.Length+1;
}
if (chg)
{
string padstr1 = ds.LargestNumber.ToString("d2").PadLeft(2,'0');
string padstr2 = ds.LargestNumberForMenu.ToString("d2").PadLeft(2,'0');
string padstr3 = ds.LargestTitleForMenu.ToString("d2").PadLeft(2,'0');
recidrow["NUMBER"] = padstr1 + " " + padstr2 + " " + padstr3;
}
ds.vdbSet.DB_Data = pdatarow.Table.DataSet;
_Title=Title;
_Prcnum=Procedure_Number;
_ProcColumn=Procedure_Column;
changeTitle=false;
changeProcCol=false;
changeProcNum=false;
if (ps.hasExtensions) this.procExt.SaveNew(this, tmprecid);
isNew=false;
ds.icon = ds.iconStates[0]; // in case it was empty
}
catch (Exception e)
{
MessageBox.Show(e.Message,"Could not perform database functions required to add procedure.");
return false;
}
return true;
}
public override bool updateROValues()
{
// update the ro values for this procset, so get parent's (dummy set), parent
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
return ps.updateROValues();
}
public override void CleanTransitionsAndROsUsages(int clntype,string ProcName)
{
// clean, send this procname to procedure set to spawn the clean
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
ps.CleanTransitionsAndROsUsages(clntype,this._Prcnum);
}
public override void ApproveProcedures(int aptype, ArrayList procs)
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (aptype == 0)
ps.ApproveProcedures(aptype,null);
else if (procs.Count>0)
ps.ApproveProcedures(aptype,procs);
else
{
ArrayList prcs = new ArrayList();
prcs.Add(this);
ps.ApproveProcedures(aptype,prcs);
}
}
public override void DataIntegrityCheck(string ProcName)
{
// send this procname to procedure set to spawn the DataCheck
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
ps.DataIntegrityCheck(this._Prcnum);
}
private void MoveFixFile(string apname, string appath, VEO_ProcSet ps)
{
string[] FxExt = {".FIX",".FX1",".FX2",".FX3",".FX4",".FX5",".FX6",".FX7",".FX8"};
string apvname = (apname==null || apname == "")?_Location:apname;
foreach (string str in FxExt)
ps.CopyAnyFileToApproved(_Location+str,apvname+str,appath);
}
private void FixProcDateAndTime(string apname, VEO_ProcSet ps)
{
string[] extensions = {".dbf",".dbt",".ndx"};
string appath = null;
string wd = null;
string apvname = (apname==null||apname=="")?_Location:apname;
foreach (string str in extensions)
{
appath = ps.GetApprovedDirectory("\\") + apvname + str;
wd = _Location + str;
FileInfo fi_app = new FileInfo(appath);
FileInfo fi_wd = new FileInfo(wd);
fi_app.LastWriteTime = fi_wd.LastWriteTime;
File.Copy(appath, wd, true);
fi_app = new FileInfo(appath);
fi_wd = new FileInfo(wd);
fi_app.LastWriteTime = fi_wd.LastWriteTime;
fi_wd.LastWriteTime = fi_app.LastWriteTime;
}
}
public void Copy(string srcdir, string destdir, string prcnum, string prcfile)
{
VEO_DummySet ds = (VEO_DummySet) parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
// if there is a new procedure to add for a modified proc number,
// prcfile will not == the _Location. Use it instead.
string loc=null;
if (prcfile != _Location)
loc = prcfile;
else
loc = _Location;
string destfile = destdir + "\\" + loc;
string srcfile = (srcdir==null)? _Location: srcdir + "\\" + _Location;
if (!File.Exists(srcfile+".dbf")) return;
if (File.Exists(destfile+".dbf")) File.Delete(destfile+".dbf");
if (File.Exists(destfile+".ndx")) File.Delete(destfile+".ndx");
if (File.Exists(destfile+".dbt")) File.Delete(destfile+".dbt");
vdb_Proc dbprc = null;
try
{
dbprc = new vdb_Proc(srcfile+".dbf");
// Use SelectIntoNewTable to create the table & copy it over using
// sql select * into ... Then just make an instance of the table, this
// will set up indexes and inf files as necessary.
dbprc.SelectIntoNewTable(srcdir+"\\"+destfile);
string cwd = Directory.GetCurrentDirectory();
Directory.SetCurrentDirectory(destdir);
vdb_Proc apprc = new vdb_Proc(loc+".dbf");
Directory.SetCurrentDirectory(cwd);
apprc=null;
}
catch (Exception e)
{
MessageBox.Show("Could not copy " + _Location + " to approved." + e.Message);
return;
}
// now copy over rtf files by finding the procedure records that are attachments.
DataSet accset=null;
try
{
accset = dbprc.GetSortedByStepSeqType("WHERE [SEQUENCE] like ' %'");
}
catch (Exception e)
{
MessageBox.Show("Could not copy over accessory page files " + this._Prcnum + ", " + e.Message);
return;
}
string rtfsrcdir = srcdir + "\\rtffiles\\" + this._Location + ".A";
string rtfdestdir = destdir + "\\rtffiles\\" + prcfile + ".A";
foreach (DataRow dr in accset.Tables[0].Rows)
{
bool accpage = (char.IsLetter(dr["STEP"].ToString()[1]))?true:false;
if (accpage)
{
string stpno = (string) dr["STEP"].ToString();
char accsect = stpno[0];
string tmpext = (accsect-'@').ToString("D2");
if (File.Exists(rtfsrcdir+tmpext))
File.Copy(rtfsrcdir+tmpext,rtfdestdir+tmpext,true);
}
}
for (int i=0;iptlength?ptlength:_Title.Length);
foundRow["NUMBER"] = _Prcnum;
foundRow["ENTRY"]= _Location==ApProcFile?_Location:ApProcFile;
foundRow["FORMAT"] = pdatarow["FORMAT"]; // if modified, pdatarow has current
foundRow["PROCCODE"] = _ProcCode;
// if removing change bars, update the working draft date/time stamp
// for this procedure.
if (ps.RmChgBarOnApp)
{
ps.UpdateSetDTI(false,pdatarow);
ds.vdbSet.DB_Data = pdatarow.Table.DataSet;
}
vdbSet.DB_Data = foundRow.Table.DataSet; // write it out
// now make sure we update the largestnumber data in the set header
recidrow = pdatarow.Table.Rows[0];
string tmplarge = recidrow["NUMBER"].ToString();
if (tmplarge == null || tmplarge == "") tmplarge = "00000000";
bool update=false;
if (ds.LargestNumber != System.Convert.ToInt32(tmplarge.Substring(0,2)))
{
update=true;
tmplarge = ds.LargestNumber.ToString("d2").PadLeft(2,'0') + tmplarge.Substring(2,tmplarge.Length-2);
}
if (ds.LargestNumberForMenu != System.Convert.ToInt32(tmplarge.Substring(3,2)))
{
update = true;
tmplarge = tmplarge.Substring(0,3) + ds.LargestNumberForMenu.ToString("d2").PadLeft(2,'0') + tmplarge.Substring(5,tmplarge.Length-5);
}
if (ds.LargestTitleForMenu != System.Convert.ToInt32(tmplarge.Substring(6,2)))
{
update = true;
tmplarge = tmplarge.Substring(0,6) + ds.LargestTitleForMenu.ToString("d2").PadLeft(2,'0');
}
if (update)
{
recidrow["NUMBER"] = tmplarge;
vdbSet.DB_Data = recidrow.Table.DataSet; // write it out
}
}
// pass in approved path & approved procedure number, i.e. original procedure
// number - if the proc number is modified, this stores original otherwise
// it is the current proc number. (if this is a new procedure then ApProcNum=null.
public void FixTransitionReferences(string ApprovedPath, string ApProcNum)
{
string appath=ApprovedPath+"\\tran.dbf";
VEO_DummySet ds = (VEO_DummySet) parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
try
{
vdb_TransUsage atransusg = new vdb_TransUsage(appath);
// if this procedure existed before this approval, then remove transitions-from
// approved version (they'll be added back later).
if (ApProcNum != null)
{
DataSet adset = atransusg.GetSortedByFromTrans("[FROMNUMBER] = \'"+ApProcNum.Replace("'","''")+"\'");
int ndr = adset.Tables[0].Rows.Count;
if (ndr > 0)
{
int errs = atransusg.DeleteSelected("[FROMNUMBER] = \'"+ApProcNum.Replace("'","''")+"\'");
if (errs>0)
{
MessageBox.Show("Error resolving transition records");
return;
}
atransusg.Pack();
}
// if there was a change in procedure number, then update the transitions-to in
// the approved version.
if (ApProcNum!=_Prcnum)
{
adset.Clear();
adset = atransusg.GetSortedByToTrans("[TONUMBER] = \'"+ApProcNum.Replace("'","''")+"\'");
ndr = adset.Tables[0].Rows.Count;
foreach (DataRow dr in adset.Tables[0].Rows) dr["TONUMBER"]=_Prcnum;
if (ndr>0) atransusg.DB_Data = adset.Tables[0].DataSet;
}
adset.Clear();
adset=null;
}
// now update the approved transitions from data based on data in the working
// draft.
vdb_TransUsage transusg = new vdb_TransUsage(ps._curDirectory+"\\"+ps.Location+"\\tran.dbf");
DataSet wdset = transusg.GetSortedByFromTrans("[FROMNUMBER] = \'"+_Prcnum.Replace("'","''")+"\'");
if (wdset.Tables[0].Rows.Count>0)
{
int errs = transusg.InsertInto(ps._curDirectory+"\\"+ps.Location+"\\"+appath,"[FROMNUMBER] = \'"+_Prcnum.Replace("'","''")+"\'");
if (errs>0)
{
MessageBox.Show("Error resolving transition records");
return;
}
// Now update the working draft 'OLDTO' field to contain the current
// working draft 'TONUMBER'+'TOSEQUENCE' fields.
StringBuilder qry = new StringBuilder();
qry.Append("UPDATE TRAN SET TRAN.OLDTO = [TONUMBER] & Space(20-Len([TONUMBER])) & [TOSEQUENCE] & Space(12-Len([TOSEQUENCE])) ");
qry.Append("WHERE (tran.FROMNUMBER=\'");
qry.Append(_Prcnum.Replace("'","''"));
qry.Append("\' AND tran.TOSEQUENCE IS NOT NULL)");
// This one handles the libdocs (their TOSEQUENCE is null).
bool success = transusg.UpdateUsing(qry.ToString());
if (!success) MessageBox.Show("Error When Updating Transition history");
qry.Length=0;
qry.Append("UPDATE TRAN SET TRAN.OLDTO = [TONUMBER] & Space(20-Len([TONUMBER])+12) ");
qry.Append("WHERE (tran.FROMNUMBER=\'");
qry.Append(_Prcnum.Replace("'","''"));
qry.Append("\' AND tran.TOSEQUENCE IS NULL)");
success = transusg.UpdateUsing(qry.ToString());
if (!success) MessageBox.Show("Error When Updating Transition history");
}
wdset.Dispose();
transusg=null;
atransusg=null;
}
catch (Exception e)
{
MessageBox.Show("Could not approve transition usages for " + _Prcnum + ", "+e.Message);
}
}
#if Upgrade2005_Print
#else
public override void AddToTree(TreeNode parentnd)
{
}
public override bool Expand(TreeNode parentnd)
{
return true;
}
#endif
public override bool mnuAllowUpdRO()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved||ps.IsEmpty||ps.isTempChange) return false;
return (amILockedByMe());
}
public override bool mnuAllowClean()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved||ps.IsEmpty) return false;
if (amILockedByMe()==false) return false;
if ((ps.accessFlags&Security.CLEAN)==Security.CLEAN) return true;
return false;
}
public override bool mnuAllowDataCheck()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved||ps.IsEmpty) return false;
if (amILockedByMe()==false) return false;
if ((ps.accessFlags&Security.CLEAN)==Security.CLEAN) return true;
return false;
}
public override bool mnuAllowChgDef()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.IsEmpty) return false;
return(amILockedByMe());
}
public override bool mnuAllowNew()
{
return false;
}
public override bool mnuAllowApprove()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (amILockedByMe()==false) return false;
if ((ps.isApproved == false) && (ps.isTempChange==false)) return true;
return false;
}
public override bool mnuAllowApproveSel()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved || ps.IsEmpty || ps.isTempChange) return false;
if (amILockedByMe()==false) return false;
if (ps.isSetApproved && ((ps.accessFlags&Security.APPROVESINGLE)==Security.APPROVESINGLE)) return true;
return false;
}
public override bool mnuAllowApproveAll()
{
bool allowit=false;
bool allowonlyonce=false;
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved || ps.IsEmpty || ps.isTempChange) return false; // cannot approve an approved set
if (amILockedByMe()==false) return false;
if ((ps.accessFlags&Security.APPROVE)==Security.APPROVE) allowit = true;
// also check if there is a serial number option which allows only one
// approve-all, i.e. if an approved version exists, cannot approve all.
if (usrRunTime.SerialNumber.GetSNOption((uint)Utils.SerialNo.SN_Flags.SN_ONLYAPPROVEONCE_ON)>0)
allowonlyonce=true;
if (allowonlyonce && ps.isSetApproved) return false;
if (allowit) return true;
return false;
}
// the following method is used by various other methods to determine whether modifications
// can be made to the procedure.
private bool AllowMods()
{
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (ps.isApproved == true) return false;
if (amILockedByMe()==false) return false;
// Right now we are allowing the slave's procedure number and title be changed
// - but it will be wiped out when/if the master's set file changes.
// - If we want to NOT allow changes to the slave's procedure number and title
// then uncomment the following line. - jsj 04/08/05
// if (ps._ProcType == ProcTypeOptions.Slave) return false;
if ((ps.accessFlags&Security.ADDMODDEL)==Security.ADDMODDEL) return true;
return false;
}
public override bool mnuAllowDelete()
{
return AllowMods();
}
public override bool canEdit()
{
return AllowMods();
}
// determine whether drag/drop can occur.
public override bool canDoDragDrop()
{
// allow user to change order in approved set list
// return AllowMods();
VEO_DummySet ds = (VEO_DummySet) this.parentObj;
VEO_ProcSet ps = (VEO_ProcSet) ds.parentObj;
if (amILockedByMe()==false) return false;
if (ps._ProcType == ProcTypeOptions.Slave) return false;
if ((ps.accessFlags&Security.ADDMODDEL)==Security.ADDMODDEL) return true;
return false;
}
}
}