如何在Progress的put unformatted输出CSV时使用IF ELSE IF多分支判断
问题根源
- 你使用的是Progress OpenEdge ABL(原4GL)语言,
put unformatted会按顺序执行所有输出项:原代码中4个独立if是并行判断、顺序执行的,哪怕第一个if匹配到Currency=1输出了Euro,后面3个未匹配的if仍会执行else ?并拼接;,最终生成多余空值标记和分隔符。 - 核心逻辑错误:把单字段(Currency)的多分支判断拆成了4个独立输出项,而非把判断结果合并为1个字符串后输出。
修正方案(两种常用写法)
方案1:用CASE语句预赋值(兼容所有ABL版本,可读性高)
先定义临时变量存储货币对应的字符串,再把变量作为put的输出项:
/* 建议在过程开头定义临时变量 */ DEFINE VARIABLE cCurrencyText AS CHARACTER NO-UNDO. /* 多分支判断:仅执行匹配的分支,其余逻辑直接跳过 */ CASE TestDB.Currency: WHEN 1 ASSIGN cCurrencyText = "Euro". WHEN 2 ASSIGN cCurrencyText = "Dollar". WHEN 3 ASSIGN cCurrencyText = "Kuna". WHEN 4 ASSIGN cCurrencyText = "Pound". OTHERWISE ASSIGN cCurrencyText = "?". /* 兼容非预期取值 */ END CASE. /* 标准csv输出:仅3个业务字段+分隔符 */ PUT UNFORMATTED TestDB.Name ';' TestDB.Age ';' cCurrencyText SKIP.
方案2:内联IF-ELSE链直接作为输出项(无需临时变量,需ABL 10.1B+)
把整个IF-ELSE链作为put的单个输出项(ABL支持多行内联IF作为表达式):
- 链的最后用
ELSE ?兜底非预期取值 - 不要在每个分支后单独加
;,仅按需在整个IF链后加分隔符
PUT UNFORMATTED TestDB.Name ';' TestDB.Age ';' /* 整个IF链是单个输出项:仅返回匹配的1个字符串 */ IF TestDB.Currency = 1 THEN 'Euro' ELSE IF TestDB.Currency = 2 THEN 'Dollar' ELSE IF TestDB.Currency = 3 THEN 'Kuna' ELSE IF TestDB.Currency = 4 THEN 'Pound' ELSE '?' SKIP.
关键注意点
- 原代码中每个
if后单独加;是错误的:;是csv字段分隔符,应放在每个字段输出项之后,而非每个IF分支之后。 - 若需严格无尾部分隔符的csv格式,上述代码已满足:仅输出
Name;Age;CurrencyText后换行,不会生成多余分隔符。
内容的提问来源于stack exchange,提问作者Smokus
相关产品推荐
相关产品推荐

