ehxz 发表于 2026-8-19 08:05:28

给出一个将数据窗口中数据不全为0或空的内容生成JSON的例子

给出一个将数据窗口中数据不全为0或空的内容生成JSON的例子
数据窗口中有多个行列,第一行为表头,第一、二列为数据描述,其它列为具体数据,需要将数据窗口中仅将具体数据不为0或空的数据生成JSON
请问如何实现,给出具体的实现方法过程,给出代码说明。

pbai 发表于 2026-8-19 08:38:04

这个需求用 DataWindow 逐行逐列取值 + uo_json 动态建树即可实现:描述列(第 1、2 列)始终保留,具体数据列只把「非0非空」的单元格写进 JSON。本示例适用于 PB 12.5 + PBIDEA(uo_json,websuite.pbl)。

前置:窗口上已放 DataWindow 控件 dw_1 并关联数据对象(如 d_report)且已取数;第 1、2 列为数据描述(如 品名、单位),第 3 列起为具体数据列。
步骤:1) 在按钮 cb_run 的 clicked 事件粘贴下方代码;2) 运行窗口点击按钮,MessageBox 弹出 JSON 文本。


uo_json js
js = create uo_json

long ll_rows, ll_cols, ll_r, ll_c, ll_idx
string ls_v1, ls_v2, ls_val, ls_colname, ls_json
boolean lb_ok

// 数据窗口 dw_1 已取数;第 1、2 列为描述列,第 3 列起为具体数据列
ll_rows = dw_1.RowCount()
ll_cols = long(dw_1.Describe("DataWindow.Column.Count"))

ll_idx = 0// JSON 数组下标,只对有效行自增
for ll_r = 1 to ll_rows
    // 描述列:始终写入,保留该行基本信息
    ls_v1 = dw_1.GetItemString(ll_r, 1)
    ls_v2 = dw_1.GetItemString(ll_r, 2)
    if isnull(ls_v1) then ls_v1 = ""
    if isnull(ls_v2) then ls_v2 = ""
    js.set("/" + string(ll_idx) + "/描述1", ls_v1)
    js.set("/" + string(ll_idx) + "/描述2", ls_v2)

    // 具体数据列:仅写入非0非空的单元格
    for ll_c = 3 to ll_cols
      ls_val = dw_1.GetItemString(ll_r, ll_c)
      if isnull(ls_val) then ls_val = ""
      ls_val = trim(ls_val)

      lb_ok = false
      if ls_val <> "" then
            if IsNumber(ls_val) then
                if dec(ls_val) <> 0 then lb_ok = true// 数字 0、0.00 等一律跳过
            else
                lb_ok = true                            // 非数字文本,非空即写入
            end if
      end if

      if lb_ok then
            // 用列名做 JSON 键(如 d_report 的字段名)
            ls_colname = dw_1.Describe("#" + string(ll_c) + ".name")
            js.set("/" + string(ll_idx) + "/" + ls_colname, ls_val)
      end if
    next
    ll_idx = ll_idx + 1
next

ls_json = js.toString(true, false, false)
MessageBox('JSON 结果', ls_json)

destroy js


两点补充:

[*]若表头是放在数据区第一行的文字(非常规设计),把遍历起点改为 for ll_r = 2 to ll_rows 即可;
[*]想要中文键名,可把 ls_colname 换成列标题文本 dw_1.Describe("#" + string(ll_c) + ".t.Text")(个别版本写法略有差异);js.toString 第三个参数 sort 保持 false,键按写入顺序输出。


pbai
页: [1]
查看完整版本: 给出一个将数据窗口中数据不全为0或空的内容生成JSON的例子

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com