
Added a new parameter to SaveSectionDocument and Error Handling Changed error handling for InvokeMember to throw an exception Added code to change the view to PrintMode when determining length
555 lines
21 KiB
C#
555 lines
21 KiB
C#
// ========================================================================
|
|
// Copyright 2006 - Volian Enterprises, Inc. All rights reserved.
|
|
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
|
|
// ------------------------------------------------------------------------
|
|
// $Workfile: $ $Revision: $
|
|
// $Author: $ $Date: $
|
|
//
|
|
// $History: $
|
|
// ========================================================================
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Collections;
|
|
using System.ComponentModel;
|
|
using System.Windows.Forms;
|
|
using System.Data;
|
|
using System.Data.OleDb;
|
|
using System.Collections.Specialized;
|
|
using System.Collections.Generic;
|
|
using System.Xml;
|
|
using System.Xml.XPath;
|
|
using System.IO;
|
|
using System.Text;
|
|
using VEPROMS.CSLA.Library;
|
|
|
|
|
|
namespace DataLoader
|
|
{
|
|
public partial class Loader
|
|
{
|
|
private Dictionary<string, int> dicOldToNew;
|
|
private Item AddSection(Item procitem, string Number, string Title, string SecType, DateTime Dts, string Userid, ConfigInfo ci, string stpseq, string fmt, int libdocid, string pth, Item FromItem, FormatInfo activeFormat)
|
|
{
|
|
frmMain.UpdateLabels(0, 1, 0);
|
|
try
|
|
{
|
|
FormatInfo format = activeFormat;
|
|
|
|
// Tie the section to format used, this will add the format xml if it doesn't exist in
|
|
// the database yet. Note that if there is no format at this level then none should
|
|
// be set so that the inheritance works correctly.
|
|
if (fmt != null && fmt != "") format = GetFormat(fmt);
|
|
|
|
// Find the docstyle based on the section type (step[1]) & the 'type' from the dbf
|
|
// record sectype[0])
|
|
string dstyleindx = ((stpseq == null || stpseq == "") ? " " : stpseq.Substring(1, 1)) + ((SecType==null||SecType == "") ? " " : SecType.Substring(0, 1));
|
|
//int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, docver,Number,Title);
|
|
int docstyleindx = GetDocStyleIndx(dstyleindx, format, procitem, Number, Title);
|
|
|
|
// tack on the column mode - add to config xml for node.
|
|
if (stpseq != null && stpseq.Substring(1, 1) == "0" && stpseq.Substring(5, 1) != " ")
|
|
{
|
|
if (ci == null) ci = new ConfigInfo(null);
|
|
ci.AddItem("Section", "ColumnMode", stpseq.Substring(5, 1));
|
|
}
|
|
|
|
// find rtf file (or use the library document temp file) & read it into the field
|
|
// acccontent
|
|
int Documentid=0;
|
|
bool needEntry = false;
|
|
if (libdocid != 0 || stpseq.Substring(1, 1) != "0")
|
|
{
|
|
needEntry = true;
|
|
string fname = null;
|
|
if (libdocid != 0)
|
|
{
|
|
Documentid = libdocid;
|
|
}
|
|
else
|
|
{
|
|
int num = Convert.ToInt32(stpseq[0]) - 64;
|
|
string thenum = num.ToString("d2");
|
|
fname = string.Format("{0}\\rtffiles\\{1}.A{2}", pth, ProcFileName, thenum);
|
|
Application.DoEvents();
|
|
SaveSectionDocument(fname, stpseq, SecType, ref Documentid, procitem.DisplayNumber + ":" + (Number == string.Empty ? Title : Number));
|
|
if (Documentid == 0)
|
|
{
|
|
if (MissingDocument==null) MissingDocument = Document.MakeDocument("MISSING FILE IN CONVERSION", null, null, null);
|
|
Documentid = MissingDocument.DocID;
|
|
}
|
|
}
|
|
}
|
|
if (Userid == null || Userid == "") Userid = "Migration";
|
|
|
|
// test for performance
|
|
Content cont;
|
|
using(Format fmt2 = format == null ? null : format.Get())
|
|
cont = Content.New(Number, Title, 10000+docstyleindx, fmt2, ci==null?null:ci.ToString(), Dts, Userid);
|
|
Entry entry = cont.MyEntry;
|
|
if (needEntry)
|
|
{
|
|
entry.MyDocument = Document.Get(Documentid);
|
|
entry.DTS = Dts;
|
|
entry.UserID = Userid;
|
|
//entry = Entry.MakeEntry(cont.ContentID, Document.Get(Documentid), Dts, Userid);
|
|
}
|
|
cont.MyZContent.OldStepSequence = ProcNumber + "|" + stpseq;
|
|
Item itm = null;
|
|
// the stpseq for section records may include a space & some other data. This
|
|
// was not part of what is stored in the transition records, so just look at
|
|
// the sequence before the space for section records. Then use the first character
|
|
// with a '0'. This is what's stored in the transition record, for example, if the
|
|
// section was BI, the transition record would have B0 (the reasoning is that
|
|
// for steps, this is what could be stored if there were enough steps.
|
|
int trindxsp = stpseq.IndexOf(' ');
|
|
string trstpseq = trindxsp < 0 ? stpseq : stpseq.Substring(0, 1)+ "0";
|
|
if (dicTrans_ItemIds.ContainsKey(ProcNumber + "|" + trstpseq))
|
|
{
|
|
itm = dicTrans_ItemIds[ProcNumber + "|" + trstpseq];
|
|
itm.MyContent = cont;
|
|
itm.MyPrevious = FromItem;
|
|
itm.DTS = Dts;
|
|
itm.UserID = Userid;
|
|
if (!itm.IsSavable) ErrorRpt.ErrorReport(itm);
|
|
itm.Save();
|
|
dicTrans_ItemIds.Remove(ProcNumber + "|" + trstpseq);
|
|
dicTrans_MigrationErrors.Remove(ProcNumber + "|" + trstpseq);
|
|
}
|
|
else
|
|
itm = Item.MakeItem(FromItem, cont, Dts, Userid);
|
|
dicTrans_ItemDone[ProcNumber+"|"+trstpseq] = itm;
|
|
dicOldStepSequence[itm] = stpseq;
|
|
return itm;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmMain.AddError(ex, "Save Section");
|
|
log.Error("Save Section");
|
|
log.ErrorFormat("oldstepsequence = {0}", stpseq);
|
|
log.ErrorFormat("{0}\r\n\r\n{1}", ex.Message, ex.InnerException);
|
|
log.ErrorFormat(ex.StackTrace);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
private int LookupOldToNew(string lkup)
|
|
{
|
|
if (dicOldToNew == null)
|
|
{
|
|
dicOldToNew = new Dictionary<string, int>();
|
|
//dicOldToNew.Add("", 1);
|
|
dicOldToNew.Add("0", 1);
|
|
dicOldToNew.Add("0 ", 1);
|
|
dicOldToNew.Add("00", 1);
|
|
dicOldToNew.Add("01", 2);
|
|
dicOldToNew.Add("02", 4);
|
|
dicOldToNew.Add("03", 8);
|
|
dicOldToNew.Add("04", 16);
|
|
dicOldToNew.Add("I", 32);
|
|
dicOldToNew.Add("I ", 32);
|
|
dicOldToNew.Add("I0", 32);
|
|
dicOldToNew.Add("I1", 64);
|
|
dicOldToNew.Add("I2", 128);
|
|
dicOldToNew.Add("I3", 256);
|
|
dicOldToNew.Add("I4", 512);
|
|
dicOldToNew.Add("A", 1024);
|
|
dicOldToNew.Add("A ", 1024);
|
|
dicOldToNew.Add("A0", 1024);
|
|
dicOldToNew.Add("A1", 2048);
|
|
dicOldToNew.Add("A2", 4096);
|
|
dicOldToNew.Add("A3", 8192);
|
|
dicOldToNew.Add("A4", 16384);
|
|
dicOldToNew.Add("F", 32768);
|
|
dicOldToNew.Add("F ", 32768);
|
|
dicOldToNew.Add("F0", 32768);
|
|
dicOldToNew.Add("F1", 65536);
|
|
dicOldToNew.Add("F2", 131072);
|
|
dicOldToNew.Add("F3", 262144);
|
|
dicOldToNew.Add("F4", 524288);
|
|
dicOldToNew.Add("05", 1048576);
|
|
dicOldToNew.Add("06", 2097152);
|
|
dicOldToNew.Add("07", 4194304);
|
|
dicOldToNew.Add("08", 8388608);
|
|
dicOldToNew.Add("09", 16777216);
|
|
dicOldToNew.Add("0:", 33554432);
|
|
dicOldToNew.Add("0;", 67108864);
|
|
dicOldToNew.Add("0<", 134217728);
|
|
dicOldToNew.Add("0=", 268435456);
|
|
dicOldToNew.Add("0>", 536870912);
|
|
}
|
|
int retval = -1;
|
|
try
|
|
{
|
|
retval = dicOldToNew[lkup];
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmMain.AddError(ex, "OldToNew {0}", lkup);
|
|
Console.WriteLine(string.Format("Error in oldtonew {0}", lkup));
|
|
Console.WriteLine(string.Format("Error = {0}", ex.Message));
|
|
}
|
|
return retval;
|
|
}
|
|
private int GetDocStyleIndx(string dstyleindx, FormatInfo format, Item procitem, /* DocVersion docver,*/ string Number, string Title)
|
|
{
|
|
// get the format, if format is set, use it, otherwise walk
|
|
//if (format == null)
|
|
//{
|
|
//format = GetFormat(procitem, docver);
|
|
//}
|
|
int docstyle = LookupOldToNew(dstyleindx);
|
|
foreach (DocStyle ds in format.PlantFormat.DocStyles.DocStyleList)
|
|
{
|
|
if ((ds.OldToNew & docstyle)>0) return (int)ds.Index;
|
|
}
|
|
frmMain.AddError("Bad OldToNew Document Style {0}:{1} dStyleIndex = '{2}'\r\n{3} - Missing OldToNew {4}",
|
|
procitem.DisplayNumber, (Number ?? "") == "" ? Title : Number, dstyleindx, format, docstyle);
|
|
return 0; // Default is Zero
|
|
}
|
|
//private FormatInfo GetFormat(Item procitem, DocVersion docver)
|
|
//{
|
|
// return procitem.MyItemInfo.ActiveFormat;
|
|
// //while (procitem.MyItemInfo.a .MyContent.MyFormat == null)
|
|
// //{
|
|
// // // find the first sibling
|
|
// // while (procitem.PreviousID != null)
|
|
// // procitem = procitem.MyPrevious;
|
|
// // if (procitem.ItemPartCount == 0) return docver.MyDocVersionInfo.ActiveFormat;
|
|
// // // find the parent node
|
|
// // procitem = procitem.ItemParts[0].MyContent.ContentItems[0].MyItem;
|
|
// //}
|
|
// //return procitem.MyContent.MyFormat;
|
|
//}
|
|
//private FormatInfo GetFormat(DocVersion docver)
|
|
//{
|
|
// if (docver.MyDocVersionInfo.MyFormat != null) return docver.MyDocVersionInfo.MyFormat;
|
|
// return GetFormat(docver.MyDocVersionInfo.MyFolder);
|
|
//}
|
|
//private FormatInfo GetFormat(FolderInfo folder)
|
|
//{
|
|
// if (folder.MyFormat != null) return folder.MyFolderInfo.MyFormat;
|
|
// return GetFormat(folder.MyParent);
|
|
//}
|
|
private string SectTitle(OleDbConnection cn, DataRowView dr, bool UseMultiLineSectionTitle, bool ConvertCaret)
|
|
{
|
|
string tbuff = null;
|
|
string menustr = null;
|
|
|
|
if (UseMultiLineSectionTitle)
|
|
{
|
|
bool titleInMemo = false;
|
|
// for accessory pages...
|
|
if (dr["Step"].ToString().Substring(1, 1) != "0")
|
|
{
|
|
// The long section title is stored on a record with the "~" character.
|
|
// This was done since originally the actual accessory page data was stored in the memo
|
|
// field, so the long title could not be stored there, another record had to be used.
|
|
OleDbDataAdapter da = new OleDbDataAdapter("select * from " + ProcFileName + " where [Step] like '" + dr["Step"].ToString().Substring(0, 1) + "~';", cn);
|
|
DataSet ds = new DataSet();
|
|
try
|
|
{
|
|
da.Fill(ds);
|
|
if (ds.Tables[0].Rows.Count == 1)
|
|
{
|
|
DataRow row = ds.Tables[0].Rows[0];
|
|
tbuff = TextConvert.ConvertText(row["Textm"].ToString(),ConvertCaret);
|
|
if (tbuff != null && tbuff != "") titleInMemo = true;
|
|
}
|
|
else // no long section title existed for this accessory page
|
|
tbuff = TextConvert.ConvertText(dr["Text"].ToString().PadRight(130, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
frmMain.AddError(ex, "Error getting long section title");
|
|
log.ErrorFormat("Error getting long section title {0}", ex.Message);
|
|
}
|
|
da.Dispose();
|
|
}
|
|
// For step sections, the long section title is stored on the section record
|
|
// (see above comment for accessory pages to see the difference)
|
|
else
|
|
{
|
|
tbuff = TextConvert.ConvertText(dr["TextM"].ToString().Trim(), ConvertCaret);
|
|
}
|
|
|
|
//// TESTS were run & it looked like that whitespace was removed before saving,
|
|
//// so, put up a message box if find out otherwise....
|
|
//int nl = tbuff.IndexOf("\n");
|
|
//if (nl > -1)
|
|
// MessageBox.Show("multiline text for section title, fix this!!");
|
|
|
|
//// remove newlines & any other escape/whitespace chars.
|
|
int nl = tbuff.IndexOf("\n");
|
|
if (nl > -1 || titleInMemo)
|
|
{
|
|
|
|
string tmpstr = tbuff.Replace("\r", "");
|
|
tmpstr = tmpstr.Replace("\t", "");
|
|
tmpstr = tmpstr.Replace("\n", " ");
|
|
// get rid of multiple spaces
|
|
while (tmpstr.IndexOf(" ") > -1) tmpstr = tmpstr.Replace(" ", " ");
|
|
tbuff = tmpstr;
|
|
if (tbuff.Substring(tbuff.Length - 1, 1) == " ") tbuff = tbuff.Substring(0, tbuff.Length - 1);
|
|
menustr = tbuff;
|
|
}
|
|
else
|
|
{
|
|
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
|
|
}
|
|
}
|
|
else
|
|
{ // format does not include long section title
|
|
menustr = TextConvert.ConvertText(dr["Text"].ToString().PadRight(80, ' ').Substring(0, 75).TrimEnd(), ConvertCaret);
|
|
}
|
|
return menustr;
|
|
}
|
|
private Item MigrateSection(Item procitem, string procnum, OleDbConnection cn, DataRowView dr, DataTable dt, Item FromItem, bool isSubSection, string pth, DocVersion docver, FormatInfo activeFormat)
|
|
{
|
|
Int32 thesectid = 0;
|
|
bool isautogen = false;
|
|
string stype = dr["type"].ToString();
|
|
string s = dr["text"].ToString().PadRight(130, ' ');
|
|
string num = s.Substring(85, 20).TrimEnd();
|
|
string fmt = s.Substring(75, 10).TrimEnd();
|
|
if (fmt == "") fmt = null;
|
|
bool ismulti = false;
|
|
bool conv_caret = true;
|
|
|
|
// sectFormat is a local that represents the format to be used by this section.
|
|
// Note that if the format is set for this section, check it against what the inherited
|
|
// value would be (for example, what the format is for the set), if they are the same
|
|
// clear the format at the section level.
|
|
FormatInfo sectFormat = null;
|
|
FormatInfo docverFormat = activeFormat;//docver.MyDocVersionInfo.ActiveFormat;
|
|
if (fmt != null&& fmt !="") // Is there a long section title (from format flag)
|
|
sectFormat = GetFormat(fmt);
|
|
else // either from this format, or the plant.
|
|
sectFormat = docverFormat;
|
|
if (sectFormat != null)
|
|
{
|
|
ismulti = sectFormat.PlantFormat.FormatData.SectData.StepSectionData.UseMultiLineSectionTitle;
|
|
conv_caret = sectFormat.PlantFormat.FormatData.SectData.ConvertCaretToDelta;
|
|
}
|
|
if (fmt != null && fmt != "") if (fmt == docverFormat.Name) fmt = null;
|
|
string title = SectTitle(cn, dr, ismulti, conv_caret);
|
|
string init = dr["initials"].ToString().Trim();
|
|
string sequence = dr["CSequence"].ToString().PadRight(10);
|
|
string step = dr["CStep"].ToString();
|
|
int libDocid = 0;
|
|
|
|
DateTime dts = GetDTS(dr["Date"].ToString(), dr["Time"].ToString());
|
|
|
|
ConfigInfo ci = new ConfigInfo(null);
|
|
ci.AddItem("Section", "OldType", stype);
|
|
|
|
|
|
// for steps sections...
|
|
// Step Section Header Format:
|
|
// A0 1X2S51 &Y
|
|
// ^^^^^^^^^^^^
|
|
// |||||||||||||
|
|
// ||||||||||||`- 'Y','N', or blank signals to print section header - lib/section/addsec.c
|
|
// |||||||||||`-- (bits) Auto Indent, Editable Data, Checkoff Header Type - lib/section/addsec.c
|
|
// ||||||||||`--- blank
|
|
// ||||||||`----- Link With Enhanced Document ' '-Default(not determined) 0-NO 1-YES
|
|
// |||||||`------ MetaSection - number of subsections is given
|
|
// ||||||`------- S-Separate(PageBreak); T-Continuous; ' '-Default
|
|
// |||||`-------- Column mode (1,2,3,' '-default)
|
|
// ||||`--------- X -only proc section; x -orig. proc; ' ' -other
|
|
// |||`---------- Position within the procedure
|
|
// ||`----------- ALWAYS leave blank
|
|
// |`------------ Step Section Header marker
|
|
// `------------- Internal section number (starts at A)
|
|
|
|
if (step.Substring(1, 1) == "0")
|
|
{
|
|
// if this section has the original edit section flag (sequence[2]) save the id.
|
|
|
|
// set pagination, continuous, separate. If blank, don't create attribute - uses format default.
|
|
if (sequence.Substring(2, 1) != " ")
|
|
{
|
|
ci.AddItem("Section", "OriginalSteps", "Y");
|
|
}
|
|
if (sequence.Substring(4, 1) == "T")
|
|
{
|
|
ci.AddItem("Section", "Pagination", "C");
|
|
}
|
|
else if (sequence.Substring(4, 1) == "S")
|
|
{
|
|
ci.AddItem("Section", "Pagination", "S");
|
|
}
|
|
|
|
// Step: linked to enhanced (!exist = N)
|
|
if (sequence.Substring(7, 1) == "1")
|
|
{
|
|
ci.AddItem("Step", "LnkEnh", "Y");
|
|
}
|
|
char cbittst = sequence.PadRight(10)[8];
|
|
if (cbittst == ' ')
|
|
cbittst = '\0';
|
|
else
|
|
{
|
|
// determine if TOC element (!exist = N)
|
|
if ((cbittst & TOC) > 1)
|
|
{
|
|
ci.AddItem("Section", "TOC", "Y");
|
|
}
|
|
// determine if autogenerated section (!exist = N)
|
|
if ((cbittst & AUTOGEN) > 1)
|
|
{
|
|
isautogen = true;
|
|
ci.AddItem("Section", "AutoGen", "Y");
|
|
}
|
|
}
|
|
// Here are subsection flags, i.e. the following are only set if this
|
|
// is a subsection.
|
|
bool didsub = false;
|
|
if (isSubSection)
|
|
{
|
|
// Subsection: editable (!exist = Y)
|
|
if ((cbittst & EDDATA) > 0)
|
|
{
|
|
ci.AddItem("SubSection", "Edit", "N");
|
|
}
|
|
|
|
// Subsection: print section headers (!exist = Y)
|
|
if ((cbittst & PH) > 0)
|
|
{
|
|
didsub = true;
|
|
ci.AddItem("SubSection", "PH", "N");
|
|
}
|
|
|
|
// Subsection: autoindent (!exist = Y)
|
|
if ((cbittst & AUTOIND) > 0)
|
|
{
|
|
ci.AddItem("SubSection", "AutoIndent", "N");
|
|
}
|
|
}
|
|
if (!didsub && sequence.Substring(4, 1) == "N")
|
|
{
|
|
ci.AddItem("SubSection", "PH", "N");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Accessory Section Format:
|
|
// AI 1 2
|
|
// ^^ ^ ^
|
|
// || | |
|
|
// || | `- # of pages (ASCII value minus 48)
|
|
// || `--- Position within the procedure
|
|
// |`----- Acc. page type (A,I, or F)
|
|
// `------ Internal section number (starts at A)
|
|
ci.AddItem("Section", "NumPages", sequence.Substring(3, 1));
|
|
|
|
// see if it's a libdoc too
|
|
string thekey = procnum.PadRight(20) + step.Substring(0, 1).PadRight(10);
|
|
if (dicLibDocRef.ContainsKey(thekey))
|
|
{
|
|
// if it is a library document, see if the section record has already been
|
|
// saved. If it has, just use this section id, otherwise, create the
|
|
// section record with info from the library document file.
|
|
libDocid = dicLibDocRef[thekey];
|
|
}
|
|
}
|
|
Item secitem = AddSection(procitem, num, title, stype, dts, init, ci, step + sequence, fmt, libDocid, pth, FromItem, sectFormat);
|
|
if (secitem == null)
|
|
throw (new Exception("Null parameter in AddSection"));
|
|
thesectid = secitem.ItemID;
|
|
|
|
// if the editsectid hasn't been set yet, set it to this section id, i.e. the first
|
|
// one processed. Then if this section has the original edit section flag (sequence[2])
|
|
// save the id. The first step is necessary in case there is no original edit section
|
|
// flag set, so that the first section is the default one to get opened in edit.
|
|
if (EditSectId==0)EditSectId = thesectid;
|
|
if (libDocid<1 && step[1] == '0' && (sequence[2] == 'x' || sequence[2] == 'X'))
|
|
EditSectId = thesectid;
|
|
// ContentType (2 in the following call) are:
|
|
// 0 = structure,
|
|
// 1 = procedure,
|
|
// 2 = section,
|
|
// 3 = step
|
|
// 4 = branch
|
|
|
|
// fromtype values are (see steps.cs too)
|
|
// 1 = procedure,
|
|
// 2 = section,
|
|
// 3 = caution
|
|
// 4 = note
|
|
// 5 = RNO
|
|
// 6 = step
|
|
// 7 = table
|
|
|
|
if (!isautogen)
|
|
{
|
|
// Process the Data Table - First look for High Level Steps
|
|
string sQry = string.Format("Step like '[{0}]%' and Sequence='S'", dr["Step"].ToString().Substring(0, 1));
|
|
DataView dv = new DataView(dt, sQry, "StepNo", DataViewRowState.CurrentRows);
|
|
Item FrItem = null;
|
|
frmMain.pbStepMaximum = dt.Rows.Count;
|
|
frmMain.pbStepValue = 0;
|
|
foreach (DataRowView drv in dv)
|
|
{
|
|
FrItem = MigrateStep(cn, dt, drv, FrItem, conv_caret, pth, docver,sectFormat);
|
|
if (secitem.MyContent.ContentParts.Count == 0)
|
|
{
|
|
// type 6 is step
|
|
secitem.MyContent.ContentParts.Add(6, FrItem);
|
|
if (!secitem.MyContent.IsSavable) ErrorRpt.ErrorReport(secitem.MyContent);
|
|
secitem.MyContent.Save();
|
|
}
|
|
}
|
|
}
|
|
return secitem;
|
|
}
|
|
private void LoadSection(DataSet ds, OleDbDataAdapter da, string FileName)
|
|
{
|
|
try
|
|
{
|
|
da.Fill(ds, "Sections");
|
|
DataTable dt = ds.Tables["Sections"];
|
|
dt.CaseSensitive = true;
|
|
dt.Columns.Add("CStep", System.Type.GetType("System.String"));
|
|
dt.Columns.Add("CSequence", System.Type.GetType("System.String"));
|
|
// set the cstep & csequence - couldn't do it in the add because it needed a sql function
|
|
foreach (DataRow drw in ds.Tables["Sections"].Rows)
|
|
{
|
|
drw["CStep"] = TextConvert.ConvertSeq(drw["Step"].ToString());
|
|
drw["CSequence"] = TextConvert.ConvertSeq(drw["Sequence"].ToString());
|
|
}
|
|
dt.Columns.Add("StepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CStep,2,1),'System.Char'),'System.Int32')-48");
|
|
dt.Columns.Add("Level", System.Type.GetType("System.Int32"), "Len(CSequence)");
|
|
dt.Columns.Add("SubStepNo", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,Len(CSequence),1),'System.Char'),'System.Int32')-48");
|
|
dt.Columns.Add("locb", System.Type.GetType("System.Int32"), "Convert(Convert(Substring(CSequence,2,1),'System.Char'),'System.Int32')-48");
|
|
}
|
|
|
|
catch (Exception ex)
|
|
{
|
|
FileInfo fi;
|
|
switch (ex.Message)
|
|
{
|
|
case "Index file not found.":// then delete inf file
|
|
fi = new FileInfo(frmMain.tbSourceText + "\\" + FileName + ".inf");
|
|
fi.Delete();
|
|
LoadSection(ds, da, FileName);// Try Again
|
|
break;
|
|
case "External table is not in the expected format.": // then pad dbt file with 128 zeros.
|
|
fi = new FileInfo(frmMain.tbSourceText + "\\" + FileName + ".dbt");
|
|
FileStream fs = fi.OpenWrite();
|
|
fs.Position = fs.Length;
|
|
byte[] buf = new byte[128];
|
|
for (int i = 0; i < 128; i++) buf[i] = 0;
|
|
fs.Write(buf, 0, 128);
|
|
fs.Close();
|
|
LoadSection(ds, da, FileName);// Try Again
|
|
break;
|
|
default: // Unrecognized error
|
|
frmMain.AddError(ex, "Unrecognized error in LoadSection {0}", FileName);
|
|
Console.WriteLine("Unrecognized error: error = {0}", ex.Message);
|
|
log.ErrorFormat("File - {0}.DBF\r\n\r\n{1}\r\n\r\n{2}", FileName, ex.Message, ex.InnerException);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |