1536 lines
		
	
	
		
			43 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			1536 lines
		
	
	
		
			43 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: ConvertParadoxROs.cs $     $Revision: 16 $
 | 
						|
 * $Author: Jsj $   $Date: 8/02/04 11:02a $
 | 
						|
 *
 | 
						|
 * $History: ConvertParadoxROs.cs $
 | 
						|
 * 
 | 
						|
 * *****************  Version 16  *****************
 | 
						|
 * User: Jsj          Date: 8/02/04    Time: 11:02a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * Bug fix B2004-028  added check of local defined fields when checking if
 | 
						|
 * the field we are converting is a combo field.
 | 
						|
 * 
 | 
						|
 * *****************  Version 15  *****************
 | 
						|
 * User: Kathy        Date: 10/15/03   Time: 10:29a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * Found/fix during debugging of B2003-060 (will go through QA process
 | 
						|
 * with that bug fix)
 | 
						|
 * 
 | 
						|
 * *****************  Version 14  *****************
 | 
						|
 * User: Kathy        Date: 3/13/03    Time: 1:15p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * master different than local field name, use local
 | 
						|
 * 
 | 
						|
 * *****************  Version 13  *****************
 | 
						|
 * User: Jsj          Date: 1/22/03    Time: 12:49p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * remove old paradox user and lock files before trying the convert.  Was
 | 
						|
 * not able to open the paradox master file.
 | 
						|
 * 
 | 
						|
 * *****************  Version 12  *****************
 | 
						|
 * User: Jsj          Date: 1/06/03    Time: 12:56p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * uses a special ROMASTER.MDB to convert data, will now remove temporary
 | 
						|
 * TXT files if the DEBUG switch is not passed in.
 | 
						|
 * 
 | 
						|
 * *****************  Version 11  *****************
 | 
						|
 * User: Jsj          Date: 12/19/02   Time: 9:17a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * now modifies the VEPROMS INI file if it has a [Graphics] section
 | 
						|
 * 
 | 
						|
 * *****************  Version 10  *****************
 | 
						|
 * User: Jsj          Date: 12/18/02   Time: 9:01a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * fix for IP2 and FNP data
 | 
						|
 * 
 | 
						|
 * *****************  Version 9  *****************
 | 
						|
 * User: Jsj          Date: 12/06/02   Time: 3:20p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * added Debug and new function to replace invalid characters in the field
 | 
						|
 * names
 | 
						|
 * 
 | 
						|
 * *****************  Version 8  *****************
 | 
						|
 * User: Jsj          Date: 12/04/02   Time: 11:01a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * added logic to handle Parameter Display Data data
 | 
						|
 * 
 | 
						|
 * *****************  Version 7  *****************
 | 
						|
 * User: Jsj          Date: 11/27/02   Time: 1:39p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * Handle - and / in field names
 | 
						|
 * 
 | 
						|
 * *****************  Version 6  *****************
 | 
						|
 * User: Jsj          Date: 10/15/02   Time: 11:39a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * added "a" to combo field names in non-master tables.
 | 
						|
 * 
 | 
						|
 * *****************  Version 5  *****************
 | 
						|
 * User: Jsj          Date: 10/04/02   Time: 2:02p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * added better user interface
 | 
						|
 * 
 | 
						|
 * *****************  Version 4  *****************
 | 
						|
 * User: Jsj          Date: 9/27/02    Time: 2:57p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * Fixed Graphic image information storage
 | 
						|
 * 
 | 
						|
 * *****************  Version 3  *****************
 | 
						|
 * User: Jsj          Date: 9/26/02    Time: 4:17p
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * There was a leading space in all of the field values - is now fixed.
 | 
						|
 * 
 | 
						|
 * *****************  Version 2  *****************
 | 
						|
 * User: Jsj          Date: 9/25/02    Time: 10:19a
 | 
						|
 * Updated in $/EXE/RefObj/ParadoxConversion
 | 
						|
 * added header
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
using System;
 | 
						|
using System.Collections;
 | 
						|
using System.IO;
 | 
						|
using System.Xml;
 | 
						|
using System.Windows.Forms; // Application.StartupPath
 | 
						|
using System.Diagnostics;
 | 
						|
using DBEncapsulation;
 | 
						|
using ROFields;
 | 
						|
 | 
						|
namespace ParadoxConversion
 | 
						|
{
 | 
						|
	/// <summary>
 | 
						|
	/// This class contains the functions needed to convert the old Paradox RO Database
 | 
						|
	/// to a newer type database.
 | 
						|
	/// </summary>
 | 
						|
	public class ConvertParadoxROs
 | 
						|
	{
 | 
						|
		System.Windows.Forms.Label StatusWin;
 | 
						|
		bool ProcessingMasterTable = false;
 | 
						|
		bool DoDebugFile = false;
 | 
						|
		BinaryReader BReader; // read text file as binary (for chars like hard spaces)
 | 
						|
		BinaryWriter BWrite; // for a debug file
 | 
						|
		String AppPath;
 | 
						|
		String ROConvertPath;
 | 
						|
		String ROPath;
 | 
						|
		String LineOfText;
 | 
						|
		String ROTableName, ROTblElmt;
 | 
						|
		String RecID, RecType, ParentRecID, AccPageID, DateTime, Info, GroupTitle;
 | 
						|
		int intRecType = 0;
 | 
						|
		int CurrentFieldType = 0;
 | 
						|
		int NumCRLFs = 0;
 | 
						|
		XmlTextWriter xmlTxtWriter = null;
 | 
						|
		RODBRecordInterface MyDbRec;
 | 
						|
		ROField NewDbField;
 | 
						|
		struct FieldInfo
 | 
						|
		{
 | 
						|
			public String fldRecID;		// Field Record ID
 | 
						|
			public String fldName;			// Field name
 | 
						|
			public String fldType;
 | 
						|
		};
 | 
						|
		ArrayList MasterFieldInfoList = new ArrayList();
 | 
						|
		ArrayList LocalFieldInfoList = new ArrayList();
 | 
						|
 | 
						|
		struct GroupTitles
 | 
						|
		{
 | 
						|
			public String GrpRecID;
 | 
						|
			public String GrpTitle;
 | 
						|
		}
 | 
						|
		ArrayList GroupTitlesList = new ArrayList();
 | 
						|
 | 
						|
		public void OpenTextFile(String FName)
 | 
						|
		{
 | 
						|
			BReader = new BinaryReader(File.Open(FName,System.IO.FileMode.Open,System.IO.FileAccess.ReadWrite));
 | 
						|
		}
 | 
						|
 | 
						|
		public void CloseTextFile()
 | 
						|
		{
 | 
						|
			BReader.Close();
 | 
						|
		}
 | 
						|
 | 
						|
		public String TxF_ReadLine()
 | 
						|
		{
 | 
						|
			bool success = true;
 | 
						|
			String TxFstr = "";
 | 
						|
			byte rdByte = 0;
 | 
						|
			if (BReader != null)
 | 
						|
			{
 | 
						|
				NumCRLFs = 0;
 | 
						|
				while (success)
 | 
						|
				{
 | 
						|
					try
 | 
						|
					{
 | 
						|
						rdByte = BReader.ReadByte();
 | 
						|
					}
 | 
						|
					catch (Exception e)
 | 
						|
					{
 | 
						|
						success = false;
 | 
						|
						TxFstr =  null;
 | 
						|
					}
 | 
						|
					if (rdByte == 0x0D) // carrage return (end of line)
 | 
						|
					{
 | 
						|
						NumCRLFs++;
 | 
						|
						rdByte = BReader.ReadByte(); // read the new line character
 | 
						|
						if (rdByte == 0x0D) // sometimes there's an extra carrage return
 | 
						|
						{
 | 
						|
							rdByte = BReader.ReadByte();
 | 
						|
							NumCRLFs++;
 | 
						|
						}
 | 
						|
						success = false; // to stop the loop
 | 
						|
					}
 | 
						|
					if (success)
 | 
						|
					{
 | 
						|
						TxFstr += Convert.ToString(Convert.ToChar(rdByte));
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return TxFstr;
 | 
						|
		}
 | 
						|
 | 
						|
/*** for debugging..... */
 | 
						|
		public void DEBUG_OpenFile(String FName)
 | 
						|
		{
 | 
						|
			if (DoDebugFile)
 | 
						|
				BWrite = new BinaryWriter(File.Open(FName,System.IO.FileMode.Create,System.IO.FileAccess.ReadWrite));
 | 
						|
		}
 | 
						|
 | 
						|
		public void DEBUG_CloseFile()
 | 
						|
		{
 | 
						|
			if (DoDebugFile)
 | 
						|
				BWrite.Close();
 | 
						|
		}
 | 
						|
 | 
						|
		public void DEBUG_Write(string str)
 | 
						|
		{
 | 
						|
			if (DoDebugFile)
 | 
						|
			{
 | 
						|
				DEBUG_WriteString(str);
 | 
						|
				DEBUG_WriteString("\n");
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public void DEBUG_WriteString(string str)
 | 
						|
		{
 | 
						|
			if (DoDebugFile)
 | 
						|
			{
 | 
						|
				int i;
 | 
						|
				for(i =0; i < str.Length; i++)
 | 
						|
				{
 | 
						|
					byte WrByte;
 | 
						|
					WrByte = (byte)str[i];
 | 
						|
					BWrite.Write(WrByte);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public void DEBUG_CheckFieldName(string fldname)
 | 
						|
		{
 | 
						|
			if (DoDebugFile)
 | 
						|
			{
 | 
						|
				char[] tmpstr = fldname.ToCharArray();
 | 
						|
				int len = fldname.Length;
 | 
						|
				int cnt = 0;
 | 
						|
				bool FirstOne = true;
 | 
						|
				string OKpunch = " -._"; // we're also going to ignore spaces
 | 
						|
				string outstr = "";
 | 
						|
				int decval;
 | 
						|
 | 
						|
				while (cnt < len)
 | 
						|
				{
 | 
						|
					char tmpchr = tmpstr[cnt];
 | 
						|
					if(!char.IsLetterOrDigit(tmpchr))
 | 
						|
					{
 | 
						|
						if (OKpunch.IndexOf(tmpchr) == -1) // not found
 | 
						|
						{
 | 
						|
							if (FirstOne)
 | 
						|
							{
 | 
						|
								FirstOne = false;
 | 
						|
								DEBUG_Write(fldname);
 | 
						|
							}
 | 
						|
							decval = tmpchr;
 | 
						|
							outstr = "   " + tmpchr.ToString() +"  [" + decval.ToString() + "]";;
 | 
						|
							DEBUG_Write(outstr);
 | 
						|
						}
 | 
						|
					}
 | 
						|
					cnt++;
 | 
						|
				}
 | 
						|
				if (!FirstOne)
 | 
						|
					DEBUG_Write("----------------\n");
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
/**  End - For Debugging **/
 | 
						|
 | 
						|
		public ConvertParadoxROs(System.Windows.Forms.Label statWin, bool DoingDebugFile)
 | 
						|
		{
 | 
						|
			// Assume we are currently in the RO directory to be converted
 | 
						|
 | 
						|
			// Was it already converted? (check for existance of a backup
 | 
						|
			//     created during the conversion process)
 | 
						|
			// Yes - return
 | 
						|
			// else  select the new database type
 | 
						|
 | 
						|
			StatusWin = statWin;
 | 
						|
			DoDebugFile = DoingDebugFile;
 | 
						|
 | 
						|
			ClearFieldStrings();
 | 
						|
		}
 | 
						|
 | 
						|
			/*
 | 
						|
			 * Initialize the fields to empty strings.
 | 
						|
			 */
 | 
						|
		public void ClearFieldStrings()
 | 
						|
		{
 | 
						|
			RecID = "";
 | 
						|
			RecType = "";
 | 
						|
			ParentRecID = "";
 | 
						|
			AccPageID = "";
 | 
						|
			DateTime = "";
 | 
						|
			Info = "";
 | 
						|
		}
 | 
						|
 | 
						|
		public void CreateNewRoDatabase()
 | 
						|
		{
 | 
						|
			// Prompt user to select the new databaes type (ex Access, SQL Server, etc)
 | 
						|
 | 
						|
			// For now, we will be creating just an Access database.
 | 
						|
			
 | 
						|
			/*
 | 
						|
			 * Copy our empty ROMaster.mdb file into the CONVERT directory (is the current
 | 
						|
			 * directory at this point)  This RomasterCvrt.mdb is located in the VE-PROMS.NET\BIN16
 | 
						|
			 * directory and is different than the ROMaster.mdb in VE-PROM.NET\BIN.  The one in the BIN16
 | 
						|
			 * directory does not have any tables, while the one in the BIN directory has an
 | 
						|
			 * ROMASTER table with the default records needed to create RO tables.
 | 
						|
			 */
 | 
						|
			String toPath = ROConvertPath + "\\ROMaster.mdb";
 | 
						|
			String fromPath = AppPath + "16\\RomasterCvrt.mdb";
 | 
						|
			File.Copy(fromPath,toPath,true); // overwrite the file if already there
 | 
						|
 | 
						|
			// Create an empty database.
 | 
						|
			MyDbRec = new RODBRecordInterface(1,ROConvertPath);
 | 
						|
			
 | 
						|
			// Open the database connection
 | 
						|
			MyDbRec.RODB_OpenConnection();
 | 
						|
		}
 | 
						|
 | 
						|
		public void CloseNewRoDatabase()
 | 
						|
		{
 | 
						|
			MyDbRec.RODB_CloseConnection();
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * Create a ORIG_RO directory and move everything(except for the CONVERT directory)
 | 
						|
		 * in RO into it.  Then move everying in CONVERT into RO.
 | 
						|
		 */
 | 
						|
		public void MoveOldROData()
 | 
						|
		{
 | 
						|
			Directory.SetCurrentDirectory("..\\");
 | 
						|
			Directory.Move("RO","ORIG_RO");
 | 
						|
			Directory.Move("CONVERT","RO");
 | 
						|
			
 | 
						|
		}
 | 
						|
 | 
						|
		/* This function will create TXT files from the Paradox database (PX2TXT.EXE) then parse
 | 
						|
		 * them and place the RO information in the new database.
 | 
						|
		 * 
 | 
						|
		 * Note that the Microsoft Paradox driver could not read our Paradox BLOB fields.
 | 
						|
		 * We had to write a program in the old Borland 16-bit environment that would basically
 | 
						|
		 * dump the RO information into a file that the Microsoft drivers could read.  We decided
 | 
						|
		 * to keep things simple and just dump the RO information into text files.
 | 
						|
		 * 
 | 
						|
		 * Each line in the text file represents a database record.  Each "field" is separated by
 | 
						|
		 * a space.  Each "record" has the following fields:
 | 
						|
		 * 
 | 
						|
		 *	RECORD ID
 | 
						|
		 *	RECORD TYPE
 | 
						|
		 *	PARENT ID
 | 
						|
		 *	ACCPAGE ID
 | 
						|
		 *	DATETIME
 | 
						|
		 *	The Paradox BLOB data
 | 
						|
		 */
 | 
						|
 | 
						|
		public void TestMessage()
 | 
						|
		{
 | 
						|
			StatusWin.Text = "This is a TEST!";
 | 
						|
			StatusWin.Refresh();
 | 
						|
		}
 | 
						|
 | 
						|
		private void StatusMessage(String Mess1)
 | 
						|
		{
 | 
						|
			StatusWin.Text = Mess1;
 | 
						|
			StatusWin.Refresh();
 | 
						|
		}
 | 
						|
 | 
						|
		private void StatusMessage(String Mess1, String Mess2)
 | 
						|
		{
 | 
						|
			StatusWin.Text = Mess1 + Mess2;
 | 
						|
			StatusWin.Refresh();
 | 
						|
		}
 | 
						|
 | 
						|
		private void StatusMessage(String Mess1, String Mess2, String Mess3)
 | 
						|
		{
 | 
						|
			StatusWin.Text = Mess1 + Mess2 + Mess3;
 | 
						|
			StatusWin.Refresh();
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		public void ConvertParadoxRODb(string PassedInROPath)
 | 
						|
		{
 | 
						|
			// Set the current working directory to my sample RO directory
 | 
						|
//			Directory.SetCurrentDirectory("G:\\PROMSDAT\\VEWPB\\RO");
 | 
						|
//			ROPath = "G:\\PROMSDAT\\VEBRAID\\RO";
 | 
						|
//			Directory.SetCurrentDirectory(ROPath);
 | 
						|
 | 
						|
			ROPath = PassedInROPath;
 | 
						|
 | 
						|
			ROConvertPath = ROPath.Substring(0,ROPath.LastIndexOf("\\"));
 | 
						|
			ROConvertPath += "\\CONVERT";
 | 
						|
 | 
						|
			// Create text files from the Paradox RO Database
 | 
						|
			StatusMessage("Paradox to Text Files");
 | 
						|
 | 
						|
			// Get the path of where this executable resides
 | 
						|
			AppPath = Application.StartupPath;
 | 
						|
			// append "16\\px2txt.exe" to the path of the VE-PROMS.NET\BIN path
 | 
						|
			// to get the resulting path: VE-PROMS.NET\BIN16\px2txt.exe
 | 
						|
			String ToTxtAppPath = AppPath + "16\\px2txt.exe";
 | 
						|
 | 
						|
			/* 
 | 
						|
			 * Before we run the PX2TXT.EXE program, delete any Paradox lock files that might
 | 
						|
			 * be hanging around.
 | 
						|
			 */
 | 
						|
			File.Delete("Pdoxusrs.net");
 | 
						|
			File.Delete("Pdoxusrs.lck");
 | 
						|
			File.Delete("paradox.lck");
 | 
						|
 | 
						|
			// create a process & wait until it exits.
 | 
						|
			Process myProcess = new Process();
 | 
						|
			myProcess.StartInfo.FileName = ToTxtAppPath;			
 | 
						|
			myProcess.Start();
 | 
						|
			myProcess.WaitForExit();
 | 
						|
 | 
						|
			/*
 | 
						|
			 * Now change directory to the CONVERT sub-directory that was created
 | 
						|
			 * from PX2TXT.EXE
 | 
						|
			 * 
 | 
						|
			 * This directory should have the TXT files containing the RO data and
 | 
						|
			 * the graphic files (Intergrated Graphics) used in the current RO database.
 | 
						|
			 * Note that some of the graphic files might be converted to a different
 | 
						|
			 * graphics format than what is used in the old RO Editor.
 | 
						|
			 */
 | 
						|
			Directory.SetCurrentDirectory(ROConvertPath);
 | 
						|
			
 | 
						|
			/* The PX2TXT.EXE program also creates a file called PXCONLST.TXT which
 | 
						|
			 * contains a list of the TXT files that it created. 
 | 
						|
			 * 
 | 
						|
			 * Read the PXCONLST.TXT file.  This contains the list of TXT files
 | 
						|
			 * that were generated as the first step to the conversion.
 | 
						|
			 * Place these in a array list for processing.
 | 
						|
			 * Assume that we are in the RO directory that is being converted
 | 
						|
			 */
 | 
						|
 | 
						|
			string FileName = "Pxconlst.txt";
 | 
						|
			int numDbs = 0;
 | 
						|
			ArrayList DbList = new ArrayList();
 | 
						|
			ArrayList DbTitleList = new ArrayList();
 | 
						|
			if (!File.Exists(FileName))
 | 
						|
			{
 | 
						|
				// Conversion from Paradox to a text file failed.
 | 
						|
				// **** provide error message ****
 | 
						|
				StatusMessage("Conversion from Paradox to a text file failed.");
 | 
						|
				return;
 | 
						|
			}
 | 
						|
 | 
						|
			OpenTextFile(FileName);
 | 
						|
			String FileNameTitle; // the title of the ROxxxxxx file
 | 
						|
			String TextFileName;
 | 
						|
			while ((FileNameTitle = TxF_ReadLine())!=null) 
 | 
						|
			{
 | 
						|
				DbTitleList.Add(FileNameTitle);
 | 
						|
				TextFileName = TxF_ReadLine();
 | 
						|
				DbList.Add(TextFileName);
 | 
						|
				numDbs++;
 | 
						|
			}
 | 
						|
			CloseTextFile();
 | 
						|
 | 
						|
			// delete the Pxconlst.txt file if we are NOT debugging
 | 
						|
			if (!DoDebugFile)
 | 
						|
				File.Delete(FileName);
 | 
						|
 | 
						|
			// Create a new (empty) database
 | 
						|
			CreateNewRoDatabase();
 | 
						|
 | 
						|
			// DEBUG - write the field names that have problem characters
 | 
						|
			DEBUG_OpenFile("DebugFieldNames");
 | 
						|
 | 
						|
			// For each file listed in PXCONLST.TXT
 | 
						|
			//    Open the file
 | 
						|
			//    read each line
 | 
						|
			//    (each line represents a record from the old Paradox database)
 | 
						|
			//    translate each line into a database record
 | 
						|
 | 
						|
			System.Collections.IEnumerator myEnumerator = DbList.GetEnumerator();
 | 
						|
			System.Collections.IEnumerator myTitleEnumerator = DbTitleList.GetEnumerator();
 | 
						|
			while(myEnumerator.MoveNext()) 
 | 
						|
			{
 | 
						|
				myTitleEnumerator.MoveNext();
 | 
						|
				// Clear the GroupTitles Array
 | 
						|
				GroupTitlesList.Clear();
 | 
						|
				// Clear the LocalFieldInfoList Array
 | 
						|
				LocalFieldInfoList.Clear();
 | 
						|
 | 
						|
				TextFileName = myEnumerator.Current.ToString();
 | 
						|
				// Get the RO Table Name (ex. ROMASTER, RO000001)
 | 
						|
				ROTableName = myEnumerator.Current.ToString();
 | 
						|
				int slen = ROTableName.Length;
 | 
						|
				ROTableName = ROTableName.Remove(slen-4,4);
 | 
						|
				// Create the database table
 | 
						|
				MyDbRec.RODB_AddNewTable(ROTableName);
 | 
						|
 | 
						|
				if (StringsAreEqualU(ROTableName,"ROMASTER"))
 | 
						|
					ProcessingMasterTable = true;
 | 
						|
				else
 | 
						|
					ProcessingMasterTable = false;
 | 
						|
 | 
						|
				String tmpMess;
 | 
						|
 | 
						|
				tmpMess = "Processing " + myTitleEnumerator.Current.ToString();
 | 
						|
				StatusMessage(tmpMess);
 | 
						|
 | 
						|
				OpenTextFile(TextFileName); // Open the text file
 | 
						|
				DEBUG_Write("===================");
 | 
						|
				DEBUG_Write(tmpMess);
 | 
						|
				DEBUG_Write(TextFileName);
 | 
						|
 | 
						|
				int cnt = 0;
 | 
						|
				while ((LineOfText = TxF_ReadLine()) != null)
 | 
						|
				{
 | 
						|
					// Process the text line (each line is a record)
 | 
						|
					ClearFieldStrings();
 | 
						|
					cnt++;
 | 
						|
					StatusMessage(tmpMess,"\nRecord: ",Convert.ToString(cnt));
 | 
						|
					ProcessTextLine();
 | 
						|
				}
 | 
						|
				StatusMessage(" ");
 | 
						|
				CloseTextFile();
 | 
						|
 | 
						|
				// delete the ROxxxx.txt file if we are NOT debugging
 | 
						|
				if (!DoDebugFile)
 | 
						|
					File.Delete(TextFileName);
 | 
						|
 | 
						|
				// Close database table
 | 
						|
			}
 | 
						|
 | 
						|
			// DEBUG - Close Debug file
 | 
						|
			DEBUG_CloseFile();
 | 
						|
 | 
						|
			CloseNewRoDatabase();
 | 
						|
			MoveOldROData();
 | 
						|
		}
 | 
						|
 | 
						|
		/* This function makes a copy of the passed in string, then replaces
 | 
						|
		 * any blank character with an underbar ('_') character.
 | 
						|
		 * The copy is returned.
 | 
						|
		 */
 | 
						|
		String StrBlanksToUnderbars(String TheString)
 | 
						|
		{
 | 
						|
			String RtnStr = TheString;
 | 
						|
			RtnStr.Replace(" ", "_");
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function compares a String with a (char *) array and returns
 | 
						|
		 * true if they are equal, else it returns false
 | 
						|
		 */
 | 
						|
		bool StringsAreEqual(String thisStr, String thatStr)
 | 
						|
		{
 | 
						|
			bool StringsAreEqual = false;
 | 
						|
			StringsAreEqual = (thisStr.CompareTo(thatStr) == 0);
 | 
						|
			return StringsAreEqual;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function will first uppercase the strings then compare them
 | 
						|
		 * and returns true if they are equal, else it returns false
 | 
						|
		 */
 | 
						|
		bool StringsAreEqualU(String thisStr, String thatStr)
 | 
						|
		{
 | 
						|
			String ThisOne = thisStr;
 | 
						|
			String ThatOne = thatStr;
 | 
						|
 | 
						|
			ThisOne.ToUpper();
 | 
						|
			ThatOne.ToUpper();
 | 
						|
			bool StringsAreEqual = false;
 | 
						|
			StringsAreEqual = (ThisOne.CompareTo(ThatOne) == 0);
 | 
						|
			return StringsAreEqual;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function reads up to the next space character (or null)
 | 
						|
		 */
 | 
						|
		String GetFieldTxt()
 | 
						|
		{
 | 
						|
			String RtnStr = "0";
 | 
						|
			char[] space = new char[1]{' '};
 | 
						|
			int txtIdxEnd = LineOfText.IndexOfAny(space); // blank is the end of a the field
 | 
						|
			if (txtIdxEnd > 0)
 | 
						|
			{
 | 
						|
				RtnStr = LineOfText.Substring(0,txtIdxEnd);
 | 
						|
				LineOfText = LineOfText.Remove(0,txtIdxEnd+1); // remove this "field" from the string
 | 
						|
			}
 | 
						|
			else if (LineOfText.Length > 0) // last field in the string
 | 
						|
			{
 | 
						|
				RtnStr = LineOfText;
 | 
						|
				LineOfText = "";
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function converts the given string to an interger
 | 
						|
		 */
 | 
						|
		int GetFieldInt(String TmpStr)
 | 
						|
		{ 
 | 
						|
			int RtnInt;
 | 
						|
			RtnInt = Convert.ToInt32(TmpStr);
 | 
						|
			return RtnInt;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/* This function will first read the length of the string (number of characters to get)
 | 
						|
		 * Then get the string of that length.
 | 
						|
		 */
 | 
						|
		String GetStringByLength()
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			int len = (int)GetFieldInt(GetFieldTxt());
 | 
						|
			int LineTextLen = LineOfText.Length;
 | 
						|
			while (len > LineTextLen)
 | 
						|
			{
 | 
						|
				RtnStr += LineOfText + "\r\n"; // need both a '\r' and a '\n'
 | 
						|
				/* NumCRLFs accounts for the number of "\r\n"s that was originally counted when the text
 | 
						|
				 * file was created.
 | 
						|
				 */
 | 
						|
				len -= (LineTextLen + NumCRLFs);
 | 
						|
				LineOfText = TxF_ReadLine();
 | 
						|
				if (len == 0)
 | 
						|
				// end of string had \r\n still may need to remove a blank at the beginning of the string buffer
 | 
						|
				{
 | 
						|
					if (LineOfText.StartsWith(" "))
 | 
						|
						LineOfText = LineOfText.Remove(0,1);
 | 
						|
				}
 | 
						|
				LineTextLen = LineOfText.Length;
 | 
						|
			}
 | 
						|
			if (len > 0)
 | 
						|
			{
 | 
						|
				RtnStr += LineOfText.Substring(0,len);
 | 
						|
				LineOfText = LineOfText.Remove(0,len+1); // add one to remove following space
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function builds the field definition string
 | 
						|
		 */
 | 
						|
		String GetFieldDefinition()
 | 
						|
		{
 | 
						|
			String tmpStr;
 | 
						|
			String RtnStr = "";
 | 
						|
			String FieldTypeStr = "";
 | 
						|
			int FieldType = 0;
 | 
						|
			String FieldLength = "";
 | 
						|
			String FieldName = "";
 | 
						|
 | 
						|
			FieldName = GetStringByLength(); // get the field name
 | 
						|
			FieldName = FixFieldName(FieldName);
 | 
						|
			NewDbField.SetFieldname(FieldName);
 | 
						|
 | 
						|
			// get the field type
 | 
						|
			FieldTypeStr = GetFieldTxt();
 | 
						|
			FieldType = GetFieldInt(FieldTypeStr);
 | 
						|
 | 
						|
			// Save the name and rec id and type in an array
 | 
						|
			FieldInfo TheFieldInfo = new FieldInfo();
 | 
						|
			TheFieldInfo.fldName = FieldName;
 | 
						|
			TheFieldInfo.fldRecID = RecID;
 | 
						|
			TheFieldInfo.fldType = FieldTypeStr;
 | 
						|
			if (ProcessingMasterTable)
 | 
						|
			{
 | 
						|
				MasterFieldInfoList.Add(TheFieldInfo);
 | 
						|
			}
 | 
						|
			else // is a local definition
 | 
						|
			{
 | 
						|
				LocalFieldInfoList.Add(TheFieldInfo);
 | 
						|
			}
 | 
						|
			
 | 
						|
			NewDbField.SetFieldType((uint)FieldType);
 | 
						|
 | 
						|
			switch (FieldType)
 | 
						|
			{
 | 
						|
				case 1:		// Fixed Length Text
 | 
						|
				case 2:		// Variable Length Text
 | 
						|
				case 8:		// X/Y Plot
 | 
						|
				case 0x10:	// Table
 | 
						|
					// Get the field length
 | 
						|
					FieldLength = GetFieldTxt();
 | 
						|
					// append/save the Field Name and Field Length to RtnStr
 | 
						|
					RtnStr += NewDbField.MakeSchemaString(FieldName,FieldLength,"");
 | 
						|
					break;
 | 
						|
 | 
						|
				case 4:		// Formatted Text
 | 
						|
					String Pattern;
 | 
						|
					// Get the field length
 | 
						|
					FieldLength = GetFieldTxt();
 | 
						|
					// Get the pattern
 | 
						|
					Pattern = GetStringByLength();
 | 
						|
					// append/save the Field Name, Length, and Pattern to RtnStr
 | 
						|
					RtnStr += NewDbField.MakeSchemaString(FieldName,FieldLength,Pattern);
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x20:	// Image (Intergrated Graphics)
 | 
						|
					// append/save only the type to RtnStr
 | 
						|
					RtnStr = NewDbField.MakeImageSchemaString(FieldName);
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x40:	// Multi Field (used by Parameter Display Data)
 | 
						|
					RtnStr += FieldName + " " + FieldTypeStr;
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					// Create a list of RecIDs separated by a blank
 | 
						|
					while (!StringsAreEqual(tmpStr,"0")) // while not "0"
 | 
						|
					{
 | 
						|
						// append/save the RefRecID to Rtn Str
 | 
						|
						RtnStr += " " + tmpStr;
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
					}
 | 
						|
					if (intRecType == 2)
 | 
						|
					{
 | 
						|
						RecType = "4";
 | 
						|
						intRecType = 4;
 | 
						|
					}
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x100:	// Generic Field (reference to a field definition)
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					string tmp1 = GetSavedMasterFieldNameAndType(tmpStr).Substring(0,4);
 | 
						|
					if (tmp1.Equals("128 "))
 | 
						|
						RtnStr = tmpStr + " " + tmp1 + FieldName + "a";
 | 
						|
					else
 | 
						|
						RtnStr = tmpStr + " " + tmp1 + FieldName;
 | 
						|
//					RtnStr = tmpStr + " " + (GetSavedMasterFieldNameAndType(tmpStr));
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x80:	// Combo Field
 | 
						|
					String SingleLineWidth = "";
 | 
						|
					String MultiLineWidth = "";
 | 
						|
					String TableWidth = "";
 | 
						|
					String XYPlotWidth = "";
 | 
						|
					bool Single = false, Multi = false, Tbl = false, XYPlt = false;
 | 
						|
					int fldtyp;
 | 
						|
						
 | 
						|
					do
 | 
						|
					{
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
						fldtyp = GetFieldInt(tmpStr);
 | 
						|
						switch (fldtyp)
 | 
						|
						{
 | 
						|
							case 1: // single line text
 | 
						|
								SingleLineWidth = GetFieldTxt();
 | 
						|
								Single = true;
 | 
						|
								break;
 | 
						|
								
 | 
						|
							case 2: // multi line text
 | 
						|
								MultiLineWidth = GetFieldTxt();
 | 
						|
								Multi = true;
 | 
						|
								break;
 | 
						|
 | 
						|
							case 8: // X/Y Plot
 | 
						|
								XYPlotWidth = GetFieldTxt();
 | 
						|
								XYPlt = true;
 | 
						|
								break;
 | 
						|
 | 
						|
							case 16: // Table
 | 
						|
								TableWidth = GetFieldTxt();
 | 
						|
								Tbl = true;
 | 
						|
								break;
 | 
						|
 | 
						|
							default:
 | 
						|
								break;
 | 
						|
						} // end switch
 | 
						|
					} while (!StringsAreEqual(tmpStr,"0"));
 | 
						|
					// append/save the Field Type to RtnStr
 | 
						|
					RtnStr = NewDbField.MakeComboSchemaString(FieldName,Single,SingleLineWidth,Multi,MultiLineWidth,Tbl,TableWidth,XYPlt,XYPlotWidth);
 | 
						|
					break;
 | 
						|
 | 
						|
				default: // nothing to do
 | 
						|
					break;
 | 
						|
 | 
						|
			} // end switch
 | 
						|
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		String GetValueDefinition()
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			String tmpStr = "";
 | 
						|
			String tmpStr2 = "";
 | 
						|
			String tmpStr3 = "";
 | 
						|
			String RecIDRef = "";
 | 
						|
			String MenuText = "";
 | 
						|
			String ValueDefTypeStr = "";
 | 
						|
			int ValueDefType = 0;
 | 
						|
			int NumItems;
 | 
						|
			do
 | 
						|
			{
 | 
						|
				ValueDefTypeStr = GetFieldTxt();
 | 
						|
				ValueDefType = GetFieldInt(ValueDefTypeStr);
 | 
						|
 | 
						|
				switch (ValueDefType)
 | 
						|
				{
 | 
						|
					case 1:	// Record ID referencing a field record
 | 
						|
						RecIDRef = GetFieldTxt();
 | 
						|
						tmpStr = GetSavedLocalFieldName(RecIDRef);
 | 
						|
						// append/save ValueDefType and RecIDRef to RtnStr
 | 
						|
						RtnStr += "<" + tmpStr + ">";
 | 
						|
						break;
 | 
						|
 | 
						|
					case 2:	// Text value
 | 
						|
						tmpStr = GetStringByLength();
 | 
						|
						tmpStr = FixString(tmpStr);
 | 
						|
						// append/save ValueDefType and TxtStr to Rtn Str
 | 
						|
						RtnStr += tmpStr;
 | 
						|
						break;
 | 
						|
 | 
						|
					case 3:	// Decimal allignment field
 | 
						|
						// append/save  RecIDRef, OffSetVal, and Width to RtnStr
 | 
						|
						RecIDRef = GetFieldTxt();
 | 
						|
						tmpStr = GetSavedLocalFieldName(RecIDRef);
 | 
						|
						// append/save ValueDefType and RecIDRef to RtnStr
 | 
						|
						RtnStr += "<" + tmpStr;
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
						//int OffSetVal = GetFieldInt(tmpStr);
 | 
						|
						RtnStr += ","+tmpStr;
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
						//int Width = GetFieldInt(tmpStr);
 | 
						|
						RtnStr += ","+tmpStr+">";
 | 
						|
						break;
 | 
						|
					
 | 
						|
					case 4:	// Menu value definition
 | 
						|
						MenuText = "";
 | 
						|
						// number of menu items
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
						NumItems = GetFieldInt(tmpStr);
 | 
						|
						tmpStr2 = "";
 | 
						|
						while (NumItems > 0)
 | 
						|
						{
 | 
						|
							// menu text string (maybe)
 | 
						|
							tmpStr = GetFieldTxt();
 | 
						|
							if (!StringsAreEqual(tmpStr,"0")) // do we have MenuText?
 | 
						|
							{
 | 
						|
								MenuText = GetStringByLength();
 | 
						|
								MenuText = FixString(MenuText);
 | 
						|
							}
 | 
						|
 | 
						|
							// append/save ValueDefType, NumItems, tmpStr, and MenuText to RtnStr
 | 
						|
 | 
						|
							// Get list of other ValueDefTypes
 | 
						|
							tmpStr = GetValueDefinition(); // call itself
 | 
						|
							// append/save tmpStr to RtnStr
 | 
						|
							tmpStr2 += "{" + MenuText + "=" + tmpStr + "}";
 | 
						|
							NumItems--;
 | 
						|
						}
 | 
						|
						RtnStr += tmpStr2;
 | 
						|
						break;
 | 
						|
 | 
						|
					case 5:	// Conditional value definition
 | 
						|
						MenuText = "";
 | 
						|
						// number of menu items
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
						NumItems = GetFieldInt(tmpStr);
 | 
						|
						tmpStr3 = "";
 | 
						|
						tmpStr2 = "";
 | 
						|
						while (NumItems > 0)
 | 
						|
						{
 | 
						|
							// menu text string (maybe)
 | 
						|
							tmpStr = GetFieldTxt();
 | 
						|
							if (!StringsAreEqual(tmpStr,"0")) // do we have MenuText?
 | 
						|
							{
 | 
						|
								MenuText = GetStringByLength();
 | 
						|
								MenuText = FixString(MenuText);
 | 
						|
							}
 | 
						|
							// append/save ValueDefType, NumItems, tmpStr, and MenuText to RtnStr
 | 
						|
 | 
						|
							// Get list of other ValueDefTypes
 | 
						|
							tmpStr = GetValueDefinition(); // call itself
 | 
						|
							// append/save tmpStr to RtnStr
 | 
						|
							tmpStr2 += "{" + MenuText + "=" + tmpStr + "}";
 | 
						|
							NumItems--;
 | 
						|
						}
 | 
						|
 | 
						|
						// Conditional text???
 | 
						|
						tmpStr = GetStringByLength();
 | 
						|
						// append/save tmpStr to RtnStr
 | 
						|
						tmpStr = FixString(tmpStr);
 | 
						|
						
 | 
						|
						tmpStr3 = "{" + tmpStr + tmpStr2 + "}";
 | 
						|
						RtnStr += tmpStr3;
 | 
						|
						break;
 | 
						|
 | 
						|
 | 
						|
					case 6:	// VARUSE
 | 
						|
						tmpStr = GetStringByLength();
 | 
						|
						tmpStr = FixString(tmpStr);
 | 
						|
						// append/save ValueDefType and TxtStr to RtnStr
 | 
						|
						RtnStr += "{" + tmpStr + "}";
 | 
						|
						break;
 | 
						|
 | 
						|
					case 7:	// VARDEFINE
 | 
						|
						tmpStr2 = GetStringByLength();
 | 
						|
						tmpStr2 = FixString(tmpStr2);
 | 
						|
						tmpStr = GetValueDefinition(); // call itself
 | 
						|
						// append/save ValueDefType, TxtStr, and tmpStr to RtnStr
 | 
						|
						RtnStr += "{" + tmpStr2 + "=" + tmpStr + "}";
 | 
						|
						break;
 | 
						|
 | 
						|
					default: // nothing to do
 | 
						|
						break;
 | 
						|
 | 
						|
				} // end switch
 | 
						|
			} while (ValueDefType != 0);
 | 
						|
 | 
						|
			/*
 | 
						|
			 * Need to replace '<' with '<' and '>' with '>'
 | 
						|
			 */
 | 
						|
			RtnStr = ReplaceGreaterLessSigns(RtnStr);
 | 
						|
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function returns a string containing a value to an RO field.
 | 
						|
		 */
 | 
						|
		String GetFieldValue()
 | 
						|
		{
 | 
						|
			String RtnStr;
 | 
						|
			String tmpStr;
 | 
						|
			String ValueTypeStr;
 | 
						|
			int ValueType = 0;
 | 
						|
 | 
						|
			ValueTypeStr = GetFieldTxt();
 | 
						|
			ValueType = GetFieldInt(ValueTypeStr);
 | 
						|
 | 
						|
			CurrentFieldType = ValueType;
 | 
						|
 | 
						|
			RtnStr = "";
 | 
						|
 | 
						|
			switch (ValueType)
 | 
						|
			{
 | 
						|
				case 1:	// Text String
 | 
						|
				case 2: // variable text string
 | 
						|
					tmpStr = GetStringByLength();
 | 
						|
					tmpStr = FixString(tmpStr);
 | 
						|
					RtnStr += tmpStr;
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x20: // Image File (Intergrated Graphics)
 | 
						|
					tmpStr = GetStringByLength(); // image file name
 | 
						|
					tmpStr = FixString(tmpStr);
 | 
						|
					String DateTimeStr = GetFieldTxt();
 | 
						|
					String ImgHeight = GetFieldTxt();
 | 
						|
					String ImgWidth = GetFieldTxt();
 | 
						|
					RtnStr += "\r\n<Image_Filename>" + DateTimeStr + " " + tmpStr + "</Image_Filename>\r\n";
 | 
						|
					RtnStr += "<Image_Height>" + ImgHeight + "</Image_Height>\r\n";
 | 
						|
					RtnStr += "<Image_Width>" + ImgWidth + "</Image_Width>\r\n";
 | 
						|
					break;
 | 
						|
 | 
						|
				case 0x40: // Parameter Display Data
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						tmpStr = GetFieldTxt(); // get the RecID of the field
 | 
						|
						while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
						{
 | 
						|
							string FieldName = GetSavedLocalFieldName(tmpStr);
 | 
						|
							RtnStr += "<" + FieldName+ ">";
 | 
						|
							RtnStr += GetFieldValue();
 | 
						|
							RtnStr += "</" + FieldName + ">\r\n";
 | 
						|
							tmpStr = GetFieldTxt(); // next
 | 
						|
						}
 | 
						|
						tmpStr = GetFieldTxt(); // next
 | 
						|
					}
 | 
						|
					break;
 | 
						|
 | 
						|
				default:
 | 
						|
					// should never get into here....
 | 
						|
					tmpStr = GetStringByLength();
 | 
						|
					tmpStr = FixString(tmpStr);
 | 
						|
					RtnStr += tmpStr;
 | 
						|
					break;
 | 
						|
			} // end switch
 | 
						|
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		// Search the local list for the given Record ID
 | 
						|
		// Return the field name
 | 
						|
		String GetSavedLocalFieldName(String RecordID)
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			FieldInfo TmpInfo;
 | 
						|
			System.Collections.IEnumerator FldLstEnumerator = LocalFieldInfoList.GetEnumerator();
 | 
						|
			while (FldLstEnumerator.MoveNext() && StringsAreEqual(RtnStr,""))
 | 
						|
			{
 | 
						|
				TmpInfo = (FieldInfo)FldLstEnumerator.Current;
 | 
						|
				if (StringsAreEqual(TmpInfo.fldRecID,RecordID))
 | 
						|
						RtnStr = TmpInfo.fldName;
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		// Search the master field list for a the given Record ID
 | 
						|
		// Return the field name and type if found
 | 
						|
		String GetSavedMasterFieldNameAndType(String RecordID)
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			FieldInfo TmpInfo;
 | 
						|
			System.Collections.IEnumerator FldLstEnumerator = MasterFieldInfoList.GetEnumerator();
 | 
						|
			while (FldLstEnumerator.MoveNext() && StringsAreEqual(RtnStr,""))
 | 
						|
			{
 | 
						|
				TmpInfo = (FieldInfo)FldLstEnumerator.Current;
 | 
						|
				if (StringsAreEqual(TmpInfo.fldRecID,RecordID))
 | 
						|
				{
 | 
						|
					RtnStr = TmpInfo.fldType.PadLeft(3,'0') + " " + TmpInfo.fldName;
 | 
						|
					if (TmpInfo.fldType.Equals("128")) // is this a combo type?
 | 
						|
						RtnStr += "a"; // append an "a"
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		/* 
 | 
						|
		 * See if the given RECID is referencing a combo field.
 | 
						|
		 */
 | 
						|
		bool IsComboFieldType(String fldName)
 | 
						|
		{
 | 
						|
			bool IsACombo = false;
 | 
						|
			bool wasFound = false;
 | 
						|
			FieldInfo TmpInfo;
 | 
						|
			System.Collections.IEnumerator LocFldLstEnumerator = LocalFieldInfoList.GetEnumerator();
 | 
						|
			System.Collections.IEnumerator FldLstEnumerator = MasterFieldInfoList.GetEnumerator();
 | 
						|
// Bug fix: B2004-028
 | 
						|
// Need to check local list of fields (of this group)
 | 
						|
// Then then if not in the local list, check the "global" list
 | 
						|
			while (!IsACombo && LocFldLstEnumerator.MoveNext())
 | 
						|
			{
 | 
						|
				TmpInfo = (FieldInfo)LocFldLstEnumerator.Current;
 | 
						|
				if (StringsAreEqual(TmpInfo.fldName,fldName))
 | 
						|
				{
 | 
						|
					wasFound = true;
 | 
						|
					if (StringsAreEqual(TmpInfo.fldType,"128"))
 | 
						|
						IsACombo = true;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			if (!wasFound)
 | 
						|
			{
 | 
						|
				while (!IsACombo && FldLstEnumerator.MoveNext())
 | 
						|
				{
 | 
						|
					TmpInfo = (FieldInfo)FldLstEnumerator.Current;
 | 
						|
					if (StringsAreEqual(TmpInfo.fldName,fldName) && StringsAreEqual(TmpInfo.fldType,"128"))
 | 
						|
						IsACombo = true;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return IsACombo;
 | 
						|
		}
 | 
						|
 | 
						|
		String BuildComboFieldName(String FldName)
 | 
						|
		{
 | 
						|
			String RtnStr = FldName;
 | 
						|
			switch (CurrentFieldType)
 | 
						|
			{
 | 
						|
				case 1: //Fixed Text
 | 
						|
					RtnStr += "a";
 | 
						|
					break;
 | 
						|
				case 2: // Variable Text
 | 
						|
					RtnStr += "b";
 | 
						|
					break;
 | 
						|
				case 16: // Table
 | 
						|
					RtnStr += "c";
 | 
						|
					break;
 | 
						|
				case 8:
 | 
						|
					RtnStr += "d";
 | 
						|
					break;
 | 
						|
				default:
 | 
						|
					break;
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		String GetGroupTitle(String RecordID)
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			GroupTitles Tmpitem;
 | 
						|
			System.Collections.IEnumerator GrpLstEnumerator = GroupTitlesList.GetEnumerator();
 | 
						|
			while (GrpLstEnumerator.MoveNext() && StringsAreEqual(RtnStr,""))
 | 
						|
			{
 | 
						|
				Tmpitem = (GroupTitles)GrpLstEnumerator.Current;
 | 
						|
				if (StringsAreEqual(Tmpitem.GrpRecID,RecordID))
 | 
						|
					RtnStr = Tmpitem.GrpTitle;
 | 
						|
			}
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		String ReplaceGreaterLessSigns(String InStr)
 | 
						|
		{
 | 
						|
			String OutStr = InStr;
 | 
						|
			OutStr = OutStr.Replace("<","<");
 | 
						|
			OutStr = OutStr.Replace(">",">");
 | 
						|
 | 
						|
			return OutStr;
 | 
						|
		}
 | 
						|
 | 
						|
		// Replace any character less than 32 (space) or greater then
 | 
						|
		// 126 (~) with "&#D;" where D is the decimal value of the character
 | 
						|
		String ReplaceNonStandardChars(string instring)
 | 
						|
		{
 | 
						|
			string outstring = "";
 | 
						|
			int len = instring.Length;
 | 
						|
			int i=0;
 | 
						|
			int substart=0;
 | 
						|
			ushort decchar;
 | 
						|
 | 
						|
			while (i < len)
 | 
						|
			{
 | 
						|
				while (i < len && instring[i] < 127) i++;
 | 
						|
				outstring += instring.Substring(substart, i-substart);
 | 
						|
				if (i < len)
 | 
						|
				{
 | 
						|
					decchar = instring[i];
 | 
						|
					outstring += "&#" + decchar.ToString() + ";";
 | 
						|
					i++;
 | 
						|
					substart = i;
 | 
						|
				}
 | 
						|
			}
 | 
						|
			return outstring;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		 * String cannot have '&' or '/' chars
 | 
						|
		 * replace them with an '_'
 | 
						|
		 */
 | 
						|
		String FixString(String instring)
 | 
						|
		{
 | 
						|
			String FixedString = "";
 | 
						|
 | 
						|
			StringWriter strWriter = new StringWriter();
 | 
						|
			xmlTxtWriter = new XmlTextWriter(strWriter);
 | 
						|
			xmlTxtWriter.WriteString(instring);
 | 
						|
 | 
						|
			FixedString = strWriter.ToString();
 | 
						|
			xmlTxtWriter.Close();
 | 
						|
 | 
						|
			// Now replace any character less than 32 (space) or greater then
 | 
						|
			// 126 (~) with "&#D;" where D is the decimal value of the character
 | 
						|
			FixedString = ReplaceNonStandardChars(FixedString);
 | 
						|
			// need to replace the forward slash with an character reference
 | 
						|
			FixedString = FixedString.Replace("/","/");
 | 
						|
			/*
 | 
						|
			 * The WriteString method is not replacing the single
 | 
						|
			 * and double quotes.  So we will do it manually
 | 
						|
			 */
 | 
						|
			FixedString = FixedString.Replace("'","'");
 | 
						|
			FixedString = FixedString.Replace("\"",""");
 | 
						|
 | 
						|
			return FixedString;
 | 
						|
		}
 | 
						|
 | 
						|
		public string ReplaceNonValidCharsInFieldName(string fldname)
 | 
						|
		{
 | 
						|
			string tmpstr = fldname;
 | 
						|
			int len = fldname.Length;
 | 
						|
			int cnt = 0;
 | 
						|
 | 
						|
			// this is also our sequence that tells us the follow 3 digits is the ascii number (base 10)
 | 
						|
			// of the character we replaced.
 | 
						|
			string OKpunch = "-._"; 
 | 
						|
 | 
						|
			string outstr = "";
 | 
						|
			int decval;
 | 
						|
 | 
						|
			while (cnt < len)
 | 
						|
			{
 | 
						|
				char tmpchr = tmpstr[cnt];
 | 
						|
				if(!char.IsLetterOrDigit(tmpchr)&& (OKpunch.IndexOf(tmpchr) == -1) )
 | 
						|
				{
 | 
						|
					decval = tmpchr;
 | 
						|
					outstr += OKpunch + decval.ToString("D3");
 | 
						|
				}
 | 
						|
				else
 | 
						|
				{
 | 
						|
					outstr += tmpchr.ToString();
 | 
						|
				}
 | 
						|
				cnt++;
 | 
						|
			}
 | 
						|
			DEBUG_Write(outstr);
 | 
						|
			return outstr;
 | 
						|
		}
 | 
						|
 | 
						|
/*
 | 
						|
 * Field names cannot have ' ', '&', or '/' characters
 | 
						|
 */
 | 
						|
		String FixFieldName(String fldname)
 | 
						|
		{
 | 
						|
			String fixedField = fldname;
 | 
						|
 | 
						|
			DEBUG_CheckFieldName(fldname);
 | 
						|
 | 
						|
			fixedField = fixedField.Replace(" ","__");
 | 
						|
 | 
						|
			/*
 | 
						|
			 * If the first character is 0-9, then put a '_' in front of the field name
 | 
						|
			 */
 | 
						|
			if (Char.IsDigit(fixedField,0))
 | 
						|
				fixedField = "__" + fixedField;
 | 
						|
			fixedField = ReplaceNonValidCharsInFieldName(fixedField);
 | 
						|
 | 
						|
			return fixedField;
 | 
						|
		}
 | 
						|
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function will parse the remaining information in the LineOfText string
 | 
						|
		 * and create the value needed for the Info field of the database record.
 | 
						|
		 */
 | 
						|
		String ParseInfoField()
 | 
						|
		{
 | 
						|
			String RtnStr = "";
 | 
						|
			String tmpStr;
 | 
						|
			String Title;
 | 
						|
			String ROMenuHead;
 | 
						|
			String GrpMenuHead;
 | 
						|
			String RoValueDef;
 | 
						|
			String RoMenuItemDef;
 | 
						|
			String GroupMenuItemDef;
 | 
						|
			String RoFieldsInUse;
 | 
						|
			String GroupFieldsInUse;
 | 
						|
			String FieldName;
 | 
						|
			int intRecType = GetFieldInt(RecType);
 | 
						|
 | 
						|
			switch (intRecType)
 | 
						|
			{
 | 
						|
				case 0: // Next Record Id or next database table name
 | 
						|
					RtnStr = GetFieldTxt();
 | 
						|
					break;
 | 
						|
 | 
						|
				case 1: // Database title and database name
 | 
						|
					RtnStr = GetStringByLength(); // database title
 | 
						|
					ROTblElmt = FixFieldName(RtnStr);
 | 
						|
					RtnStr += "\t";
 | 
						|
					tmpStr = GetStringByLength(); // database table name
 | 
						|
					if (tmpStr.Length == 0)
 | 
						|
						RtnStr += "RO000001"; // default database table name
 | 
						|
					else
 | 
						|
						RtnStr += tmpStr;
 | 
						|
					break;
 | 
						|
 | 
						|
				case 2: // Field Description
 | 
						|
						// get the field definition
 | 
						|
						RtnStr = GetFieldDefinition();
 | 
						|
					break;
 | 
						|
 | 
						|
				case 3: // RO Group
 | 
						|
					GroupTitle = GetStringByLength(); // group name (title)
 | 
						|
					ROMenuHead = GetStringByLength(); // RO menu header
 | 
						|
					GrpMenuHead = GetStringByLength();// Group menu header
 | 
						|
 | 
						|
					RtnStr = "<vlnGroup "; // begin group definition
 | 
						|
 | 
						|
					// RO return value definition
 | 
						|
					RoValueDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(RoValueDef,""))
 | 
						|
						RtnStr += "RetVal=\"" + RoValueDef + "\" ";
 | 
						|
 | 
						|
					//RO menu item definition
 | 
						|
					RoMenuItemDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(RoMenuItemDef,""))
 | 
						|
						RtnStr += "MenuItem=\"" + RoMenuItemDef + "\" ";
 | 
						|
 | 
						|
					// Group menu item definition
 | 
						|
					GroupMenuItemDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(GroupMenuItemDef,""))
 | 
						|
						RtnStr += "GroupMenuItem=\"" + GroupMenuItemDef + "\" ";
 | 
						|
 | 
						|
					// Ro fields in use
 | 
						|
					RoFieldsInUse = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						RoFieldsInUse += tmpStr + " ";
 | 
						|
						tmpStr = GetFieldTxt(); //next
 | 
						|
					}
 | 
						|
					RoFieldsInUse = RoFieldsInUse.TrimEnd(' ');
 | 
						|
					if (!StringsAreEqual(RoFieldsInUse,""))
 | 
						|
						RtnStr += "FieldsInUse=\"" + RoFieldsInUse + "\" ";
 | 
						|
 | 
						|
					// Group fields in use
 | 
						|
					GroupFieldsInUse = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						GroupFieldsInUse = GroupFieldsInUse + tmpStr + " ";
 | 
						|
						tmpStr = GetFieldTxt(); //next
 | 
						|
					}
 | 
						|
					GroupFieldsInUse = GroupFieldsInUse.TrimEnd(' ');
 | 
						|
 | 
						|
					if (!StringsAreEqual(GroupFieldsInUse,""))
 | 
						|
						RtnStr += "GroupFieldsInUse=\"" + GroupFieldsInUse + "\" ";
 | 
						|
 | 
						|
					// AccPageID prefix
 | 
						|
					String AccPagePreFix;
 | 
						|
					AccPagePreFix = GetStringByLength();
 | 
						|
					AccPagePreFix = FixString(AccPagePreFix);
 | 
						|
 | 
						|
					if (!StringsAreEqual(AccPagePreFix,""))
 | 
						|
						RtnStr += "AccPageIDPrefix=\"" + AccPagePreFix + "\" ";
 | 
						|
 | 
						|
					// AccdPageID definition
 | 
						|
					String AccPageDef;
 | 
						|
					AccPageDef = GetValueDefinition();
 | 
						|
 | 
						|
					if (!StringsAreEqual(AccPageDef,""))
 | 
						|
						RtnStr += "AccPageID=\"" + AccPageDef + "\" ";
 | 
						|
 | 
						|
					// end group attributes
 | 
						|
					RtnStr +=">";
 | 
						|
 | 
						|
					// add group name
 | 
						|
					RtnStr += FixString(GroupTitle);
 | 
						|
 | 
						|
					RtnStr += "</vlnGroup>"; // end group definition
 | 
						|
 | 
						|
					break;
 | 
						|
 | 
						|
				case 4: // sub group
 | 
						|
 | 
						|
					Title = GetStringByLength(); // sub group name (title)
 | 
						|
					ROMenuHead = GetStringByLength(); // RO menu header
 | 
						|
					GrpMenuHead = GetStringByLength();// sub group menu header
 | 
						|
 | 
						|
					// replace special chars
 | 
						|
					Title = FixString(Title);
 | 
						|
 | 
						|
					// Save the group title and recid for use later on
 | 
						|
					GroupTitles TheGroupTitle = new GroupTitles();
 | 
						|
					TheGroupTitle.GrpRecID = RecID;
 | 
						|
					TheGroupTitle.GrpTitle = Title;
 | 
						|
					GroupTitlesList.Add(TheGroupTitle);
 | 
						|
 | 
						|
					RtnStr = "<vlnGroup "; // begin sub group definition
 | 
						|
 | 
						|
					// The Sub Group Title
 | 
						|
					RtnStr += "MenuTitle=\"" + Title + "\" ";
 | 
						|
 | 
						|
					// RO return value definition
 | 
						|
					RoValueDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(RoValueDef,""))
 | 
						|
						RtnStr += "RetVal=\"" + RoValueDef + "\" ";
 | 
						|
 | 
						|
					//RO menu item definition
 | 
						|
					RoMenuItemDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(RoMenuItemDef,""))
 | 
						|
						RtnStr += "MenuItem=\"" + RoMenuItemDef + "\" ";
 | 
						|
 | 
						|
					// Group menu item definition
 | 
						|
					GroupMenuItemDef = GetValueDefinition();
 | 
						|
					if (!StringsAreEqual(GroupMenuItemDef,""))
 | 
						|
						RtnStr += "GroupMenuItem=\"" + GroupMenuItemDef + "\" ";
 | 
						|
 | 
						|
					// Ro fields in use
 | 
						|
					RoFieldsInUse = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						RoFieldsInUse = RoFieldsInUse + tmpStr + " ";
 | 
						|
						tmpStr = GetFieldTxt(); // next
 | 
						|
					}
 | 
						|
					RoFieldsInUse = RoFieldsInUse.TrimEnd(' ');
 | 
						|
 | 
						|
					if (!StringsAreEqual(RoFieldsInUse,""))
 | 
						|
						RtnStr += "FieldsInUse=\"" + RoFieldsInUse + "\" ";
 | 
						|
 | 
						|
					// Group fields in use
 | 
						|
					GroupFieldsInUse = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						GroupFieldsInUse = GroupFieldsInUse + tmpStr + " ";
 | 
						|
						tmpStr = GetFieldTxt(); // next
 | 
						|
					}
 | 
						|
					GroupFieldsInUse = GroupFieldsInUse.TrimEnd(' ');
 | 
						|
 | 
						|
					if (!StringsAreEqual(GroupFieldsInUse,""))
 | 
						|
						RtnStr += "GroupFieldsInUse=\"" + GroupFieldsInUse + "\" ";
 | 
						|
 | 
						|
					// End attributes
 | 
						|
					RtnStr = RtnStr.TrimEnd(' ');
 | 
						|
					RtnStr += ">";
 | 
						|
 | 
						|
					// Sub Group fields and values
 | 
						|
					String SubGrpFldsAndVals = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						FieldName = GetSavedLocalFieldName(tmpStr);
 | 
						|
						SubGrpFldsAndVals += "<" + FieldName+ ">";
 | 
						|
						SubGrpFldsAndVals += GetFieldValue();
 | 
						|
						SubGrpFldsAndVals += "</" + FieldName + ">\r\n";
 | 
						|
 | 
						|
						tmpStr = GetFieldTxt(); // next
 | 
						|
					}
 | 
						|
					RtnStr += SubGrpFldsAndVals;
 | 
						|
					RtnStr += "</vlnGroup>"; // end group definition
 | 
						|
					break;
 | 
						|
 | 
						|
				case 5: // RO Value Record
 | 
						|
					// RO Menu Item Value
 | 
						|
					String ROMenuItemValue = GetStringByLength();
 | 
						|
					ROMenuItemValue = FixString(ROMenuItemValue);
 | 
						|
 | 
						|
					RtnStr = "<" + FixFieldName(GroupTitle) + " ";
 | 
						|
 | 
						|
					// RO Menu Item
 | 
						|
					RtnStr += "MenuTitle=\"" + ROMenuItemValue + "\">\r\n";
 | 
						|
 | 
						|
					//RO fields and values
 | 
						|
					String ROFldsAndVals = "";
 | 
						|
					tmpStr = GetFieldTxt();
 | 
						|
					while (!StringsAreEqual(tmpStr,"0"))
 | 
						|
					{
 | 
						|
						FieldName = GetSavedLocalFieldName(tmpStr);
 | 
						|
						tmpStr = GetFieldValue();
 | 
						|
						if (IsComboFieldType(FieldName))
 | 
						|
						{
 | 
						|
							FieldName = BuildComboFieldName(FieldName);
 | 
						|
						}
 | 
						|
						ROFldsAndVals += "<" + FieldName + ">";
 | 
						|
						ROFldsAndVals += tmpStr;
 | 
						|
						ROFldsAndVals += "</" + FieldName + ">\r\n";
 | 
						|
 | 
						|
						tmpStr = GetFieldTxt();
 | 
						|
					}
 | 
						|
					RtnStr += ROFldsAndVals;
 | 
						|
					RtnStr += "</" + FixFieldName(GroupTitle) + ">\r\n";
 | 
						|
					break;
 | 
						|
				
 | 
						|
				default:
 | 
						|
					break;
 | 
						|
			}// end switch
 | 
						|
 | 
						|
			return RtnStr;
 | 
						|
		}
 | 
						|
 | 
						|
		/*
 | 
						|
		 * This function will parse the given text record (string) and place the
 | 
						|
		 * information in a database record.
 | 
						|
		 */
 | 
						|
		void ProcessTextLine()
 | 
						|
		{
 | 
						|
 | 
						|
			/*
 | 
						|
			 * Get the first 5 database fields and save them in string types.
 | 
						|
			 */
 | 
						|
 | 
						|
			RecID= GetFieldTxt();
 | 
						|
			RecType = GetFieldTxt();
 | 
						|
			ParentRecID = GetFieldTxt();
 | 
						|
			AccPageID = GetStringByLength();
 | 
						|
			DateTime = GetFieldTxt();
 | 
						|
			intRecType = GetFieldInt(RecType);
 | 
						|
/***** For Debugging ***/
 | 
						|
//			if (RecID.Equals("000000c1"))
 | 
						|
//			{
 | 
						|
//				int test;
 | 
						|
//				test = 1;
 | 
						|
//			}
 | 
						|
 | 
						|
//			if (AccPageID.Equals("R.29"))
 | 
						|
//			{
 | 
						|
//				MessageBox.Show("debug");
 | 
						|
//			}
 | 
						|
/**** End - for debugging ****/
 | 
						|
 | 
						|
			// setup a new database record
 | 
						|
			NewDbField = new ROField("", RecID, ParentRecID, (uint)intRecType);
 | 
						|
 | 
						|
			/* 
 | 
						|
			 * Now what's remaining in the txtRecord string is the BLOB info from
 | 
						|
			 * the old Paradox database record.
 | 
						|
			 * Parse the remaining information and build the XML or XSD string that
 | 
						|
			 * represents the data.
 | 
						|
			 */
 | 
						|
			Info = ParseInfoField();
 | 
						|
 | 
						|
			// Fix the single quotes before writing to the database
 | 
						|
			// MS Access complained when we tried to write "C'.'99", wanted "C''.''99" instead
 | 
						|
			Info = Info.Replace("'","''");
 | 
						|
 | 
						|
			// if we are processing a record type 4, save it as a record type 3.
 | 
						|
			// record type 4's were considered subgroups. We are going to store them
 | 
						|
			// as groups (type 3) with the parent id pointing to the the parent group
 | 
						|
			// or subgroup.
 | 
						|
			if (intRecType == 4 && !StringsAreEqual(RecType,"2"))
 | 
						|
				intRecType = 3;
 | 
						|
 | 
						|
			// write to database
 | 
						|
			MyDbRec.RODB_WriteDbRecord(ROTableName,RecID,intRecType,ParentRecID,AccPageID,DateTime,Info);
 | 
						|
 | 
						|
			if (StringsAreEqual(RecType,"0")&& StringsAreEqual(RecID,"00000001"))
 | 
						|
			{
 | 
						|
				// build schema header for the table just inserted
 | 
						|
				Info = "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\r\n";
 | 
						|
				Info += "elementFormDefault=\"qualified\" targetNamespace=\"volianNS\" xmlns=\"volianNS\">\r\n";
 | 
						|
				Info += "<xsd:element name=\"volianElement\" type=\"volianElementType\" />";
 | 
						|
				Info += "<xsd:complexType name=\"volianElementType\">\r\n";
 | 
						|
				Info += "<xsd:sequence>";
 | 
						|
				// write the schema header record (type 6)
 | 
						|
				// Note that a null recid will cause RODB_WriteDbRecord to get the next
 | 
						|
				// available one and update the "next RecID" database record.
 | 
						|
				MyDbRec.RODB_WriteDbRecord(ROTableName,"",6,"00000000","",DateTime,Info);
 | 
						|
 | 
						|
				// build the schema footer for the table just inserted
 | 
						|
				Info = "</xsd:sequence>\r\n";
 | 
						|
				Info += "</xsd:complexType>\r\n";
 | 
						|
				Info += "<xsd:simpleType name=\"Fixed\">\r\n";
 | 
						|
				Info += "<xsd:restriction base=\"xsd:normalizedString\">\r\n";
 | 
						|
				Info += "<xsd:maxLength value=\"16\"/>\r\n";
 | 
						|
				Info += "</xsd:restriction>\r\n";
 | 
						|
				Info += "</xsd:simpleType>\r\n";
 | 
						|
				Info += "<xsd:simpleType name=\"Variable\">\r\n";
 | 
						|
				Info += "<xsd:restriction base=\"xsd:string\">\r\n";
 | 
						|
				Info += "<xsd:maxLength value=\"72\"/>\r\n";
 | 
						|
				Info += "</xsd:restriction>\r\n";
 | 
						|
				Info += "</xsd:simpleType>\r\n";
 | 
						|
				Info += "<xsd:simpleType name=\"Table\">\r\n";
 | 
						|
				Info += "<xsd:restriction base=\"xsd:string\">\r\n";
 | 
						|
				Info += "<xsd:maxLength value=\"72\"/>\r\n";
 | 
						|
				Info += "</xsd:restriction>\r\n";
 | 
						|
				Info += "</xsd:simpleType>\r\n";
 | 
						|
				Info += "<xsd:simpleType name=\"XY_Plot\">\r\n";
 | 
						|
				Info += "<xsd:restriction base=\"xsd:string\">\r\n";
 | 
						|
				Info += "<xsd:maxLength value=\"72\"/>\r\n";
 | 
						|
				Info += "</xsd:restriction>\r\n";
 | 
						|
				Info += "</xsd:simpleType>\r\n";
 | 
						|
				Info += "</xsd:schema>\r\n";
 | 
						|
				// write the schema footer record (type 7)
 | 
						|
				// Note that a null recid will cause RODB_WriteDbRecord to get the next
 | 
						|
				// available one and update the "next RecID" database record.
 | 
						|
				MyDbRec.RODB_WriteDbRecord(ROTableName,"",7,"00000000","",DateTime,Info);
 | 
						|
			}
 | 
						|
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |