/// <summary>
        /// Create field on table
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="fieldName"></param>
        /// <param name="fieldDescription"></param>
        /// <param name="type"></param>
        /// <param name="size"></param>
        /// <param name="editSize"></param>
        /// <param name="subType"></param>
        /// <param name="validValues">Dropdown values</param>
        /// <param name="defaultValue"></param>
        /// <param name="linkedTable"> use '@' with usertables</param>
        /// <returns></returns>
        public static void CreateField(string tableName, string fieldName, string fieldDescription,
                                       BoFieldTypes type = BoFieldTypes.db_Alpha, int size = 50, BoFldSubTypes subType = BoFldSubTypes.st_None,
                                       IDictionary <string, string> validValues = null, string defaultValue = null,
                                       string linkedTable = null, int editSize = 0)
        {
            UserFieldsMD userFieldsMd = null;

            try
            {
                userFieldsMd = SboApp.Company.GetBusinessObject(BoObjectTypes.oUserFields) as UserFieldsMD;

                if (userFieldsMd == null)
                {
                    throw new NullReferenceException("Failed to get UserFieldsMD object");
                }

                var fieldId = GetFieldId(tableName, fieldName);
                if (fieldId != -1)
                {
                    return;
                }

                userFieldsMd.TableName    = tableName;
                userFieldsMd.Name         = fieldName;
                userFieldsMd.Description  = fieldDescription;
                userFieldsMd.Type         = type;
                userFieldsMd.SubType      = subType;
                userFieldsMd.Size         = size;
                userFieldsMd.EditSize     = editSize != 0 ? editSize : size;
                userFieldsMd.DefaultValue = defaultValue;

                if (validValues != null)
                {
                    foreach (var validValue in validValues)
                    {
                        userFieldsMd.ValidValues.Value       = validValue.Key;
                        userFieldsMd.ValidValues.Description = validValue.Value;
                        userFieldsMd.ValidValues.Add();
                    }
                }

                if (linkedTable != null)
                {
                    if (DatabaseHelper.TableExists(linkedTable))
                    {
                        userFieldsMd.LinkedTable = linkedTable.Trim('@');
                    }
                    else
                    {
                        throw new Exception($"Linked table '{linkedTable}' could not be found");
                    }
                }

                ErrorHelper.HandleErrorWithException(userFieldsMd.Add(), "Could not create field");
            }
            catch (Exception ex)
            {
                SboApp.Logger.Error($"Create Field {tableName}.{fieldName} Error: {ex.Message}", ex);
                throw;
            }
            finally
            {
                if (userFieldsMd != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(userFieldsMd);
                }
                userFieldsMd = null;
                GC.Collect();
            }
        }