C# 针灸Bql与仿制药C
这是AcumaticaERP特有的。我创建了一个BaseBlcHelper类,如下所示:C# 针灸Bql与仿制药C,c#,.net,acumatica,C#,.net,Acumatica,这是AcumaticaERP特有的。我创建了一个BaseBlcHelper类,如下所示: public abstract class BaseBlcHelper<TBlcObject, TDacObject> : PXGraph<TBlcObject>,
public abstract class BaseBlcHelper<TBlcObject, TDacObject> :
PXGraph<TBlcObject>,
IBaseBlcHelper<TDacObject, TDacObject> where TBlcObject : PXGraph
where TDacObject : class, IBqlTable, new()
Vendor next_vendor = (Vendor)PXSelect<Vendor, Where<Vendor.vendor1099, Equal<True>>, OrderBy<Desc<Vendor.acctCD>>>.Select(this);
我创建这个类是因为我想我可以在其中加入一些共享功能。
问题就在这里。当我有这样的select语句时:
public abstract class BaseBlcHelper<TBlcObject, TDacObject> :
PXGraph<TBlcObject>,
IBaseBlcHelper<TDacObject, TDacObject> where TBlcObject : PXGraph
where TDacObject : class, IBqlTable, new()
Vendor next_vendor = (Vendor)PXSelect<Vendor, Where<Vendor.vendor1099, Equal<True>>, OrderBy<Desc<Vendor.acctCD>>>.Select(this);
如何将TDacObject泛型对象解析为查询的Vendor.vendor1099部分等等?我假设您将创建将DAC字段参数作为泛型类型的帮助器方法 下面是一个以通用图、DAC类型、字段类型和字段值为参数的示例原型:
public static List<TDacObject> Select<TFieldObject>(this PXGraph graph, object fieldParamValue)
where TFieldObject : class,IBqlField
where TDacObject : class,IBqlTable
{
// 'graph' will be used to provide the required context for query execution
// 'TDacObject' is a generic DAC type used in the query
// 'TFieldObject' is a generic DAC type used in the query
// 'fieldParamValue' is a generic value you can use in your query
}
使用泛型类型创建和执行查询的技巧是使用泛型类型创建BQLCommand对象。之后,您可以创建一个PXView对象,该对象将BQLCommand作为输入参数。最后,执行PXView的Select方法来执行BQL查询
下面是一些通用的按ID选择方法的示例代码。它应该给你一个过程的基本概念:
// Roughly equivalent to:
// PXSelect<TDacObject, Where<TDacObject.TDacField, Equals<Required<fieldParamValue>>>>
// TDacObject below is extracted from the type 'fieldType.DeclaringType'
// You can substitute that for your generic DAC Type entity
public static List<T> SelectById<T, TField>(this PXGraph graph, object id)
where TField : class, IBqlField
where T : class, IBqlTable
{
return SelectById(graph, typeof(TField), id).Cast<T>().ToList();
}
public static List<object> SelectById(this PXGraph graph, Type fieldType, object id)
{
var select = CreateSelectCommand(fieldType);
var view = GetView(graph, fieldType, select);
return view.SelectMulti(id);
}
public static BqlCommand CreateSelectCommand(Type fieldType)
{
return CreateSelectCommand(fieldType.DeclaringType, fieldType);
}
public static BqlCommand CreateSelectCommand(Type entityType, Type fieldType)
{
Type required = BqlCommand.Compose(typeof(Required<>), fieldType);
Type equal = BqlCommand.Compose(typeof(Equal<>), required);
Type where = BqlCommand.Compose(typeof(Where<,>), fieldType, equal);
return BqlCommand.CreateInstance(typeof(Select<,>), entityType, where);
}
public static PXView GetView(this PXGraph graph, Type fieldType, BqlCommand select)
{
PXView view;
graph.Views.TryGetValue(fieldType.FullName, out view);
if (view == null)
{
view = new PXView(graph, false, @select);
graph.Views.Add(fieldType.FullName, view);
graph.EnsureCachePersistence(fieldType.DeclaringType);
}
return view;
}