PB中的Describe,Evaluatate,LookUpDisplay小结

本文介绍了使用PowerBuilder中数据窗口控件的各种技巧,包括如何通过Describe和Evaluate函数获取数据窗口的各种属性,如页数、显示值及计算结果等。同时,还详细解释了如何利用LookUpDisplay函数来读取用户在数据窗口中实际看到的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据窗口控件名.describe("Evaluate('计算公式',行号)") 理论上可以取到数据窗口里所有能用计算列计算的内容,如:
1、取数据窗口的页数:
       dw_1.describe("Evaluate('pagecount()',1)")
2、取DropDownDW列显示的值:
       dw_1.describe("Evaluate('lookupdisplay(列名)',行号)")
3、取最小值:
       dw_1.describe("evaluate('min(billing_date_time)',1)")
4、求合计:
       dw_1.describe("evaluate('sum(charges for all)',1)")

PB中的Describe,Evaluatate,LookUpDisplay小结

Describe 可以描述DW中某个对象的某个属性的取值,虽然函数Describe可以获取对象的信息,但是表达式的取值就不能正常读取了,而这又是经常遇到的. Evaluate 如果想获取数据窗口对象中由属性、函数等构成的表达式的取值时,必须在函数Describe中使用函数Evaluate,LookUpDisplay   在数据窗口控件上显示的值和字段实际得到的值并不相同,使用函数GetItemX只能读取这样的字段的真实取值,而不是用户看到的值。如何才能读取用户看到的值?可以使用此函数,LookUpDisplay函数不能直接从PowerScript调用,可以在Describe中和Evaluate函数配合使用。因为函数Lookupdisplay不能指定对哪行数据进行操作,它的参数只有一个字段名称,所以必须和Evaluate函数配合使用。该函数的语法是:Lookupdisplay(columnname)参数columnname是字段的名称,而不是一个字符串。函数执行错误则返回空字符串。

例一:

ls_1 = dw_1.Describe("dw_1.cb_4.text")ls_2 = This.Describe(dwo.name + ".ColType")语法: value = datawindow.Describe(string ls)

例二:

判断第3行的sex是否为1,如果是则返回男,否则返回女dw_1.Describe("Evaluate('If(sex = 1, 男, 女) ', 3)")

语法: Evalute('expression',rowno)其中,expression是属性表达式,rowno是要描述的行号。该函数放置在Describe的属性列表中。

例三:dw_1.Describe("Evaluate('Lookupdisplay(column)'," + string (row number) + ")")

在dw_1 里面有一个gxbm字段的edit属性页下面:dataWindow:d_dmzd_gxbm,Display Column:dmmc,data Column:gxbm.在显示时:不是显示gxbm的值,而是显示dmmc的值,但我们用getitemstring(row,"gxbm")时,得到的是gxbm的值,而不是显示的dmmc值,如果我们想得到显示的dmmc值,那就用lookupdisplay来用:ls_1 = dw_1.describe( "Evaluate('lookupdisplay(gxbm)'," + string(1) + ")")

另: 在用代码学PB中有这样一段代码,值得关注:
integer li_PageCount

//*******分页
li_PageCount = integer(dw_1.describe("evaluate('pagecount()',1)"))
i_int_currentpage = integer(dw_1.describe("evaluate('page()',1)"))
st_page.Text = "第"+String( i_int_currentpage ) + "页(共" + String( li_PageCount )+"页)"

动态设置下拉数据窗口

动态设置字段的下拉窗口如下:
dw_1.modify("column_result.dddw.name='" + ls_dataobject + "'")//设置数据窗口
dw_1.Modify("column_result.dddw.DisplayColumn ='" + ls_display + "'")//设置显示字段
dw_1.modify("column_result.dddw.DataColumn='" + ls_data + "'")//设置数据字段
dw_1.modify('column_result.dddw.Autohscroll=yes')
dw_1.modify('column_result.dddw.Allowedit=yes ')
dw_1.modify("column_result.dddw.VScrollBar=yes")
dw_1.modify('column_result.dddw.useasborder=yes')
dw_1.modify('column_result.dddw.ShowList=yes')
     
dw_1.GetChild("column_result",ldwc_childdw)//获取下拉数据窗口
ldwc_childdw.settransobject(sqlca)
ldwc_childdw.retrieve()//刷新下拉数据窗口的值

================================================================
动态为下拉数据窗口添加数据如下:
dw_1.GetChild("column_result",ldwc_childdw)//获取下拉数据窗口
ls_display = dw_1.describe('column_result.dddw.DisplayColumn')
ls_data = dw_1.describe('column_result.dddw.DataColumn')
ldwc_childdw.settransobject(sqlca)
ll_row = ldwc_childdw.insertrow(0)//新增行
ldwc_childdw.setitem(ll_row,ls_display,"显示数据")//填写数据
ldwc_childdw.setitem(ll_row,ls_data,"1")//填写数据


<think>嗯,用户的问题是关于如何在Protocol Buffers中查找新增字段名称,特别是在使用描述命令时只显示现有字段的情况下。首先,我需要回想一下Protocol Buffers的基本结构和工作原理。Protocol Buffers使用.proto文件定义数据结构,每个消息类型都有字段,每个字段有唯一的编号。当.proto文件被编译后,会生成对应的代码,用于序列化和反解析数据。 用户提到的问题可能出现在版本迭代中,比如在.proto文件中添加了新字段,但使用protoc工具的描述命令(如protoc --decode或protoc --describe)时,可能没有显示新增的字段。这可能是因为旧的数据快照或缓存导致的,或者是因为新字段没有被正确编译到描述符中。 接下来,我需要考虑可能的解决方法。首先,用户需要确保.proto文件已经被正确编译,并且生成的代码包含了新增的字段。如果使用protoc --decode时没有显示新字段,可能需要检查是否在编译时包含了最新的.proto文件。另外,Protocol Buffers的反射API可能能够动态获取字段信息,包括新增的字段。例如,在Python中,可以使用DESCRIPTOR属性来遍历消息的所有字段,包括新增的。 另外,用户可能需要检查版本兼容性。Protocol Buffers在默认情况下会保留已删除的字段编号,但新增的字段需要确保没有重复的编号,并且编译过程正确。如果使用描述符文件(.desc),需要重新生成以包含最新的变更。 还有,用户可能需要使用工具如protoc的--include_imports选项来确保所有依赖的.proto文件都被包含进去。如果使用某些IDE或编辑器插件,可能需要清除缓存或重启插件以加载最新的.proto定义。 最后,生成相关问题时,需要考虑用户可能的后续疑问,比如如何验证字段是否存在、处理版本兼容性问题,或者使用反射API的细节。这些问题可以帮助用户更全面地理解Protocol Buffers的字段管理机制。</think>在Protocol Buffers中查找新增字段名称可通过以下步骤实现: ### 一、使用反射API查询字段描述符 1. 通过`Descriptor`对象遍历所有字段: ```python from google.protobuf import descriptor_pool message_descriptor = descriptor_pool.Default().FindMessageTypeByName('package.MessageName') new_fields = [field.name for field in message_descriptor.fields] ``` 2. 对比新旧版本字段列表: ```python old_fields = [...] # 旧版本字段列表 added_fields = list(set(new_fields) - set(old_fields)) ``` ### 二、使用版本控制对比工具 1. 通过git diff对比.proto文件变更: ```bash git diff HEAD~1 -- *.proto | grep '+ optional' ``` 2. 解析字段添加操作: ```proto message User { required string name = 1; optional int32 age = 2; // 新增字段 + optional string email = 3; // git diff可见 } ``` ### 三、编译时验证方法 1. 生成描述符文件: ```bash protoc --descriptor_set_out=msg.desc --include_imports *.proto ``` 2. 使用protoc解析描述符: ```bash protoc --decode_raw < msg.bin | grep '新增字段名' ``` ### 四、运行时检测机制 ```cpp const Descriptor* desc = Foo::descriptor(); for(int i=0; i<desc->field_count(); ++i){ const FieldDescriptor* field = desc->field(i); if(field->is_extension()) continue; cout << "Field name: " << field->name() << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值