C2021-026 Parent/Child applicability in RO Editor

This commit is contained in:
John Jenko 2021-07-29 18:28:12 +00:00
parent 697490d5bf
commit ce9e9e182e
16 changed files with 1103 additions and 263 deletions

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: CmpRpt.cs $ $Revision: 3 $ * $Workfile: CmpRpt.cs $ $Revision: 3 $
@ -264,7 +264,7 @@ namespace CmpRpt
for (int i = cnt - 1; i >= 0; i--) for (int i = cnt - 1; i >= 0; i--)
headers.Add(reversehdrs[i]); headers.Add(reversehdrs[i]);
myrodb.MyDBID = tbl; myrodb.MyDBID = tbl;
rptele.Show(myrodb, headers, showStat); rptele.Show(myrodb, headers, showStat, PCChildren); // this will write data to print.tmp file in the RO folder
Application.DoEvents(); Application.DoEvents();
headers.Clear(); headers.Clear();
reversehdrs.Clear(); reversehdrs.Clear();
@ -296,6 +296,7 @@ namespace CmpRpt
} }
} }
} }
public static string[] PCChildren; //C2021-026 list of Parent/Child Children
private static string BuildROList(string[] args) 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 // when ro's in sql was added, an /sql parameter was introduced to allow the definition of the connection string. So
@ -317,6 +318,9 @@ namespace CmpRpt
{ {
SqlConnectionStr = parm2.Substring(5); 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 else
roIdArg = parm2; roIdArg = parm2;
} }

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021- Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: RODefFrm.cs $ $Revision: 18 $ * $Workfile: RODefFrm.cs $ $Revision: 18 $
@ -105,6 +105,7 @@ using System.Text;
using ROFields; using ROFields;
using RODBInterface; using RODBInterface;
using VlnStatus; using VlnStatus;
using System.Collections.Generic;
namespace ROEditor namespace ROEditor
@ -125,6 +126,7 @@ namespace ROEditor
private System.Windows.Forms.Label lblInUse; private System.Windows.Forms.Label lblInUse;
private System.Windows.Forms.Label lblAvail; private System.Windows.Forms.Label lblAvail;
private System.Windows.Forms.ListBox lboxInUse; private System.Windows.Forms.ListBox lboxInUse;
private System.Windows.Forms.CheckedListBox lboxInUseCB; // C2021-026 added a checked list box for Parent/Child capabilites
private System.Windows.Forms.ListBox lboxAvail; private System.Windows.Forms.ListBox lboxAvail;
private System.Windows.Forms.Button btnAdd; private System.Windows.Forms.Button btnAdd;
private System.Windows.Forms.Button btnEdit; private System.Windows.Forms.Button btnEdit;
@ -139,15 +141,24 @@ namespace ROEditor
private System.Windows.Forms.Button btnOK; private System.Windows.Forms.Button btnOK;
private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnCancel;
ArrayList InUseList; ArrayList InUseList;
ArrayList InUseApplcList; // C2021-026 hold the list of fields that have child values
private VlnXmlElement elem; private VlnXmlElement elem;
private uint editlevel; // flag for group definition or ro definition private uint editlevel; // flag for group definition or ro definition
private string strFieldsInUse; private string strFieldsInUse;
private string origFieldsInUse; private string origFieldsInUse;
private string origApplicFields;
private string origRetVal; private string origRetVal;
private string origMenuItem; private string origMenuItem;
StringBuilder parseerror; StringBuilder parseerror;
private int hi, lo; private int hi, lo;
private Label lb_chkApplc;
private int dbtype; private int dbtype;
// C2021-026 returns true is Parent/Child info was passed into the RO Editor
public bool PCApplicabilityEnabled
{
get { return ROEditor.Form1.ApplicabilityEnabled(); }
}
// pass in Group Element // pass in Group Element
public RODefFrm(VlnXmlElement pelem, RODB rodb, string fields, string grptxt, int idbtype) public RODefFrm(VlnXmlElement pelem, RODB rodb, string fields, string grptxt, int idbtype)
{ {
@ -164,7 +175,20 @@ namespace ROEditor
// //
InitializeComponent(); InitializeComponent();
if(editlevel==(uint)RecordType.GroupSchema)this.Text = "Subgroup Definition"; // C2021-024 toggle which check boxes are visable based on if Parent/Child is available
if (PCApplicabilityEnabled)
{
lboxInUseCB.Visible = true;
lboxInUse.Visible = false;
lb_chkApplc.Visible = true;
}
else
{
lboxInUseCB.Visible = false;
lboxInUse.Visible = true;
lb_chkApplc.Visible = false;
}
if (editlevel==(uint)RecordType.GroupSchema)this.Text = "Subgroup Definition";
FillInData(grptxt); FillInData(grptxt);
} }
@ -195,31 +219,62 @@ namespace ROEditor
this.lboxAvail.Items.Add(rof.GetFieldname); this.lboxAvail.Items.Add(rof.GetFieldname);
} }
} }
// C2021-024 see if the give RO field is checked to have child values
private bool ContainedInUseApplicList(ROField rof)
{
bool isInList = false;
foreach (ROField arof in InUseApplcList)
{
if (arof.GetRecID == rof.GetRecID)
{
isInList = true;
break;
}
}
return isInList;
}
private bool _initializing = false;
private void SetUpListBoxes() private void SetUpListBoxes()
{ {
_initializing = true;
ROField rof; ROField rof;
// Get list of available fields (all fields in this type, i.e. rectype = 'Schema' // Get list of available fields (all fields in this type, i.e. rectype = 'Schema'
// or 'GroupSchema') and get list of inuse from the schema definition. // or 'GroupSchema') and get list of inuse from the schema definition.
ArrayList tmp = myrodb.RODB_GetFields(elem, editlevel); ArrayList tmp = myrodb.RODB_GetFields(elem, editlevel);
// put the items in the AvailList box. // put the items in the AvailList box.
if (AvailList == null) AvailList = new ArrayList(); if (AvailList == null) AvailList = new ArrayList();
for (int i=0; i< tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary for (int i = 0; i < tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary
InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList, strFieldsInUse, ref origFieldsInUse, false); InUseList = myrodb.RODB_GetFieldsInUse(elem, AvailList, strFieldsInUse, ref origFieldsInUse, true);
// C2021-024 get the list of fields that are have P/C values turned on (fields that are checked)
InUseApplcList = myrodb.RODB_GetApplicabilityEnabledFields(elem, InUseList, ref origApplicFields, PCApplicabilityEnabled);
FillInAvailable(); FillInAvailable();
// set up the listbox for inuse items. // set up the listbox for inuse items.
if (InUseList != null) if (InUseList != null)
{ {
// add items to the InUseList box. // add items to the InUseList box.
for (int i=0; i< InUseList.Count; i++) for (int i = 0; i < InUseList.Count; i++)
{ {
rof = (ROField) InUseList[i]; rof = (ROField)InUseList[i];
if (rof.GetFieldname != null) //DO YET: why null? if (rof.GetFieldname != null) //DO YET: why null?
this.lboxInUse.Items.Add(rof.GetFieldname); {
// C2021-026 populate the relative In Use list base on if Parent/Child is enabled
if (PCApplicabilityEnabled)
{
this.lboxInUseCB.Items.Add(rof.GetFieldname);
if (rof.FieldTypeCanDoApplicability())
{
if (ContainedInUseApplicList(rof))
this.lboxInUseCB.SetItemCheckState(lboxInUseCB.Items.IndexOf(rof.GetFieldname), CheckState.Checked);
}
}
else
this.lboxInUse.Items.Add(rof.GetFieldname);
}
} }
} }
_initializing = false;
} }
@ -282,7 +337,11 @@ namespace ROEditor
DoValueTextBoxes(); DoValueTextBoxes();
SetUpListBoxes(); SetUpListBoxes();
lboxInUse.GotFocus += new EventHandler(this.lboxInUse_GotFocus); if (PCApplicabilityEnabled) // C2021-026 Check Box list focus event
lboxInUseCB.GotFocus += new EventHandler(this.lboxInUseCB_GotFocus);
else
lboxInUse.GotFocus += new EventHandler(this.lboxInUse_GotFocus);
lboxAvail.GotFocus += new EventHandler(this.lboxAvail_GotFocus); lboxAvail.GotFocus += new EventHandler(this.lboxAvail_GotFocus);
// save copies of local data, so if there is a change, we know we must save them. // save copies of local data, so if there is a change, we know we must save them.
@ -309,9 +368,19 @@ namespace ROEditor
this.btnAdd.Enabled = false; this.btnAdd.Enabled = false;
this.btnEdit.Enabled = true; this.btnEdit.Enabled = true;
} }
protected void lboxInUseCB_GotFocus(object sender, EventArgs e)
{
lboxAvail.ClearSelected();
this.btnRemove.Enabled = true;
this.btnAdd.Enabled = false;
this.btnEdit.Enabled = true;
}
protected void lboxAvail_GotFocus (object sender, EventArgs e) protected void lboxAvail_GotFocus (object sender, EventArgs e)
{ {
lboxInUse.ClearSelected(); if (PCApplicabilityEnabled)
lboxInUseCB.ClearSelected();
else
lboxInUse.ClearSelected();
this.btnAdd.Enabled = true; this.btnAdd.Enabled = true;
this.btnRemove.Enabled = false; this.btnRemove.Enabled = false;
this.btnEdit.Enabled = true; this.btnEdit.Enabled = true;
@ -320,48 +389,101 @@ namespace ROEditor
{ {
//get item in lboxInUse (in use list) and remove it from there //get item in lboxInUse (in use list) and remove it from there
// and add it to the lboxAvail list. // and add it to the lboxAvail list.
if (lboxInUse.SelectedIndex >=0 ) if (PCApplicabilityEnabled) // C2021-026 use the Check Box list
{ {
// get the selected item and its string. Remove it from the listbox, if (lboxInUseCB.SelectedIndex >= 0)
// add it to the available array list & listbox & then remove it from {
// the inuse array list. // get the selected item and its string. Remove it from the listbox,
int indx = lboxInUse.SelectedIndex; // add it to the available array list & listbox & then remove it from
lboxInUse.Items.RemoveAt(indx); // the inuse array list.
int indx = lboxInUseCB.SelectedIndex;
lboxInUseCB.Items.RemoveAt(indx);
// copy if over to availlist // copy if over to availlist
ROField rof = (ROField) InUseList[indx]; ROField rof = (ROField)InUseList[indx];
ROField copyrof = new ROField(rof.GetFieldname,rof.GetRecID,rof.GetMasterRecID, rof.GetFieldType); ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
AvailList.Add(copyrof); AvailList.Add(copyrof);
lboxAvail.Items.Add(copyrof.GetFieldname); lboxAvail.Items.Add(copyrof.GetFieldname);
InUseList.RemoveAt(indx); InUseList.RemoveAt(indx);
lboxAvail.Refresh(); if (InUseApplcList.Contains(rof)) // C2021-026 remove from the field applicability list
lboxInUse.Refresh(); InUseApplcList.Remove(rof);
lboxAvail.Refresh();
lboxInUseCB.Refresh();
}
}
else
{
if (lboxInUse.SelectedIndex >= 0)
{
// get the selected item and its string. Remove it from the listbox,
// add it to the available array list & listbox & then remove it from
// the inuse array list.
int indx = lboxInUse.SelectedIndex;
lboxInUse.Items.RemoveAt(indx);
// copy if over to availlist
ROField rof = (ROField)InUseList[indx];
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
AvailList.Add(copyrof);
lboxAvail.Items.Add(copyrof.GetFieldname);
InUseList.RemoveAt(indx);
if (InUseApplcList.Contains(rof)) // C2021-026 remove from the field applicability list
InUseApplcList.Remove(rof);
lboxAvail.Refresh();
lboxInUse.Refresh();
}
} }
} }
private void btnAdd_Click(object sender, System.EventArgs e) private void btnAdd_Click(object sender, System.EventArgs e)
{ {
//get item in lboxInUse (in use list) and remove it from there //get item in lboxInUse (in use list) and remove it from there
// and add it to the lboxAvail list. // and add it to the lboxAvail list.
if (lboxAvail.SelectedIndex >=0 ) if (PCApplicabilityEnabled) // C2021-026 using the Check Box List
{ {
// get the selected item and its string. Remove it from the listbox, if (lboxAvail.SelectedIndex >= 0)
// add it to the inuse array list & listbox & then remove it from {
// the avail(able) array list. // get the selected item and its string. Remove it from the listbox,
int indx = lboxAvail.SelectedIndex; // add it to the inuse array list & listbox & then remove it from
lboxAvail.Items.RemoveAt(indx); // the avail(able) array list.
int indx = lboxAvail.SelectedIndex;
lboxAvail.Items.RemoveAt(indx);
// copy if over to availlist // copy if over to availlist
ROField rof = (ROField) AvailList[indx]; ROField rof = (ROField)AvailList[indx];
ROField copyrof = new ROField(rof.GetFieldname,rof.GetRecID,rof.GetMasterRecID,rof.GetFieldType); ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
InUseList.Add(copyrof); InUseList.Add(copyrof);
lboxInUse.Items.Add(copyrof.GetFieldname); lboxInUseCB.Items.Add(copyrof.GetFieldname);
AvailList.RemoveAt(indx); AvailList.RemoveAt(indx);
lboxAvail.Refresh(); lboxAvail.Refresh();
lboxInUse.Refresh(); lboxInUseCB.Refresh();
btnOK.Enabled=true; btnOK.Enabled = true;
}
}
else
{
if (lboxAvail.SelectedIndex >= 0)
{
// get the selected item and its string. Remove it from the listbox,
// add it to the inuse array list & listbox & then remove it from
// the avail(able) array list.
int indx = lboxAvail.SelectedIndex;
lboxAvail.Items.RemoveAt(indx);
// copy if over to availlist
ROField rof = (ROField)AvailList[indx];
ROField copyrof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
InUseList.Add(copyrof);
lboxInUse.Items.Add(copyrof.GetFieldname);
AvailList.RemoveAt(indx);
lboxAvail.Refresh();
lboxInUse.Refresh();
btnOK.Enabled = true;
}
} }
} }
@ -849,6 +971,17 @@ namespace ROEditor
if (i+1 < InUseList.Count) inuserecs = inuserecs + " "; if (i+1 < InUseList.Count) inuserecs = inuserecs + " ";
} }
} }
// C2021-026 save the fields with applicability set
string applicfieldrecs = null;
for (int i = 0; i < InUseApplcList.Count; i++)
{
rof = (ROField)InUseApplcList[i];
if (rof.GetFieldname != null)
{
applicfieldrecs = applicfieldrecs + rof.GetRecID;
if (i + 1 < InUseApplcList.Count) applicfieldrecs = applicfieldrecs + " ";
}
}
// save the database record, saving modified data as appropriate -- if a mod // save the database record, saving modified data as appropriate -- if a mod
// occurred at this level, add it to the attribute list too. // occurred at this level, add it to the attribute list too.
@ -877,6 +1010,12 @@ namespace ROEditor
elem.SetAttribute("FieldsInUse", inuserecs); elem.SetAttribute("FieldsInUse", inuserecs);
mod = true; mod = true;
} }
//C2021-026 save the list of field recids that use applicability
if (applicfieldrecs != origApplicFields)
{
elem.SetAttribute("ApplicabilityEnabled", applicfieldrecs);
mod = true;
}
} }
if (editlevel == (uint) RecordType.GroupSchema) if (editlevel == (uint) RecordType.GroupSchema)
@ -941,7 +1080,8 @@ namespace ROEditor
// Get the field which is active & it's type. Pass the field through to the field // Get the field which is active & it's type. Pass the field through to the field
// editor. // editor.
int indx; int indx;
indx = lboxInUse.SelectedIndex; // C2021-026 get the selected index base on wich InUse list is being used
indx = (PCApplicabilityEnabled)? lboxInUseCB.SelectedIndex : lboxInUse.SelectedIndex;
if (indx >= 0) if (indx >= 0)
rof = (ROField) InUseList[indx]; rof = (ROField) InUseList[indx];
else else
@ -975,13 +1115,29 @@ namespace ROEditor
// Update Lists & Text boxes to represent any modified text. // Update Lists & Text boxes to represent any modified text.
if (isInSelList) if (isInSelList)
{ {
lboxInUse.Items.Clear(); if (PCApplicabilityEnabled)
lboxInUseCB.Items.Clear();
else
lboxInUse.Items.Clear();
// add items to the InUseList box. // add items to the InUseList box.
for (int i=0; i< InUseList.Count; i++) for (int i=0; i< InUseList.Count; i++)
{ {
rof = (ROField) InUseList[i]; rof = (ROField) InUseList[i];
if (rof.GetFieldname != null) if (rof.GetFieldname != null)
this.lboxInUse.Items.Add(rof.GetFieldname); {
// C2021-026 if doing Parent/Child enabled RO Editor, put the In Use fields in the Check Box List instead of the normal list
if (PCApplicabilityEnabled)
{
this.lboxInUseCB.Items.Add(rof.GetFieldname);
if (rof.FieldTypeCanDoApplicability())
{
if (ContainedInUseApplicList(rof))
this.lboxInUseCB.SetItemCheckState(lboxInUseCB.Items.IndexOf(rof.GetFieldname), CheckState.Checked);
}
}
else
this.lboxInUse.Items.Add(rof.GetFieldname);
}
} }
} }
else else
@ -1009,6 +1165,32 @@ namespace ROEditor
lboxAvail.Items.Add(rof.GetFieldname); lboxAvail.Items.Add(rof.GetFieldname);
} }
} }
// C2021-026 Check/un-check field for Parent/Child values
private void lboxInUseCB_ItemCheck(object sender, ItemCheckEventArgs e)
{
if (_initializing) return;
ROField rof = (ROField)InUseList[e.Index];
bool isInAplicList = ContainedInUseApplicList(rof);
if (!rof.FieldTypeCanDoApplicability())
{
MessageBox.Show("Cannot Enable Applicability on this RO Field type.", "Enable Applicabilty", MessageBoxButtons.OK, MessageBoxIcon.Information);
e.NewValue = CheckState.Unchecked;
}
else if (e.NewValue == CheckState.Checked) //we are going to check it - add tothe applic list
{
if (!isInAplicList) // make sure it's not already in the list (this should never happen)
InUseApplcList.Add(rof);
}
else if (isInAplicList) // we are un-checking it. Remove it from the applic list
{
for (int i = 0; i < InUseApplcList.Count; i++)
if ((InUseApplcList[i] as ROField).GetRecID == rof.GetRecID)
{
InUseApplcList.RemoveAt(i);
break;
}
}
}
#region Windows Form Designer generated code #region Windows Form Designer generated code
/// <summary> /// <summary>
@ -1024,12 +1206,14 @@ namespace ROEditor
this.tbMenuVal = new System.Windows.Forms.TextBox(); this.tbMenuVal = new System.Windows.Forms.TextBox();
this.lblGroupText = new System.Windows.Forms.Label(); this.lblGroupText = new System.Windows.Forms.Label();
this.gbFields = new System.Windows.Forms.GroupBox(); this.gbFields = new System.Windows.Forms.GroupBox();
this.lb_chkApplc = new System.Windows.Forms.Label();
this.btnNew = new System.Windows.Forms.Button(); this.btnNew = new System.Windows.Forms.Button();
this.btnRemove = new System.Windows.Forms.Button(); this.btnRemove = new System.Windows.Forms.Button();
this.btnEdit = new System.Windows.Forms.Button(); this.btnEdit = new System.Windows.Forms.Button();
this.btnAdd = new System.Windows.Forms.Button(); this.btnAdd = new System.Windows.Forms.Button();
this.lboxAvail = new System.Windows.Forms.ListBox(); this.lboxAvail = new System.Windows.Forms.ListBox();
this.lboxInUse = new System.Windows.Forms.ListBox(); this.lboxInUse = new System.Windows.Forms.ListBox();
this.lboxInUseCB = new System.Windows.Forms.CheckedListBox(); // C2021-026 list with check boxes to enable P/C on field
this.lblAvail = new System.Windows.Forms.Label(); this.lblAvail = new System.Windows.Forms.Label();
this.lblInUse = new System.Windows.Forms.Label(); this.lblInUse = new System.Windows.Forms.Label();
this.btnOK = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button();
@ -1090,22 +1274,32 @@ namespace ROEditor
// //
// gbFields // gbFields
// //
this.gbFields.Controls.AddRange(new System.Windows.Forms.Control[] { this.gbFields.Controls.Add(this.lb_chkApplc);
this.btnNew, this.gbFields.Controls.Add(this.btnNew);
this.btnRemove, this.gbFields.Controls.Add(this.btnRemove);
this.btnEdit, this.gbFields.Controls.Add(this.btnEdit);
this.btnAdd, this.gbFields.Controls.Add(this.btnAdd);
this.lboxAvail, this.gbFields.Controls.Add(this.lboxAvail);
this.lboxInUse, this.gbFields.Controls.Add(this.lboxInUse);
this.lblAvail, this.gbFields.Controls.Add(this.lboxInUseCB);
this.lblInUse}); this.gbFields.Controls.Add(this.lblAvail);
this.gbFields.Controls.Add(this.lblInUse);
this.gbFields.Location = new System.Drawing.Point(8, 112); this.gbFields.Location = new System.Drawing.Point(8, 112);
this.gbFields.Name = "gbFields"; this.gbFields.Name = "gbFields";
this.gbFields.Size = new System.Drawing.Size(704, 224); this.gbFields.Size = new System.Drawing.Size(704, 247);
this.gbFields.TabIndex = 8; this.gbFields.TabIndex = 8;
this.gbFields.TabStop = false; this.gbFields.TabStop = false;
this.gbFields.Text = "Fields"; this.gbFields.Text = "Fields";
// //
// lb_chkApplc
//
this.lb_chkApplc.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lb_chkApplc.Location = new System.Drawing.Point(69, 24);
this.lb_chkApplc.Name = "lb_chkApplc";
this.lb_chkApplc.Size = new System.Drawing.Size(227, 16);
this.lb_chkApplc.TabIndex = 8;
this.lb_chkApplc.Text = "(Check Parent/Child Applicability Fields)";
//
// btnNew // btnNew
// //
this.btnNew.Location = new System.Drawing.Point(608, 48); this.btnNew.Location = new System.Drawing.Point(608, 48);
@ -1150,17 +1344,25 @@ namespace ROEditor
this.lboxAvail.ItemHeight = 14; this.lboxAvail.ItemHeight = 14;
this.lboxAvail.Location = new System.Drawing.Point(376, 48); this.lboxAvail.Location = new System.Drawing.Point(376, 48);
this.lboxAvail.Name = "lboxAvail"; this.lboxAvail.Name = "lboxAvail";
this.lboxAvail.Size = new System.Drawing.Size(216, 144); this.lboxAvail.Size = new System.Drawing.Size(216, 172);
this.lboxAvail.TabIndex = 3; this.lboxAvail.TabIndex = 3;
// //
// lboxInUse // lboxInUse
// //
this.lboxInUse.ItemHeight = 14; this.lboxInUse.ItemHeight = 14;
this.lboxInUse.Location = new System.Drawing.Point(24, 48); this.lboxInUse.Location = new System.Drawing.Point(27, 48);
this.lboxInUse.Name = "lboxInUse"; this.lboxInUse.Name = "lboxInUse";
this.lboxInUse.Size = new System.Drawing.Size(216, 144); this.lboxInUse.Size = new System.Drawing.Size(216, 172);
this.lboxInUse.TabIndex = 2; this.lboxInUse.TabIndex = 2;
// //
// lboxInUseCB
//
this.lboxInUseCB.Location = new System.Drawing.Point(27, 48);
this.lboxInUseCB.Name = "lboxInUseCB";
this.lboxInUseCB.Size = new System.Drawing.Size(216, 174);
this.lboxInUseCB.TabIndex = 2;
this.lboxInUseCB.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.lboxInUseCB_ItemCheck);
//
// lblAvail // lblAvail
// //
this.lblAvail.Location = new System.Drawing.Point(384, 24); this.lblAvail.Location = new System.Drawing.Point(384, 24);
@ -1200,21 +1402,21 @@ namespace ROEditor
// //
this.AutoScaleBaseSize = new System.Drawing.Size(6, 15); this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
this.ClientSize = new System.Drawing.Size(792, 437); this.ClientSize = new System.Drawing.Size(792, 437);
this.Controls.AddRange(new System.Windows.Forms.Control[] { this.Controls.Add(this.btnCancel);
this.btnCancel, this.Controls.Add(this.btnOK);
this.btnOK, this.Controls.Add(this.gbFields);
this.gbFields, this.Controls.Add(this.lblGroupText);
this.lblGroupText, this.Controls.Add(this.tbMenuVal);
this.tbMenuVal, this.Controls.Add(this.tbRetVal);
this.tbRetVal, this.Controls.Add(this.lblMenuVal);
this.lblMenuVal, this.Controls.Add(this.lblRetVal);
this.lblRetVal, this.Controls.Add(this.lblGroup);
this.lblGroup}); this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Name = "RODefFrm"; this.Name = "RODefFrm";
this.Text = "Referenced Object Definition"; this.Text = "Referenced Object Definition";
this.gbFields.ResumeLayout(false); this.gbFields.ResumeLayout(false);
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout();
} }
#endregion #endregion

View File

@ -1,75 +1,96 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 1.3 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">1.3</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1">this is my long string</data> <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
[base64 mime encoded serialized .NET Framework object] <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
[base64 mime encoded string representing a byte array form of the .NET Framework object] <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
</data> <comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array mimetype: application/x-microsoft.net.object.bytearray.base64
: using a System.ComponentModel.TypeConverter value : The object must be serialized into a byte array
: and then encoded with base64 encoding. : using a System.ComponentModel.TypeConverter
--> : and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
@ -88,15 +109,12 @@
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>1.3</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="$this.Name">
<value>RODefFrm</value>
</data>
</root> </root>

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: ROEditor.cs $ $Revision: 54 $ * $Workfile: ROEditor.cs $ $Revision: 54 $
@ -350,6 +350,7 @@ namespace ROEditor
private System.Windows.Forms.MenuItem menuEditSelAll; private System.Windows.Forms.MenuItem menuEditSelAll;
private TreeNode LastSelectedNode; private TreeNode LastSelectedNode;
private TextBox _CurrentTextBox; // currently selected TextBox field private TextBox _CurrentTextBox; // currently selected TextBox field
public static string[] PCChildren; //C2021-026 list of Parent/Child Children
public TextBox CurrentTextBox public TextBox CurrentTextBox
{ {
@ -887,9 +888,9 @@ namespace ROEditor
} }
} }
private void CreateCtlXmlEdit2(VlnXmlElement curelem, XmlSchema myschema, ArrayList reqfields) private void CreateCtlXmlEdit2(VlnXmlElement curelem, XmlSchema myschema, ArrayList reqfields, ArrayList fieldsWithApplic)
{ {
ctlXMLEdit2 = new ctlXMLEditLib.ctlXMLEdit(curelem,myschema,reqfields); ctlXMLEdit2 = new ctlXMLEditLib.ctlXMLEdit(curelem,myschema,reqfields,fieldsWithApplic,PCChildren); // C2021-026 pass in P/C enabled information
ctlXMLEdit2.AutoScroll = true; ctlXMLEdit2.AutoScroll = true;
ctlXMLEdit2.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); ctlXMLEdit2.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
ctlXMLEdit2.Name = "ctlXMLEdit2"; ctlXMLEdit2.Name = "ctlXMLEdit2";
@ -927,9 +928,29 @@ namespace ROEditor
this.panel2.Controls.Add(ctlXMLEdit2); this.panel2.Controls.Add(ctlXMLEdit2);
tbtnCancel.Enabled = true; tbtnCancel.Enabled = true;
} }
// C2021-026 Get a list of fields that are P/C enabled
private ArrayList GetApplcFieldListForElement(VlnXmlElement elem)
{
ArrayList rtnval = null;
ArrayList InUseApplcList = null;
ArrayList AvailList = null;
ArrayList InUseList = null;
string origFieldsInUse = "";
string origApplicFields = "";
ArrayList tmp = myrodb.RODB_GetFields((VlnXmlElement)elem.ParentNode, (uint)RecordType.Schema);
// put the items in the AvailList box.
if (AvailList == null) AvailList = new ArrayList();
for (int i = 0; i < tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary
InUseList = myrodb.RODB_GetFieldsInUse((VlnXmlElement)elem.ParentNode, AvailList, "FieldsInUse", ref origFieldsInUse, false);
InUseApplcList = myrodb.RODB_GetApplicabilityEnabledFields((VlnXmlElement)elem.ParentNode, InUseList, ref origApplicFields, ApplicabilityEnabled());
rtnval = new ArrayList();
foreach (ROField rof in InUseApplcList)
rtnval.Add(rof.GetFieldname);
return rtnval;
}
private void EditRO(VlnXmlElement curelem) private void EditRO(VlnXmlElement curelem)
{ {
ArrayList fieldsWithApplic = null;
newone=null; newone=null;
// can't edit fields for top or top group nodes (top node not editable, // can't edit fields for top or top group nodes (top node not editable,
// and top group node data change at properties level). // and top group node data change at properties level).
@ -944,6 +965,10 @@ namespace ROEditor
// a message. (B2004-017) // a message. (B2004-017)
if (curelem.Name != "vlnGroup") if (curelem.Name != "vlnGroup")
{ {
// C2021-026 Get the list of fields with P/C enabled
// use the curelm.parent and calls similar to what is in RODefFrm.cs
fieldsWithApplic = GetApplcFieldListForElement(curelem);
myschema = myrodb.RODB_GetSchema(curelem); myschema = myrodb.RODB_GetSchema(curelem);
if (myschema==null) if (myschema==null)
{ {
@ -965,7 +990,7 @@ namespace ROEditor
} }
ArrayList reqfields = curelem.GetRequiredFields(); ArrayList reqfields = curelem.GetRequiredFields();
CreateCtlXmlEdit2(curelem,myschema,reqfields); CreateCtlXmlEdit2(curelem,myschema, reqfields, fieldsWithApplic); // C2021-026 pass in P/C enabled fields
this.panel2.Controls.Add(ctlXMLEdit2); this.panel2.Controls.Add(ctlXMLEdit2);
tbtnSave.Enabled=false; // set initial states of buttons on edit tbtnSave.Enabled=false; // set initial states of buttons on edit
tbtnRestore.Enabled=false; tbtnRestore.Enabled=false;
@ -1406,7 +1431,7 @@ namespace ROEditor
this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; this.panel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.panel1.Location = new System.Drawing.Point(228, 28); this.panel1.Location = new System.Drawing.Point(228, 28);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(588, 591); this.panel1.Size = new System.Drawing.Size(710, 591);
this.panel1.TabIndex = 5; this.panel1.TabIndex = 5;
// //
// panel2 // panel2
@ -1447,7 +1472,7 @@ namespace ROEditor
this.tbar.Location = new System.Drawing.Point(0, 0); this.tbar.Location = new System.Drawing.Point(0, 0);
this.tbar.Name = "tbar"; this.tbar.Name = "tbar";
this.tbar.ShowToolTips = true; this.tbar.ShowToolTips = true;
this.tbar.Size = new System.Drawing.Size(816, 28); this.tbar.Size = new System.Drawing.Size(938, 28);
this.tbar.TabIndex = 0; this.tbar.TabIndex = 0;
this.tbar.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right; this.tbar.TextAlign = System.Windows.Forms.ToolBarTextAlign.Right;
this.tbar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tbar_OnClick); this.tbar.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(this.tbar_OnClick);
@ -1519,7 +1544,7 @@ namespace ROEditor
// Form1 // Form1
// //
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(816, 619); this.ClientSize = new System.Drawing.Size(980, 619);
this.Controls.Add(this.lblDuplicateRO); this.Controls.Add(this.lblDuplicateRO);
this.Controls.Add(this.panel1); this.Controls.Add(this.panel1);
this.Controls.Add(this.splitter1); this.Controls.Add(this.splitter1);
@ -1574,23 +1599,36 @@ namespace ROEditor
// the the Access database. // the the Access database.
if (args.Length > 0) if (args.Length > 0)
{ {
ConnectionPath = args[0]; if (args[0].ToUpper().StartsWith("PC="))
PCChildren = args[0].Substring(3).Split(','); //C2021-026 list of Parent/Child Children
else
ConnectionPath = args[0];
// Directory.SetCurrentDirectory(ConnectionPath); // Directory.SetCurrentDirectory(ConnectionPath);
} }
else // find ROPATH if (ConnectionPath == null) // RO Path was not passed in, find ROPATH
{ {
ConnectionPath = FindTheRODirectory(); ConnectionPath = FindTheRODirectory();
} }
if (args.Length > 1) if (args.Length > 1)
{ {
if (args[1].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[1]; if (args[1].ToUpper().StartsWith("PC="))
PCChildren = args[1].Substring(3).Split(','); //C2021-026 list of Parent/Child Children
else if (args[1].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[1];
else specificro = args[1]; else specificro = args[1];
} }
if (args.Length > 2) if (args.Length > 2)
{ {
if (args[2].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[2]; if (args[2].ToUpper().StartsWith("PC="))
PCChildren = args[2].Substring(3).Split(','); //C2021-026 list of Parent/Child Children
else if (args[2].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[2];
else specificro = args[2]; else specificro = args[2];
} }
if (args.Length > 3)
if (args[3].ToUpper().StartsWith("PC="))
PCChildren = args[3].Substring(3).Split(','); //C2021-026 list of Parent/Child Children
else if (args[3].ToUpper().Contains("DATA SOURCE")) SqlConnectionStr = args[3];
else specificro = args[3];
RODB.PCChildList = PCChildren; //C2021-026 pass the Parent/Child info to the RODB class
try try
{ {
// Convert the RO data if needed // Convert the RO data if needed
@ -1726,6 +1764,12 @@ namespace ROEditor
} }
} }
// C2021-026 was Parent/Child information passed into the RO Editor?
public static bool ApplicabilityEnabled()
{
return (PCChildren != null && PCChildren.Length > 0);
}
/* /*
* Look for the RO directory via PROC.INI and by * Look for the RO directory via PROC.INI and by
* looking for a \RO directory in the current VEplant * looking for a \RO directory in the current VEplant
@ -2011,7 +2055,7 @@ namespace ROEditor
int retval = roTreeView_ClearEditDisplay(false); int retval = roTreeView_ClearEditDisplay(false);
if (retval == -1) return; if (retval == -1) return;
roListView_ClearListDisplay(); roListView_ClearListDisplay();
CreateCtlXmlEdit2(nelem,myschema,reqfields); CreateCtlXmlEdit2(nelem,myschema,reqfields, null);
tbtnSave.Enabled=false; // initial disable the save button tbtnSave.Enabled=false; // initial disable the save button
ctlXMLEdit2.Focus(); ctlXMLEdit2.Focus();
tbtnZoom.Enabled = false; tbtnZoom.Enabled = false;
@ -2024,6 +2068,7 @@ namespace ROEditor
private void menuNewRefObj_Click(object sender, System.EventArgs e) private void menuNewRefObj_Click(object sender, System.EventArgs e)
{ {
int retval = roTreeView_ClearEditDisplay(false); int retval = roTreeView_ClearEditDisplay(false);
ArrayList InUseApplcList=null;
if (retval == -1) return; if (retval == -1) return;
roListView_ClearListDisplay(); roListView_ClearListDisplay();
VlnXmlElement curelem = (VlnXmlElement) roTreeView.SelectedNode.Tag; VlnXmlElement curelem = (VlnXmlElement) roTreeView.SelectedNode.Tag;
@ -2051,6 +2096,7 @@ namespace ROEditor
{ {
curelem.ParentNode.AppendChild((XmlNode) nelem); curelem.ParentNode.AppendChild((XmlNode) nelem);
TreeNewparent = roTreeView.SelectedNode.Parent; TreeNewparent = roTreeView.SelectedNode.Parent;
InUseApplcList = GetApplcFieldListForElement(curelem); //C2021-026 get list of fields with P/C enabled
} }
else else
{ {
@ -2060,7 +2106,7 @@ namespace ROEditor
newone = nelem; newone = nelem;
ArrayList reqfields = nelem.GetRequiredFields(); ArrayList reqfields = nelem.GetRequiredFields();
CreateCtlXmlEdit2(nelem,myschema,reqfields); CreateCtlXmlEdit2(nelem,myschema,reqfields, InUseApplcList);
tbtnSave.Enabled=false; // initial disable the save button tbtnSave.Enabled=false; // initial disable the save button
ctlXMLEdit2.Focus(); ctlXMLEdit2.Focus();
tbtnZoom.Enabled = false; tbtnZoom.Enabled = false;
@ -2555,7 +2601,8 @@ namespace ROEditor
if (rof.GetFieldname != null) if (rof.GetFieldname != null)
{ {
uint ftype = rof.GetFieldType; uint ftype = rof.GetFieldType;
if (ftype == 1 || ftype == 2 || ftype==4 || ftype==128) if (ftype == (uint)ROFields.FieldTypes.SingleTxt || ftype == (uint)ROFields.FieldTypes.VariableTxt ||
ftype == (uint)ROFields.FieldTypes.FrmtSingleTxt || ftype == (uint)ROFields.FieldTypes.Combination)
roListView.Columns.Add(rof.GetFieldname, 100,HorizontalAlignment.Left); roListView.Columns.Add(rof.GetFieldname, 100,HorizontalAlignment.Left);
} }
} }
@ -2594,7 +2641,8 @@ namespace ROEditor
if (rof.GetFieldname != null) if (rof.GetFieldname != null)
{ {
uint ftype = rof.GetFieldType; uint ftype = rof.GetFieldType;
if (ftype == 1 || ftype == 2 || ftype == 4 || ftype == 128) if (ftype == (uint)ROFields.FieldTypes.SingleTxt || ftype == (uint)ROFields.FieldTypes.VariableTxt ||
ftype == (uint)ROFields.FieldTypes.FrmtSingleTxt || ftype == (uint)ROFields.FieldTypes.Combination)
{ {
string nm0 = rof.GetFieldname; string nm0 = rof.GetFieldname;
nm = rof.MakeFieldName(nm0); nm = rof.MakeFieldName(nm0);
@ -2711,9 +2759,9 @@ namespace ROEditor
byte xbyte, ybyte; byte xbyte, ybyte;
xlen = xbuff.Length; xlen = xbuff.Length;
ylen = ybuff.Length; ylen = ybuff.Length;
if (xbuff[0] == '<') if (xbuff.Length > 0 && xbuff[0] == '<')
rtnval = 0; rtnval = 0;
if (ybuff[0] == '<') if (ybuff.Length > 0 && ybuff[0] == '<')
rtnval = 0; rtnval = 0;
while ((rtnval==0) && ((xcnt < xlen) || (ycnt < ylen))) while ((rtnval==0) && ((xcnt < xlen) || (ycnt < ylen)))
{ {

View File

@ -112,20 +112,20 @@
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<metadata name="imageListRoTree.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="imageListRoTree.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>124, 17</value> <value>124, 17</value>
</metadata> </metadata>
<data name="imageListRoTree.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="imageListRoTree.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACE ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACE
CAAAAk1TRnQBSQFMAgEBAgEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo CAAAAk1TRnQBSQFMAgEBAgEAARwBAAEcAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -164,18 +164,18 @@
AYAPAAEBBwABAwYAAYABBwYAAcYBHwQACw== AYAPAAEBBwABAwYAAYABBwYAAcYBHwQACw==
</value> </value>
</data> </data>
<metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="mainMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<metadata name="imageListToolBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="imageListToolBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>256, 17</value> <value>256, 17</value>
</metadata> </metadata>
<data name="imageListToolBar.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="imageListToolBar.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAe ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAe
CwAAAk1TRnQBSQFMAgEBBgEAARQBAAEUAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo CwAAAk1TRnQBSQFMAgEBBgEAARwBAAEcAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@ -225,10 +225,10 @@
ASgDAAFAAwABIAMAAQEBAAEBBgABARYAA///AAIACw== ASgDAAFAAwABIAMAAQEBAAEBBgABARYAA///AAIACw==
</value> </value>
</data> </data>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>36</value> <value>36</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAABAA AAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAAAAAAAAAAEAAAABAA

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: RO_FST.cs $ $Revision: 15 $ * $Workfile: RO_FST.cs $ $Revision: 15 $
@ -823,7 +823,7 @@ namespace ROEditor
// i =0; // i =0;
// } // }
string cvttmp= CvtFldToUserFld(RtnValTmplate); string cvttmp= CvtFldToUserFld(RtnValTmplate);
string RORtnVal = elem.GetReturnValue(ROdatabase,tablename,cvttmp,InUseList,ref RtnVal); string RORtnVal = elem.GetReturnValue(ROdatabase,tablename,cvttmp,InUseList,ref RtnVal,ROEditor.Form1.PCChildren); // C2021-026 pass in P/C Children
// Write the field type to the FST // Write the field type to the FST
fhFST.Write(RtnVal); fhFST.Write(RtnVal);

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: RODBInterface.cs $ $Revision: 48 $ * $Workfile: RODBInterface.cs $ $Revision: 48 $
@ -264,6 +264,7 @@ using Org.Mentalis.Files;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Collections.Generic; using System.Collections.Generic;
namespace RODBInterface namespace RODBInterface
{ {
/// <summary> /// <summary>
@ -273,7 +274,6 @@ namespace RODBInterface
{ {
Master = 0, SubDatabase = 1, Schema = 2, Group = 3, GroupSchema = 4, RRO = 5, SchemaStart = 6, SchemaEnd = 7, ConvertedToSql = 8 Master = 0, SubDatabase = 1, Schema = 2, Group = 3, GroupSchema = 4, RRO = 5, SchemaStart = 6, SchemaEnd = 7, ConvertedToSql = 8
} }
/// <summary> /// <summary>
/// The following class handles generation of sql strings to get/put requested parts of /// The following class handles generation of sql strings to get/put requested parts of
/// XML RO Tree. And performs the database access using the VLN_DB class. /// XML RO Tree. And performs the database access using the VLN_DB class.
@ -314,6 +314,13 @@ namespace RODBInterface
get { return _OnlyConnectOnce; } get { return _OnlyConnectOnce; }
set { _OnlyConnectOnce = value; } set { _OnlyConnectOnce = value; }
} }
// C2021-026 used to access in the list of P/C Children
private static string[] _PCChildList = null;
public static string[] PCChildList
{
get { return _PCChildList; }
set { _PCChildList = value; }
}
#endregion #endregion
#region abstracts // need these for each method that must be defined for each database type #region abstracts // need these for each method that must be defined for each database type
public abstract string RODB_GetNextGroupTable(); public abstract string RODB_GetNextGroupTable();
@ -355,7 +362,6 @@ namespace RODBInterface
} }
#region GeneralDB #region GeneralDB
public void GetDbServerInfo(string ROdir) public void GetDbServerInfo(string ROdir)
{ {
string strServerProvider; string strServerProvider;
@ -504,6 +510,84 @@ namespace RODBInterface
} }
return inuse; return inuse;
} }
//C2021-026 adding ability to have field values based on Parent/Child applicability
// This reads the database and returns a list of the field where applicability was enabled
public ArrayList RODB_GetApplicabilityEnabledFields(VlnXmlElement elem, ArrayList fieldsInUse, ref string origApplcFields, bool pcApplicabilityEnabled)
{
ArrayList newApplicList = new ArrayList();
if (!pcApplicabilityEnabled)
{
origApplcFields = null;
return newApplicList;
}
VlnXmlElement startelem = elem;
string atribApplicFields = "ApplicabilityEnabled"; //xml attribute containing list of field recids
// if this element doesn't have any fields in use, walk up the tree until
// we find them.
string applicFields = "";
if (startelem.HasAttribute(atribApplicFields) == false)
{
VlnXmlElement parent;
parent = (VlnXmlElement)startelem.ParentNode;
while (parent != null && applicFields == "")
{
applicFields = parent.GetAttribute(atribApplicFields);
if (parent.Name != "RO_Root")
parent = (VlnXmlElement)parent.ParentNode;
else
parent = null;
}
}
else
applicFields = startelem.GetAttribute(atribApplicFields);
origApplcFields = applicFields; // make a copy to compare to later.
// if there are no fields with applicability (may be inserting a top group)
// return an empty list.
if (applicFields == "") return newApplicList;
// Go through the FieldsInUse list and copy elements to newApplicList
int strpos = 0;
string recid;
recid = applicFields.Substring(strpos, 8);
MyRecID = recid;
while (recid != null)
{
// find it in avail list and add to newApplicList
for (int i = 0; i < fieldsInUse.Count; i++)
{
ROField rof = (ROField)fieldsInUse[i];
string lrecid = rof.GetRecID;
if (lrecid == recid)
{
// add to newApplilcList if it is not already there list
ROField inuserof = new ROField(rof.GetFieldname, rof.GetRecID, rof.GetMasterRecID, rof.GetFieldType);
bool addit = true;
foreach (ROField arof in newApplicList)
{
if (arof.GetRecID == inuserof.GetRecID)
{
addit = false; //this field is already in the list
break;
}
}
if (addit)
newApplicList.Add((object)inuserof);
break;
}
}
strpos = strpos + 9;
if (strpos > applicFields.Length)
recid = null;
else
{
recid = applicFields.Substring(strpos, 8);
}
}
return newApplicList;
}
public string CvtUserFldToFld(string fldname) public string CvtUserFldToFld(string fldname)
{ {
if (fldname.Length < 2) if (fldname.Length < 2)
@ -649,6 +733,12 @@ namespace RODBInterface
xmlTextWriter.WriteString(enode.GetAttribute("FieldsInUse")); xmlTextWriter.WriteString(enode.GetAttribute("FieldsInUse"));
xmlTextWriter.WriteEndAttribute(); xmlTextWriter.WriteEndAttribute();
} }
if (enode.HasAttribute("ApplicabilityEnabled")) //C2021-026 save field applicability
{
xmlTextWriter.WriteStartAttribute("ApplicabilityEnabled", null);
xmlTextWriter.WriteString(enode.GetAttribute("ApplicabilityEnabled"));
xmlTextWriter.WriteEndAttribute();
}
if (enode.HasAttribute("GroupMenuItem")) if (enode.HasAttribute("GroupMenuItem"))
{ {
xmlTextWriter.WriteStartAttribute("GroupMenuItem", null); xmlTextWriter.WriteStartAttribute("GroupMenuItem", null);
@ -755,12 +845,31 @@ namespace RODBInterface
success = RODB_NewSchemaPiece(lrecid, parent.GetAttribute("RecID"), myelem.GetAttribute("Table"), strbld.ToString(), editlevel); success = RODB_NewSchemaPiece(lrecid, parent.GetAttribute("RecID"), myelem.GetAttribute("Table"), strbld.ToString(), editlevel);
return success; return success;
} }
// C2021-026 rename any P/C Child fields
public string DoReplaceParentChildField(string infstr, string oldName, string newName)
{
string rtnInfoStr = infstr;
if (PCChildList == null) return rtnInfoStr;
int pcChildIdx = 0; // children indexing starts at one so initialize with zero
foreach (string chld in PCChildList)
{
pcChildIdx++;
string csufx = string.Format("_PCCHILD{0}", pcChildIdx); // Create child field name
string oldFldNameChild = oldName.Insert(oldName.Length - 1, CvtUserFldToFld(csufx));
string newFldNameChild = newName.Insert(newName.Length - 1, CvtUserFldToFld(csufx));
rtnInfoStr = rtnInfoStr.Replace(oldFldNameChild, newFldNameChild);
}
return rtnInfoStr;
}
public string DoCmbFieldReplace(string repstring, string oname, string nname, string letter) public string DoCmbFieldReplace(string repstring, string oname, string nname, string letter)
{ {
string cmboname, cmbnname; string cmboname, cmbnname;
cmboname = oname.Insert(oname.Length - 1, letter); cmboname = oname.Insert(oname.Length - 1, letter);
cmbnname = nname.Insert(nname.Length - 1, letter); cmbnname = nname.Insert(nname.Length - 1, letter);
return (repstring.Replace(cmboname, cmbnname)); string rtnstr = repstring.Replace(cmboname, cmbnname);
rtnstr = DoReplaceParentChildField(rtnstr, cmboname, cmbnname); // C2021-026 create child fields in combo group
return rtnstr;
} }
// RODB_UpdateNamesInROs: goes through subtree (top node is 'fld') and if this // RODB_UpdateNamesInROs: goes through subtree (top node is 'fld') and if this
@ -2333,11 +2442,9 @@ namespace RODBInterface
DBE.CommandDispose(); DBE.CommandDispose();
return success; return success;
} }
public override bool RODB_ProcessRROFieldChange(VlnXmlElement child, string oldname, string newname, uint editlevel, public override bool RODB_ProcessRROFieldChange(VlnXmlElement child, string oldname, string newname, uint editlevel,
VlnStatusMessage StatMsgWindow, bool combofield) VlnStatusMessage StatMsgWindow, bool combofield)
{ {
bool success; bool success;
string str; string str;
string info; string info;
@ -2464,7 +2571,9 @@ namespace RODBInterface
if (combofield == false) if (combofield == false)
{ {
tinfo1 = info.Replace(onameOpen, nnameOpen); tinfo1 = info.Replace(onameOpen, nnameOpen);
tinfo1 = DoReplaceParentChildField(tinfo1, onameOpen, nnameOpen); //C2021-0226 also update Parent/Child fields
tinfo2 = tinfo1.Replace(onameClose, nnameClose); tinfo2 = tinfo1.Replace(onameClose, nnameClose);
tinfo2 = DoReplaceParentChildField(tinfo2, onameClose, nnameClose); //C2021-0226 also update Parent/Child fields
XmlNodeList nodeList; XmlNodeList nodeList;
nodeList = echild.SelectNodes(oldname); nodeList = echild.SelectNodes(oldname);
foreach (XmlNode nod in nodeList) foreach (XmlNode nod in nodeList)
@ -2499,7 +2608,6 @@ namespace RODBInterface
} }
} }
} }
StatMsgWindow.StatusMessage = echild.GetAttribute("MenuTitle"); StatMsgWindow.StatusMessage = echild.GetAttribute("MenuTitle");
str = "UPDATE " + echild.GetAttribute("Table") + " SET Info = '" + tinfo2 + "'"; str = "UPDATE " + echild.GetAttribute("Table") + " SET Info = '" + tinfo2 + "'";
str = str + ", ModDateTime = '" + dt + "' WHERE RecID = '" + echild.GetAttribute("RecID") + "';"; str = str + ", ModDateTime = '" + dt + "' WHERE RecID = '" + echild.GetAttribute("RecID") + "';";

View File

@ -2133,7 +2133,9 @@ namespace RODBInterface
if (combofield == false) if (combofield == false)
{ {
tinfo1 = info.Replace(onameOpen, nnameOpen); tinfo1 = info.Replace(onameOpen, nnameOpen);
tinfo1 = DoReplaceParentChildField(tinfo1, onameOpen, nnameOpen); //C2021-0226 also update Parent/Child fields
tinfo2 = tinfo1.Replace(onameClose, nnameClose); tinfo2 = tinfo1.Replace(onameClose, nnameClose);
tinfo2 = DoReplaceParentChildField(tinfo2, onameClose, nnameClose); //C2021-0226 also update Parent/Child fields
XmlNodeList nodeList; XmlNodeList nodeList;
nodeList = echild.SelectNodes(oldname); nodeList = echild.SelectNodes(oldname);
foreach (XmlNode nod in nodeList) foreach (XmlNode nod in nodeList)
@ -2565,6 +2567,7 @@ namespace RODBInterface
return null; return null;
} }
} }
// C2021-026 read in schema for the "ApplicabilityEnabled" attribute
entireschema = schemastart + entireschema + schemaend; entireschema = schemastart + entireschema + schemaend;
} }
XmlTextReader schemareader = new XmlTextReader(entireschema, XmlNodeType.Element, null); XmlTextReader schemareader = new XmlTextReader(entireschema, XmlNodeType.Element, null);

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: VlnXml.cs $ $Revision: 23 $ * $Workfile: VlnXml.cs $ $Revision: 23 $
@ -689,12 +689,77 @@ namespace RODBInterface
return rtnval; return rtnval;
} }
private ArrayList GetApplcFieldListForElement(RODB roDatabase, VlnXmlElement elem, bool pcApplicability)
{
ArrayList rtnval = null;
ArrayList InUseApplcList = null;
ArrayList AvailList = null;
ArrayList InUseList = null;
string origFieldsInUse = "";
string origApplicFields = "";
ArrayList tmp = roDatabase.RODB_GetFields((VlnXmlElement)elem.ParentNode, (uint)RecordType.Schema);
// put the items in the AvailList box.
if (AvailList == null) AvailList = new ArrayList();
for (int i = 0; i < tmp.Count; i++) AvailList.Add(tmp[i]); // don't modify the list returned from RODB_GetFields since it is part of dictionary
InUseList = roDatabase.RODB_GetFieldsInUse((VlnXmlElement)elem.ParentNode, AvailList, "FieldsInUse", ref origFieldsInUse, false);
InUseApplcList = roDatabase.RODB_GetApplicabilityEnabledFields((VlnXmlElement)elem.ParentNode, InUseList, ref origApplicFields, pcApplicability);
rtnval = new ArrayList();
foreach (ROField rof in InUseApplcList)
rtnval.Add(rof.GetFieldname);
return rtnval;
}
private string GetPCReturnValues(RODB theDb, string[] pcChildern, VlnXmlElement elm, bool PCApplicability, string inusename, string defValue)
{
string applicValues = defValue;
ArrayList FieldsWithApplic = GetApplcFieldListForElement(theDb, elm, PCApplicability);
if (FieldsWithApplic.Contains(CvtFldToUserFld(inusename))) // C2021-026 returns True if field should show Parent/Child Applicability fields
{
XmlNode elmnode = (XmlNode)elm;
XmlNode nd = elmnode.SelectSingleNode(inusename);
string parentName = inusename;
string parentValue = "";
public string GetReturnValue(RODB theDb, string TableName,string RtnValTemplate, ArrayList InUseList, ref ushort ValueType) if (nd == null)
{
XmlNode radNode = elmnode.FirstChild;
string radNodeName = radNode.Name;
while (radNode != null && !radNodeName.StartsWith(inusename))
{
radNode = radNode.NextSibling;
radNodeName = radNode.Name;
}
parentValue = radNode.InnerText;
parentName = radNodeName;
}
else
parentValue = nd.InnerText;
//applicValues = "";
applicValues = string.Format("<APL DefaultVal={0}", parentValue);
int pcChildIdx = 0;
foreach (string c in pcChildern)
{
//string csufx = CvtUserFldToFld(c);
pcChildIdx++;
string csufx = string.Format("_PCCHILD{0}", pcChildIdx);
applicValues += ",";
XmlNode cn = elmnode.SelectSingleNode(parentName + csufx);
if (cn == null)
applicValues += string.Format("UnitIdx={0} Value={1}", pcChildIdx, parentValue); // use parent value as default
else
applicValues += string.Format("UnitIdx={0} Value={1}", pcChildIdx, cn.InnerText);
}
applicValues += " /APL>";
}
return applicValues;
}
public string GetReturnValue(RODB theDb, string TableName, string RtnValTemplate, ArrayList InUseList, ref ushort ValueType, string[] pcChildern)
{ {
string RtnValStr = ""; string RtnValStr = "";
VlnXmlElement elm = this; VlnXmlElement elm = this;
StringBuilder strbld = new StringBuilder(); StringBuilder strbld = new StringBuilder();
bool PCApplicability = (pcChildern != null && pcChildern.Length > 0);
// Parse the template for the fields and generate a return string // Parse the template for the fields and generate a return string
int left = RtnValTemplate.IndexOf("<"); // look for begining of field int left = RtnValTemplate.IndexOf("<"); // look for begining of field
@ -762,6 +827,8 @@ namespace RODBInterface
} }
ValueType |= FldType; ValueType |= FldType;
if (PCApplicability)
text = GetPCReturnValues(theDb, pcChildern, elm, PCApplicability, inusename, text); // C2021-026 Get P/C Children return values
strbld.Append(text); strbld.Append(text);
} }
else else
@ -789,6 +856,7 @@ namespace RODBInterface
return RtnValStr; return RtnValStr;
} }
public string GetComboFieldValueAndType(XmlNode CurNode, string Fld, ref ushort FldTyp, bool ForMenu) public string GetComboFieldValueAndType(XmlNode CurNode, string Fld, ref ushort FldTyp, bool ForMenu)
{ {
string RtnVal = ""; string RtnVal = "";
@ -929,52 +997,52 @@ namespace RODBInterface
/// ///
// ShowGroupDetail sends to print.tmp the data for a Group level. // ShowGroupDetail sends to print.tmp the data for a Group level.
private bool ShowGroupDetail(RODB myrodb) //private bool ShowGroupDetail(RODB myrodb)
{ //{
ROField rof; // ROField rof;
XmlNode nd; // XmlNode nd;
VlnXmlDocument xmldoc = (VlnXmlDocument) this.OwnerDocument; // VlnXmlDocument xmldoc = (VlnXmlDocument) this.OwnerDocument;
string nm; // string nm;
// First get the fields used for this Group. // // First get the fields used for this Group.
string tmp=null; // needed for inuse call // string tmp=null; // needed for inuse call
ArrayList AvailList = myrodb.RODB_GetFields(this, 0); // ArrayList AvailList = myrodb.RODB_GetFields(this, 0);
ArrayList InUseList = myrodb.RODB_GetFieldsInUse(this, AvailList, "GroupFieldsInUse", ref tmp, false); // ArrayList InUseList = myrodb.RODB_GetFieldsInUse(this, AvailList, "GroupFieldsInUse", ref tmp, false);
// For each field, print the header (field name) & then print data if it exists. // // For each field, print the header (field name) & then print data if it exists.
if (InUseList != null) // if (InUseList != null)
{ // {
xmldoc.writeRROBegin(); // xmldoc.writeRROBegin();
xmldoc.writeInt(7); // xmldoc.writeInt(7);
xmldoc.writeText(" "); // xmldoc.writeText(" ");
for (int i=0; i< InUseList.Count; i++) // for (int i=0; i< InUseList.Count; i++)
{ // {
rof = (ROField) InUseList[i]; // rof = (ROField) InUseList[i];
if (rof.GetFieldname != null) // if (rof.GetFieldname != null)
{ // {
string nm0 = rof.GetFieldname; // string nm0 = rof.GetFieldname;
nm = rof.MakeFieldName(nm0); // nm = rof.MakeFieldName(nm0);
xmldoc.pushHeader(nm0); // xmldoc.pushHeader(nm0);
// see if it has data in the ro. // // see if it has data in the ro.
nd = this.SelectSingleNode(nm); // nd = this.SelectSingleNode(nm);
// if not found with just the string, search the tree. // // if not found with just the string, search the tree.
if (nd==null)nd = this.SelectSingleNode("*/"+nm); // if (nd==null)nd = this.SelectSingleNode("*/"+nm);
if (nd == null) // not found, write out a '0'. // if (nd == null) // not found, write out a '0'.
xmldoc.writeInt(0); // xmldoc.writeInt(0);
else // else
{ // {
VlnXmlElement end; // VlnXmlElement end;
end = (VlnXmlElement) nd; // end = (VlnXmlElement) nd;
xmldoc.writeTextValue(end.InnerText); // xmldoc.writeTextValue(end.InnerText);
} // }
xmldoc.popHeader(); // xmldoc.popHeader();
} // }
} // }
xmldoc.writeRROEnd(); // xmldoc.writeRROEnd();
} // }
return true; // return true;
} //}
public XmlNode GetCurrentOfMultiFields(VlnXmlElement CurElement, string FldName) public XmlNode GetCurrentOfMultiFields(VlnXmlElement CurElement, string FldName)
{ {
@ -997,6 +1065,19 @@ namespace RODBInterface
return nd; return nd;
} }
private bool ContainedInArrayList(ROField rof, ArrayList aryList)
{
bool isInList = false;
foreach (ROField arof in aryList)
{
if (arof.GetRecID == rof.GetRecID)
{
isInList = true;
break;
}
}
return isInList;
}
// ShowRRO writes data for the input RO. // ShowRRO writes data for the input RO.
private bool ShowRRO(RODB myrodb, ArrayList headers) private bool ShowRRO(RODB myrodb, ArrayList headers)
{ {
@ -1010,7 +1091,8 @@ namespace RODBInterface
string tmp=null; // needed for inuse call string tmp=null; // needed for inuse call
ArrayList AvailList = myrodb.RODB_GetFields(this, 0); ArrayList AvailList = myrodb.RODB_GetFields(this, 0);
ArrayList InUseList = myrodb.RODB_GetFieldsInUse(this, AvailList, "FieldsInUse", ref tmp, false); ArrayList InUseList = myrodb.RODB_GetFieldsInUse(this, AvailList, "FieldsInUse", ref tmp, false);
ArrayList InUseApplcList = myrodb.RODB_GetApplicabilityEnabledFields(this, InUseList, ref tmp, HasApplicabilityEnabled); // C2021-026 get fields that have P/C Children
string defPCROval = "";
// put out the stored headers, i.e. the group titles up the tree. // put out the stored headers, i.e. the group titles up the tree.
xmldoc.doHeader(headers); xmldoc.doHeader(headers);
@ -1094,13 +1176,33 @@ namespace RODBInterface
if (doingplot) if (doingplot)
xmldoc.writePlot(end.InnerText); xmldoc.writePlot(end.InnerText);
else else
{
xmldoc.writeTextValue(end.InnerText); xmldoc.writeTextValue(end.InnerText);
defPCROval = end.InnerText;
}
}
}
// C2021_026 put out PC children values
if (ContainedInArrayList(rof,InUseApplcList))
{
XmlNode pcn;
int pcChildIdx = 0;
foreach (string s in PCChildren)
{
pcChildIdx++;
string pcName = nd.Name + string.Format("_PCCHILD{0}", pcChildIdx); // create child field name
string pcField = rof.MakeFieldName(pcName);
xmldoc.pushHeader(" "+s); // put out the PC Child name (indented 5 spaces) for complete RO Report
// see if it has data in the ro.
pcn = this.SelectSingleNode(pcField);
if (pcn != null)
xmldoc.writeTextValue(pcn.InnerText); // use PC Child value
else
xmldoc.writeTextValue(defPCROval); // use default value
} }
} }
xmldoc.popHeader(); xmldoc.popHeader();
} }
} }
xmldoc.writeRROEnd(); xmldoc.writeRROEnd();
} }
@ -1184,12 +1286,21 @@ namespace RODBInterface
headers.RemoveAt(headers.Count-1); headers.RemoveAt(headers.Count-1);
return true; return true;
} }
private static string[] PCChildren = null; //C2021-026 holds list of P/C children names
public bool HasApplicabilityEnabled
{
get
{
return (PCChildren != null && PCChildren.Length > 0);
}
}
// put this element, and if a group all it's subelements out to the 'print.tmp' // put this element, and if a group all it's subelements out to the 'print.tmp'
// file for complete reports. // file for complete reports.
public bool Show(RODB myrodb, ArrayList headers, VlnStatusMessage showStat) public bool Show(RODB myrodb, ArrayList headers, VlnStatusMessage showStat, string [] pcChildren)
{ {
bool success; bool success;
PCChildren = pcChildren; // C2021-026 list of P/C children
VlnXmlDocument xmldoc = (VlnXmlDocument) this.OwnerDocument; VlnXmlDocument xmldoc = (VlnXmlDocument) this.OwnerDocument;
success = xmldoc.OpenTemp(); success = xmldoc.OpenTemp();
if (success==false) return false; if (success==false) return false;

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: ROField.cs $ $Revision: 11 $ * $Workfile: ROField.cs $ $Revision: 11 $
@ -63,12 +63,22 @@ using System.Text;
namespace ROFields namespace ROFields
{ {
// Field Types:
// SingleTxt - Single Line Text
// VariableTxt - Variable Length Text (multiple lines)
// FrmtSingleTxt - Single Line Formatted text - used for Accessory ID fields
// XYPlot - used to enter the plot language commands
// Table - Used to enter a table (16-bit VE-PROMS text based style using dashes and pipe characters to define cells)
// Image - Used for images (ex. TIF,JPG,BMP file references)
// MultiTxt - ??
// Combination - used for Setpoint return values - user can select type of return value (Single/Multi line text, Table, X/Y Plot)
// when entering the RO data
// MultiField - ??
public enum FieldTypes: uint public enum FieldTypes: uint
{ {
Nil=0, SingleTxt=1, VariableTxt=2, FrmtSingleTxt=4, XYPlot=8, Table=10, Image=32, Nil=0, SingleTxt=1, VariableTxt=2, FrmtSingleTxt=4, XYPlot=8, Table=10, Image=32,
MultiTxt=40, Combination=128, MultiFld=100 MultiTxt=40, Combination=128, MultiFld=100
} }
/// <summary> /// <summary>
/// Summary description for ROField: This class contains RO Field information. Each ROField /// Summary description for ROField: This class contains RO Field information. Each ROField
/// contains: /// contains:
@ -92,7 +102,7 @@ namespace ROFields
recID = rID; recID = rID;
masterrecID = mrID; masterrecID = mrID;
fldtype = fieldtype; fldtype = fieldtype;
} }
public string GetFieldname { get {return fieldname;}} public string GetFieldname { get {return fieldname;}}
public string GetRecID { get {return recID;}} public string GetRecID { get {return recID;}}
public string GetMasterRecID { get {return masterrecID;}} public string GetMasterRecID { get {return masterrecID;}}
@ -102,6 +112,22 @@ namespace ROFields
public void SetMasterRecID(string mrecid) {masterrecID = mrecid;} public void SetMasterRecID(string mrecid) {masterrecID = mrecid;}
public void SetFieldType(uint ftype) {fldtype = ftype;} public void SetFieldType(uint ftype) {fldtype = ftype;}
// C2021-026 return true if we allow child values for the current field type
public bool FieldTypeCanDoApplicability()
{
bool rtnval = false;
switch (fldtype)
{
case (uint)FieldTypes.SingleTxt:
case (uint)FieldTypes.VariableTxt:
case (uint)FieldTypes.Combination:
rtnval = true;
break;
}
return rtnval;
}
// Given a schema string, determine which RO Field type it is. // Given a schema string, determine which RO Field type it is.
public uint ParseFieldType(string info) public uint ParseFieldType(string info)
{ {
@ -191,7 +217,7 @@ namespace ROFields
StringBuilder strbld = new StringBuilder(); StringBuilder strbld = new StringBuilder();
strbld.Append("<xsd:element name=\""); strbld.Append("<xsd:element name=\"");
strbld.Append(MakeFieldName(fieldname)); strbld.Append(MakeFieldName(fieldname));
strbld.Append("\" minOccurs=\"0\">\n"); strbld.Append("\" minOccurs=\"0\">\n");
if (ftype == (uint)FieldTypes.VariableTxt || ftype == (uint)FieldTypes.Table || ftype == (uint)FieldTypes.XYPlot) if (ftype == (uint)FieldTypes.VariableTxt || ftype == (uint)FieldTypes.Table || ftype == (uint)FieldTypes.XYPlot)
{ {
strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">"); strbld.Append("<xsd:annotation>\n<xsd:documentation xml:lang=\"en\">");

View File

@ -1,5 +1,5 @@
/********************************************************************************************* /*********************************************************************************************
* Copyright 2002 - Volian Enterprises, Inc. All rights reserved. * Copyright 2021 - Volian Enterprises, Inc. All rights reserved.
* Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
* ------------------------------------------------------------------------------ * ------------------------------------------------------------------------------
* $Workfile: ctlXMLEdit.cs $ $Revision: 36 $ * $Workfile: ctlXMLEdit.cs $ $Revision: 36 $
@ -259,11 +259,16 @@ namespace ctlXMLEditLib
int DPPC = (720/12); int DPPC = (720/12);
int height, width; int height, width;
/** C2021-026 the following are use for Parent Child RO fields **/
public ArrayList FieldsWithApplic = null;
public string[] PCChildren;
private GroupBox pcGrpBox = null;
/** end C2021-026 **/
// use this struct to define attributes for the text box fields, storing // use this struct to define attributes for the text box fields, storing
// the pattern, radio button association, required field flag, etc. // the pattern, radio button association, required field flag, etc.
struct TextBoxAttrTag struct TextBoxAttrTag
{ {
bool required; //whether the field is required bool required; //whether the field is required
string req_msg; //message to print if required, but not set string req_msg; //message to print if required, but not set
string pattern; //pattern for validation string pattern; //pattern for validation
@ -295,10 +300,12 @@ namespace ctlXMLEditLib
public void SetImageDate(string imgdate) {this.imagedate = imgdate;} public void SetImageDate(string imgdate) {this.imagedate = imgdate;}
} }
public ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema, ArrayList reqfields) public ctlXMLEdit(VlnXmlElement myelem, XmlSchema myschema, ArrayList reqfields, ArrayList fldsWithApplic, string [] pckids)
{ {
// This call is required by the Windows.Forms Form Designer. // This call is required by the Windows.Forms Form Designer.
InitializeComponent(); InitializeComponent();
FieldsWithApplic = fldsWithApplic;
PCChildren = pckids; //C2021-026 list of Parent/Child children
zmtooltip = new ToolTip(); zmtooltip = new ToolTip();
myHT = new Hashtable(); myHT = new Hashtable();
tabindx=0; tabindx=0;
@ -410,6 +417,38 @@ namespace ctlXMLEditLib
} }
} }
// C2021-026 If this is a Parent/Child field that has no value saved in the database
// then use the parent's value and display it as grey colored text.
private void GetDefaultParentValue(TextBox tb, XmlNode node, string chldName)
{
XmlNode parentNode = null;
// PCChildren contains a list strings reprenting the Children setup in the current Working Draft Parent/Child property
if (PCChildren == null) return; // C2021-026 no children to process
int pcChildIdx = 0; // C2021-026 corresponds with DocVersionConfig.SelectedSlave value: 0 = no child selected 1 = first child ...
foreach (string c in PCChildren)
{
pcChildIdx++;
string csufx = string.Format("_PCCHILD{0}", pcChildIdx); // C2021-026 create a child field name
if (chldName.EndsWith(csufx))
{
int idx = chldName.LastIndexOf(csufx);
if (idx > 0)
{
string parent = chldName.Remove(idx);
parentNode = node.SelectSingleNode(parent);
// if not found with just the string, search the tree.
if (parentNode == null) parentNode = node.SelectSingleNode("*/" + parent);
if (parentNode != null)
{
tb.Text = parentNode.InnerText; // set the P/C Child text box to the parent's value
tb.ForeColor = SystemColors.GrayText;
break;
}
}
}
}
}
// Given a parent XmlNode, walk through the child nodes & add the text for the // Given a parent XmlNode, walk through the child nodes & add the text for the
// node to the associated text box. // node to the associated text box.
private void DisplayFieldContents(XmlNode node) private void DisplayFieldContents(XmlNode node)
@ -425,7 +464,9 @@ namespace ctlXMLEditLib
nd = node.SelectSingleNode(str); nd = node.SelectSingleNode(str);
// if not found with just the string, search the tree. // if not found with just the string, search the tree.
if (nd==null)nd = node.SelectSingleNode("*/"+str); if (nd==null)nd = node.SelectSingleNode("*/"+str);
if (nd != null) if (nd == null)
GetDefaultParentValue(hwnd, node, str); // C2021-026 Parent/Child Field has no value so use parent's value
else
{ {
hwnd.Text = nd.InnerText; // set the field's text from XML hwnd.Text = nd.InnerText; // set the field's text from XML
@ -504,8 +545,8 @@ namespace ctlXMLEditLib
{ {
// if MaxWidth is small, a scroll bar appears below the fields // if MaxWidth is small, a scroll bar appears below the fields
// so make this a bit larger, so a scroll bar doesn't appear // so make this a bit larger, so a scroll bar doesn't appear
if (MaxWidth<30) return MaxWidth+60; if (MaxWidth < 30) return MaxWidth + 100;
return MaxWidth+30; return MaxWidth + 70;
} }
public int GetMaxLength() public int GetMaxLength()
{ {
@ -569,11 +610,46 @@ namespace ctlXMLEditLib
editelem.InnerXml = savedInnerXml; editelem.InnerXml = savedInnerXml;
} }
//C2021-026 when saving the RO record, if a PC Child's textbox contains a value identical
// to the parent's value, then clear the child's textbox so that nothing is saved
// to the database. This allow us to know that a specific value was not set
// for this Parent/Child child
private void RemovePCChildTextIfSameAsParent(XmlNode node, TextBox tb, string chldName)
{
XmlNode parentNode = null;
// if this is a child node get the parent's value
// PCChildren contains a list strings reprenting the Children setup in the current Working Draft Parent/Child property
if (PCChildren == null) return;
int pcChildIdx = 0;
foreach (string c in PCChildren)
{
//string csufx = CvtUserFldToFld(c);
pcChildIdx++;
string csufx = string.Format("_PCCHILD{0}", pcChildIdx);
if (chldName.EndsWith(csufx))
{
int idx = chldName.LastIndexOf(csufx);
if (idx > 0)
{
string parent = chldName.Remove(idx);
parentNode = node.SelectSingleNode(parent);
// if not found with just the string, search the tree.
if (parentNode == null) parentNode = node.SelectSingleNode("*/" + parent);
if (parentNode != null && parentNode.InnerText == tb.Text)
{
tb.Text = "";
break;
}
}
}
}
}
// SaveData saves the data in the element which had been sent to the control. Return // SaveData saves the data in the element which had been sent to the control. Return
// true if success, false if fail. // true if success, false if fail.
// Note that the Parent and Child XML node variables below are not coding for Parent/Child Applicabily Fields
public bool SaveData() public bool SaveData()
{ {
if (mysavexml) if (mysavexml)
{ {
TextBox hwnd; TextBox hwnd;
@ -586,7 +662,6 @@ namespace ctlXMLEditLib
object o = myHT[str]; object o = myHT[str];
hwnd = (TextBox) o; hwnd = (TextBox) o;
imgdate = null; imgdate = null;
// if this is a required field and there is no text, put out an error // if this is a required field and there is no text, put out an error
// message and get out of here. // message and get out of here.
if (hwnd.Tag != null) if (hwnd.Tag != null)
@ -602,7 +677,6 @@ namespace ctlXMLEditLib
return (false); return (false);
} }
imgdate = tag.GetImageDate; imgdate = tag.GetImageDate;
} }
// find the element in the current element node. // find the element in the current element node.
@ -612,7 +686,7 @@ namespace ctlXMLEditLib
XmlNode elmnode = (XmlNode) editelem; XmlNode elmnode = (XmlNode) editelem;
XmlNode nd = elmnode.SelectSingleNode(str); XmlNode nd = elmnode.SelectSingleNode(str);
if (nd == null) nd = elmnode.SelectSingleNode("*/"+str); if (nd == null) nd = elmnode.SelectSingleNode("*/"+str);
RemovePCChildTextIfSameAsParent(elmnode, hwnd, str); // C2021-026 will clear hwnd.Text if child value is same as parent value
// handle, element exists - but text removed first (delete element) // handle, element exists - but text removed first (delete element)
if ((hwnd.Text == null || hwnd.Text == "") && nd != null) if ((hwnd.Text == null || hwnd.Text == "") && nd != null)
{ {
@ -694,6 +768,7 @@ namespace ctlXMLEditLib
} }
} }
mysavexml=false; // data has been saved, don't allow it again. mysavexml=false; // data has been saved, don't allow it again.
DisplayFieldContents((XmlNode) editelem); // to refresh display after saving Parent/Child fields to show default values
return(true); return(true);
} }
return (false); return (false);
@ -783,7 +858,8 @@ namespace ctlXMLEditLib
{ {
XmlSchemaDocumentation doc = (XmlSchemaDocumentation) item; XmlSchemaDocumentation doc = (XmlSchemaDocumentation) item;
XmlNode[] node = (XmlNode[]) doc.Markup; XmlNode[] node = (XmlNode[]) doc.Markup;
// Note: this has nothing to do with PROMS Annotations. This is more of a field type description
// used for Graphics (figures) RO fields to setup event handlers and buttons to display a Find File Dialog
getannot = node[0].InnerText; getannot = node[0].InnerText;
if (getannot == "VLN_FINDFILE") if (getannot == "VLN_FINDFILE")
{ {
@ -894,7 +970,6 @@ namespace ctlXMLEditLib
else else
tmp = element.SchemaTypeName.Name; tmp = element.SchemaTypeName.Name;
radio.Text = CvtFldToUserFld(tmp); radio.Text = CvtFldToUserFld(tmp);
//radio.Width = (int) radio.Font.SizeInPoints * radio.Text.Length + 20; // add 20 for button
radio.TabIndex = 0; radio.TabIndex = 0;
ysize = (int) radio.Height; ysize = (int) radio.Height;
@ -917,7 +992,19 @@ namespace ctlXMLEditLib
gbox.Contains(tb); gbox.Contains(tb);
// the following will set attributes on the text boxes such as maxlength, multiline, etc. // the following will set attributes on the text boxes such as maxlength, multiline, etc.
DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType, tb, radio,false,null); DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType, tb, radio,false,null);
rety = (ysize + 25 + tb.Height); int chldGrpHeight = 0;
if (FieldsWithApplic != null && FieldsWithApplic.Contains(gbox.Text) && radio.Text == "Fixed") // C2021-026 user turned appicability on for this field
{
int saveScreeny = screeny;
int saveScreenx = screenx;
screeny += tb.Height + 50;
screenx += 20;
pcGrpBox = null; // C2021-026 used to hide/show Parent/Child group when radio buttons are selected
DisplayAppicChildrenGroup(element, PCChildren, ref chldGrpHeight, gbox.Text); // C2021-026 make sub-group for Parent/Child child fields (if needed)
screeny = saveScreeny;
screenx = saveScreenx;
}
rety = (ysize + 25 + chldGrpHeight + tb.Height);
retx = tb.Width; retx = tb.Width;
} }
@ -956,25 +1043,84 @@ namespace ctlXMLEditLib
// get the widths of all children of this group box & use this to set the size // get the widths of all children of this group box & use this to set the size
// of the groupbox. // of the groupbox.
int gritms = groupbox.Controls.Count; int gritms = groupbox.Controls.Count;
screeny=screeny+maxyfortext+10; screeny = screeny + maxyfortext + 20;
MaxWidth = (maxxfortext+40>MaxWidth)?maxxfortext+40:MaxWidth; MaxWidth = (maxxfortext+40>MaxWidth)?maxxfortext+40:MaxWidth;
groupbox.Size = new System.Drawing.Size(maxxfortext+40, maxyfortext+10); groupbox.Size = new System.Drawing.Size(maxxfortext+40, maxyfortext+10);
Controls.Add(groupbox); Controls.Add(groupbox);
} }
private void DisplayXmlSchemaElement(XmlSchemaElement element) private void DisplayXmlSchemaElement(XmlSchemaElement element)
{
string userfldName = CvtFldToUserFld(element.Name);
string childLabel = "";
bool pcApplic = FieldsWithApplic != null && FieldsWithApplic.Contains(userfldName); // C2021-026 returns True if field should show Parent/Child Applicability fields
if (pcApplic) childLabel = CvtFldToUserFld(element.Name);
int dmy = 0;
DoDisplayXmlSchemaElement(element, childLabel, 0, ref dmy, Color.Transparent, 0);
if (pcApplic)
{
// C2021-026 this will create a grouping containing Parent/Child Applicability fields
DisplayAppicChildrenGroup(element, PCChildren, ref dmy, null);
screeny += 10;
}
}
// C2021-026 Creates a group box containing Parent/Child Applicability fields
// the group box is indented and shaded a blue color
private void DisplayAppicChildrenGroup(XmlSchemaElement element, string [] PCChildren, ref int chldgrphgt, string altGrpName)
{
int screenposx, screenposy;
int savescreenX = screenx;
screenx += 20;
GroupBox groupbox = new GroupBox();
groupbox.BackColor = Color.AliceBlue;
groupbox.SuspendLayout();
groupbox.Location = new System.Drawing.Point(screenx, screeny);
groupbox.Name = "PCgb_" + element.Name;
groupbox.TabStop = false;
// remove the last character of the name for the title of the group box.
string tstr = (altGrpName == null)?CvtFldToUserFld(element.Name):altGrpName;//(elem.Name);
groupbox.Text = "Child Values";
screenposx = screenx + 20;
screenposy = screeny + 20;
int screenySave = screeny;
screeny += 20;
int maxChldWidth = 0;
int pcChildIdx = 0;
foreach (string s in PCChildren)
{
string childLabel = s;
pcChildIdx++;
DoDisplayXmlSchemaElement(element, childLabel, 20, ref maxChldWidth,Color.AliceBlue, pcChildIdx);
}
// get the widths and number of all children of this group box & use this to set the size
// of the groupbox.
groupbox.Size = new System.Drawing.Size(Math.Max(55,maxChldWidth + 40), screeny - screenySave + 5);//maxxfortext + 40, maxyfortext + 10);
chldgrphgt = screeny - screenySave + 5;
Controls.Add(groupbox);
if (pcGrpBox == null)
pcGrpBox = groupbox; // only save if is in a Choice (radio button) group - used to hide/unhide the P/C Group box when radio buttons are selected
screenx = savescreenX;
}
private void DoDisplayXmlSchemaElement(XmlSchemaElement element, string applicLabel, int indent, ref int maxwidth, Color chlbckcolor, int pcChildIdx)
{ {
// always add a label. // always add a label.
Label mylabel;
int sscreeny; int sscreeny;
mylabel = new System.Windows.Forms.Label(); string userfldName = CvtFldToUserFld(element.Name);
mylabel.Location = new Point(screenx, screeny); string pcChildFldName = element.Name; // C2021-026 PC Child field name
mylabel.Name = element.Name; // C2021-026 the first PC Child has pcChildIdx of one
mylabel.Text = CvtFldToUserFld(element.Name); if (pcChildIdx > 0)
pcChildFldName += string.Format("_PCCHILD{0}", pcChildIdx);
Label mylabel;
mylabel = new System.Windows.Forms.Label();
mylabel.BackColor = chlbckcolor; // PC Applic fields are shaded blue otherwise backcolor is transparent
mylabel.Location = new Point(screenx+indent, screeny);
mylabel.Name = (pcChildIdx == 0) ? CvtUserFldToFld(element.Name) : CvtUserFldToFld(pcChildFldName);
mylabel.Text = (applicLabel.Length > 0) ? applicLabel : CvtFldToUserFld(element.Name); // C2021-026 applicLabel is the P/C Child name
mylabel.AutoSize = true; mylabel.AutoSize = true;
Controls.Add(mylabel); Controls.Add(mylabel);
// add 3 onto screeny so that textbox is slightly below label. // add 3 onto screeny so that textbox is slightly below label.
screeny = screeny+mylabel.Height+3; screeny = screeny + mylabel.Height + 3;
sscreeny = screeny; // save 'y' location in case of annotation. sscreeny = screeny; // save 'y' location in case of annotation.
if (element.SchemaType != null && element.SchemaType is XmlSchemaComplexType) if (element.SchemaType != null && element.SchemaType is XmlSchemaComplexType)
{ {
@ -986,23 +1132,34 @@ namespace ctlXMLEditLib
{ {
TextBox mytextbox; TextBox mytextbox;
mytextbox = new TextBox(); mytextbox = new TextBox();
mytextbox.Location = new Point(screenx, screeny); mytextbox.Location = new Point(screenx+indent, screeny);
myHT.Add(element.Name,mytextbox); string tFieldName = (pcChildIdx == 0) ? CvtUserFldToFld(element.Name) : CvtUserFldToFld(pcChildFldName);
myHT.Add(tFieldName, mytextbox);
tabindx++; tabindx++;
Controls.Add(mytextbox); Controls.Add(mytextbox);
screeny+=mytextbox.Height; screeny = screeny + 10;
mytextbox.TextChanged += new System.EventHandler(this.textbox_change); mytextbox.TextChanged += new System.EventHandler(this.textbox_change);
mytextbox.Validating += new System.ComponentModel.CancelEventHandler(this.textbox_Validating); mytextbox.Validating += new System.ComponentModel.CancelEventHandler(this.textbox_Validating);
mytextbox.GotFocus += new System.EventHandler(this.textbox_zoombtn); mytextbox.GotFocus += new System.EventHandler(this.textbox_zoombtn);
mytextbox.KeyDown += new KeyEventHandler(MyOnKeyDown); mytextbox.KeyDown += new KeyEventHandler(MyOnKeyDown);
if (pcChildIdx > 0)
{
mytextbox.Enter += new System.EventHandler(this.txtBox_Enter);
mytextbox.Leave += new System.EventHandler(this.txtBox_Leave);
}
string labelAnnot; string labelAnnot;
bool imgchld = false; bool imgchld = false;
if (element.Name == "Image_Filename" || element.Name == "Image_Height" || element.Name == "Image_Width") imgchld = true; if (element.Name == "Image_Filename" || element.Name == "Image_Height" || element.Name == "Image_Width") imgchld = true;
// Pass the textbox in to set attributes such as maxlength, multiline and pattern // Pass the textbox in to set attributes such as maxlength, multiline and pattern
// DisplayXmlSchemaSimpleType will set up
// - the textbox length which is needed to determin the Parent/Child group box width
// - add special buttons and events for Graphic (figure) RO type fields
labelAnnot = DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType,mytextbox, null,imgchld,GraphicsText); labelAnnot = DisplayXmlSchemaSimpleType((XmlSchemaSimpleType)element.SchemaType,mytextbox, null,imgchld,GraphicsText);
if (labelAnnot != null) if (labelAnnot != null)
{ {
// this is part of a Graphics (figure) RO - either the height or width adjustment text box
// so put a lable next to the respective height/width text box
Label annot; Label annot;
annot = new System.Windows.Forms.Label(); annot = new System.Windows.Forms.Label();
annot.Location = new Point(screenx+mytextbox.Width+10, sscreeny); annot.Location = new Point(screenx+mytextbox.Width+10, sscreeny);
@ -1011,7 +1168,9 @@ namespace ctlXMLEditLib
annot.AutoSize = true; annot.AutoSize = true;
Controls.Add(annot); Controls.Add(annot);
} }
screeny+=mytextbox.Height; screeny += mytextbox.Height;
maxwidth = Math.Max(maxwidth, mylabel.Width); // is the label wider?
maxwidth = Math.Max(mytextbox.Width, maxwidth); // is the text box wider?
} }
} }
@ -1028,6 +1187,37 @@ namespace ctlXMLEditLib
{ {
if(dosaveflag)mysavexml = true; if(dosaveflag)mysavexml = true;
} }
// C2021-026 Event handler for Parent/Child child textbox
// if the textbox text is same as parent, then or nothing is entered in the textbox
// then use the parent value and set the text color to gray
private void txtBox_Leave(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
string dfTxt = "";
string parName = pcGrpBox.Name.Substring(5);
object o = myHT[parName];
if (o != null)
dfTxt = (o as TextBox).Text; // set to use the parent's value (default)
if (dosaveflag) mysavexml = true;
if (tb.Text.Length == 0 || tb.Text == dfTxt)
{
tb.Text = dfTxt;
tb.ForeColor = SystemColors.GrayText;
}
}
// C2021-026 Event handler for Parent/Child child textbox
// If the textbox is set to gray, then we are using the parent value
// so clear the textbox so that user can enter the value for that child
private void txtBox_Enter(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
if (tb.ForeColor == SystemColors.GrayText) // currently no value set - using parent's value
{
tb.Text = "";
tb.ForeColor = SystemColors.WindowText;
}
}
// radiocheckchg - called when a radio button is selected. This will set // radiocheckchg - called when a radio button is selected. This will set
// visibility for associated text box. // visibility for associated text box.
@ -1050,6 +1240,30 @@ namespace ctlXMLEditLib
assocbox = (TextBox) o; assocbox = (TextBox) o;
// make the text box visible if checked, otherwise, invisible // make the text box visible if checked, otherwise, invisible
assocbox.Visible = btnsel.Checked; assocbox.Visible = btnsel.Checked;
// C2021-026 show or hide the Parent/Child appicability group box
if (pcGrpBox != null) // note that we save only one applicability group box and only for the schema choice field type (radio buttons)
{
bool vsblState = (btnsel.Text == "Fixed"); // only show parent/child group if the Fixed radio button is selected
{
pcGrpBox.Visible = vsblState; // show or hide the P/C Children group box (the box shaded in blue)
// C2021-026 PCChildren contains a list strings reprenting the Children setup in the current Working Draft Parent/Child property
int pcChildIdx = 0;
foreach (string s in PCChildren)
{
pcChildIdx++;
string fldx = string.Format("_PCCHILD{0}", pcChildIdx); // create a field name for P/C Child fields
string tstr = pcGrpBox.Name.Substring(5) + fldx; // get the base part of the label and text box control name
foreach (Control c in Controls)
if (c.Name == tstr)
{
c.Visible = vsblState; // show or hide the lable inside the group box
object oo = myHT[c.Name];
if (oo != null)
(oo as TextBox).Visible = vsblState; // show or hide the associated text box
}
}
}
}
} }
// these two methods convert user input field names from/to xml tags. (xml tags // these two methods convert user input field names from/to xml tags. (xml tags

View File

@ -300,6 +300,40 @@ namespace VEPROMS.CSLA.Library
} }
return val; return val;
} }
// C2021-026 Get the child RO value if it exists, otherwise to the default (parent) RO value
public string GetParentChildROValue(rochild roc)
{
string roval = roc.value;
// get the child (slave) information and set the rtnchld.value to the corresponding RO Value
int selChldIdx = MyDocVersionInfo.DocVersionConfig.SelectedSlave;
string childName = MyDocVersionInfo.DocVersionConfig.Unit_Name;
string aplString = roval;
string ChldValue = "";
// if the RO Value contains Parent/Child values, parse out default value and the child (slave or unit specific) value
while (roval.Contains("<APL DefaultVal="))
{
int startCVIdx = roval.IndexOf("<APL DefaultVal=");
int EndCVidx = roval.IndexOf(" /APL>", startCVIdx);
aplString = roval.Substring(startCVIdx, EndCVidx + 6 - startCVIdx);
int endDefIdx = aplString.IndexOf(",UnitIdx=",startCVIdx); // look for more than just a comma incase value contains a comma
string defValue = aplString.Substring(16,endDefIdx-16); // save the default RO value
int idx = aplString.IndexOf("UnitIdx=" + selChldIdx.ToString()); // look for a specific child (slave/unit) value
if (selChldIdx > 0 && idx > -1 && idx < aplString.Length)
{
idx = aplString.IndexOf("Value=", idx) + 6;
int idxEndVal = aplString.IndexOf(",UnitIdx=", idx); // look for more than just a comma incase value contains a comma
if (idxEndVal == -1) idxEndVal = EndCVidx; // if last child value is up to " /APL>"
if (idxEndVal > idx)
ChldValue = aplString.Substring(idx, idxEndVal - idx); // selected Child RO value
else
ChldValue = defValue; // incomplete "<APL ..." structure use default value
}
else
ChldValue = defValue; // could not find a value for the selected child so use the default value
roval = roval.Replace(aplString, ChldValue); // replace the entire Parent/Child value string ("<APL ... /APL>") with the specifc value
}
return roval;
}
// this only gets rochild values. Later we may want another // this only gets rochild values. Later we may want another
// dictionary to get groups. // dictionary to get groups.
public string GetRoValue(string ROID16) public string GetRoValue(string ROID16)
@ -311,14 +345,14 @@ namespace VEPROMS.CSLA.Library
{ {
rochild rochld = (rochild)dicRos[ROID.ToUpper()]; rochild rochld = (rochild)dicRos[ROID.ToUpper()];
if (rochld.value != null && rochld.value != string.Empty) if (rochld.value != null && rochld.value != string.Empty)
return FixUnitROs( rochld.value); return FixUnitROs(GetParentChildROValue(rochld));
if (rochld.children != null) if (rochld.children != null)
{ {
foreach (rochild child in rochld.children) foreach (rochild child in rochld.children)
if (child.roid.ToUpper() == ROID16.ToUpper() || (child.roid.EndsWith("0041") && ROID16.EndsWith("0000"))) if (child.roid.ToUpper() == ROID16.ToUpper() || (child.roid.EndsWith("0041") && ROID16.EndsWith("0000")))
return FixUnitROs(child.value ?? "?"); return FixUnitROs(GetParentChildROValue(child) ?? "?");
// if there isn't a specific match for multi-return values, default to the first child. // if there isn't a specific match for multi-return values, default to the first child.
return FixUnitROs(rochld.children[0].value ?? "?"); return FixUnitROs(GetParentChildROValue(rochld.children[0]) ?? "?");
} }
} }
//if (ROID == "FFFF00000001") return _ROFstInfo.ROFstAssociations[0].MyDocVersion.DocVersionConfig.Unit_Number; //if (ROID == "FFFF00000001") return _ROFstInfo.ROFstAssociations[0].MyDocVersion.DocVersionConfig.Unit_Number;
@ -1140,7 +1174,7 @@ namespace VEPROMS.CSLA.Library
{ {
rochild? child = GetROChildByAccPageID(accPageID, spDefault, igDefault); rochild? child = GetROChildByAccPageID(accPageID, spDefault, igDefault);
if (child == null) return null; if (child == null) return null;
return ((rochild)child).value; return GetParentChildROValue((rochild)child); // C2021-026 get the P/C value if it exists, otherwise get the non-P/C value
} }
public int? GetROTypeByAccPagID(string accPageID, string spDefault, string igDefault) public int? GetROTypeByAccPagID(string accPageID, string spDefault, string igDefault)
{ {

View File

@ -251,7 +251,9 @@ namespace Volian.Controls.Library
switch (chld.type) switch (chld.type)
{ {
case 1: // standard (regular) text RO type case 1: // standard (regular) text RO type
tbROValue.Text = chld.value.Replace(@"\u160?", " "); string roval = chld.value.Replace(@"\u160?", " ");
roval = GetPCDefaultValue(roval); // C2021-026 get the default RO value from P/C RO value information
tbROValue.Text = roval;
btnPreviewRO.Enabled = false; btnPreviewRO.Enabled = false;
if (chld.roid.StartsWith("FFFF")) if (chld.roid.StartsWith("FFFF"))
btnGoToRO.Enabled = false; btnGoToRO.Enabled = false;
@ -317,6 +319,23 @@ namespace Volian.Controls.Library
} }
private E_ROValueType _CurrentROTypeFilter = E_ROValueType.All; private E_ROValueType _CurrentROTypeFilter = E_ROValueType.All;
// C2021-026 Get the Parent (Default) RO value if the return value include P/C information
// otherwise return the RO value as is.
// This is used for the insert RO interface on the Step Properties pannel
private string GetPCDefaultValue(string roval)
{
string rntval = roval;
while (rntval.Contains("<APL DefaultVal=")) // C2021-026 remove Parent/Child values for the menu item text
{
int startCVIdx = rntval.IndexOf("<APL DefaultVal=");
int EndCVidx = rntval.IndexOf(" /APL>", startCVIdx);
string aplicValues = rntval.Substring(startCVIdx, EndCVidx + 6 - startCVIdx);
int endDefIdx = rntval.IndexOf(",", startCVIdx);
string defValue = rntval.Substring(startCVIdx + 16, endDefIdx - (startCVIdx + 16));
rntval = rntval.Replace(aplicValues, defValue);
}
return rntval;
}
private void LoadChildren(TreeNode tn) private void LoadChildren(TreeNode tn)
{ {
object tag = tn.Tag; object tag = tn.Tag;
@ -378,7 +397,9 @@ namespace Volian.Controls.Library
//} //}
else else
{ {
tmp = new TreeNode(chld[i].title.Replace(@"\u160?"," ")); string ntitle = chld[i].title.Replace(@"\u160?", " ");
ntitle = GetPCDefaultValue(ntitle); // C2021-026 get the default RO value from P/C RO value information
tmp = new TreeNode(ntitle);
tmp.Tag = chld[i]; tmp.Tag = chld[i];
if (chld[i].roid.Length == 16) if (chld[i].roid.Length == 16)
tn.Nodes.Add(tmp); tn.Nodes.Add(tmp);
@ -887,6 +908,14 @@ namespace Volian.Controls.Library
string args = "\"" + _MyROFST.MyRODb.FolderPath + "\" " + roch.roid.ToLower(); string args = "\"" + _MyROFST.MyRODb.FolderPath + "\" " + roch.roid.ToLower();
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (_MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _MyROFST.MyRODb.DBConnectionString + "\""; if (_MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _MyROFST.MyRODb.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = Mydvi.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str!="" && str!="0")
args += " \"PC=" + str + "\"";
}
System.Diagnostics.Process.Start(roapp, args); System.Diagnostics.Process.Start(roapp, args);
} }
} }
@ -929,6 +958,14 @@ namespace Volian.Controls.Library
} }
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (_MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _MyROFST.MyRODb.DBConnectionString + "\""; if (_MyROFST.MyRODb.DBConnectionString != "cstring") args = args + " \"" + _MyROFST.MyRODb.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = Mydvi.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str != "" && str !="0")
args += " \"PC=" + str + "\"";
}
System.Diagnostics.Process.Start(roapp, args); System.Diagnostics.Process.Start(roapp, args);
} }
} }

View File

@ -938,6 +938,16 @@ namespace Volian.Controls.Library
string roloc = "\"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath + "\" \"/f=" + fname + "\""; string roloc = "\"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.FolderPath + "\" \"/f=" + fname + "\"";
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"/sql=" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\""; if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"/sql=" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = MyDVI.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str != "" && str != "0")
roloc += " \"/PC=" + str + "\"";
}
System.Diagnostics.Process p = System.Diagnostics.Process.Start(cmpRptExePath, roloc); System.Diagnostics.Process p = System.Diagnostics.Process.Start(cmpRptExePath, roloc);
// need to wait, sometimes the Print.tmp file that is generated is not available // need to wait, sometimes the Print.tmp file that is generated is not available
p.WaitForExit(); // without arguments, this will wait indefinitely p.WaitForExit(); // without arguments, this will wait indefinitely

View File

@ -3112,6 +3112,14 @@ namespace Volian.Controls.Library
} }
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (myRODB.DBConnectionString != "cstring") args = args + " \"" + myRODB.DBConnectionString + "\""; if (myRODB.DBConnectionString != "cstring") args = args + " \"" + myRODB.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = Mydvi.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str!="" && str!="0")
args += " \"PC=" + str + "\"";
}
System.Diagnostics.Process.Start(roapp, args); System.Diagnostics.Process.Start(roapp, args);
} }
} }
@ -3268,6 +3276,14 @@ namespace Volian.Controls.Library
} }
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (Mydvi.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"" + Mydvi.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\""; if (Mydvi.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"" + Mydvi.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = Mydvi.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str!="" && str!="0")
roloc += " \"PC=" + str + "\"";
}
System.Diagnostics.Process.Start(roapp, roloc); System.Diagnostics.Process.Start(roapp, roloc);
} }

View File

@ -2088,7 +2088,16 @@ namespace Volian.Controls.Library
return; return;
} }
// C2017-003: ro data in sql server, check for sql connection string // C2017-003: ro data in sql server, check for sql connection string
if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring") roloc = roloc + " \"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\""; if (MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString != "cstring")
roloc = roloc + " \"" + MyDVI.DocVersionAssociations[0].MyROFst.MyRODb.DBConnectionString + "\"";
// C2021-026 pass in Parent/Child information (list of the children)
DocVersionConfig dvc = MyDVI.DocVersionConfig as DocVersionConfig;
if (dvc != null)
{
string str = dvc.Unit_Name;
if (str !="" && str != "0")
roloc += " \"PC=" + str + "\"";
}
System.Diagnostics.Process.Start(roapp, roloc); System.Diagnostics.Process.Start(roapp, roloc);
} }