桐ver.5についてのノウハウあれこれ

1998年 2月20日更新

トップページへ戻る


 私がこれまで桐を使ってきて得たいくつかのノウハウを紹介します。今まで桐ver.5では対応していないとあきらめていたことへの私なりの挑戦と、職場やインターネットで皆さんから質問を受けたことの報告です。
ノウハウのメニュー



ノウハウ集

13.伝票形式帳票(明細付き)をタックシール印刷のように1枚の用紙に同じものを上下に並べて印刷したい。
納品書
ABCD会社 御中
月日 品名 単価 数量 金額
2月1日 ノート 100 2 200
2月2日 えんぴつ 50 10 500
         
         
合計 700

ありがとうございました。
−−−−−−−−−−−−−−−
納品書(控え)
ABCD会社 御中
月日 品名 単価 数量 金額
2月1日 ノート 100 2 200
2月2日 えんぴつ 50 10 500
         
         
合計 700

(自社控え)


 複数の明細付きの伝票形式の帳票を横に並べて、同じものを1枚の用紙に印刷するのであれば、左右に同じレイアウトを作ればいいだけなので簡単なのだが、左の図のように同じ伝票で上のものはお客さんに渡すため、真ん中で切り取って下のものは控えにするため、上下に同じものを1枚の用紙に印刷したいときはどうすればいいのでしょう。

要するに、伝票形式帳票で
見出し部3行
明細部4行(明細単位1行)
脚書部2行

見出し部3行
明細部4行(明細単位1行)
脚書部2行
という指定をし、上下の明細部には同じものを印字するということなのですが、桐ver.5ではこのような指定はできません。

 <やり方>
 見出し部3行、明細部4行(明細単位1行)までは普通だが、脚書部には12行くらいとる。つまり、上半分の伝票の合計行以下(下の伝票の部分も含めて)をすべて脚書部にしてしまいます。また、脚書部で印字するためのデータを代入するための変数をその項目の分だけ用意します。(&月日1〜&月日4、&品名1〜&品名4、&単価1〜&単価4、&数量1〜&数量4、&金額1〜&金額4、データ型はそれぞれの項目のデータ型にあわせます。)各変数の最後の1〜4は、明細部の行数分だけ必要だという意味です。
一番上の見出し部の適当なところ(空いたところ)に、計算式の領域を5つ定義し、下記の式を書きます。(各変数をクリアするために領域を設定するので実際には何も印字されない。)

#計算(#代入(&月日1,””),#代入(&月日2,””),#代入(&月日3,””),#代入(&月日4,””),””)

#計算(#代入(&品名1,””),#代入(&品名2,””),#代入(&品名3,””),#代入(&品名4,””),””)

#計算(#代入(&数量1,””),#代入(&数量2,””),#代入(&数量3,””),#代入(&数量4,””),””)

#計算(#代入(&単価1,””),#代入(&単価2,””),#代入(&単価3,””),#代入(&単価4,””),””)

#計算(#代入(&金額1,””),#代入(&金額2,””),#代入(&金額3,””),#代入(&金額4,””),””)

明細部の適当なところに、計算式の領域を5つ定義し、下記の式を書きます。(項目の値を変数に代入するために設定するため実際には何も印字されない。)

#条件選択(#明細連番=1,#計算(#代入(&月日1,[月日],””),#明細連番=2,#計算(#代入(&月日2,[月日],””),#明細連番=3,#計算(#代入(&月日3,[月日],””),#明細連番=4,#計算(#代入(&月日4,[月日],””))

#条件選択(#明細連番=1,#計算(#代入(&品名1,[品名],””),#明細連番=2,#計算(#代入(&品名2,[品名],””),#明細連番=3,#計算(#代入(&品名3,[品名],””),#明細連番=4,#計算(#代入(&品名4,[品名],””))

#条件選択(#明細連番=1,#計算(#代入(&数量1,[数量],””),#明細連番=2,#計算(#代入(&数量2,[数量],””),#明細連番=3,#計算(#代入(&数量3,[数量],””),#明細連番=4,#計算(#代入(&数量4,[数量],””))

#条件選択(#明細連番=1,#計算(#代入(&単価1,[単価],””),#明細連番=2,#計算(#代入(&単価2,[単価],””),#明細連番=3,#計算(#代入(&単価3,[単価],””),#明細連番=4,#計算(#代入(&単価4,[単価],””))

#条件選択(#明細連番=1,#計算(#代入(&金額1,[金額],””),#明細連番=2,#計算(#代入(&金額2,[金額],””),#明細連番=3,#計算(#代入(&金額3,[金額],””),#明細連番=4,#計算(#代入(&金額4,[金額],””))

脚書部の各項目のところに、それぞれの変数を印字するための領域を作ります。
上の伝票の明細部のところでそれぞれの変数に代入して、脚書部でその変数を印字しているという訳です。
帳票定義時のイメージは下記のとおりになります。
H 納品書 (見出し部の空いたところに変数を
クリアする計算式の領域を定義する。)
H [会社名] 御中
H 月日 品名 単価 数量 金額
D [月日] [品名] [単価] [数量] [金額] (変数に代入する領域を定義する。)
F 合計 #合計([金額]) ←頁計
F ありがとうございました
F −−−−−−−−−−−−−−−−−−−−
F 納品書(控え)
F [会社名] 御中
F 月日 品名 単価 数量 金額
F &月日1 &品名1 &単価1 &数量1 &金額1 ←明細部で代入した、変数を脚書部
でそれぞれ印字する。
F &月日2 &品名2 &単価2 &数量2 &金額2
F &月日3 &品名3 &単価3 &数量3 &金額3
F &月日4 &品名4 &単価4 &数量4 &金額4
F 合計 #合計([金額]) 同じ脚書部なので、上の合計の領域と
同じでよい。
F 自社控え

変数をたくさん必要とするため、初期メニューで変数を定義したら、いったんファイルに書き出ししておき、印刷するときにその変数ファイルを読み込んでから行うと効率的に変数定義ができます。

12: 行集計で[金額]の項目を小計したものに0.05をかけて(小数点以下を切り捨て)[消費税]の項目で表示し、総計では[消費税]を小計で計算したものの合計を出したい。
1.変数の機能より値変更で &合計値を 0 にする。(集計する前には必ず行う)
2.行集計で[消費税]の総計の式は &合計値とする。
  小計の式は以下のとうりとする。
  #計算(#代入(&合計値,&合計値+#切り捨て(#合計([金額])*0.05,0)),切り捨て(#合計([金額])*0.05,0)) 



11.どうしても帳票(伝票形式)で横段組印刷をしたい。
桐の機能としては、帳票で段組印刷はありませんが、以下の方法でやってやれないことはありません。
サンプルとして、住所録のデータでJUSHO.TBL のデータをたて10行の2段組にしたいとします。
1.JUSHO.TBL の定義内容。
項目名 データ型
NO 数値
氏名 文字列
住所 文字列


NOのデータは、重複しない連番です。氏名コードのような
ものでもかまいません。
2.作業用のTENKAI.TBLを用意し、JUSHO.TBLのデータを読み込み機能で読み込む。(項目名一致)
項目名 データ型 項目計算式
行番 整数 #条件選択(#直前値([行番],0)=10,1,1,#直前値([行番],0)+1)
頁番 整数 #条件選択(#直前値([頁番],0)=20,1,1,#直前値([頁番],0)+1)
整数 #条件選択([頁番]=1,#直前値([頁],0)+1,1,#直前値([頁],0))
頁行番 文字列 #文字列([頁],4)+”-”+#文字列([行番],4)
位置 文字列 #条件選択([頁番]=<10,”左”,1,”右”)
NO 数値
氏名 文字列
住所 文字列
3.[頁行番]を文字符号順で整列させる。

4.下記の設定で転置集計をする。
グループ項目 [頁行番]
転置項目 [位置]
集計項目 [NO]
集計種別 合計
5.下記のDANGUMI.TBL に書き出し(追加)する。
項目名 データ型 項目計算式
数値
数値
数値 #表引き([左],=,”TENKAI”,[NO],[頁])
氏名左 文字列 #表引き([左],=,”TENKAI”,[NO],[氏名])
住所左 文字列 #表引き([左],=,”TENKAI”,[NO],[住所])
氏名右 文字列 #表引き([右],=,”TENKAI”,[NO],[氏名])
住所右 文字列 #表引き([右],=,”TENKAI”,[NO],[住所])
6.DANGUMI.TBL を開き、[頁]を置換で再計算させる。(他の項目も同時に再計算)

7.DANGUMI.TBL を対象表とした伝票形式の帳票を定義して印刷する。
  (明細部に、[氏名左]、[住所左]、[氏名右]、[住所左]の項目を定義する。)
  必ず明細部の行数は10行とする。
  改頁グループ項目は[頁]とする。

  行数を変えたいとき、例えば20行にしたいときは、TENKAI.TBL の項目計算式の中の
  10を20に、20を40にする。(3ケ所)帳票の明細部行数を20にする。
  印刷する項目は、TENKAI.TBL とDANGUMI.TBL(左と右の分それぞれ)に追加する。

 多少、手順がめんどうですので、実際の使用には一括処理を組んだ方がよいでしょう。



10.画面伝票の脚書部に合計を表示し、3桁ごとにカンマを入れるため#通貨文字列を使い小数点の桁を揃えたい。
計算式を以下のようにする。(小数点以下の桁数が1の場合)
#条件選択(#合計([A])−#切り捨て(#合計([A]),0)=0,#通貨文字列(#合計([A]),””)+”.0”,
1,#通貨文字列(#合計([A]),””))

9.K3フォーマットで書き出したときデータの中に ” があると ”” となって出力されてしまう。
以下の一括処理で対応する。

変数宣言 文字列{&DQ,&A,&B}
&DQ=”””
表 ”SAMPLE”
  位置指定 行番号=先頭
  印字開始 ”SAMPLE.K3”
    繰り返し (.NOT #EOF)
     &A=[A]
     &B=[B]
     印字 &DQ+&A+&DQ+”,”+&DQ+&B+&DQ
     位置指定 行番号=+1
    繰り返し終了
  印字終了

終了

8.帳票印刷でななめ罫線を引きたい。
図形ファイルでななめ罫線だけの図形を作って表示させる。
(ちょっとインチキくさいですが、私は実際にこの方法を使っています。桐ver.6に期待しましょう。)

7.プリンタで対応していないいろんなフォントを帳票印刷で使いたい。しかも自由な大きさで印刷したい。
桐の字体はプリンタに依存しており、大きさも一定の大きさしか印刷できません。
しかし、帳票の表題等固定の文字を印刷するだけなら、図形ファイルで好きなフォントの文字を書き、その図形ファイルを印字することで可能です。(項目のデータを印字するのには使えないのでインチキくさい。)
ある条件によって印刷する文字の内容を変えたいときは、簡単なものならいくつかの文字の図形ファイルを用意しておき、一括処理の中で条件によって図形ファイルのファイル名を変更する。

6.表引き関数を使い、複数の項目で照合したい。(SAMPLE.TBLの[A]と[B]とで照合し、[C]の値を取り出したい)
1.SAMPLE.TBLに作業用の項目を1つ作り、項目計算式を以下のようにする。
   (項目名は[D]、データ型は文字列)

  [A]+”-”+[B] (文字列の場合)
  #文字列([A])+”-”+#文字列([B])  (数値の場合) 
2.表引きの関数式を以下のようにする。

  #表引き([A]+”-”+[B],=,”SAMPLE”,[D],[C])  文字列の場合

  #表引き(#文字列([A])+”-”+#文字列([B]),=,”SAMPLE”,[D],[C]) 数値の場合 

5.ネットワークでレコード単位の排他制御を行いたい。
桐ver.5はファイル単位での排他制御はできますが、レコード単位ではできません。(1つのファイルを複数の人が同時に編集できない。)しかし、どうしても同じファイルでもレコードが違えば複数の人が同時に編集できるようにしたいということで・・・以下のとおり。

私は、ネットワークOSとしてNetWare4.1Jを使用していますが、複雑な一括処理を組んだため、概念だけを説明します。
(一括処理は概念を説明するためのものですので、このままでは使えません。)
このことについては、和田公人著「プロフェッショナルのための桐一括処理」をヒントに考えたので、参考にして下さい。

1.データは、当然サーバ上に置きます。レコードごとにデータ内容が重複しないような[データNo]の項目を作っておきます。
  (データ型は文字列で、8桁以内)

2.編集したいレコードを選択し、クライアントに作業用ファイルとして複写します。

3.同時にその[データNo]の内容をファイル名とするファイルを印字コマンドでサーバ上に作成します。(ファイルの内容は何でもよい。そのレコードが編集中かどうかを判断するフラグ用のファイルとして使用)
  クライアントに複写したレコードはサーバ上からは削除します。同時にサーバ上の表を閉じます
 
4.クライアントで作業用ファイルを使って編集し、終了後サーバ上のもとのファイルに追加します。

5.もとのファイルに追加すると同時に、印字コマンドで作成した[データNo]の内容をファイル名とするファイルを削除します。

6.他のクライアントは、サーバのファイルが開いている間は#ファイル使用を使って監視され、開けません。
  表が閉じられるまで待ってもらうようメッセージを出します。
  また、現在作業中の[データNo]のレコードを編集しようとすると、#ファイルサイズでその[データNo]の内容をファイル名とするファイルが存在するかどうかを判断し、他の人が編集中なら存在するので、しばらく待つようメッセージを出す。

7.他の人が編集を終わるとそのファイルは削除されるので、編集可能になる。


一括処理を組むときは、常に第3者のクライアントがアクセスしてくるという可能性を頭の中にもちながら、組まなくてはいけません。特にエラーチェックなどきびしく行う必要があります。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
 サーバのドライブ名は F:\  クライアントは C:\

繰り返し

  キー入力 (10,10),プロンプト=”編集するデータNoを入力して下さい”,終了状態=&END,&DATANO
   &FILE=”F:\”+&DATANO+”.FRG”
    条件 (&END=0) 繰り返し中止

  繰り返し (#ファイルサイズ(&FILE)<>-1)
     画面表示 (20,10),”そのデータは他クライアントが使用中 しばらくお待ち下さい”
     機能キー入力 (1,1)-(1,1),プロンプト=””,カーソル=オフ,文字キー=無効,
     入力待ち=しない,バッファクリア=する,&END
       条件 (&END=27) 繰り返し中止
  繰り返し終了
   条件 (&END=27) 繰り返し中止

   印字開始 &FILE
     印字 &FILE
   印字終了

  繰り返し (.NOT #ファイル使用(”F:\SAMPLE”,1))
     画面表示 (20,20),”他のクライアントが処理中 しばらくお待ち下さい”
     機能キー入力 (1,1)-(1,1),プロンプト=””,カーソル=オフ,文字キー=無効,
     入力待ち=しない,バッファクリア=する,&END
       条件 (&END=27) 繰り返し中止
  繰り返し終了
     条件 (&END=27) 繰り返し中止

  表 ”F:\SAMPLE”,表番号=1,更新=許可,リトライ=する,終了状態=&END 

  選択 [データNo]=&DATANO
    書き出し 表,”C:¥WORK”,*
    行削除 *
  選択解除
  終了 表 1

  手続き実行 作業ファイル編集

  ファイル削除 &FILE

繰り返し終了

終了


名札 作業ファイル編集
  表 ”C:\WORK”
    (データ編集部分を記述する)
  書き出し 表,”F:SAMPLE”,追加,*
  表
  ファイル削除 ”C:\WORK”
手続き終了
 

4.システムコマンドを使わないでチャイルドプロセスを行いたい。
 桐ver.5から正式にシステムコマンドがサポートされ、桐の一括処理の中から直接、DOSの外部コマンドやバッチファイルを実行することができるようになりましたが、どうしてもメモリ不足でシステムコマンドで実行できないコマンドがあります。
 また、例えばLANでネットワークを組むときならよいのですが、電話回線を使ったWANといわれるネットワークで桐を使用するときは、ISDNを使っても回線速度が遅く使いものになりません。
 そこで、普段はローカルで桐を使用し、送受信をするファイルを作っておいてから、いったん桐を終了し、バッチファイルによってネットワークを起動し、ファイルの送受信を行ってから又桐に戻るという手法を使います。
 一括処理を起動するバッチファイルを使用し、その中で一括処理と組み合わせてチャイルドプロセスもどきを行います。
 これは、酒井昭伸、田村安史著の「名人桐」に掲載されていたものをヒントにしました。

・バッチファイル
 :START
  IF EXIST C:\CHILD.BAT DEL C:\CHILD.BAT
 C:\
 CD \KIRIV5
 KIRI =サンプル.CMD
 IF NOT EXIST C:\CHILD.BAT GOTO END
 CALL C:\CHILD.BAT
 GOTO START
:END


・一括処理
  システムコマンドを実行したい部分で、以下の部分を記述する。(--------- は実行したいコマンドを書く)

  印字開始 ”C:\CHILD.BAT”
    印字 ”--------”
    印字 ”--------”
  印字終了
  終了

一括処理は、必ずバッチファイルから実行し、この部分にくるとチャイルドプロセスのバッチファイルを作成し、いったん終了する。
バッチファイルに戻って、作成されたバッチファイルを実行し、その後そのバッチファイルを削除して一括処理に戻る。

3.データの中のある特定の文字を取り除きたい。
空白を取り除く関数はあるが、特定の文字列を取り除く関数はありません。ただし、#文字置換を使えば可能です。
要するに取り除きたい文字を””(ヌル、空文字列)に変換すればよいのです。
(例は、[電話番号]の中の−(ハイフン)を取り除く)

#文字置換([電話番号],”−”,””)

2.データ(文字列)の中に指定した文字がいくつ含まれているかを調べたい。
例:”ABCDEFGCH”の中に”C”は2ケ(項目名は[A])
前項の応用です。

#文字数([A])−#文字数(#文字置換([A],”C”,””))

[A]の文字数から[A]から”C”を取り除いた後の文字数を引いて”C”の数を求める。

1.選択でのOR検索を6個より多い条件で行いたい。
通常、選択でOR条件を指定するには「選択:条件名」の機能を使います。
ただし、「条件名」では1つの検索条件で指定できるOR条件は6種類までという制限があります。
6個より多くOR条件を指定して選択する方法はいろいろあるかと思いますが、そのうちの2つを紹介します。

1.併合を使う。
  選択したいレコードを他の表で作成しておき、その表を元に併合:選択をする。ただし、複雑な式を指定することはできない。

2.作業用の項目を一つ用意し、その項目計算式に#条件選択を使って指定した条件式にあてはまるとき、”選択”という文字を返すようにしてから、その項目に”選択”という文字が入っているレコードを選択する。

<例>
#条件選択(式1,”選択”,式2,”選択”,式3,”選択”,式4,”選択”,式5,”選択”,式6,”選択”,式7,”選択”,1,””)

 式1から順番に評価していき、あてはまると”選択”という文字を返している。どれにもあてはまらないと””ヌルを返す。
 その後、”選択”の入っているレコードを選択すれば、結果的にOR条件をいくつでも指定していることになる。
ただし、式が長くなって多少みにくくなるのが欠点。




トップページへ戻る