Exemplo n.º 1
0
        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);
        }