2017-08-20 3 views
1

私は一般的にPeoplesoftとPeoplecode/SQRの新人です。質問したいと思います。SQRプログラミング言語を使用して可変フォーマットを変更する

私がやりたいことは、Microsoftのテキストのレイアウトを変更できるのと同じように、ページ上の3列のSQRプログラミング言語を使用してPDFファイルに大きな(clob)文字列変数を出力しようとすることですレイアウト切り替え行くことによって単語 - >列 - >三

は私が今まで持っていることはこれです:

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 

は1000のデータベースに格納されているCLOBです0文字と出力したい

&TXT.PO_TXT 

上記のレイアウトを使用してください。

私はCOLUMNSとNEXT-COLUMN SQRコマンドを使用しようとしましたが、役に立たないです。 Oracle Webサイトの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 

私はどこにでも答えを見つけることができませんでした。私を助けてください。

答えて

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の後の2番目の数字は、印刷される最大行数です。

私のコードの複雑さの大部分は、最も多くの行を印刷した列(縦が一番大きい列)を追跡し、現在のカーソル位置をその行の下に移動する必要があることに由来します。難しいのは、最も高い列が左列か中央列のいずれかになる可能性があるためです。右列を印刷した後に単にカーソルを下に移動するのではなく、どの列が最も高いかを追跡する必要があります。私の例では、中央の列が最も高いです。 #current-lineはヘッダのオフセットを含むレポートで現在の行の位置があるので、私は#line-offset#start-line-offsetを使用してい

理由があります。たとえば、ヘッダーが5行の高さの場合、#current-lineは6(ヘッダーの後の1行目)に等しくなり、PRINT 'hello' (#current-line, 1)は実際にレポートの11行目(5行目のヘッダーから6行下)に印刷されます。また、#current-lineに値を代入しても動作しないようですので、現在の行位置を直接操作することはできません。しかし、あなたは3つの列の後に何かを印刷する必要がない場合は、あなたの現在の行の位置は、各PRINTの間で変化しないように

は、その後、あなたはWRAPKEEP-TOPパラメータを使用することができますし、持っていませんラインオフセットトラッキングのいずれかを行う。

&TXT.PO_TXTをテキストと列の位置データがそのフィールドに格納される方法に基づいて、3つの別々の変数(各列に1つ)に解析する必要があります。

注目すべき点の1つは、印刷中のデータ内に2つ以上の空白がある場合、単語区切りだけが決定されるように見えるため、SQRは行の最初の文字としてスペースを入れることがあります1つまたは複数のスペースのシーケンスではなく、第1のスペースによるものです。

関連する問題