Peoplesoft 组件 ci - 从基础 table 中删除行

People soft component ci - delete row from base table

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

&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;

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

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

如果你真的想做一个SQLupdate/insert/delete操作(不鼓励),那么你会招致研究负担:

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

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

唯一的主观 'better' 方法是使用不使用 CI 的现有 Entity Framework 构造。 CI 的加载确实很昂贵,运行,因此 EF 选项(如果可用)快得多

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

除了 @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. 从您的代码中删除 'magic' 个字符串
  5. 您不必 craft/test/debug SQL 个字符串。
  6. 可以判断SelectByKey是否成功,也可以判断Delete是否成功。用户反馈等更多选项
  7. 除非您一次执行数百万次删除,否则开销应该不会太糟糕,然后我会质疑更大的方法...