過去の桐井戸端BBS (桐ver.7)
27978 二つ以上の条件での表引きをするとき新しいデータのみで表引きをさせたい hiroshi 2004/10/17-10:23
はじめてお伺い致します。
桐ver.7で請求書を作成したいとおもいます。
運送会社なので、時々運賃の改定があります。
行先を比較項目として、運賃は表引きで入力しようと考えました。
表引き表には[運賃設定日]、[行先]、[運賃]の項目があります。
入力表には、[売上日]、[行先]、[運賃]の項目があります。
ここで、表引き表には、同じ行先でも旧運賃と新運賃が混在しております。
[売上日]が[運賃設定日]より新しいばあい新運賃のほうを表引きさせる方法はあるのでしょうか。

過去ログを拝見しまして、二つ以上の項目で表引きするには
表引き表に連結項目をつくって検索させる、という風に理解しました。
そしてまた、比較演算子をつかう表引きは過去ログで掲載されておりましたが、
[売上日]が[運賃設定日]とくらべてどうか[行先]はどこかという設定ではなかったので悩んでいます。

表引き表の旧運賃を削除してしまえばいいのですが、
データーとして残しておきたいので、どなたか、ご教授ねがえないでしょうか。

27979 Re:二つ以上の条件での表引きについて 宮城 2004/10/17-17:47
記事番号27978へのコメント
hiroshiさん、こんにちは。

ちょいと発想を変えてみてはいかがでしょうか? 新旧両運賃を両方
表引きさせ、[適用運賃]という項目を追加、[売上日]と[運賃設定日]の
比較によりどちらを使うか項目計算式に設定する。

27980 Re:二つ以上の条件での表引きについて 宮城 2004/10/17-17:53
記事番号27979へのコメント
ちょっと他のかたにも伺いたいんですが、「表引き」の比較式、
私は「=」以外を遣ったのは1回あるっきりです。

# 常に「=」とすると割り切ったほうがわかりやすいのでは?

27981 Re:二つ以上の条件での表引きについて 北山 2004/10/17-18:51
記事番号27980へのコメント
hiroshiさん、宮城さん今晩は。
#表引き2を使っては如何でしょうか??
運賃表.TBLの第一項目は行先名・第二項目は新運賃・第三項目は旧運賃とし、
#条件選択で売上日により、#表引き2を使い第二項目若しくは第三項目を表引きさせます。

下記に桐のHELPをコピーしておきましたの参照して下さい。
#表引き2( val , op , file , num1 , num2 【 | , str 【 | , f 】 】 )

指定した表の中を検索し、該当するレコードの値を取り出します。
該当するレコードが複数ある場合は、表の先頭から見て、最初に見つかった
レコードの値を取り出します。
該当するレコードがなければ未定義値になります。
#表引きでは項目名を式で指定できませんが、この関数を利用すると検索する
項目と取り出す項目を項目番号(数値式)で指定できます。

引数 説明

val 比較する値を指定します。
この値のデータ型は、item1 と同じでなければいけません。
op 比較条件を演算子で指定します。

演算子 比較条件

=  val = item1
<>val <> item1
> val > item1
=> val => item1
<= val <= item1
< val < item1

file 検索する表ファイル名を指定します。
この引数に計算式は指定できません。
文字列型の定数または変数で指定してください。
自身の表を指定することはできません。
num1 file で指定した表の検索項目を番号で指定します。
項目番号は数値式で指定できます。
この項目のデータ型は、val と同じでなければいけません。
num2 値を取り出す file の項目を番号で指定します。
項目番号は数値式で指定できます。
str 索引を使用するときに、file の索引名を指定します。
使用しない場合は "" を指定します。この引数を省略した場合、item1 だけの
索引が定義されていればその索引を使用し、なければ索引を使用しません。
表が絞り込み状態のときは、つねに索引は使用しません。

f 編集対象となっているレコードを検索対象にするかどうかを指定します。

値 対象

0 file で指定した表が編集中であれば編集対象となっているレコードを
検索対象にし、そうでなければ表全体を検索対象にします。
1 つねに表全体を検索対象にします。

サンプル

商品.tbl に定義されている項目が、[CODE]、[JAN8]、[JAN13]、
[単価] のとき、[商品No] が 8 桁なら [JAN8](項目番号 = 2)、それ以外なら
[JAN13](項目番号 = 3)から検索して [単価](項目番号 = 4)の値を取り出します。

#表引き2( [商品No] , = , "商品.tbl" , #条件選択(#文字数([商品No])=8 , 2 , 1 , 3 ) , 4 )

ノート

#表引き2 は #TLU2 と書いてもかまいません。
表引き表を開くときのモードは、専有が第1優先順位になっています。
専有で開けなければ共有で開かれます。共有モードを第1優先順位にする場合は、
[ツール]メニューから[環境設定]を選び、[全般]タブの[高度な設定]ボタンをクリックして
「#表引き関数の表を共有→参照の順に開く」をONにします。
27982 Re:二つ以上の条件での表引きについて 悲しげ 2004/10/17-19:30
記事番号27978へのコメント
「#表引き2」関数なんかは利用できませんでしょうか?
〜〜〜〜〜〜〜〜〜〜〜〜以下ヘルプ〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#表引きでは項目名を式で指定できませんが、この関数を利用すると
検索する項目と取り出す項目を項目番号(数値式)で指定できます。

サンプル
商品.tbl に定義されている項目が、[CODE]、[JAN8]、[JAN13]、[単価]のとき、
[商品No] が 8 桁なら [JAN8](項目番号 = 2)、それ以外なら
[JAN13](項目番号 = 3)から検索して [単価](項目番号 = 4)の値を取り出します。
#表引き2([商品No],=,"商品.tbl",#条件選択(#文字数([商品No])=8,2,1,3),4)
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
今回の件に当てはめれば、後半の条件選択部分が
  [売上日]>[運賃設定日]ならば[新運賃](の項目番号)
  そうでなければ[旧運賃](の項目番号)
とか。(未検証)
あ、上記は当該表引き対象表の中に[新運賃]と[旧運賃]が別項目として存在していることが前提です。
それと[運賃設定日]は定数ではないとすればと入力表にも項目値を持たせる必要があるのか?



あるいは、新運賃表と旧運賃表が別の表だとした場合、

#計算(#代入(&件数,#表引き([行先],=,"新運賃表.tbl",[行先],[運賃]))
   ,#代入(&秒,#表引き([行先],=,"旧運賃表.tbl",[行先],[運賃]))
   ,#cond([売上日]>[運賃改訂日],&件数,1,&秒))

こちらも未検証。(^^;)

27983 Re:二つ以上の条件での表引きについて 悲しげ 2004/10/17-19:40
記事番号27978へのコメント
「表引き表に連結項目」および(「比較演算子」と云うよりは)不等号を使うやり方として思いつくのは、

入力表の連結項目の計算式を、例えば
  #str([売上日])+[行先]
のようにし、表引き対象表の項目値もこれに準じた形のデータを用意し、
当該連結項目について例えば降順の索引を設定しておく。

とすれば、入力表の運賃項目の計算式は
#表引き([某連結項目],<,"運賃表.tbl",[某連結項目],[運賃],"連結項目降順",1)とか。

これまた未検証。ひょっとすると不等号の向きや索引並びの設定は逆かも?

27986 ちょっと発想を変えて 尾形 2004/10/18-18:16
記事番号27981へのコメント
こんにちは
新と旧の二つではまた運賃が改定されたら破綻しそうです


表引き表は、[行先][運賃]のみにして
入力表は、[売上日][行先][運賃][入力運賃]

[入力運賃]に置換で現在の[運賃]を入れてください
[運賃]の項目計算式に
#条件選択(#絶対値([入力運賃])>0,[入力運賃],1,#表引き(・・・))

※要約すると[入力運賃]は古い(改定前)の運賃を入れておいて
※[入力運賃]が未定義なら単価表から表引きする としたらどうですか

27987 Re:二つ以上の条件での表引きについて アックン 2004/10/18-18:47
記事番号27978へのコメント
hiroshiさん、こんばんは。
もし運賃改定日に新旧ふたつの異なる日付が入っていると、不等号を使っただけでは
正確に新旧を判断できないと思うんですが。>悲しげさん

表引き表を新運賃と旧運賃のふたつ用意してみてはどうですか。
このやり方は意に添わないかもしれませんが・・・・・・

項目計算式:
 #cond( [売上日]>=d"2004-10-01" ,
 #tlu( [行先] , = , "新運賃表引表" , [行先] , [運賃] ) , 1 , #tlu( [行先] , = , "旧運賃表引表" , [行先] , [運賃] ) )

d"2004-10-01" は新運賃になった日です。
この日以降なら新運賃の表から表引きし、
それ以前なら旧運賃の表から表引きします。

アックン(=^・^=)
27988 Re:二つ以上の条件での表引きについて hiroshi 2004/10/18-19:17
記事番号27980へのコメント
宮城さん早速のご返信有難う御座います。
私は、つい最近不等式を使った表引きを知ったばかりで
おっしゃるとおり、イコールのすっきりした式にしたいです。
27989 Re:二つ以上の条件での表引きについて hiroshi 2004/10/18-19:41
記事番号27981へのコメント
北山さんご返信有難う御座います。
表引き2は初めてです。
表引き表には同じ行先でも、改定運賃は別レコードとして追加していましました。
理解できたところでは、表引き2では改定運賃は同じ行で別項目で入力する必要があるように思いました。
そこで、仮に運賃改定が3回あったとして、当初の運賃設定日2回目の運賃設定日、3回目の運賃設定日、
また当初の運賃2回目の運賃、3回目の運賃、が項目として考えられると思います。
その場合、目的とする金額を求めるには、条件選択かなにかで入力表の運送日が
表引き表の当初の運賃設定日より小ならば、表引き2、当初の運賃、運送日が
表引き表の運賃設定日より大きくてなおかつ2回目の運賃設定日より小ならば、表引き2、2回目の運賃
以下同じという、式にすればよいのでしょうか。

27990 Re:ちょっと発想を変えて hiroshi 2004/10/18-19:55
記事番号27986へのコメント
尾形さんご返信有難う御座います
表引き表を複数作って新と旧の運賃表を作成すると理解してよいでしょうか
27991 パネルでの表引きか、表引き関数かによって違いますが 佐田 守弘 2004/10/18-23:52
記事番号27978へのコメント
hiroshiさん
質問内容ですが、表引きパネルを表示してリストから選ぶ表引きなのか
それとも「#表引き」関数を使って計算式で表引きするのかが書かれて
おりません。このどちらを使うかによってやり方が変わります。
質問文からは、表引き関数を使うケースの様に見えますので、
こちらを前提に話を進めます。(どちらの場合もそれなりの難題ですね)

●イベントの中で日付について絞り込みを行う方法
フォームとイベントを使っているのであれば、表引き表(運賃表)を
予めイベントのメイン部で開いておきます。
そして、[売上日]のソース値更新イベントを使って、表引き表の
絞り込みを行っておく方法が思いつきます。
(但しできるかどうか、ためしてはおりません)
できたとしても、項目計算式に設定すると、再計算した時に値が
変わってしまいますから、編集初期値式に設定するのが良いでしょう。

●運賃表を複数に持つ方法
この方が実用的な様な気もします。
つまり、運賃01.tbl、運賃02.tblと分けるわけです。
表引き関数は次の様な形になります。
 #条件選択([売上日]<&運賃設定日1
      ,#表引き([行先],=,"運賃01",[行先],[運賃])
      ,[売上日]<&運賃設定日2
      ,#表引き([行先],=,"運賃02",[行先],[運賃])
      ,1
      ,#表引き([行先],=,"運賃03",[行先],[運賃])
      )
課題として、運賃設定日をどこに持たせるかがあります。その1つは
イベントのメイン部当たりで変数に値を設定しておくのが1つかと思います。

より汎用性を持たせようとしたら、運賃改訂日の表を持つ方法も考えられそうです。
この表は次の様な表です。
 [改訂日]  [運賃表]
 2004/01/30 運賃01.tbl
そして売上表でしょうか、売上日や運賃などを書き込む表の中に、
[運賃表]という項目を作り、日付から表引きする運賃表名を書き込みます。
この運賃表の名前を使って、運賃を表引きする関数を記述します。
表引きの表名に項目名の指定ができないかもしれないので、だめな場合には
一度変数に値を代入して、変数名で表引き関数を記述してみて下さい。

佐田守弘(KS-00119)
27992 Re:二つ以上の条件での表引きについて 今村 誠 2004/10/19-00:53
記事番号27978へのコメント
桐5の時から運賃計算は表引きでしています。
私は表引き表を2つ作っています。
一つは、行き先みたいなもので、全国の電話番号簿で、
(電話.tbl)市区町村毎(約3100件)にコードを割り当てています。
  ※サンプルあります。
 もう一つは運賃表(untin.tbl)約109件で、東北や近畿圏などを、
ヤマトやゆうパックの地区割り毎に重量とサイズで入力していますが、実際は重量です。
        ※サンプルはおいていません。
サイズが範囲外の時は結局重量の部分を商品(syouhin.tbl)毎に変更します。
※サンプルはおいていません。

 後は、売上伝票の方の数量に応じて、売上伝票の方に計算式で、
表引きの元になる項目(比較値)を作成します。
 hirosiさんの場合は、年度みたいな値を項目計算式で付加して見ては如何でしょうか。

参考までに表引きのための比較値の計算式を貼り付けてみます。
untin.tbl [表引運賃]
#cond([重量]<1,"",[着店]<1,"",1,#str([着店])+#str([重量],2))

販売.tbl [表引運賃] この項目は表示はしません。
#計算(#代入(&時,#NUM(#表引き([市],=,&tel,[住所],[着店コード]))),
#代入(&時,#cond(&時<1000,5,&時<1300,10,&時<1600,13,&時<2000,10,
&時<4000,20,&時<4400,40,&時<5000,44,&時<6000,50,&時<7000,60,
&時<8000,70,&時<9000,80,&時<9800,90,&時<10000,98)),
#代入(&分,#TLU([品C],=,"syouhin",[品C],[重量])*[数量]),
#cond(&分<1,"",&分<2,#str(&時)+"02",&分=<5,#str(&時)+"05",
&分=<10,#str(&時)+"10",&分=<15,#str(&時)+"15",
&分=<20 .and [数量]=4,#str(&時)+"30",
&分=<25 .and [数量]=3,#str(&時)+"40",
&分=<30 .and [数量]=4,#str(&時)+"50",1,#str(&時)+"60"))
販売.tblの表引き項目 [運賃]の表引き定義画面
 ┌────┬─────┬────────────────┐
 │比較項目│[表引運賃]│表引きのオプション チェック項目    │
 ├────┼─────┼──────┬─────────┤
 │表引き表│UNTIN.TBL│自動表示する│先頭一致で検索する  │
 ├────┼─────┼──────┴─────────┤
 │使用索引│表引運賃 │他の値も入力する             │
 ├────┼─────┼────────────────┤
 │検索項目│[表引運賃]│索引を自動使用する            │
 ├────┼─────┼────────────────┤
 │値項目 │[運賃]    │置換する                  │
 └────┴─────┴────────────────┘
運賃は目安として表示しますが、ほとんどenterですね。
27993 Re:二つ以上の条件での表引きについて hiroshi 2004/10/19-21:20
記事番号27987へのコメント
アックンさん
明快な回答有難う御座います。
運賃表を二つもつのは、おっしゃる通り
気がすすまないのですが
検討してみます。
27994 Re:パネルでの表引きか、表引き関数かによって違いますが hiroshi 2004/10/19-21:34
記事番号27991へのコメント
佐田 守弘さん
当方の意図するところが、もうひとつはっきりしませんでした。
説明不足、申し訳ありません。
ご推察のとおり、計算式にて問題をクリアしたいと思っています。
現段階では項属性で運賃データを引き、
今回に限りこの運賃だとか、あるいは運賃単価の改定等イレギュラーがあったときなどは、
他の値を手入力しています。
ところで、フォーム、イベントとか
なかんずく変数はもうひとつ、ピンと理解できていません。
こちらの、理解度か足らなくて、申し訳ありません。

27995 Re:二つ以上の条件での表引きについて hiroshi 2004/10/19-21:38
記事番号27983へのコメント
悲しげさんは
ご回答有難う御座います
表引き表、入力表の日付は日付文字列
になっていると思うので、よくわかりませんが
日付文字列は大・小の比較はできるのではないかと思います。

27996 Re:二つ以上の条件での表引きについて 悲しげ 2004/10/20-10:59
記事番号27995へのコメント
hiroshiさん wrote

>表引き表、入力表の日付は日付文字列
>になっていると思うので、よくわかりませんが
>日付文字列は大・小の比較はできるのではないか
>と思います。

「日付文字列は大・小の比較はできる」こと自体は、
私もできると思います。
……であるならばどうなのか? と云うところで、
文意がいまいちよく判りませんが……。(^^;)


戻る