代码之家  ›  专栏  ›  技术社区  ›  Michel Michels

用于在SQL Server中保存选定月份并在WPF中显示的数据结构[已关闭]

  •  -1
  • Michel Michels  · 技术社区  · 7 年前

    我正在用C语言开发软件。NET、WPF中的前端和SQL Server数据库来定期开具发票,有些客户不希望在一年中的特定月份开具发票。此发票是定期开具的,与实际年份无关。发票由具有特定参数的“合同”对象生成,以创建定期发票。

    当用户创建合同时,理想情况下,他应该在一年中的每个月都看到一个复选框,以取消选中何时不应为合同开具发票。现在,为了节省这些用户选择的月份,我需要某种数据结构;运行时和SQL Server。

    听起来我应该用 带标志的枚举 ,但我一直坚持这个想法,因为它与XAML的配合不太好(或者我缺乏经验,无法让它发挥作用)。我也可以每月在我的合同对象中写一个布尔值,但这似乎是个愚蠢的想法,不是吗?

    问题 :在SQL Server中运行时,我应该使用什么数据结构来保存用户选择的月份?

    编辑:举例说明:客户可以是学校,学校在7月和8月(我所在的地方)关门。这几个月不应该给他们开发票。其他公司可以在不同的月份停业,所以我不能只创建一个布尔值“IsSchool”并将其用作过滤器。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Tab Alleman    7 年前

    就我个人而言,我会将它们存储在具有两列的桥接表中: User Month

    除非你在问题中遗漏了一些重要的细节,否则我觉得你似乎有点想得太多了。

    由于并不是每个人都能理解我的建议,这里有一个非常简短的例子:

    Contract   Month
    1          1
    1          2
    1          3
    2          3
    2          5
    2          7
    3          1
    3          11
    3          12 
    

    可能会有很多行,但如果表被索引,无论它有多长,它都会非常快。

        2
  •  1
  •   Community CDub    4 年前

    您当然可以使用标志来实现这一点。

    为了便于解释,假设您将复选框的值收集到一个列表中:

    [Flags]
    enum MonthsOfYear
    {        
        January = 1,
        February = 2,
        March = 4,
        April = 8,
        May = 16,
        June = 32,
        July = 64,
        August = 128,
        September = 256,
        October = 512,
        November = 1024,
        December = 2048
    }
    
    public class Months
    {
        internal static MonthsOfYear CalculateEnum(List<bool> checkboxes)
        {
            MonthsOfYear value = 0;
            var month = 0;
            for (int i = 0; i < 12; i++)
            {
                month = (i == 0) ? 1 : month * 2;
                if (checkboxes[i])
                    value |= (MonthsOfYear)Enum.Parse(typeof(MonthsOfYear), month.ToString());
            }
            return value;
        }
    
        internal static List<bool> GetFlagsFromEnum(MonthsOfYear value)
        {
            List<bool> checkboxes = new List<bool>();
            var month = 0;
            for (int i = 0; i < 12; i++)
            {
                month = (i == 0) ? 1 : month * 2;
                checkboxes.Add((value & (MonthsOfYear)Enum.Parse(typeof(MonthsOfYear), month.ToString())) != 0);
            }
            return checkboxes;
        }
    }
    

    示例用法:

    List<bool> checkboxes = new List<bool>() { true, false, true, false, true, false, true, false, true, false, true, false };
    Output("Original: ", checkboxes);
    var selectionValue = Months.CalculateEnum(checkboxes);
    var unpackedCheckboxes = Months.GetFlagsFromEnum(selectionValue);
    Output("Unpacked: ", unpackedCheckboxes);        
    
    checkboxes = new List<bool>() { true, true, true, false, false, false, true, true, true, false, false, true};
    Output("Original: ", checkboxes);
    selectionValue = Months.CalculateEnum(checkboxes);
    unpackedCheckboxes = Months.GetFlagsFromEnum(selectionValue);
    Output("Unpacked: ", unpackedCheckboxes);
    

    输出:

    原件:: 真,假,真,假,真,假,真,假,真,假,真,假,真,假

    未打包:: 真,假,真,假,真,假,真,假,真,假,真,假,真,假

    原件:: 真,真,真,假,假,假,真,真,真,假,假,真

    未打包:: 真,真,真,假,假,假,真,真,真,假,假,真

    我在几分钟内就把这件事说了出来。重要的是想法。