本文是版主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
我创建了<<协同开发,轻松入门>>的学习清单,推荐给你,和我一起学习交流吧!
<<协同开发,轻松入门>>
查看往期精选:
【汇总】金蝶云·星空-协同开发 | 产品应用典型/热门问答精选
推荐阅读