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 以修改所有其他表中的数据。
因此,最好使用组件接口进行删除(例如使用 InsertItem
或 Deleteitem
方法)。这取决于您使用的基础组件定义,因为并非所有组件都允许删除。
- 参考资料:
- Cedar Hills Group > Integration Broker:缺失的手册> Best Practices with PeopleSoft Table Updates and Inserts
- PeopleSoft PeopleTools 8.56 > PeopleBooks > 产品 > 开发工具 > PeopleCode API 参考 > 组件接口 类 > Data Collection Methods
- IT 工具箱 > PeopleSoft 博客 > The Component Interface – Methods, Properties, & Collections – oh my!
唯一的主观 '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;
这样做的原因有很多,即:
- 关心数据库架构;
- 帮助调试
- 搜索和参考记录很有帮助
- 从您的代码中删除 'magic' 个字符串
- 您不必 craft/test/debug SQL 个字符串。
- 可以判断SelectByKey是否成功,也可以判断Delete是否成功。用户反馈等更多选项
- 除非您一次执行数百万次删除,否则开销应该不会太糟糕,然后我会质疑更大的方法...
根据通过组件接口进入文件的数据,需要 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 以修改所有其他表中的数据。
因此,最好使用组件接口进行删除(例如使用 InsertItem
或 Deleteitem
方法)。这取决于您使用的基础组件定义,因为并非所有组件都允许删除。
- 参考资料:
- Cedar Hills Group > Integration Broker:缺失的手册> Best Practices with PeopleSoft Table Updates and Inserts
- PeopleSoft PeopleTools 8.56 > PeopleBooks > 产品 > 开发工具 > PeopleCode API 参考 > 组件接口 类 > Data Collection Methods
- IT 工具箱 > PeopleSoft 博客 > The Component Interface – Methods, Properties, & Collections – oh my!
唯一的主观 '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;
这样做的原因有很多,即:
- 关心数据库架构;
- 帮助调试
- 搜索和参考记录很有帮助
- 从您的代码中删除 'magic' 个字符串
- 您不必 craft/test/debug SQL 个字符串。
- 可以判断SelectByKey是否成功,也可以判断Delete是否成功。用户反馈等更多选项
- 除非您一次执行数百万次删除,否则开销应该不会太糟糕,然后我会质疑更大的方法...