【问题标题】:SELECT with substring in ON clause?在 ON 子句中选择子字符串?
【发布时间】:2022-01-07 10:15:28
【问题描述】:

我在 ABAP 中有以下 select 语句:

SELECT munic~mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE_M ZZONE_T USAGE_M USAGE_T M2MC M2MT M2RET EXEMPTMCMT EXEMPRET CHARGEMCMT
INTO corresponding fields of table GT_INSTMUNIC_F
FROM ZCI00_INSTMUNIC AS MUNIC
INNER JOIN EVER AS EV on
  MUNIC~POD = EV~VREFER(9).
"where EV~BSTATUS = '14' or EV~BSTATUS = '32'.

我对上述语句的问题是无法识别“ON”子句上的子字符串/偏移操作。如果我删除'(9)然后 它会识别该字段,否则会出错:

字段 ev~refer 未知。它既不在指定的表格之一中 也不是由“DATA”语句定义的。我也尝试在“Where”子句中做类似的事情,收到类似的错误:

LOOP AT gt_instmunic.

 clear wa_gt_instmunic_f.

 wa_gt_instmunic_f-mandt = gt_instmunic-mandt.
 wa_gt_instmunic_f-bis = gt_instmunic-bis.
 wa_gt_instmunic_f-ab = gt_instmunic-ab.
 wa_gt_instmunic_f-zzelecdate = gt_instmunic-zzelecdate.
 wa_gt_instmunic_f-ZZCERTDATE = gt_instmunic-ZZCERTDATE.
 wa_gt_instmunic_f-CONSYEAR = gt_instmunic-CONSYEAR.
 wa_gt_instmunic_f-ZDIMO = gt_instmunic-ZDIMO.
 wa_gt_instmunic_f-ZZONE_M = gt_instmunic-ZZONE_M.
 wa_gt_instmunic_f-ZZONE_T = gt_instmunic-ZZONE_T.
 wa_gt_instmunic_f-USAGE_M = gt_instmunic-USAGE_M.
 wa_gt_instmunic_f-USAGE_T = gt_instmunic-USAGE_T.

 temp_pod = gt_instmunic-pod.

  SELECT vrefer
  FROM ever
    INTO wa_gt_instmunic_f-vrefer
    WHERE ( vrefer(9) LIKE temp_pod  ).            " PROBLEM WITH SUBSTRING
    "AND ( BSTATUS = '14' OR BSTATUS = '32' ).
  ENDSELECT.

  WRITE: / sy-dbcnt.
  WRITE: / 'wa is: ', wa_gt_instmunic_f.
  WRITE: / 'wa-ever is: ', wa_gt_instmunic_f-vrefer.
  APPEND wa_gt_instmunic_f TO gt_instmunic_f.
  WRITE: / wa_gt_instmunic_f-vrefer.
ENDLOOP.

itab_size = lines( gt_instmunic_f ).
WRITE: / 'Internal table populated with', itab_size, ' lines'.

我要实现的基本任务是修改一个表上的特定字段, 从另一个人那里汲取价值。它们有一个共同的字段( pod = vrefer(9) )。提前感谢您的宝贵时间。

【问题讨论】:

  • vwegert 建议(手动合并两个表)听起来比任何 SQL 脏把戏都要好。此外,你确定你的要求或你的方法吗?我担心使用部分字段来链接数据是危险的……如果您有两个具有相同 9 个初始位置的合约怎么办?你打算如何决定哪一个是正确的?

标签: select substring abap opensql


【解决方案1】:

它们有一个共同的字段( pod = vrefer(9) )

这是一个错误的假设,因为它们都不是字段,而是字段。

如果您确实需要通过 SQL 完成该任务,我建议您检查原生 SQL 语句,例如 SUBSTRING,并检查您是否可以设法在 EXEC_SQL 或(更好) CL_SQL* 类。

【讨论】:

  • 不要将 Native SQL 用于应用程序级编程。永远。
  • 如果我能找到另一种方法,我尽量不这样做,但 OP 询问了 SQL 选项。顺便说一句,您可以向我们解释为什么永远不要使用 Native SQL……这将有助于我们提高知识,并且会让您的评论显得不那么粗鲁。我编辑了答案,让你不那么暴躁;)
  • 回答我自己:OP 没有要求 SQL 方法:我的错。我为“脾气暴躁”的评论道歉,我会因为我的耻辱而离开那里(尽管解释你的“EVER”的原因仍然是一件好事)
  • ABAP 使用 OpenSQL 将 SELECT 语句转换为 db-specif 查询。通过使用 Native SQL,您假设您的代码无论连接到应用程序服务器的数据库如何都可以工作,这是一个非常危险的假设
  • 做出假设真的那么危险吗?除非您正在构建附加代码,否则我从未在改变数据库平台的公司工作过。即使在今天,您听到的主要是 AnyDB to HANA。有很多工具可以告诉您在进行 HANA 转换之前需要进行哪些更改。这是最佳实践吗?不,但我认为“非常危险”和“永远不要使用......永远”有点过头了。
【解决方案2】:

field(9) 是由 ABAP 环境处理的子集操作,不能转换为数据库级别的 SQL 语句(至少目前不能,但如果有的话我会感到惊讶)。您最好的选择是单独选择数据集并手动合并它们(如果两者大致相同)或预先选择一个并使用 FAE/IN 子句。

【讨论】:

    【解决方案3】:

    如果您使用的是足够晚的 NetWeaver 版本,它适用于 7.51,您可以使用 OpenSQL 函数 LEFTSUBSTRING。您的查询类似于:

    SELECT munic~mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE_M ZZONE_T USAGE_M USAGE_T M2MC M2MT M2RET EXEMPTMCMT EXEMPRET CHARGEMCMT
      FROM ZCI00_INSTMUNIC AS MUNIC
      INNER JOIN ever AS ev 
              ON MUNIC~POD EQ LEFT( EV~VREFER, 9 )
      INTO corresponding fields of table GT_INSTMUNIC_F.
    

    请注意,INTO 子句也需要移到命令的末尾。

    【讨论】:

      猜你喜欢
      • 2018-04-15
      • 2022-01-23
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2018-09-07
      • 1970-01-01
      相关资源
      最近更新 更多