祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 36|回复: 1

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

[复制链接]

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

[复制链接]
ehxz

主题

0

回帖

62万

积分

管理员

积分
626284
贡献
在线时间
小时
3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
给出一个将数据窗口中数据不全为0或空的内容生成JSON的例子
数据窗口中有多个行列,第一行为表头,第一、二列为数据描述,其它列为具体数据,需要将数据窗口中仅将具体数据不为0或空的数据生成JSON
请问如何实现,给出具体的实现方法过程,给出代码说明。
共享共进共赢
Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
pbai

主题

0

回帖

767

积分

PBAI

积分
767
贡献
在线时间
小时
3 天前 | 显示全部楼层
这个需求用 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 文本。
  1. uo_json js
  2. js = create uo_json
  3. long ll_rows, ll_cols, ll_r, ll_c, ll_idx
  4. string ls_v1, ls_v2, ls_val, ls_colname, ls_json
  5. boolean lb_ok
  6. // 数据窗口 dw_1 已取数;第 1、2 列为描述列,第 3 列起为具体数据列
  7. ll_rows = dw_1.RowCount()
  8. ll_cols = long(dw_1.Describe("DataWindow.Column.Count"))
  9. ll_idx = 0  // JSON 数组下标,只对有效行自增
  10. for ll_r = 1 to ll_rows
  11.     // 描述列:始终写入,保留该行基本信息
  12.     ls_v1 = dw_1.GetItemString(ll_r, 1)
  13.     ls_v2 = dw_1.GetItemString(ll_r, 2)
  14.     if isnull(ls_v1) then ls_v1 = ""
  15.     if isnull(ls_v2) then ls_v2 = ""
  16.     js.set("/" + string(ll_idx) + "/描述1", ls_v1)
  17.     js.set("/" + string(ll_idx) + "/描述2", ls_v2)
  18.     // 具体数据列:仅写入非0非空的单元格
  19.     for ll_c = 3 to ll_cols
  20.         ls_val = dw_1.GetItemString(ll_r, ll_c)
  21.         if isnull(ls_val) then ls_val = ""
  22.         ls_val = trim(ls_val)
  23.         lb_ok = false
  24.         if ls_val <> "" then
  25.             if IsNumber(ls_val) then
  26.                 if dec(ls_val) <> 0 then lb_ok = true  // 数字 0、0.00 等一律跳过
  27.             else
  28.                 lb_ok = true                            // 非数字文本,非空即写入
  29.             end if
  30.         end if
  31.         if lb_ok then
  32.             // 用列名做 JSON 键(如 d_report 的字段名)
  33.             ls_colname = dw_1.Describe("#" + string(ll_c) + ".name")
  34.             js.set("/" + string(ll_idx) + "/" + ls_colname, ls_val)
  35.         end if
  36.     next
  37.     ll_idx = ll_idx + 1
  38. next
  39. ls_json = js.toString(true, false, false)
  40. MessageBox('JSON 结果', ls_json)
  41. destroy js
复制代码

两点补充:

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


pbai
共享共进共赢
Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

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

Mail To:Admin@SybaseBbs.com

客服微信:18669893686
挂谷猜想 · 探索

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2026-8-22 20:51 , Processed in 0.018138 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表