本文是金蝶云·星空版主OUT_MAN发布的协同开发产品应用中的典型/热门问答汇总,包含数据行隔行标注、自定义SQL报表数据规则设置、获取FormID的方法、采购订单审核插件无效的处理、执行计划自动下推单据的实现以及服务插件辅助资料赋值等问题及其解决方案,并附有问题来源链接。
各位社区的小伙伴们,大家好,我是 版主 OUT_MAN
在金蝶云·星空-协同开发产品应用中,你需要了解的典型/热门问答都在这里!
本帖每月持续更新,欢迎小伙伴们点赞,收藏本帖,CTRL+F关键词搜索,以便随时查看、扩充知识哟
嗨,朋友们!金蝶云社区创见者评选火热进行中,点击链接,和我一起参与投票,小米手环、颈部按摩仪等大奖等你赢!
【第24期】
更新日期:2024-9
1、 数据行隔行设置不同的标注符号?
问题描述:
偶数行,不加后缀,动态字段 如何实现?
解决方案:
这样写: FMaterialId.FNumber if(FPOOrderEntry_FSeq%2==0) else ("{0}后缀").format( FMaterialId.FNumber)
FEntity_Seq 改成 :int(字段[-4:]) F_RXDP_Text_ca9 if(int(F_RXDP_Text_ca9[-4:])%2==0) else ("{0}后缀").format( F_RXDP_Text_ca9)
问题来源:https://vip.kingdee.com/link/s/liGr9
2、 自定义SQL报表不能设置数据规则怎么办
问题描述:
自定义的sql报表是关于销售订单数据的,没法设置数据规则的话每个业务员都能看见别人的订单
解决方案:
系统不能自动引用权限里面的数据规则。
要自己在SQL里面拼接过滤条件,系统提供了几个默认的关键字:当前用户ID、当前用户对应的组织。
基于这个系统变量,可以自己拼接子查询过滤,例如,根据当前用户ID对应的业务员,来过滤业务单据!
数据规则复杂的话,就不建议使用权限配置里的数据规则了,因为无法直接通过SQL解析出来,可以自己二开一个单据或者基础资料,设置每个用户对应的数据范围,例如,维护用户能看到哪些客户,然后SQL查询的时候基于这个数据来关联过滤!
问题来源:https://vip.kingdee.com/link/s/liG5a
3、 代码获取的formid与BOS不同
问题描述:
代码 string billtype = a.DynamicObjectType.Name.ToString();获取表单fromid 发现有部分单据获取的fromid与单据的实际fromid不同 是否有方法能获取是一样的
解决方案:
a.DynamicObjectType.Name,这个获取到的是实体的ORM实体标识。
获取FormID,要从BusinessInfo里面获取。
BInfo=this.View.BillBusinessInfo
formId= BInfo. GetForm().Id;
问题来源:https://vip.kingdee.com/link/s/liGi2
4、 想在采购订单做一个审核按钮 的插件没有效果怎么办
问题描述:
想在采购订单做一个审核按钮 的插件没有效果怎么办
解决方案:
在BeforeExecureOperationTransaction事件中设置e.cancel=true ,设置cancelMessage,不要强行抛出错误
问题来源:https://vip.kingdee.com/link/s/liGnh
5、 执行计划,怎么实现进行自动下推单据
问题描述:
用执行计划插件,怎么实现进行自动下推单据,怎么去拿到源单的数据,在进行下推操作
解决方案:
直接通过SQL语句查询,筛选出符合条件的单据内码就行。 //筛选大于2024年1月1日的销售订单 string sql = @"/*dialect*/select FID from t_sal_order where fdate>='{0}'"; DataSet ds = DBServiceHelper.ExecuteDataSet(ctx,string.Format(sql,new DateTime(2024,01,01))); if (ds.Tables[0].Rows.Count>0) { foreach (DataRow row in ds.Tables[0].Rows) { long fid = Convert.ToInt64(row["FID"]); //调用下推服务 //TODO } } 调用下推服务-整单下推: public void doPush(Context ctx) { FormMetadata targetBill = MetaDataServiceHelper.Load(ctx, "目标单据formid") as FormMetadata; var rule = ConvertServiceHelper.GetConvertRule(ctx, "单据转换标识"); ListSelectedRow[] selectedRowsBill = GenerateListSelectedRowsBill("表单内码", "源单fromid"); //选择下推的单据 ConvertOperationResult operationResult = null; Dictionary<string, object> custParams = new Dictionary<string, object>(); try { PushArgs pushArgs = new PushArgs(rule.Rule, selectedRowsBill) { TargetBillTypeId = "3c6f819d78ac4d5981891956c4595b20",//单据类型 TargetOrgId = 0, CustomParams = custParams, }; var opt = OperateOption.Create(); opt.SetVariableValue("ValidatePermission", true);//取消权限校验 operationResult = ConvertServiceHelper.Push(ctx, pushArgs, opt); } catch (Exception ex) { string message = ex.Message; } if (operationResult != null) { DynamicObject[] objs = (from p in operationResult.TargetDataEntities select p.DataEntity).ToArray(); foreach (DynamicObject obj in objs) { //obj就是下推之后产生的单据数据包: OperateOption saveOption = OperateOption.Create(); saveOption.SetVariableValue("IgnoreWarning", true); saveOption.SetVariableValue("_IgnoreInteraction_", true); IOperationResult rs2 = BusinessDataServiceHelper.Save(ctx, targetBill.BusinessInfo, obj, saveOption); } } } /// <summary> /// 选择整单下推 /// </summary> /// <param name="fid"></param> /// <param name="strFormId"></param> /// <returns></returns> private ListSelectedRow[] GenerateListSelectedRowsBill(string fid, string strFormId) { IList<ListSelectedRow> source = new List<ListSelectedRow>(); ListSelectedRow singleRow = new ListSelectedRow(fid, "0", 0, strFormId); source.Add(singleRow); return source.ToArray<ListSelectedRow>(); }
问题来源:https://vip.kingdee.com/link/s/l5I1r
6、 服务插件辅助资料赋值
问题描述:
需要在服务插件中给某个辅助资料赋值,照着基础资料的数据包赋值弄好像不行,请问有这个辅助资料的数据包赋值代码吗,
解决方案:
改一下抓数据包的方式试试。 BaseDataField field = this.BusinessInfo.GetField("字段标识") as BaseDataField; obj["实体属性_Id"] = "内码"; obj["实体属性"] =BusinessDataServiceHelper.LoadSingle(this.Context, "内码",field.RefFormDynamicObjectType) ;
问题来源:https://vip.kingdee.com/link/s/liYlz
7、 自建单据中两个字段做的值更新服务在保存时报错
问题描述:
1、问题描述: 两个字段做的值更新服务,在保存时提示表达式错误, 2、错误提示:
3、值更新服务配置与表达式测试
解决方案:
你不能配置到表头触发,要配置到单据体的实体服务规则里面。 你测试的时候,当前实体选择的是 单据体 ,所以没报错
问题来源:https://vip.kingdee.com/link/s/liYS5
8、 简单账表动态显示列,打开账表显示的是空白的
问题描述:
简单账表调用存储过程来实现,打开账表是空白的,这个是什么原因临时表的数据
临时表的数字部分为动态列,这部分和代码中的动态列是同样的数据
代码如下
public class Class1 : SysReportBaseService
{
public override void Initialize()
{
base.Initialize();
ReportProperty.IsUIDesignerColumns = false;
ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL;
IsCreateTempTableByPlugin = true;
ReportProperty.IdentityFieldName = "FIDENTITYID";
}
DynamicObjectCollection dt;
public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName)
{
base.BuilderReportSqlAndTempTable(filter, tableName);
DynamicObject dynamicObject = filter.FilterParameter.CustomFilter;
DateTime Date = Convert.ToDateTime(dynamicObject["F_StartDate"]);
DateTime eDate = Convert.ToDateTime(dynamicObject["F_EndDate"]);
List<SqlParam> sqlParams = new List<SqlParam>();
sqlParams.Add(new SqlParam("@FTempTable", KDDbType.AnsiString, tableName));
sqlParams.Add(new SqlParam("@sdate", KDDbType.AnsiString, Date));
sqlParams.Add(new SqlParam("@edate", KDDbType.AnsiString, eDate));
DBUtils.ExecuteStoreProcedure(this.Context, "XRK_QXLX_5", sqlParams);
string sSQL = string.Format(@"/*dialect*/select case when [tian] = 32 then CONVERT(nvarchar, '合计') else CONVERT(nvarchar, [tian]) end as tian from table3");
dt = DBUtils.ExecuteDynamicObject(this.Context, sSQL, null, null, CommandType.Text, null);
string sSQL1 = string.Format(@"/*dialect*/select * into "+ tableName +" from qxmx6");
DBUtils.Execute(this.Context, sSQL1);
}
public override ReportHeader GetReportHeaders(IRptParams filter)
{
base.GetReportHeaders(filter);
DynamicObject dynamicObject = filter.FilterParameter.CustomFilter;
DateTime SDate = Convert.ToDateTime(dynamicObject["F_StartDate"]);
DateTime EDate = Convert.ToDateTime(dynamicObject["F_EndDate"]);
ReportHeader header = new ReportHeader();
//header.AddChild("FIDENTITYID", new LocaleValue("FIDENTITYID"));
header.AddChild("工序说明", new LocaleValue("工序说明"));
header.AddChild("缺陷类型", new LocaleValue("缺陷类型"));
//wl.ColIndex = 0;
for (var i = 0; i < dt.Count; i++)
{
var date = dt[i][0].ToString();
header.AddChild(date, new LocaleValue(date));
}
return header;
}
}
解决方案:
header.AddChild(date, new LocaleValue(date)); 这里的第一个参数是字段Key,不要用纯数字,前面加个字母嘛:F1,F2,F3....
问题来源:https://vip.kingdee.com/link/s/liYKi
我创建了<<协同开发,轻松入门>>的学习清单,推荐给你,和我一起学习交流吧!
<<协同开发,轻松入门>>
查看往期精选:
【汇总】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选
推荐阅读