みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
以前カスタム関数で、
1)指定バイト数で値を生成(倍角があってもOK)
LeftB ( text ; len )
というカスタム関数
Case (
Length ( text ) + Length ( Filter ( text ; RomanZenkaku ( KanaZenkaku ( text ) ) ) ) ≤ len ; text ;
LeftB ( Left ( text ; Length ( text ) - 1 ) ; len ))
2)半角バイト数を返す(倍角があってもOK)
Length( テキスト & Filter ( テキスト ; RomanZenkaku (KanaZenkaku ( テキスト ))))
の2つをお教えいただきました。
今回は、Middle関数も必要になるのかなと思いますが、なかなかうまいこと行きません。
ご指導の程よろしくお願いいたします。
Offline
LeftB と同じような仕組みで RightB を作ります。
Middle ( Text ; n ; m ) は、LeftB ( RightB ( Text ; Length ( Text ) - n + 1 ) ) ; m ) です。
RightB ( LeftB ( Text ; n + m - 1 ) ) ; m ) のほうがシンプルかな。
Last edited by Shin (2022-09-14 09:57:44)
Offline
shinさん
さっそくお教えいただきましてありがとうございます。
試してみます。
Offline
たびたびの質問で恐縮です。カスタム関数の登録で綱拭いています。
まず、
1)RightBは
Case (
Length ( text ) + Length ( Filter ( text ; RomanZenkaku ( KanaZenkaku ( text ) ) ) ) ≤ len ; text ;
RightB ( Right ( text ; Length ( text) - 1 ) ; len )
)
を作りました。
引数は、text、len
次に
2)Middle ( Text ; n ; m )
Left ( RightB ( Text ; Length ( Text ) - n + 1 ) ) ; m )
引数は、text,n,m
この2)で「OK」ができず、エラーとなってしまいます。
何がいけないのでしょうか?
お手数おかけします。
よろしくお願いいたします。
Offline
全然別の式を作ってみました。2バイト文字の途中で切れる事には対応していません。
// MiddleB ( テキスト ; 先頭文字位置 ; 文字数 )
While (
[
t = テキスト ;
n = 先頭文字位置 + 文字数 - 1 ;
m = 先頭文字位置 ;
b = 0 ;
r = ""
] ;
b ≤ n;
[
v = Left ( t ; 1 ) ;
t = Replace ( t ; 1 ; 1 ; "" ) ;
b = b + Length ( HexEncode ( TextEncode ( v ; "shift_jis" ; 1 ) ) ) / 2 ;
r = Case ( b < m ; r ; r & v )
] ;
r
)
この式から、引数の持たせかたで、LeftB() , RightB() も計算できます。
Last edited by Shin (2022-09-12 22:39:33)
Offline
>この2)で「OK」ができず、エラーとなってしまいます。
関数名が既存だから?
内容はよく見てませんが、SJISに変換するのは一番理屈に合ってますよね。
ところで、倍角ではなく全角といいます。
倍角というのは、昔のワープロにあった、標準より横幅を2倍にする文字装飾のことです。
長年の疑問が解決して、
LeftB ( text ; length ) は
Let (
HT = Left ( HexEncode ( TextEncode ( text ; "shift_jis" ; 1 ) ) ; length * 2 ) ;
TextDecode ( HexDecode ( HT ; "shittJIS.bin" ) ; "shift_jis" )
)
RightB ( text ; length ) は
Let (
HT = Right ( HexEncode ( TextEncode ( text ; "shift_jis" ; 1 ) ) ; length * 2 ) ;
TextDecode ( HexDecode ( HT ; "shittJIS.bin" ) ; "shift_jis" )
)
MiddleB ( text ; start ; length ) は
Let (
HT = Middle ( HexEncode ( TextEncode ( text ; "shift_jis" ; 1 ) ) ; start * 2 - 1 ; length * 2 ) ;
TextDecode ( HexDecode ( HT ; "shittJIS.bin" ) ; "shift_jis" )
)
などで求められます。
ただし、textは、JISに定義されている文字に限りますが。
Last edited by Shin (2022-09-14 09:53:48)
Offline
himadaneeさん、アドバイスありがとうございます。
関数名が既存だから?
・・・既存登録済ではないのです。
ところで、倍角ではなく全角といいます。
倍角というのは、昔のワープロにあった、標準より横幅を2倍にする文字装飾のことです。
→知識不足のところありがとうございます。
shinさん
本日8:58にいただいた関数で再度トライします。
While関数のところは、私には理解できませんでした。
追ってご報告致します。
ありがとうございます。
Offline
●MiddleB ( text ; start ; length ) は
Let (
HT = Middle ( HexEncode ( TextEncode ( text ; "shift_jis" ; 1 ) ) ; start * 2 - 1 ; length * 2 ) ;
TextDecode ( HexDecode ( HT ; "shittJIS.bin" ) ; "shift_jis" )
)
これをカスタム関数で登録すればいいと思いました。
★lengthは引数として登録できない → lenに変更したらOK
★計算式に=があるのでこの計算式はエラーになってしまう
何か根本的に理解できていないところがあるのでしょうか?
そこで、直接フィールドにこ関数をセットしたところ、正常に値を取得できるフィールドと取得できないフィールドがあるのです。
項目間に空白があり、それが全角だったり半角だったりしていることが影響しているのか・・・。
※Claris社はどうしてByteで取得できる関数をやめてしまったのですかね。
日本や中国はとても困っていると思うのですが
Offline
コピペしてみましたが、
>★lengthは引数として登録できない → lenに変更したらOK
これは確かにその通り(関数名と重複は不可)ですが、
>★計算式に=があるのでこの計算式はエラーになってしまう
これはありえません。=はLet変数の設定なので何も問題ないです。そもそもそういう原因なら「直接フィールドに」も設定できません。
>正常に値を取得できるフィールドと取得できないフィールドがある
これは、「2バイト文字の途中で切れる事には対応していません。」のせいでは?これに対応しないと実際には使えませんね。
元のデータが正しく作られているかどうかでしょうが、バイト詰めで作られているデータで、正しい作りになっていれば、詰め文字が全角スペースでも半角スペースでも、バイト数での区切り位置で文字が切れることはないはずです。その範囲では実用になります。(なぜか、コードが分断されていると、エラーにならないでFMが落ちますが、なんでだろう)
この計算式では文字分断の処理が非常に面倒で、これを完璧に処理しようとすると、1文字毎処理になるので、上のループ処理の方が簡単になります。
FileMaker がその処理をやめたのは、内部の文字コードがUnicodeに変更されたからです。Unicodeには、バイトという概念がありません。(これは全世界的な流れですのでメリットの方が大きい)
Last edited by Shin (2022-09-15 14:27:27)
Offline
ああそうか、この質問は元々固定長データの分割のようでしたから、「取得できない」としたら、計算式の問題ではなくデータか指定する位置が間違ってるってことですね。
「これに対応しないと実際には使えません」と書いたのは、「任意のデータを枠幅に合わせてバイト長指定で切り出す」ような場合の話でした。失礼しました。
対応するとしたら、半端な位置が指定された場合の動作を規定しないと作れません。(スペースを前や後に入れるか・切り捨てるか切り上げるかなど)
お二人には、ここまでいろいろと考えていただき大変会社しています。余計な時間も使わせてしまったこととと思います。
で、結局、どうしたかと言いますと
元々は「データ」というフィールド・・・3206バイト
・データ_商品名から最後_DT Middle( データ ; 361 ; 800 )
・データ_右から規格名漢字_DT Right( データ ; 826 )
・データ_右からケース数_DT Right( データ ; 673 )
影響のない範囲で、元データを区切りました。
そこから、お教えいただいたカスタム関数やフィールドに設定する計算式をケースバイケースで設定しました。
そして1項目づつ、値を確認しました。
複数の発注データで検証しましたが、全てあるべき値を取得できとりあえずほっとしています。
納品までの時間もあまり残されていなかったためこんなベタことをやりました。
昨日、今日と、このベタな方法でも正常に処理できてるので、このままいきます。
ただし、何らかの理由で正常に取得できないリスクは抱えたままです。
とにもかくにも、ご指導いただきまして誠にありがとうございました。
Offline
納品されるものなのですか。
有償で依頼されるならともかく、その内容はご自分で解決されるべきでは。
状況によっては、著作権法に抵触するかもしれんよ
Last edited by Shin (2022-09-22 00:46:50)
Offline
どうゆう意味でしょうか?
有償で納品するものであるならば、ここで無償で相談することはダメだということでしょうか?
ここで紹介された関数や計算式を有償で納品するということは、勝手にはできないということでしょうか?
Offline
細かい事はいいたくないですが、厳密に言うとその通りだと思います。
ここで公開されているモノに限らず、webなどで公開されているすべてのプログラム(広義に解釈すれば1行の関数も含まれるかもしれません)については、それを書いた人に著作権が設定されます。著作権法の定義では、プログラムについては、公開された時点で、何ら登録などは不要で、著作物となります(著作権法第10条1項9号)。
著作物については、著作権法第30条で、
第三十条 著作権の目的となつている著作物(以下この款において単に「著作物」という。)は、個人的に又は家庭内その他これに準ずる限られた範囲内において使用すること(以下「私的使用」という。)を目的とするときは、次に掲げる場合を除き、その使用する者が複製することができる。
と定められており、個人的な利用以外の使用については著作権者の権利が及びます。
逆に、あなたが納品された物の一部の機能を他に流用され、それを販売されたらあなたはどうされますか。
別の見方からの判例があったと思いますが、そのプログラムが無ければあなたは納品できなかった可能性があり、その場合の損失を補填した形になるプログラムの著作権者からの報酬の請求を認めたものです。
どちらにしても、納入先が、ボランティアの掲示板の第3者の補助で作られていた事を知ったらどう考えられるでしょうか。
Last edited by Shin (2022-09-22 19:49:59)
Offline
あまり詳しいことを考えずに相談投稿してしまいました。
申し訳ありません。
納品プログラムは、独自の計算式に置き換えて、今後運用していきます。
Offline
一度メール下さい
お話ししましょう。
Offline
[ Generated in 0.008 seconds, 10 queries executed - Memory usage: 566.33 KiB (Peak: 586.87 KiB) ]