1

我是 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

我在任何地方都找不到答案。请帮我。

4

1 回答 1

1

我认为这不可能通过使用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-offsetand#start-line-offset的原因#current-line是报告中的当前行位置,包括 header 的偏移量。例如,如果您的标题有 5 行高,则#current-line开始等于 6(标题之后的第一行),doingPRINT 'hello' (#current-line, 1)实际上将打印到报告的第 11 行(从 5 行标题向下的 6 行)。此外,分配一个值#current-line似乎不起作用,所以我认为您不能直接操纵当前行位置。

但是,如果您不需要在三列之后打印任何其他内容,那么您可以使用KEEP-TOP参数 toWRAP以便您当前的行位置不会在每列之间更改,PRINT并且您不必执行任何行偏移追踪。

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

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

于 2017-08-21T23:47:30.910 回答