예제 #1
0
        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);
        }
예제 #2
0
        /// <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());
        }
예제 #3
0
 /// <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));
 }
예제 #4
0
        /// <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);
        }