internal static void ExportCursor(string categoryName, IEnumerable <ICursorFilter> filters, string[] fieldNames, IEnumerable <ConnectedField> connectedFields, string path, IExportSettings options) { // we got fieldnames, so we have to create a custom cursor using (var db = new CommenceDatabase()) using (var cur = db.GetCursor(categoryName)) { if (fieldNames != null && fieldNames.Any()) { cur.Columns.AddDirectColumns(fieldNames); } // in this case the cursor will hold all columns, because non was exlicitly specified // we need to explicitly clear it // in this case we will do so by adding the Name field else { cur.Columns.AddDirectColumn(db.GetNameField(categoryName)); } if (connectedFields != null) { foreach (var cf in connectedFields) { cur.Columns.AddRelatedColumn(cf.ConnectionName, cf.ToCategory, cf.FieldName); } } cur.Columns.Apply(); if (filters != null) { foreach (var f in filters) { cur.Filters.Add(f); } cur.Filters.Apply(); } cur.ExportToFile(path, options); } }
private IList <ConnectedItem> PopulateConnectedItemNamesList(string searchString) { IList <ConnectedItem> retval = new List <ConnectedItem>(); if (string.IsNullOrEmpty(this.SelectedConnectedCategory)) { return(retval); } using (ICommenceDatabase db = new CommenceDatabase()) { using (ICommenceCursor cur = db.GetCursor(this.SelectedConnectedCategory)) { string nameField = db.GetNameField(this.SelectedConnectedCategory); var columns = this.CategoryDefinition.Clarified ? new[] { nameField, this.CategoryDefinition.ClarifyField } : new[] { nameField }; if (!cur.SetColumns(columns)) { return(retval); } // something went wrong bad var number = cur.RowCount; if (string.IsNullOrEmpty(searchString)) { if (number == 0) { retval.Add(new ConnectedItem("(No items to display)", null, null, null)); return(retval); } else if (number < 1000) { return(GetConnectedItems(cur).ToList()); } else { retval.Add(new ConnectedItem("(Too many items to display.)", null, null, null)); return(retval); } } else { CursorFilterTypeF f = cur.Filters.Create(1, FilterType.Field); f.FieldValue = this.ConnectedItemSearchString; f.FieldName = nameField; f.Qualifier = FilterQualifier.Contains; int count = cur.Filters.Apply(); if (count > 1000) { retval.Add(new ConnectedItem("(Too many items to display)", null, null, null)); return(retval); } else if (count == 0) { retval.Add(new ConnectedItem($"(No items contain '{ this.ConnectedItemSearchString }')", null, null, null)); return(retval); } else { return(GetConnectedItems(cur).ToList()); } } } } }
private void SetPropertiesByView(string viewName) { // if we have just a view, everything changes // we need to create the fieldnames and the connected fields from the columns in the view. // This is non-trivial, because of the mess Commence makes with representing rlated columns. // for some viewtypes it is '%%', for others it is a space. IEnumerable <ICommenceConnection> connNames; IEnumerable <string> viewColumns; List <string> directColumns = new List <string>(); List <ConnectedField> connectedColumns = new List <ConnectedField>(); using (var db = new CommenceDatabase()) using (var cur = db.GetCursor(viewName, CmcCursorType.View, CmcOptionFlags.Default)) { connNames = db.GetConnectionNames(cur.Category); viewColumns = db.GetViewColumnNames(viewName); // loop through all columns to determine if they are a direct field or a connection foreach (var vc in viewColumns) { if (vc.Contains(connDelim)) { string[] cc = vc.Split(new string[] { connDelim }, StringSplitOptions.None); if (cc.Length == 3) { connectedColumns.Add(new ConnectedField(cc[0], cc[1], cc[2])); } } else if (vc.Contains(' ')) { foreach (ICommenceConnection c in connNames) { if (vc.StartsWith(c.Name) && vc.EndsWith(c.ToCategory) && vc.Length == c.Name.Length + c.ToCategory.Length + 1) { connectedColumns.Add(new ConnectedField(c.Name, c.ToCategory, db.GetNameField(c.ToCategory))); break; } } } else // a direct column { directColumns.Add(vc); } } FieldNames = directColumns?.ToArray(); ConnectedFields = connectedColumns?.ToArray(); } }