// Установить значение любого объекта GR public static void SetAttributeValueRegular(this IgObject obj , bool isUDA , string name , MxDataType type , object value , string description = "" , string engUnits = "" ) { if (obj == null) { throw new ArgumentNullException("IgObject is null"); } //Все типы MxString* сводятся только в тип MxInternationalizedString if (type == MxDataType.MxString || type == MxDataType.MxInternationalizedString || type == MxDataType.MxBigString) { type = MxDataType.MxInternationalizedString; } if (SystemAttributes.TryGetValue(name, out var act)) { obj.CheckOutWithCheckStatus(); try { act(obj, value?.ToString()); obj.SaveAndCheckIn($"System attribute {name} = {(value == null ? "null" : $"\"{value}\"")}"); }
/// <summary> /// Получение типа. /// </summary> public static void PutMxValue(ref MxValue valueObj, MxDataType type, string value) { switch (type) { case MxDataType.MxBoolean: valueObj.PutBoolean(bool.Parse(value)); break; case MxDataType.MxInteger: valueObj.PutInteger(int.Parse(value)); break; case MxDataType.MxFloat: valueObj.PutFloat(float.Parse(value)); break; case MxDataType.MxDouble: valueObj.PutDouble(double.Parse(value)); break; case MxDataType.MxString: valueObj.PutString(value); break; //case MxDataType.MxTime: valueObj.PutTime(DateTime.Parse(value)); break; default: valueObj.PutString(value); break; } }
//Получить тип // если вернулось MxNoData - значит атрибута не существует // TODO: проверить нужен ли check out public static MxDataType GetAttributeMxDataType(this IgObject gobj, string attrname) { if (gobj == null) { throw new ArgumentNullException($" Объект {gobj.Tagname} не существует или NULL"); } if (string.IsNullOrWhiteSpace(attrname)) { throw new Exception($"Имя атрибута {nameof(attrname)} не может быть пустым"); } MxDataType type = MxDataType.MxNoData; gobj.CheckOutWithCheckStatus(); if (gobj.IsExistAttribute(attrname)) { type = gobj.ConfigurableAttributes[attrname].DataType; gobj.SaveAndCheckIn($"Получение типа атрибута {attrname} для объекта {gobj}."); } else { throw new AttributeNullReferenceException(); } return(type); }
void workerImport_DoWork(object sender, DoWorkEventArgs e) { DateTime t0 = DateTime.Now; int createSuccessCount = 0; int recreateSuccessCount = 0; int updateSuccessCount = 0; int faultCount = 0; int delay = 50; UpdateType updateType = UpdateType.Update; int index = 0; double progress = 0; int count = 0; try { //string nodeName = Environment.MachineName; string nodeName = Global.Default.varXml.SystemPlatform.NodeName; string galaxyName = Global.Default.varXml.SystemPlatform.GalaxyName; // create GRAccessAppClass object GRAccessApp grAccess = new GRAccessAppClass(); Report(string.Format("Подключение к Galaxy ({0}/{1})...\r\n", nodeName, galaxyName)); // try to get galaxy IGalaxies gals = grAccess.QueryGalaxies(nodeName); if (gals == null || grAccess.CommandResult.Successful == false) { Report(string.Format("Error!\r\nCustomMessage - {0}\r\nCommandResult - {1}\r\n", grAccess.CommandResult.CustomMessage, grAccess.CommandResult.Text)); return; } else { Report("Подключен.\r\n"); } IGalaxy galaxy = gals[galaxyName]; string login = Global.Default.varXml.SystemPlatform.Login; string password = Global.Default.varXml.SystemPlatform.Password; Report(string.Format("Авторизация {0}/{1}...\r\n", login, password)); // log in galaxy.Login(login, password); ICommandResult cmd; cmd = galaxy.CommandResult; if (!cmd.Successful) { Report("Ошибка авторизации:" + cmd.Text + " : " + cmd.CustomMessage + "\r\n"); return; } else { Report("Авторизован.\r\n"); } XPCollection <ObjectTypeAddonCollection> importFields = new XPCollection <ObjectTypeAddonCollection>(); XPCollection <ObjectType> objTypes2 = new XPCollection <ObjectType>(); ObjectType objType = (ObjectType)_dbInterface1.GetCurrentObject(); ObjectType objTypeThreadSafe = null; foreach (ObjectTypeAddonCollection addon in importFields) { if (addon.ObjectTypeOwner.Oid == objType.Oid) { objTypeThreadSafe = addon.ObjectTypeOwner; break; } } if (objTypeThreadSafe != null) { string templateName = ""; IgObjects queryResult; string[] tagnames = new string[1]; // Почему-то не работает стандартная выборка. //importFields.Filter = CriteriaOperator.Parse("[ObjectTypeOwner] == {0}", objTypeThreadSafe); importFields.Criteria = new BinaryOperator("ObjectTypeOwner", objTypeThreadSafe); importFields.Filter = CriteriaOperator.Parse("[ArchestrAImport]"); count = importFields.Count; templateName = objType.ArchestrATemplate; tagnames[0] = templateName; queryResult = galaxy.QueryObjectsByName(EgObjectIsTemplateOrInstance.gObjectIsInstance, ref tagnames); // get the $UserDefined template tagnames[0] = objType.ArchestrATemplate; queryResult = galaxy.QueryObjectsByName( EgObjectIsTemplateOrInstance.gObjectIsTemplate, ref tagnames); cmd = galaxy.CommandResult; if (!cmd.Successful) { Report("Ошибка инициализации шаблона:" + cmd.Text + " : " + cmd.CustomMessage + "\r\n"); } ITemplate template = (ITemplate)queryResult[1]; Report(string.Format("Обновляем шаблон {0}...\r\n", objType.ArchestrATemplate)); Thread.Sleep(delay); template.CheckOut(); foreach (ObjectTypeAddonCollection field in importFields) { index++; try { if (!string.IsNullOrEmpty(field.AttributeAddon)) { IAttribute att = template.Attributes[field.AttributeAddon]; MxDataType type = GetDataType(field.DataType); if (att == null) { updateType = UpdateType.Create; createSuccessCount++; template.AddUDA(field.AttributeAddon, type, MxAttributeCategory.MxCategoryWriteable_USC_Lockable, MxSecurityClassification.MxSecurityOperate); } else { if (att.DataType == type) { updateType = UpdateType.Update; updateSuccessCount++; } else { updateType = UpdateType.Recreate; recreateSuccessCount++; template.DeleteUDA(field.AttributeAddon); template.AddUDA(field.AttributeAddon, type, MxAttributeCategory.MxCategoryWriteable_USC_Lockable, MxSecurityClassification.MxSecurityOperate); } } att = template.Attributes[field.AttributeAddon]; att.Description = field.Comment; string fieldValue = field.ArchestrAValue; if (!string.IsNullOrEmpty(fieldValue)) { MxValue mxValue = new MxValueClass(); PutMxValue(ref mxValue, type, fieldValue); att.SetValue(mxValue); } progress = ((double)index / count * 1000); progressPossition = (int)Math.Round(progress); switch (updateType) { case UpdateType.Update: Report(string.Format("Поле {0} ({1} / {2}) обновлено удачно.\r\n", field.AttributeAddon, type, fieldValue)); break; case UpdateType.Create: Report(string.Format("Поле {0} ({1} / {2}) создано удачно.\r\n", field.AttributeAddon, type, fieldValue)); break; case UpdateType.Recreate: Report(string.Format("Поле {0} ({1} / {2}) пересоздано удачно.\r\n", field.AttributeAddon, type, fieldValue)); break; } } } catch (Exception ex) { Report(string.Format("У поля {0} есть проблема создания :( [{1} -> {2}] \r\n", templateName, ex.Message, ex.InnerException)); faultCount++; } } template.Save(); template.CheckIn("Check in after adding."); Report(string.Format("Обновлен.\r\n")); galaxy.Logout(); Thread.Sleep(delay); Report(string.Format("Отключение от галактики выполнено. \r\n")); Thread.Sleep(delay); } } catch (Exception ex) { meResultArchestrA.Text = ex.Message + "->" + ex.InnerException + "\r\n"; } TimeSpan diff = DateTime.Now - t0; Report(string.Format("Было потрачено времени: {0} c.\r\n", diff.ToString())); Thread.Sleep(delay); Report(string.Format("Среднее время на один объект: {0:0.#} c.\r\n", diff.TotalSeconds / count)); Thread.Sleep(delay); Report(string.Format("Удачно созданных: {0}.\r\n", createSuccessCount)); Thread.Sleep(delay); Report(string.Format("Удачно обновленных: {0}.\r\n", updateSuccessCount)); Thread.Sleep(delay); Report(string.Format("Удачно пересозданных: {0}.\r\n", recreateSuccessCount)); Thread.Sleep(delay); Report(string.Format("Неудачно выполненных команд: {0}. \r\n", faultCount)); Thread.Sleep(delay); }
// Создаем значение типа MX public static MxValue CreateMxValue(MxDataType type, object value) { MxValue val = new MxValue(); switch (type) { case MxDataType.MxDataTypeUnknown: break; case MxDataType.MxNoData: break; case MxDataType.MxBoolean: val.PutBoolean(bool.Parse(value?.ToString() ?? "false")); break; case MxDataType.MxInteger: val.PutInteger(int.Parse(value?.ToString() ?? "0")); break; case MxDataType.MxFloat: val.PutFloat(float.Parse(value?.ToString() ?? "0")); break; case MxDataType.MxDouble: val.PutDouble(double.Parse(value?.ToString() ?? "0")); break; case MxDataType.MxString: val.PutInternationalString(1049, value?.ToString() ?? ""); break; case MxDataType.MxTime: break; case MxDataType.MxElapsedTime: break; case MxDataType.MxReferenceType: break; case MxDataType.MxStatusType: MxStatus stat = new MxStatus(); stat.success = 1; val.PutMxStatus(stat); break; case MxDataType.MxDataTypeEnum: break; case MxDataType.MxSecurityClassificationEnum: break; case MxDataType.MxDataQualityType: break; case MxDataType.MxQualifiedEnum: break; case MxDataType.MxQualifiedStruct: break; case MxDataType.MxInternationalizedString: val.PutInternationalString(1049, value?.ToString() ?? ""); break; case MxDataType.MxBigString: val.PutInternationalString(1049, value?.ToString() ?? ""); break; case MxDataType.MxDataTypeEND: break; default: break; } return(val); }
public static GDataTypeEnum GetGDataType(MxDataType type) { switch (type) { #region Соответствие типов MxDataType -> GDataTypeEnum case MxDataType.MxDataTypeUnknown: return(GDataTypeEnum.Unknown); case MxDataType.MxNoData: return(GDataTypeEnum.NoData); case MxDataType.MxBoolean: return(GDataTypeEnum.Boolean); case MxDataType.MxInteger: return(GDataTypeEnum.Integer); case MxDataType.MxFloat: return(GDataTypeEnum.Float); case MxDataType.MxDouble: return(GDataTypeEnum.Double); case MxDataType.MxString: return(GDataTypeEnum.String); case MxDataType.MxTime: return(GDataTypeEnum.Time); case MxDataType.MxElapsedTime: return(GDataTypeEnum.ElapsedTime); case MxDataType.MxReferenceType: return(GDataTypeEnum.ReferenceType); case MxDataType.MxStatusType: return(GDataTypeEnum.StatusType); case MxDataType.MxDataTypeEnum: return(GDataTypeEnum.DataTypeEnum); case MxDataType.MxSecurityClassificationEnum: return(GDataTypeEnum.SecurityClassificationEnum); case MxDataType.MxDataQualityType: return(GDataTypeEnum.DataQualityType); case MxDataType.MxQualifiedEnum: return(GDataTypeEnum.QualifiedEnum); case MxDataType.MxQualifiedStruct: return(GDataTypeEnum.QualifiedStruct); case MxDataType.MxInternationalizedString: return(GDataTypeEnum.InternationalizedString); case MxDataType.MxBigString: return(GDataTypeEnum.BigString); case MxDataType.MxDataTypeEND: return(GDataTypeEnum.DataTypeEND); #endregion default: return(GDataTypeEnum.Unknown); } }