【问题标题】:PeopleSoft Effective-Dated CI: No rows exist for the specified keys (Java)PeopleSoft 生效日期 CI:指定键不存在行 (Java)
【发布时间】:2016-03-16 15:13:59
【问题描述】:

我在其他帖子中多次看到这个问题,但还没有解决它。也许你们可以在这里有所启发。

我正在尝试使用 Java 对象适配器库 (psjoa.jar)Component Interface "LOCATION" 执行更新,但我遇到了以下问题尝试保存记录时出错:

"No rows exist for the specified keys. {LOCATION} (91,50), Failed to execute PSBusComp request , The highlighted field is required. You must enter a value for it before proceeding.{LOCATION.LOCATION_TBL(1).DESCR} (15,54), Error saving Component Interface. {LOCATION} (91,37), Failed to execute PSBusComp request"

如果记录存在,则不会出现错误,但位置不会更新。我能够通过网络/在线应用程序创建和更新位置,但不能从 CI 执行相同操作。

这很可能是由表的“生效日期”行为引起的。 Application Designer 显示 Location 组件在 Scroll Level 0 和 Scroll Level 1 有一个 LOCATION_TBL 表。下面是我传递给 psjoa.jar 的“invokeMethod(sName, args)”操作的参数:

// level 0
SETID: "SHARE",
LOCATION :"T00001", 

// level 1
LOCATION_TBL: {    
   SETID: "SHARE", 
   LOCATION :"T00001", 
   DESCR: "My Test", 
   DESCR_AC: "TEST", 
   EFFDT: |2016-03-16|, 
   EFF_STATUS: "A" 
}

我在几个地方读到过,生效日期的组件可能需要使用 PeopleCode 和/或 SQL 进行自定义实现,例如。

我想知道:

  1. 我是否错误地调用了 CI 操作,传递了错误的参数, 不遵循预期的滚动结构?如果是,应该采用哪种方法?
  2. 我是否必须使用自定义更新/插入操作 人员代码 ?
  3. (1)和(2)?

其他信息:

  • PeopleTools 8.53.02
  • PeopleSoft 人力资源管理系统 9.20.000
  • 附上我的位置 CI 的屏幕截图。

【问题讨论】:

  • 你的location_tbl的关键字段是什么? SETIDLOCATIONEFFDT?我想如果您尝试更新表条目,您的get 呼叫已经失败。请添加java代码你如何调用组件接口。

标签: java peoplesoft peoplesoft-app-engine


【解决方案1】:

需要查看您的 Java 代码才能确定,但​​这是一种可能性:

如果您将新的 0 级添加到有效日期记录,那么它将自动添加具有当前日期的“虚拟”级别 1 有效日期记录 - 与在 Web UI 上所做的完全一样。如果随后添加另一个 1 级记录,那么滚动中将有 2 行,但只有对第二行的引用。如果您随后在第二行设置字段并尝试保存它,您可能会遇到您所看到的错误类型(第 1 行缺少必填字段)。

换句话说,当添加一个新的 0 级时,以下可能会失败(对于伪代码,但没有配置的 Java/PS 环境可供处理......):

ci.create()         // create new L0 record - also adds L1 record
l0 = ci.getRow(0)   // get the L0 record
l1 = l0.addRow()    // add new L1 record - you now have 2 - l1 points to row 2
l1.EFFDT = ...      // this sets fields on row 2
l1.EFF_STATUS = ...
l1.DESCR = 
ci.save()           // missing values on row 1 cause errors

而更有可能成功的方法是

ci.create()         // create new L0 record - also adds L1 record
l0 = ci.getRow(0)   // get the Lo record
l1 = l0.getRow(0)   // don't add a new row - just get the dummy one
l1.EFFDT = ...      // set the fields on row 1
l1.EFF_STATUS = ...
l1.DESCR = 
ci.save()           // cross your fingers...

您可以通过以下方式准确生成您在此处看到的消息:

  • 在 CI 测试器中打开 CI(适用于 2 层 - 工具 8.54 - 未尝试 3 层)
  • 创建新的 SETID/位置
  • 右键单击 LOCATION_TBL > InsertItem - 索引 1
  • 选择第二行 (LOCATION_TBL [2])
  • 设置描述
  • 保存 CI

您收到的信息完全正确 - LOCATION_TBL [1] 上的描述为空白。

【讨论】:

  • 确实,在创建新记录并执行更新后,我错过了“虚拟”行中的 DESCR 字段。另外,我不知道 CI Tester 的附加功能。我只用它来执行基本操作,但我遵循了您的指南并重现了相同的错误消息。非常有用的建议。这个问题帮助我更好地理解了生效日期的组件。
  • 或者你可以这样做:&MyCI.GetDummyRows = False;
  • @jared 是的,CI 接口支持该标志,它应该达到预期的结果,但我发现 psjoa 接口说起来有点“不稳定”最好的。一般来说,当我让我的界面代码准确地复制你使用 web ui 时发生的事情时,我取得了最大的成功。干杯。
  • 组件接口很棘手,GetDummyRows 和交互模式会改变行为。我根据我要对底层组件执行的操作来打开或关闭它们。这是我注意到的唯一“片状”行为。还需要注意的是,特定的 Web 组件无法通过 CI 访问,这也可能归因于您注意到的不稳定行为。
【解决方案2】:

在 App Designer 中使用组件接口测试器。您必须登录 3 层。使用该工具,您可以模拟您的程序正在做什么,并可能从测试人员那里获得反馈。

【讨论】:

  • 一般来说是好的建议,但并不总是 100% 准确。 CI 测试器不使用 psjoa 库,所以使用 psjoa 库时出现的错误有时在使用 CI 测试器时不会出现。
  • 正如您在上面的答案中看到的那样,使用 CI 测试器,OP 的答案会很明显
  • 在这种情况下,是的(虽然看起来OP之前没有使用过CI测试器的插入功能)。就像我说的,一般很好的建议。然而,当组件通过 CI 测试器而不是通过 psjoa 工作时,我已经有很多次了。此外,您喜欢删除关于需要 3 层的位,因为那不是真的。干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2018-07-03
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多