使用 SQR 编程语言更改变量格式

Alter variable format using SQR programming language

我是 Peoplesoft 的新手,一般来说 Peoplecode/SQR 我想问一个问题。

我想做的是尝试使用 SQR 编程语言在 PDF 文件上输出一个大的 (clob) 字符串变量,在页面的 3 列上,就像您可以更改文本的布局一样Microsoft Word 转到布局 -> 列 -> 三

到目前为止我得到的是:

 begin-select
   TXT.U_PO_TXT &TXT.PO_TXT
   from PS_U_PO_DISC_TXT TXT
   where TXT.BUSINESS_UNIT = &PO.BUSINESS_UNIT
   and TXT.PO_ID = &PO.PO_ID
 end-select

所以,

 TXT.U_PO_TXT

是一个存储在数据库中的10000个字符的CLOB,我要输出

 &TXT.PO_TXT

使用上述布局在 PDF 上。

我尝试过使用 COLUMNS 和 NEXT-COLUMN SQR 命令,但无济于事。 我发现 Oracle 网站上 SQR 的文档写得不好。

这是我找到的适用于我的案例的示例:

columns 10 50 110
move 55 to #bottom_line
begin-select
 TXT.U_PO_TXT &TXT.PO_TXT
 if #current-line >= #bottom_line
 next-column goto-top=1 at-end=newpage
 else
 position (+1,1) !what is this even, it throws me an error "Unknown command"
 end-if
 from PS_U_PO_DISC_TXT TXT 
  where TXT.BUSINESS_UNIT = &PO.BUSINESS_UNIT
  and TXT.PO_ID = &PO.PO_ID
end-select

我到处都找不到答案。请帮助我。

我认为使用 COLUMNS 不可能做到这一点。定义和打印到 SQR 列决定了您开始打印的位置,但文本在到达列末尾后不会自动换行。它只会继续打印。

但是,您可以使用 WRAP 参数 PRINT 来完成此操作。这是一个例子

LET $left = 'This is the left column. This is the left column. This is the left column. This is the left column. This is the left column. This is the left column.'
LET $middle = 'This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column. This is the middle column.'
LET $right = 'This is the right column. This is the right column. This is the right column. This is the right column. This is the right column. This is the right column.'

! These variables are used to track which column is the tallest and then 
! move the current position (#start-line) down by the largest number of
! lines that were printed
LET #line-offset = 0
LET #start-line = 1
LET #start-line-offset = #current-line - #start-line

! Print the left column
PRINT $left (#start-line, 1) WRAP 40 100
IF #current-line - #start-line-offset > #line-offset
    LET #line-offset = #current-line - #start-line-offset
END-IF

! Print the middle column
PRINT $middle (#start-line, 50) WRAP 50 100
IF #current-line - #start-line-offset > #line-offset
    LET #line-offset = #current-line - #start-line-offset
END-IF

! Print the right column
PRINT $right (#start-line, 110) WRAP 40 100
IF #current-line - #start-line-offset > #line-offset
    LET #line-offset = #current-line - #start-line-offset
END-IF

! Update #start-line to be the original line position, plus the 
! number of lines that were printed in the tallest column
LET #start-line = #start-line + #line-offset

PRINT 'Rest of the report goes here' (#start-line, 1)

WRAP之后的第一个数字是该列的字符宽度。

WRAP后的第二个数字是将打印的最大行数。

我的代码中的大部分复杂性来自于这样一个事实,即您必须跟踪哪一列打印的行数最多(垂直方向最大),然后将当前光标位置向下移动那么多行。困难在于您最高的列可能是左列或中间列,因此您需要跟踪哪一列是您最高的列,而不是简单地在打印右列后向下移动光标。在我的示例中,中间的列最高。

我使用 #line-offset#start-line-offset 的原因是因为 #current-line 是您报告中的当前行位置 包括 [=46] 的偏移量=]。例如,如果您的 header 是 5 行高,那么 #current-line 将开始等于 6(您的 header 之后的第一行)并且执行 PRINT 'hello' (#current-line, 1) 实际上会打印到报告的第 11 行(第 5 行 header 的第 6 行)。另外,给 #current-line 赋值似乎不起作用,所以我认为你不能直接操作当前行位置。

但是,如果您不需要在三列之后打印任何其他内容,那么您可以将 KEEP-TOP 参数用于 WRAP,这样您当前的行位置就不会改变在每个 PRINT 之间,您不必进行任何行偏移跟踪。

在您的情况下,您必须根据文本和列位置数据在该字段中的存储方式将 &TXT.PO_TXT 解析为三个单独的变量(每列一个)。

需要注意的一件事是,如果您在打印的数据中连续有两个或更多 space,SQR 可能会将 space 作为第一个字符一行,因为分词似乎只由第一个 space 决定,而不是一个或多个 space 的序列。