2014-12-31 75 views
1

我有一個bql聚合查詢,我想按年和月分組。 這在SQL中會很簡單,但在BQL中並不那麼明顯。BQL是否允許使用DatePart?

表(DAC)中有一個日期字段。 如果我單獨按日期字段分組,它基本上給我每個人的記錄。 我想在日期和月份中的某一年進行分組。

BQL是否有能力像DATEPART結果一樣在SQL和組中抓取DATEPART?

我看到它有一個datediff函數,但沒有關於我想要做什麼的文檔。

+0

這是爲了將數據分組到現有的Acumatica表或您創建的表上嗎? – Gabriel

+0

這是爲了在自定義表格中的日期進行分組,儘管我希望能夠在任何可能需要聚合數據的日期字段上使用它。 – xDJR1875

+0

Max給了你一個非常好的示例,其他選項將會在你的自定義表中有一個包含YYYYMM的文本字段,你將自己填充。這是我如何做到這一點,以避免需要編寫一個自定義的BQL操作數 – Gabriel

回答

2

我希望這對你的作品:

public sealed class DatePart 
{ 
    public const string Day = "dd"; 
    public const string Hour = "hh"; 
    public const string Minute = "mi"; 
    public const string Month = "mm"; 
    public const string Year = "yyyy"; 
    public const string Second = "ss"; 
    public const string Millisecond = "ms"; 

    public class day : Constant<string> { public day() : base(Day) { } } 
    public class hour : Constant<string> { public hour() : base(Hour) { } } 
    public class minute : Constant<string> { public minute() : base(Minute) { } } 
    public class month : Constant<string> { public month() : base(Month) { } } 
    public class year : Constant<string> { public year() : base(Year) { } } 
    public class second : Constant<string> { public second() : base(Second) { } } 
    public class millisecond : Constant<string> { public millisecond() : base(Millisecond) { } } 
} 


public sealed class DatePart<UOM, Operand> : BqlFunction, IBqlOperand, IBqlCreator 
    where Operand: IBqlOperand 
    where UOM : Constant<string>, new() 
{ 
    private IBqlCreator _operand; 

    public void Verify(PXCache cache, object item, List<object> pars, ref bool? result, ref object value) 
    { 
     value = null; 
     object date1; 
     if (!getValue<Operand>(ref _operand, cache, item, pars, ref result, out date1) || date1 == null) return; 


     DateTime period = Convert.ToDateTime(date1); 
     switch ((string)new UOM().Value) 
     { 
      case DatePart.Day: 
       value = Convert.ToInt32(period.Day); 
       break; 
      case DatePart.Hour: 
       value = Convert.ToInt32(period.Hour); 
       break; 
      case DatePart.Minute: 
       value = Convert.ToInt32(period.Minute); 
       break; 
      case DatePart.Second: 
       value = Convert.ToInt32(period.Second); 
       break; 
      case DatePart.Millisecond: 
       value = Convert.ToInt32(period.Millisecond); 
       break; 
      case DatePart.Month: 
       value = Convert.ToInt32(period.Month); 
       break; 
      case DatePart.Year: 
       value = Convert.ToInt32(period.Year); 
       break; 
     } 
    } 


    public void Parse(PXGraph graph, List<IBqlParameter> pars, List<Type> tables, List<Type> fields, 
         List<IBqlSortColumn> sortColumns, StringBuilder text, BqlCommand.Selection selection) 
    { 
     if (graph != null && text != null) 
     { 
      text.Append(" DATEPART(").Append((string)new UOM().Value).Append(", "); 
      parseOperand<Operand>(ref _operand, graph, pars, tables, fields, sortColumns, text, selection); 
      text.Append(")"); 
     } 
     else 
     { 
      parseOperand<Operand>(ref _operand, graph, pars, tables, fields, sortColumns, text, selection); 
     } 
    } 
}  

注:這是具體的MSSQL,不會對MySQL的工作。

+0

如何創建自定義BQL操作數的很好例子。謝謝Max! – Gabriel

+0

我會試試這個,讓你知道。謝謝! – xDJR1875