過去の桐井戸端BBS (桐ver.9)
23997 レポート印刷で電話番号をハイフンで区切って3分割して印刷したい katsuyoshi 2003/12/23-08:40
お世話になります。
桐9-2004で受発注管理に取り組んでいます。
項目[電話番号]に文字列で 123-456-7890と入力し
宅配ラベル(RPT)にテキストオブジェクトを3分割して
印刷しようと思っています。
#部分列で文字分割ができますが郵便番号のように
各オブジェクトの桁数(文字数)が不定のため
うまく区切ることができません。
よい方法を教えてください。
24000 Re:電話番号の部分列について 大原孝一 2003/12/23-10:53
記事番号23997へのコメント
はじめまして
単純な発想ですが、電話番号って1234-12-1234か123-123-1234の10桁構成ではないでしょうか?
そこで、前、中、後に分割する表中計算は

前; #条件選択(#IS記号([番号],0)=4,#部分列([番号],1,3),#IS記号([番号],0)=5,#部分列([番号],1,4))

中;#条件選択(#IS記号([番号],0)=4,#部分列([番号],5,3),#IS記号([番号],0)=5,#部分列([番号],6,2))

後;#右側文字列([番号],4)

ではいかがでしょう。はずしていらたm(_ _)m

24001 Re:電話番号の部分列について 佐田 守弘 2003/12/23-10:57
記事番号23997へのコメント
katsuyoshiさん
電話番号を市外局番、市内局番、加入者番号に切り分けるには、
区切りに使っているハイフォンの位置を「#文字位置」関数で求め、この位置までを取り出す方法で行います。
3つのテキストオブジェクトを作ったとの事なので、それぞれに次の様な計算式を設定して下さい(動作確認はしておりません)。
・市外局番
#計算(#代入(&pos,#文字位置([電話番号]),"-")
   ,#代入(&tel1,#部分列([電話番号],1,&pos-1))
   ,#代入(&tel,#部分列([電話番号],&pos+1)
   ,&tel1
   )
・市内局番
#計算(#代入(&pos,#文字位置(&tel),"-")
   ,#代入(&tel1,#部分列(&tel,1,&pos-1))
   ,#代入(&tel,#部分列(&tel,&pos+1)
   ,&tel1
   )
・加入者番号(次のどの計算式でも同じ)
#右側文字列(&tel,4)  または
#部分列(&tel,2)    または
#文字置換(&tel,"-","")

なお、3つのオブジェクトは、左上位置の高さがきちんと合わせてあり、
オブジェクトリストでこの順に並んでいる事を確認して下さい。
オブジェクトリストの順と位置がずれていると、異なる結果になるおそれがあります。

●上記の考え方
まず[電話番号]の先頭のハイフォンの位置を見つけます。
この1つ手前までの文字列を取り出して、&tel1にひとまず代入します。
この値が印刷する値です。
次にハイフォンの後ろを&telに代入します。これは次の処理に使う値です。
最後に&tel1を呼び出してこの値をテキストオブジェクトの値とします。
一連の計算を行うために、「#計算」関数を使っています。
同様にして、市内局番も処理を行います。

●しかしながら
市外局番、市内局番、加入者番号の3つを縦に並べるなら解りますが、
横に並べて印刷するのであると、3つのオブジェクトに分ける必要があるのでしょうか。
文字数は決まっていませんから、仮に枠を作っても、巧く収まるかどうかですね。
単にハイフォンをスペースに置換して印刷するだけで目的を達する様な気もしますが。

佐田守弘(KS-00119)
24005 Re:電話番号の部分列について MIT 2003/12/23-12:22
記事番号23997へのコメント
katsuyoshiさん

「123-456-789」が項目[電話番号]で
(区切り文字として「-」は必ず入っていると仮定して)
以下の4項目を該当の表に追加します。

1.[市街局番]の項目を表に作って計算式に

#部分列([電話番号],1,#文字位置([電話番号],"-")-1)

を設定します。ここには「123」が入ります。


2.[電話番号2]の項目を表に作って計算式に

#部分列([電話番号],#文字数([市街局番])+1)

を設定します。ここには「456-789」が入ります。


3.[局番]の項目を表に作って計算式に

#部分列([電話番号2],1,#文字位置([電話番号2],"-")-1)

を設定します。ここには「456」が入ります。


4.[番号]の項目を表に作って計算式に

#部分列([電話番号2],#文字数([局番])+1)

を設定します。ここには「789」が入ります。


以上ですが、要するに区切り記号「-」で2分割するのは簡単なので
途中に[電話番号2]を設けて計算は2分割になるようにしたものです。
もっと多くの分割を必要とするケースでも応用できるかと思います。


宅配用紙など指定用紙では手書きのために「-」が印刷されており
佐田先生のおっしゃる「-」をスペースで置換でも印字としては
十分かと思いますが、印字位置をきれいに合わせたい時は電話番号が
分かれていると確かに位置合わせがやり易いですね。


ところで、これまでのデータは上記の方法で3分割できますので、
3分割後に計算式を削除して今後は入力も3分割に変更してしまうのも
良いかも知れません。
その理由は電話番号の「-」位置は変更される場合があるためです。
印刷などのために3分割で保存しておいて、更に検索項目として
[市街局番]+[局番]+[番号]を計算式とした項目を追加しておくと
「-」位置が変わっても検索できます。
以上ご参考まで。MIT
24006 Re:電話番号の部分列について 今村 誠 2003/12/23-13:09
記事番号23997へのコメント
katsuyoshiさんこんにちは
私の場合ヤマト運輸などでは3つに分割しています。
レポートの2番目の箱には

#計算(#代入(&STR,[電話]),
#代入(&STR,
#S(#S(#S(#S(#S(#S(
#trim(#半角(&STR),3)
," ",",")
,"(",",")
,")",",")
,"ー",",")
,"−",",")
,"-",",")),
#代入(&STR,#COND(
#L(&STR)-#L(#S(&STR,",",""))<>2,
#S(&STR,",",""),
1,&STR)),
#COND(#L(&STR)<9,"",
#文字位置(&STR,",")<1,
#S(#SSTR(&STR,#切り上げ((#l(&STR)-4)/2,0)+1),#last(&STR,4),""),
1,#対応文字列(&STR,2)))

1番目は後ろの2行を
#SSTR(&STR,1,#切り上げ((#l(&STR)-4)/2,0),
1,#対応文字列(&STR,1)))
3番目は
#last(&STR,4),
1,#対応文字列(&STR,3)))

にしています。
入力の区切りがスペースでない場合は途中の#trimの引数を
4にすると空白がなくなります。

 検索では(‐)ハイフン等の区切り文字を省いた計算項目を
作成してそこを検索します。
 3つに分けると検索しにくいと思います。
また重複したデータの確認をするためにもハイフン(区切り)
無しの項目はあった方が便利いいと思います。
24007 Re:電話番号の部分列について うにん 2003/12/23-14:38
記事番号23997へのコメント

>#部分列で文字分割ができますが郵便番号のように
>各オブジェクトの桁数(文字数)が不定のため
>うまく区切ることができません。
>よい方法を教えてください。

「郵便番号のように」でなく「郵便番号と違って」ですよね:-)
(さもなくば、「一定ではないため」)

それはさておき、#対応文字列を使うとすっきりします。
#対応文字列(#文字置換([電話番号],"-",","),1)
#対応文字列(#文字置換([電話番号],"-",","),2)
#対応文字列(#文字置換([電話番号],"-",","),3)

24009 Re:電話番号の部分列について katsuyoshi 2003/12/23-21:16
記事番号23997へのコメント
大原さん、佐田さん、MITさん、今村さん、うにんさん
ありがとうございました。
一つの結果を得るためにいくつもの方法があるんだなぁー
と改めて教えて頂きました。
今回はうにんさんの方法でレポートを作成したいと思います。
皆さんが言っておられるように検索をすることも考えなければ
と思い検索用に別項目を作成したいと思います。

うにんさん
>「郵便番号のように」でなく「郵便番号と違って」ですよね:-)
>(さもなくば、「一定ではないため」)
その通りです。仕事が休みで頭がまだ寝ていたようです。

これからもよろしくお願いします。

別質問がありますのでそちらもよろしくお願いします。
24014 Re:電話番号の部分列について 通りすがり 2003/12/23-23:09
記事番号24009へのコメント
>一つの結果を得るためにいくつもの方法があるんだなぁー
>今回はうにんさんの方法でレポートを作成したいと思います。

うにんさんの方法も今村さんの方法も基本的には同じ手法です。
「-」を「,」へ変換し、#対応文字列 を使うのですが・・・・。

今村さんのは、区切りの「-」が「ー」や「()」にも対応しており、誤って空白を
入れてある場合にも対応しているんじゃないかな?
012-345-6789
012(345)6789
012ー345ー4789
012−345−6789
いろんな値が入力してある場合が想定されますから。

まあ、元のデータがきちんと生理整頓されていれば、うにんさんのようにすっきりとした書き方になります。
(確実に区切りが「-」だけであり、必ず「-」が2つあり、
かつ、データに「数字以外」が含まれない場合)

いずれにせよ、元データがしっかりと管理されていなければなりませんね。


戻る