private void buttonCreateDictionary_Click(object sender, RoutedEventArgs e) { if (String.IsNullOrEmpty(DictionaryLabel)) { MessageBox.Show("Please enter the dictionary label"); return; } if (String.IsNullOrEmpty(DictionaryPath)) { MessageBox.Show("Please enter the name of the file to save the dictionary to"); return; } if (LevelSpecs.Count == 0) { MessageBox.Show("Please add at least one dictionary level"); return; } foreach (var levelSpec in LevelSpecs) { if (levelSpec.IdItems.Count == 0) { MessageBox.Show(String.Format("Level {0} does not have any Id Items. Each level must have at least one Id Item.", levelSpec.Name)); return; } if (levelSpec.Records.Count == 0) { MessageBox.Show(String.Format("Level {0} does not have any records. Each level must have at least one record.", levelSpec.Name)); return; } } // Add documents directory to path if none specified if (!Path.IsPathRooted(DictionaryPath)) { DictionaryPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), DictionaryPath); } try { DictionaryGenerator generator = new DictionaryGenerator(); using (var valueSetRetriever = new ValueSetRetriever(connectionString, ValueSetQueryTemplate)) { var dictionary = generator.CreateDictionary(DictionaryLabel, DatabaseName, LevelSpecs, valueSetRetriever); dictionary.Save(DictionaryPath); } // Show dictionary file in explorer System.Diagnostics.Process.Start("explorer.exe", "/select, \"" + DictionaryPath + "\""); } catch (Exception ex) { MessageBox.Show(String.Format("Error creating dictionary: {0}", ex.Message)); } }
/// <summary> /// Fill in CSPro dictionary record a record specification /// </summary> /// <param name="dictRecord">Empty CSPro DictionaryRecord to fill in</param> /// <param name="recordName">Name to use for record</param> /// <param name="recSpec">RecordSpecification for the record to be generated</param> /// <param name="dbColumns">List of database columns to include the generated record</param> /// <param name="valueSetRetriever">Utility class to get value sets for generated dictionary items</param> private void CreateRecord(DictionaryRecord dictRecord, string recordName, RecordSpec recSpec, IEnumerable <DatabaseColumn> dbColumns, ValueSetRetriever valueSetRetriever) { dictRecord.Label = recSpec.Name; dictRecord.Name = recordName; dictRecord.RecordType = recSpec.Type.ToString(); dictRecord.Note = String.Format("#table {0}", recSpec.DatabaseTable.FullName); foreach (var dbCol in dbColumns) { string itemName = MakeName(dbCol.Name, "_" + dictRecord.Name); CreateItem(dictRecord.AddItem(), itemName, dbCol, valueSetRetriever); } }
/// <summary> /// Fill in a CSPro DictionaryLevel from a LevelSpec /// </summary> /// <param name="dictLevel">Empty level from CSPro dictionary to fill in</param> /// <param name="levelSpec">Level specification that contains mapping from tables to records</param> /// <param name="usedIdItems">List of id-items included in previous levels so that they will not be repeated. Updated by this routine.</param> /// <param name="valueSetRetriever">Utility class to get value sets for generated dictionary items</param> private void CreateLevel(DictionaryLevel dictLevel, LevelSpec levelSpec, List <DatabaseColumn> usedIdItems, ValueSetRetriever valueSetRetriever) { dictLevel.Label = levelSpec.Name; dictLevel.Name = MakeName(levelSpec.Name, "_LVL"); // Add id-items to level var idColumns = levelSpec.Records.SelectMany(r => r.DatabaseTable.Columns).Where(c => levelSpec.IdItems.Contains(c)).Distinct(); foreach (var idCol in idColumns) { string itemName = MakeName(idCol.Name, "_" + levelSpec.Name); CreateItem(dictLevel.IdItems.AddItem(), itemName, idCol, valueSetRetriever); } usedIdItems.AddRange(idColumns); // Add variables to each record foreach (var recSpec in levelSpec.Records) { // Only add non-id items as record variables var regularColumns = recSpec.DatabaseTable.Columns.Where(c => usedIdItems.FirstOrDefault(id => id.Name == c.Name) == null); string recordName = MakeName(recSpec.Name, "_" + levelSpec.Name); CreateRecord(dictLevel.AddRecord(), recordName, recSpec, regularColumns, valueSetRetriever); } }
/// <summary> /// Construct CSPro data dictionary from dictionary specs. /// </summary> /// <param name="label">Text to use for CSPro dictionary label</param> /// <param name="databaseName">Name of SQL server database (saved in dictionary notes)</param> /// <param name="levelSpecs">List of level specifications that contain mappings from SQL database columns to CSPro levels and records.</param> /// <param name="valueSetRetriever">Utility class to get value sets for generated dictionary items</param> /// <returns>CSPro data dictionary</returns> public DataDictionary CreateDictionary(string label, string databaseName, IEnumerable <LevelSpec> levelSpecs, ValueSetRetriever valueSetRetriever) { var dictionary = new DataDictionary(); dictionary.Label = label; dictionary.Name = MakeName(label + "_DICT"); dictionary.RecordTypeLength = 1; dictionary.RecordTypeStart = 1; dictionary.Note = String.Format("#database {0}", databaseName); // Keep track of id-items used at this and previous levels so that they are not repeated List <DatabaseColumn> usedIdItems = new List <DatabaseColumn>(); foreach (var levelSpec in levelSpecs) { CreateLevel(dictionary.AddLevel(), levelSpec, usedIdItems, valueSetRetriever); } AdjustItemStartPositions(dictionary); return(dictionary); }
/// <summary> /// Fill in CSPro data dictionary item from DatabaseColumn /// </summary> /// <param name="dictItem">Empty CSPro dictionary item to fill in</param> /// <param name="itemName">Name to use for generated item</param> /// <param name="column">DatabaseColumn to map to this dictionary item</param> /// <param name="valueSetRetriever">Utility class to get value sets for generated dictionary items</param> private void CreateItem(DictionaryItem dictItem, string itemName, DatabaseColumn column, ValueSetRetriever valueSetRetriever) { dictItem.Label = column.Name; dictItem.Name = itemName; dictItem.Note = String.Format("#column {0}:{1}", column.Name, column.Type.ToString()); //TODO - sqltype SetItemTypeAndLength(dictItem, column); valueSetRetriever.GetValueSet(dictItem); }