本文是金蝶云·星空-BOS平台应用的热门问答汇总,包括:1.SQL报表日期默认设置当日的方法;2.解决从dataset回调方式给单据体赋值不对齐的问题;3.判断单据是否原厂或自定义的方法;4.下拉字段设置默认缺省值的方法;5.移动端列表分录行按钮点击事件的实现;6.单据菜单按钮显示在审批流中的方法;7.配置供应商名称必须使用大括号的方法。
在金蝶云·星空-BOS平台应用中,你需要了解的典型/热门问答都在这里!
本帖不定期持续更新,欢迎小伙伴们收藏本帖,以便随时查看、扩充知识哟
【第32期】
1、SQL报表日期能设置默认日期当日?
问题描述:
请问大神,自定义报表日期,如何设置打开时候,两个日期过滤显示是当日
解决方案:
可以默认是当前日期:
问题来源:
2、从dataset回调方式给单据体赋值,为啥对不上了
问题描述:
entityKey = "F_Entity" def OnActionComplete(dt): # 单据体动态创建列之后通过回调方式为该单据体添加数据 grid = this.View.GetControl(entityKey) grid.SetData(GetEntityData(dt)) def GetColumns(): # 生成构建表格的指令集 entityAppearance = this.View.LayoutInfo.GetEntityAppearance(entityKey) gridMeta = entityAppearance.CreateControl() gridMeta.Put("primaryKey", ExtConst.GRID_INDEX_FIELD_KEY) gridMeta.Put("indexKey", ExtConst.GRID_INDEX_FIELD_KEY) gridMeta.Put("startRow", 0) gridMeta.Put("pageSize", entityAppearance.PageRows) # 生成列 columns = gridMeta["columns"] for i in range(len(fieldNames)): fieldName = fieldNames[i] col = JSONObject() if fieldName.find('zkh')>0: xtype = "textfield" if fieldName.find('_20')>0: xtype = "decimalfield" col.Put("fieldscale",2) col.Put("fieldprecision",13) col.Put("xtype", xtype) col.Put("colIndex", i + 2) col.Put("dataIndex", fieldName) col.Put("header", fieldName.replace('F_','').replace('_','-').replace('zkhmc','Customer Group')) col.Put("width", "100") col.Put("visible", True) col.Put("enable", True) columns.Add(col) return gridMeta def BindData(e): final_sql=" /*dialect*/ exec u_get_h_hz 0, '{0}'".format( filterWhere.replace("'", "''")) this.View.Model.SetValue("F_log",final_sql) this.View.UpdateView("F_log") dt=DBUtils.ExecuteDataSet(this.Context, final_sql) actionData = JSONObject() actionData["key"] = entityKey actionData["methodname"] = "CreateDyanmicList" coMeta = JSONArray() # 添加需要创建的列 coMeta.Add(GetColumns()) coMeta.Add("") actionData["args"] = coMeta this.View.AddAction("InvokeControlMethod", actionData, lambda x: OnActionComplete(dt)) def GetEntityData(dt): # 获取 DataSet 的第一个 DataTable ds = dt.Tables[0] # 假设我们只处理第一个表 data = JSONObject() rows = JSONArray() # 获取行数 row_count = ds.Rows.Count # 遍历每一行 for x in range(row_count): row = JSONArray() # 遍历 DataTable 的列名 for col in ds.Columns: fieldName = col.ColumnName # 获取列名 value = ds.Rows[x][fieldName] # 使用列名提取值 # 处理可能的空值 if value is None: value = "null" # 或者可以设置为其他默认值 #row.Add(x) row.Add("{0},{1}".format(fieldName, value)) rows.Add(row) data.Put("rows", rows) return data我现在的问题是出在最后一个def里了
这个getentirydata,填充的单据体数据乱了,没有按dataset里的列对单据体的列进行填充
解决方案:
分录构建
界面填充,有视图的情况下,借助视图的相关功能,快速填写单据体,这种方法简单粗暴,对于有界面的情况下,快速填写实体有帮助,但是有的时候存在模型交互情况,需要添加 this.View.Mode.BeginInit()和this.View.Model.EndInit()语句进行初始化构造。
//清空分录包 this.View.Model.DeleteEntryData("分录Key"); //获取实体信息 var rEntity = this.View.Model.BusinessInfo.GetEntity("分录Key"); int index = 0; foreach (var item in invStock) { //新增行 this.View.Model.CreateNewEntryRow(rEntity, index); //按分录填值 this.View.Model.SetValue("行字段", Convert.ToInt64(item["FMATERIALID"]), index); this.View.Model.SetValue("行字段", Convert.ToInt64(item["FAUXPROPID"]), index); index++; } //刷新分录 this.View.UpdateView("F_QPOV_Entity");
对于动态表单来说,数据源是完全不确定的情况下,初始化取数过后,在创建数据包的时候,构建业务数据包。缺点,对于基础资料类的数据,仍然需要使用SetValue,或者需要LoadReference,否则看到的基础资料是空值。
public override void CreateNewData(BizDataEventArgs e) { base.CreateNewData(e); if (lstProxy == null || lstProxy.Count<= 0) { return; } //动态对象类型 var billType = this.View.Model.BusinessInfo.GetDynamicObjectType(); //实体包 DynamicObject billObj = new DynamicObject(billType); //Entity var entryEntity = this.View.Model.BusinessInfo.GetEntryEntity("分录Key"); foreach (var item in lstProxy) { var rowObj = new DynamicObject(entryEntity.DynamicObjectType); rowObj["行字段"] = item.Number; rowObj["行字段"] = item.Name; //对属性包填值 entryEntity.DynamicProperty.GetValue<DynamicObjectCollection>(billObj).Add(rowObj); } 给业务包赋值 e.BizDataObject = billObj; }
问题来源:
3、如何知道单据是原厂的还是自定义的?
问题描述:
如何知道单据是原厂的还是自定义的?
解决方案:
原厂的单据都是KD开发识别码
编辑于 2024年10月08日 15:48:18
可是我开发商标识是企业的话,第一层都不是KD了,我如何判断?
看这个
问题来源:
4、下拉字段没法设置默认缺省值?
问题描述:
下拉字段没法设置默认缺省值?想在下拉字段设置一个默认值
解决方案:
bos里面缺省值勾选一个就可以了
问题来源:
5、移动bos列表分录行按钮点击事件
问题描述:
在移动端列表分录行里面加了个按钮,想做个点击事件,但buttonclick 和entrybuttonclick试了都不行,请问还有其它触发事件吗?
解决方案:
一、概述:
在代理分录和单据体(移动列表)中配置操作菜单的方式有很多,比如用按钮、弹窗菜单、侧滑菜单等等,本篇要讲的是V7.5新加的一种自带列表行菜单,即单据体菜单。
二、适用版本:
适用于V7.5.1.202010及以上,移动运行时新框架xmobile版
三、列表行菜单(单据体菜单)
注:设置后,菜单会带出行的序号
3.1 菜单分为:
a. 单据体行菜单:菜单与列表行循环出现
b. 单据体菜单: 菜单出现在列表底部
3.2. 配置位置:在代理分录或单据体(移动列表)的【菜单集合】属性中配置
3.3 添加增/删/改,绑定操作
略
3.4 运行时效果
问题来源:
6、如何将单据的菜单按钮显示在审批流中
问题描述:
请问如何将单据上的菜单按钮显示在审批流中?如下推
解决方案:
流程配置中心里面看看有没有这个按钮可以显示
问题来源:
7、怎么配置供应商名称限制公司名称的括号必须大括号
问题描述:
怎么配置供应商名称限制公司名称的括号必须大括号
解决方案:
使用正则表达式,请参考:正则表达式在金蝶云星空中的运用技巧:对用户输入的值进行复杂判断与实时校验
注:在正则表达式中,大括号字符及括号字符有特殊的含义,因此需要使用转义字符\\
来转义。
问题来源:
8、工作流运行平台移动端如何只显示标题或者是只显示内容
问题描述:
工作流运行平台移动端如何只显示标题或者是只显示内容
解决方案:
这个要在流程设计中心里面设置流程标题/内容
编辑于 2024年10月15日 15:11:45
问题来源:
9、云星空直接SQL报表,关键字,数据来源如何新增?
问题描述:
如图,数据来源处我想自定义一个【是否综合本位币】,两个选择【是】或者【否】,如何新增?
解决方案:
编辑于 2024年10月14日 11:03:33
数据来源的选择不能自定义??
勾上必录
不能自定义或者你可以选择枚举值 去找个是否的枚举值来选择
问题来源:
10、单据列表上合并套打是否支持只打印单据头信息
问题描述:
单据列表上合并套打是否支持只打印单据头信息
解决方案:
做个没有数据表格的套打,问题是的单据体字段合并你得配置一个Python插件
# 表单插件和列表插件
from System import StringComparison
from System import String
# 套打单据编号合并打印
def OnPrepareNotePrintData(f):
if f.DataSourceId.Equals("FBillHead", StringComparison.OrdinalIgnoreCase):
if f.IsMergedPrint:
list = [];
for obj in f.DataObjects:
list.append(obj["FBillNo"].ToString())
for obj in f.DataObjects:
obj["FBillNo"] = ','.join(list);
问题来源:
11、 列表过滤条件框不生效
问题描述:
二开了一个新的表单,并且为他新写了一个列表过滤框,过滤框未生效,我看到社区有说,二开的单据过滤框是需要重新写插件的,但是并没有找到详细的帖子说明要怎么二开
解决方案:
首先,你这个列表过滤框,建议继承系统默认的列表过滤(BOS_StandardFilter)
然后,你要在你自定义的表单里面,去修改【过滤窗口业务对象】
最后,自定义的过滤字段,通过列表插件来获取后,干预列表过滤,核心就是PrepareFilterParameter事件
参考:二开案例.列表插件.通过发布菜单时添加自定义参数控制列表过滤结果
二开案例.列表插件.使用PrepareFilterParameter事件干预列表查询
e.CustomFilter可以获取到自定义过滤字段的实体数据包
可以自行在社区搜索更多PrepareFilterParameter的用法
问题来源:
12、 如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?
问题描述:
如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?
解决方案:
检查组合字段唯一性这边这个选项不勾选就会检查单据列表内唯一
问题来源:
如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?
13、 表达式如何获取当前登陆用户是否拥有指定角色?
问题描述:
类似于 ISROLE('1236')=true 一样的?
解决方案:
标准没有这样的表达式函数 可以通过插件自定义:
参考:
二开案例.表达式函数.编写自定义的表达式函数(字符串包含函数):https://vip.kingdee.com/link/s/ln3zh
权限相关的插件获取 可以参考:二开案例.表单插件.点击单据体超链接打开单据时验证单据体明细数据权限:https://vip.kingdee.com/link/s/ln3zk
问题来源:
14、 PYTHON插件中如何处理JSON
问题描述:
param={'op':'save','BillNo':'12345678'} billObj=this.View.Model.DataObject billNo=billObj["BillNo"] param['BillNo']=billNo result=post(url,param)注册PYTHON插件,以上代码无法进行,如果将param值改为引号(字符串),param="{'op':'save','BillNo':'12345678'}",并且param['BillNo']=billNo去掉,则可以正常。但是这不是想要的,想创建一个JSON,然后将取得的值进行修改,然后POST
解决方案:
可以引用:Kingdee.BOS.dll里面的JSON对象来使用。from Kingdee.BOS.JSON import *
使用JSONObject和JSONArray来构造JSON字符串,可以参考我下面的代码示例:
#构造JSON参数示例:{"字符串":"ss","字符串数组":["1","2"],"对象数组":[{"key":"Value"}],"数值":1,"布尔":true,"对象":{"编码":"123","名称":"电脑"}} def CreateJson(): root=JSONObject(); root.Put("字符串","ss"); strArr=JSONArray(); strArr.Add("S1"); strArr.Add("S2"); root.Put("字符串数组",strArr); objArr=JSONArray(); for i in range(2): obj=JSONObject(); obj.Put("key{0}".format(i),"Value{0}".format(i)); objArr.Add(obj); root.Put("对象数组",objArr); root.Put("数值",1); root.Put("布尔",False); jObj=JSONObject(); jObj.Put("编码","123"); jObj.Put("名称","电脑"); root.Put("对象",jObj); #将字符串转换成JSON对象实例:JSON对象或者JSON数组 jsonObj=JSONObject.Parse("{'key':'Value'}");#返回JSONObject对象 jsonArr=JSONArray.Parse("[{'key1':'Value1'},{'key2':'Value2'}]");#返回JSONArray对象 return root.ToJSONString();#把JSONObject对象转换成JSON字符串
更多Python插件开发的知识可以参考我的课程:Python插件入门讲解-学习课程大纲总览(含配套视频讲解课程)
问题来源:
15、请问各位大神:套打可不可以实现一个数据行的单元格内+多个字段?
问题描述:
司给了个新的要求:在凭证套打的时候,要将两个字段的内容,打印在一个格子里。
本来想到用单元格拆分的方法,把一个格子分成两个,然后中间不加内框,这样看起来好像是在同一个格子里
但是如果某个字段的字数较多,这样就看上去很不协调
所以,想请教一下:有没有什么办法,可以让多个字段的内容,打印在一个单元格内?
解决方案:
可以,GetValue("FEntrynote"),GetValue("F_CH_FHBillNo")
问题来源:
请问各位大神:套打可不可以实现一个数据行的单元格内+多个字段?
16、BOS套打,审批路线的处理人是谁
问题描述:
这个处理人,指的是审核人吗,需要审核之后才能在打印预览看见吗
解决方案:
添加数据表格,我们是这样设置的
问题来源:
查看往期精选:
【汇总】 金蝶云·星空-BOS平台 | 产品应用典型/热门问答精选 (kingdee.com)
推荐阅读