【问题标题】:People soft component ci - delete row from base tablePeople soft 组件 ci - 从基表中删除行
【发布时间】:2021-11-19 09:34:56
【问题描述】:

需要根据通过组件接口进入文件的数据来更新/插入和删除现有表中的数据。 虽然我写了下面的代码但没有信心,如果有其他方法可以执行相同的操作,请告诉我。 代码 -

&Osession = %session
&Ocipersonaldata = &osession.getcompintfc.(compintfc.ci_prsonal_data);
&Ocipersonaldata.interactivemode = true;
&Ocipersonaldata.gethistoryitems= false;
&Ocipersonaldata.edithistoryitems= false;

&Ocipersonaldata.keypropemplid= d_persnid_aet.emplid
&Opersnidcollection = Ocipersonaldata.coll_pers_nid;
&Found =false;

For &I = 1 to Opersnidcollection.count
  &Opersnid = Opersnidcollection.item(&I);

  If Opersnid.country= d_persnid_aet.country and &opersnid.nationalid_type =d_persnid_aet.nationalid_type then
    If d_persnid_aet.actn = 'delete'
      Sqlexec(delete from ps_persnid where emplid =:1 and country =:2 and nationalid_type =:3",d_persnid_aet.emplud,d_persnid_aet.country,d_persnid_aet.nationalid_type);
    Else 
      If d_persnid_aet.actn = 'insert' then
        &Pernid = &persnidcollection.item (persnidcollection.count);
        &Pernid.nationalid= d_persnid_aet.nationalid;
      Else
        &Persnid =persnidcollection.insertitem(persnidcollection.count);
        &Pernid.nationalid= d_persnid_aet.nationalid;
        &Pernid.country= d_persnid_aet.country;
        &Pernid.nationalid_type d_persnid_aet.nationalid_type
      End-if;

【问题讨论】:

    标签: peoplesoft peoplecode


    【解决方案1】:

    唯一主观上“更好”的方法是使用不使用 CI 的现有实体框架构造。 CI 的加载和运行成本确实很高,因此 EF 选项(如果可用)会快得多。

    始终使用 CI 或实体服务来更改业务数据。通过编写 SQL,您将立即对可能在该表上挂起的所有下游更改负责。

    除了@qyb2zm302 的好答案,当您直接操作数据时,从长远来看,您会帮自己一个忙,使用 PeopleCode API 来执行此操作。

    Local Record &rPersnId;
    &rPersnId= GetRecord(Record.PERSNID);
    &rPersnId.EMPLID.Value = d_persnid_aet.emplid;
    &rPersnId.COUNTRY.Value = d_persnid_aet.country;
    &rPersnId.NATIONALID_TYPE.Value = d_persnid_aet.nationalid_type;
    If &rPersnId.SelectByKey() then
       &ret = &rPersnId.Delete();
    End-If;
    

    这样做的原因有很多,即:

    1. 关心数据库架构;
    2. 帮助调试
    3. 搜索和引用记录很有帮助
    4. 从您的代码中删除“魔术”字符串
    5. 您不必制作/测试/调试 SQL 字符串。
    6. 您可以判断 SelectByKey 是否成功,也可以判断 Delete 是否成功。用户反馈等方面的更多选项。
    7. 除非您同时进行数百万次删除,否则开销应该不会太大,那么我会质疑更大的方法...

    【讨论】:

      【解决方案2】:

      组件接口 (CI) 的目的是确保您遵守业务逻辑。

      我在您的代码中看到一条 SQL 删除语句,这可能违背了使用 CI 的目的。由于 PeopleSoft 与数据库无关,因此它没有利用内置数据库功能,例如外键和级联删除。相反,维护引用完整性的逻辑是在应用层实现的(即通过 PeopleCode、SQR 代码、COBOL 代码、应用引擎 SQL 等)。

      如果您真的想要执行 SQL 更新/插入/删除操作(不鼓励这样做),那么您将承担以下研究负担:

      • 确定需要相应修改的外键和其他表,并
      • 编写 sql 来修改所有其他表中的数据。

      因此,最好使用组件接口进行删除(例如,使用InsertItem 或Deleteitem 方法)。这取决于您使用的底层组件定义,因为并非所有组件都允许删除。

      【讨论】:

      • 您好,非常感谢您查看代码。我已经用 deleteitem 重新编写了 sqlexec 语句。希望除此之外,代码看起来还不错。还需要更新另一条不在组件定义中的记录。我只使用过 sqlexec。让我知道这是否可以。
      • "还需要更新一条不在组件定义中的记录。我只使用了 sqlexec。让我知道这是否可以。"我的回答(以及提供的参考资料)中的相同响应适用于其他记录。如果你可以通过 CI 做到这一点,那就去做吧。如果没有,那么您必须进行自己的研究,以确保您理解并手动尊重所有数据关系。关于如何做到这一点的一些想法是:代码阅读(这很困难,因为那里有很多跨多种语言的代码)、对 SQL 的 PeopleTools 跟踪或与您的 DBA 进行数据库级审计。
      • 感谢您的宝贵意见。正如建议的那样,我已经开始阅读现有代码并检查了与其他记录相关的所有参考并能够了解数据关系。我有一个问题,我有一个在页面上标记为必填字段的字段,对于该字段,我不会在文件中接收数据,所以我尝试传递空白或空值,但它失败了。任何建议请。
      • 这就是 PeopleTools 跟踪可以向您显示正常情况的地方。您也可以尝试使用屏幕添加数据,然后使用 SQL 查询必填字段以查看其包含的值。通常,这将由 CI 处理,但听起来您正试图绕过 CI(通常不建议这样做)。
      • 谢谢。知道了。关于这一点,我试图将错误存储在 CI 加载期间引起的临时表中。由于是国家 ID 加载,我收到与 Nid 格式相关的错误。我曾尝试在异常块中编写“更新查询:并尝试将错误消息存储在表中。但程序将进入不成功。
      猜你喜欢
      • 1970-01-01
      • 2020-12-28
      • 2012-07-19
      • 1970-01-01
      • 2018-01-18
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多