public static PXModel PrepareForPopulationPyramid(this PXModel px, string maleValueName) { px = px.Xerox(); if (!px.Meta.Variables.Any(x => x.Values.Any(z => z.Value.ToLower() == maleValueName.ToLower()))) { throw new PxExtendExceptions.PxExtendException("No variables contains a value with the supplied male value name."); } DataTable dt = px.AsDataTable(); int count = -1; foreach (DataRow row in dt.Rows) { count++; if (row.ItemArray.Select(x => x.ToString().ToLower()).Contains(maleValueName.ToLower()) && px.Data.ReadElement(count) > 0) { px.Data.WriteElement(count, Math.Abs(px.Data.ReadElement(count)) * -1); } } return(px); }
/// <summary> /// Creates a CSV string from a PXModel instance. /// </summary> /// <param name="px"></param> /// <returns></returns> public static string AsCSV(this PXModel px) { StringBuilder sb = new StringBuilder(); DataTable table = px.AsDataTable(false, true); foreach (DataRow r in table.Rows) { sb.AppendLine(String.Join(";", r.ItemArray.Select(x => x.ToString()).ToArray())); } return(sb.ToString()); }
/// <summary> /// Creates a DataTable from a PXModel instance. /// Includes values in datatable. /// Does not include codes in datatable. /// Does not include columns with info about codes and texts. /// This overload should be removed when we move to 4.0 - defaults used on non-obsolete overload. /// </summary> /// <param name="px"></param> /// <returns></returns> //TODO: 4.0: Remove this overload when migrating to 4.0 public static DataTable AsDataTable(this PXModel px) { return(px.AsDataTable(false, false)); }
/// <summary> /// Creates a DataTable from a PXModel instance. Joins the columns for series name if several. /// This overload includes conversion of data for a specific variable/value to negative numbers for usage with population chart. /// </summary> /// <param name="px"></param> /// <param name="variableName">Variable for which data for a specific value is converted to negative numbers. If null, value can only be present for one variable.</param> /// <param name="valueTextOrValue">Value for which data is converted to negative numbers.</param> /// <returns></returns> public static DataTable AsDataTableCompressed(this PXModel px, string variableName, string valueTextOrValue) { var dt = px.AsDataTable(true, false); if (valueTextOrValue != null) { var columnsWithValue = dt.Columns.OfType <DataColumn>() .Where( column => dt.Rows.OfType <DataRow>() .Select(row => row.Field <object>(column)) .Any(o => o is string && o.ToString() == valueTextOrValue) ) .ToArray(); if (columnsWithValue.Count() != 1) { throw variableName == null ? new PxExtendExceptions.ConvertToNegativeValuesException("Supplied value must be present for one variable og variable must be suplied.") : new PxExtendExceptions.ConvertToNegativeValuesException("Supplied variable/value-combination must be present."); } variableName = variableName ?? columnsWithValue.Single().ColumnName; } var table = new DataTable(); table.Columns.AddRange( new[] { new DataColumn("Series"), new DataColumn("Label"), new DataColumn("DATA", typeof(double)), new DataColumn("CODES"), new DataColumn("TEXT") } ); foreach (DataRow row in dt.Rows) { double d; object data; if (Double.TryParse(row.ItemArray.Take(row.ItemArray.Length - 2).Last().ToString(), out d)) { if (variableName == null) { data = d; } else { if (d < 0) { throw new PxExtendExceptions.ConvertToNegativeValuesException("Negative values not allowed, when conversion enabled."); } data = row.Field <string>(variableName) == valueTextOrValue ? d * -1 : d; } } else { data = DBNull.Value; } var r = table.NewRow(); r[0] = row.ItemArray.Length < 5 ? "Series 1" : String.Join(", ", row.ItemArray.Take(row.ItemArray.Length - 4).Select(x => x.ToString()).ToArray()); r[1] = row.ItemArray.Length < 5 ? row.ItemArray.First() : row.ItemArray[row.ItemArray.Length - 4]; r[2] = data; r[3] = row.ItemArray.Take(row.ItemArray.Length - 1).Last(); r[4] = row.ItemArray.Last(); table.Rows.Add(r); } return(table); }