みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
よろしくお願いします。
商品品番の文字列の操作について教えて下さい。
以下のような書式の品番にだけ特定の処理を行います。
ABC1-1234ABCDEFGHI
AB1-5678JKLMNOPQR
先頭からアルファベット2~3文字+数字1文字+ハイフン+数字4ケタ+アルファベット9文字
数字4ケタの後ろのアルファベットの3文字目を判別するにはどうしたらよいですか?
上記の書式には当てはまらない品番もあり、それは対象ではありません。
「数字4ケタ」を含んでいるのは上記の該当品番だけなので、それを目印にするといいのかな?と思うのですが、「数字4ケタを含む文字列の中で、数字に続くアルファベットの頭から3文字目」の出し方がわかりません。
先頭の文字列から、品番ごとにチェックする方法しか思いつかなかったので、下記のように計算フィールドを作ってみましたがダメでした。
Case(品番="ABC1-*" ; Middle ( 品番 ; 12 ; 1) ; 品番="AB1-*" ; Middle ( 品番 ; 11 ; 1) ; "" )
品番の検索の部分が間違っているのかな?と思うものの、その方法もわかりません。
初歩的なことかと思いますが、ご指導よろしくお願いします。
Windows7、FMP13
Offline
質問者です。
計算式をMiddleからPatternCountに変えたらアルファベットを拾えるようにはなりました。
でも、PatternCountでは文字列の途中に含まれる ”ABC1-” も抽出されてしまいました。
文字列の先頭から判別をしたいのですが、どのようにしたらよいですか?
よろしくお願いします。
Offline
先頭が "ABC1-" か否かを判定するだけなら、
Exact ( Left ( 品番 ; 5 ) ; "ABC1-" )
※大文字小文字を区別する場合。
先頭からアルファベット2~3文字+数字1文字+ハイフン+数字4ケタ+アルファベット9文字
と書かれていますが、"ABC1-" または "AB1-" のいずれかしかないのですか?
Offline
質問者です。
何度もすみません。
Caseの条件式の中で、Position ( 製品品番 ; "ABC1-" ; 1 ; 1 ) =1 としたら、先頭以外のものは対象から外れ、とりあえず品番ごとに条件を設定する方法では結果を得られるようになりました。
どうして 品番="ABC1-" では検索できないのですか?
ヘルプを読んでもよくわからなかったので、解説をしていただける方よろしくお願いします。
それと、今後も品番は増えていきますので、できれば「数字4ケタに続くアルファベットの3文字目」で判別をできるようにしたいです。
引き続きそちらの方法を教えていただけますようお願いします。
Offline
まず下記の質問にだけ。
どうして 品番="ABC1-" では検索できないのですか?
品番 = "ABC1-"
この式は品番が"ABC1-"か否か(大文字小文字は区別しない)という式なので、
"ABC1-1234ABCDEFGHI" では成立しません。
"ABC1-" が存在するか否かには PatternCount または Position を使います。
検索しているわけではないので「*」などのワイルドカードは利用できません。
Offline
Moz様
ご回答をいただいていたのに、大変失礼しました。
リロードしたつもりでしたが反映されておらず、行き違いになっておりました。
先頭からアルファベット2~3文字+数字1文字+ハイフン+数字4ケタ+アルファベット9文字
と書かれていますが、"ABC1-" または "AB1-" のいずれかしかないのですか?
"ABC1-" と "AB1-" 以外のものもあります。
今回は、"ABC1-" と "AB1-" のレコードだけに処理をしたいので、この2つだけを書きました。
説明が下手ですみません。
引き続きご指導よろしくお願いします。
Offline
Moz様
またまたありがとうございます。
"ABC1-" が存在するか否かには PatternCount または Position を使います。
検索しているわけではないので「*」などのワイルドカードは利用できません。
なるほど!!!
検索しているわけではないので、ワイルドカードは利用できないのですね。
やっと腑に落ちました!
スッキリしました~!
ありがとうございました。
Offline
先頭からアルファベット2~3文字+数字1文字+ハイフン+数字4ケタ+アルファベット9文字
数字4ケタの後ろのアルファベットの3文字目を判別するにはどうしたらよいですか?
上記の書式には当てはまらない品番もあり、それは対象ではありません。
「数字4ケタ」を含んでいるのは上記の該当品番だけなので、それを目印にするといいのかな?と思うのですが、「数字4ケタを含む文字列の中で、数字に続くアルファベットの頭から3文字目」の出し方がわかりません。
Let([
#txt=商品品番;
#txt=GetValue(Substitute(#txt;"-";¶); 2); //"-"より後半文字列を摘出
#txt=Replace(#txt;5;0;¶); //後半文字列をさらに前半4文字と後半文字列に分ける
#txt1=GetValue(#txt;1); //前半4文字を摘出
#txt2=GetValue(#txt;2); //後半文字列を摘出
#flg=(Filter(#txt1;"0123456789")=#txt1) and (Filter(#txt2;"0123456789")="") //対象品番か?を判別
];
Case(#flg; Middle(#txt2;3;1))
)
Last edited by Hiro (2014-08-10 12:36:24)
Offline
Hiro様
すごい関数を教えていただきましてありがとうございました。
Letも変数もFilterも、初めてお目にかかるものばかりで、最初はなんと難解な関数だろうとビビってしまいましたが、ご親切に解説も付けて下さったので、ちゃんと理解できました。
順序立てて分解していくんですね。
とても勉強になりました。
後半文字列の #txt2 の中に数字が1文字だけ含まれているレコードが3個だけ存在していたので、対象品番か判別する部分は、
#flg=(Filter(#txt1;"0123456789")=#txt1)
だけにしてみました。
すみません、こちらの関数を教えていただくまで気付いていませんでした。
前半4文字の #txt1 が数字だけの品番は、処理対象のものしか存在しないので、大丈夫だと思います。
御二方のお蔭で希望の結果も得られ、とても勉強になりました。
どうもありがとうございました。
Offline
Pages: 1
[ Generated in 0.006 seconds, 10 queries executed - Memory usage: 525.88 KiB (Peak: 546.42 KiB) ]