2012-04-11 18 views
2

おはようございます!Crystal Reports XIのテキストフィールドでの文字列の書式設定

誰かが私に助けてくれることを願っていますが、おそらく簡単な質問ですが、私は好きなように働くことはできません。私は現在、 "catch-all"テキストフィールドを持つレポートを扱っています。このフィールドでは、ユーザーは必要なものを入力でき、場合によっては情報を列形式で入力します(例1.1)。このフィールドは、このフィールドに「行」を作成するために使用されるキャリッジリターンを許可します。問題は、情報が入力されたときに列間のスペースを数えることなく(たとえば、1.2)、このフィールドの「列」がレポートに並んでいてほしいということです。問題は、この種の情報が入力されても、プロトコルまたはフォーマットのガイドラインが設定されていないことです。複数の「字幕」、行、字幕で区切られた行などがあります。各行の終わりにある改行(Chr(10))(または新しい行の始まり)だけが依存することができます一貫して

私は現在、個々の行を区切る必要に応じて、それぞれの書式を設定し、そのように一緒に戻ってそれを置くしようとしています:

Dim output As String 
    Dim sections as String 
    Dim returnCount as Int 
    Dim leftText as String 
    Dim rightText as String 
    Dim sectionTogether as String 
    Dim totalText as String 
    Dim textLength as Int 

    output = {table.textfield} 

    sections = ExtractString(output, Chr(10), Chr(10)) 

    If Instr(sections," ") > 0 Then 
     leftText = Left(sections, Instr(sections, " ")) 
     textLength = Length(Left(sections, Instr(sections, " ")) 
     rightText = Right(sections, Instr(sections, " ")) 
     Replace(sections," "," ") 
     sectionTogether = rightText + (Space(20) - (textLength - 3)) + leftText 
     totalText = totalText + sectionTogether 
     formula = totalText 
    else 
     formula = output 

これは私が何をしようとしているの要旨です。 2つのノート: 1)私はすべてのセクションをフォーマットするためにいくつかの種類のループが不足していることを知っているが、私は結晶でそれを設定する方法を知っていない 2)私はVBプログラミング経験を持っていますが、限られたツールを使用しているので、私はひっかかっていると感じています。私はVisual Studioで使用する方法とツールを見つけるのに苦労しています 3)私はまだこれを設定する方法を学んでいるので、デバッガ。

私は誰かが私を助けてくれることを願っています。私は1週間以上研究していて、壁に頭を打っているように感じています。

ありがとうございます。

The output examples 
ex. 1.1 
"Your current charges are: 
Jan   12.89 
Feb   117.44 
Mar   15.02 
Apr  4.17" 

ex. 1.2 
"Your current charges are: 
Jan      12.89 
Feb      117.44 
Mar      15.02 
Apr      4.17" 

答えて

3

あなたがしたいとしている最初のものは、(スプリット経由で行を分割している)、このように:

local stringvar array wallOText := split({table.textfield},chr(10));

これはあなたに、各文字列の配列を与えます配列エントリは「行」です。ここで、次を使用して行を超えることができますループ:

for i := 1 to ubound(wallOText) step 1 do <some stuff to wallOText[i]>

は今、列が右寄せ得ることは少しトリッキーですが、ここであなたが始めるためにいくつかのコードです。列の幅は、必要に応じて調整できます(この場合は20スペース)。また、では、固定幅フォントを使用する必要があります。

local stringvar output; 
local stringvar array row; 
local numbervar i; 
local numbervar j; 
local stringvar array wallOText := split({@some text},chr(10)); 
local stringvar elem; 

for i := 1 to ubound(wallOText) do //loop over lines 
    (row := split(wallOText[i]," "); 
    for j := 1 to ubound(row) do //loop over words 
     (elem := trim(row[j]); //get current element and cut white space 
     if not(elem="") then 
     output := output + space(20-len(elem)) + elem); //build output string 
    output := output + chr(10)); 

output
+0

ありがとうございました。それは真のタイプのフォントであり、私はあなたのアプローチが大好きですが、私はまだスペーシングエラーが発生しています。私はあなたのコードに小さな変更を加えなければならなかったので、複数のスペースを持たない行でこれらの操作を実行しませんでした。 '(行:= split(wall [i]、 ""); j:= 1の場合、 (行:= split(wall [i]、 ""); の場合はi = 1からubound (elem:= trim(行[j]); output:= output + space(20-len(elem))+ elem); output:= output + chr(10)); ) Else 出力:= {PBP_DPM_DETAIL_VW。テキスト}; 出力 ' –

+0

つまり、コードはうまくいくように見えますが、コードを変更せずに実行すると、奇妙な間隔があります。 idk何が起こっている。 –

+0

@EdwardLane出力をビルドする前に 'if not(elem =" ")then'を追加しました。これは、あなたの例のように列の輪郭を描くためにスペースの束を使用する状況を処理します。 "字幕"を含む行をスキップする場合は、その行に2つのスペースを含む文字列が表示されているかどうかを確認するだけです。 – Ryan

関連する問題