【第32期】 金蝶云·星空-BOS平台 | 产品应用典型/热门问答精选原创
金蝶云社区-Dave身份
Dave
7人赞赏了该文章 482次浏览 未经作者许可,禁止转载编辑于2024年11月07日 17:59:27
summary-icon摘要由AI智能服务提供

本文是金蝶云·星空-BOS平台应用的热门问答汇总,包括:1.SQL报表日期默认设置当日的方法;2.解决从dataset回调方式给单据体赋值不对齐的问题;3.判断单据是否原厂或自定义的方法;4.下拉字段设置默认缺省值的方法;5.移动端列表分录行按钮点击事件的实现;6.单据菜单按钮显示在审批流中的方法;7.配置供应商名称必须使用大括号的方法。

在金蝶云·星空-BOS平台应用中,你需要了解的典型/热门问答都在这里!

本帖不定期持续更新,欢迎小伙伴们收藏本帖,以便随时查看、扩充知识哟


【第32期】



1、SQL报表日期能设置默认日期当日?

问题描述:

请问大神,自定义报表日期,如何设置打开时候,两个日期过滤显示是当日

image.png

解决方案

可以默认是当前日期:

image.png


问题来源

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; }


问题来源

从dataset回调方式给单据体赋值,为啥对不上了


3、如何知道单据是原厂的还是自定义的?

问题描述:

如何知道单据是原厂的还是自定义的?

解决方案

原厂的单据都是KD开发识别码

image.png

编辑于 2024年10月08日 15:48:18

追问

可是我开发商标识是企业的话,第一层都不是KD了,我如何判断?

追答

看这个

image.png

问题来源

如何知道单据是原厂的还是自定义的?


4、下拉字段没法设置默认缺省值?

问题描述:

下拉字段没法设置默认缺省值?想在下拉字段设置一个默认值

解决方案

bos里面缺省值勾选一个就可以了

image.png

问题来源

下拉字段没法设置默认缺省值?


5、移动bos列表分录行按钮点击事件

问题描述:

在移动端列表分录行里面加了个按钮,想做个点击事件,但buttonclick 和entrybuttonclick试了都不行,请问还有其它触发事件吗?
1728524371560.png

解决方案

一、概述:

        在代理分录和单据体(移动列表)中配置操作菜单的方式有很多,比如用按钮、弹窗菜单、侧滑菜单等等,本篇要讲的是V7.5新加的一种自带列表行菜单,即单据体菜单。

 

二、适用版本:

       适用于V7.5.1.202010及以上,移动运行时新框架xmobile版

 

三、列表行菜单(单据体菜单)

         注:设置后,菜单会带出行的序号

         3.1 菜单分为:

                a. 单据体行菜单:菜单与列表行循环出现

                b. 单据体菜单: 菜单出现在列表底部

        

        3.2. 配置位置:在代理分录或单据体(移动列表)的【菜单集合】属性中配置


        3.3 添加增/删/改,绑定操作

              略


        3.4 运行时效果

        

问题来源

移动bos列表分录行按钮点击事件


6、如何将单据的菜单按钮显示在审批流中

问题描述:

请问如何将单据上的菜单按钮显示在审批流中?如下推

image.png

image.png

解决方案

流程配置中心里面看看有没有这个按钮可以显示

image.png

问题来源

如何将单据的菜单按钮显示在审批流中


7、怎么配置供应商名称限制公司名称的括号必须大括号

问题描述:

怎么配置供应商名称限制公司名称的括号必须大括号

解决方案

使用正则表达式,请参考:正则表达式在金蝶云星空中的运用技巧:对用户输入的值进行复杂判断与实时校验

注:在正则表达式中,大括号字符及括号字符有特殊的含义,因此需要使用转义字符\\来转义。

问题来源

怎么配置供应商名称限制公司名称的括号必须大括号


8、工作流运行平台移动端如何只显示标题或者是只显示内容

问题描述:

工作流运行平台移动端如何只显示标题或者是只显示内容

image.png

解决方案

这个要在流程设计中心里面设置流程标题/内容

image.png

编辑于 2024年10月15日 15:11:45

问题来源

工作流运行平台移动端如何只显示标题或者是只显示内容


9、云星空直接SQL报表,关键字,数据来源如何新增?

问题描述:

如图,数据来源处我想自定义一个【是否综合本位币】,两个选择【是】或者【否】,如何新增?

image.png

解决方案

文本类型 然后查询的时候自己填是或否 这里面选不了的

编辑于 2024年10月14日 11:03:33

追问

数据来源的选择不能自定义??

追答

勾上必录

image.png

不能自定义或者你可以选择枚举值 去找个是否的枚举值来选择

image.png

问题来源

云星空直接SQL报表,关键字,数据来源如何新增?


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、 列表过滤条件框不生效

问题描述:

二开了一个新的表单,并且为他新写了一个列表过滤框,过滤框未生效,我看到社区有说,二开的单据过滤框是需要重新写插件的,但是并没有找到详细的帖子说明要怎么二开

71fa9d71c880ad32c71e531a2b7e21e.png

解决方案

首先,你这个列表过滤框,建议继承系统默认的列表过滤(BOS_StandardFilter)


然后,你要在你自定义的表单里面,去修改【过滤窗口业务对象】

image.png

最后,自定义的过滤字段,通过列表插件来获取后,干预列表过滤,核心就是PrepareFilterParameter事件

参考:二开案例.列表插件.通过发布菜单时添加自定义参数控制列表过滤结果

二开案例.列表插件.使用PrepareFilterParameter事件干预列表查询

e.CustomFilter可以获取到自定义过滤字段的实体数据包


可以自行在社区搜索更多PrepareFilterParameter的用法

问题来源

列表过滤条件框不生效


12、 如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?

问题描述:

如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?

解决方案

检查组合字段唯一性这边这个选项不勾选就会检查单据列表内唯一

image.png

问题来源

如何设置规则,单据保存时检查物料编码唯一,如何设置不仅检查本单据内物料编码唯一,还能检查单据列表内唯一?


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插件入门讲解-学习课程大纲总览(含配套视频讲解课程)

问题来源

PYTHON插件中如何处理JSON

15、请问各位大神:套打可不可以实现一个数据行的单元格内+多个字段?

问题描述:

司给了个新的要求:在凭证套打的时候,要将两个字段的内容,打印在一个格子里。

本来想到用单元格拆分的方法,把一个格子分成两个,然后中间不加内框,这样看起来好像是在同一个格子里

但是如果某个字段的字数较多,这样就看上去很不协调

所以,想请教一下:有没有什么办法,可以让多个字段的内容,打印在一个单元格内?

解决方案

可以,GetValue("FEntrynote"),GetValue("F_CH_FHBillNo")

image.png


问题来源

请问各位大神:套打可不可以实现一个数据行的单元格内+多个字段?


16、BOS套打,审批路线的处理人是谁

问题描述:

这个处理人,指的是审核人吗,需要审核之后才能在打印预览看见吗


3]`265O78R9%GO}XOD$7W96.png

解决方案

图片.png

图片.png

添加数据表格,我们是这样设置的


问题来源

BOS套打,审批路线的处理人是谁



查看往期精选:

【汇总】 金蝶云·星空-BOS平台 | 产品应用典型/热门问答精选 (kingdee.com)







图标赞 7
7人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!