FileMaker Dictionary 関数
FileMaker Dictionary Functions以下の blockquote部分は上記出典ページの段落、直後の日本語は内容の拙訳です。拙訳への具体的な「ちげーよバカ!」な突っ込みは大歓迎です。※ 万一のトラブルは、出典サイトはもちろん、(たとえそれが僕の拙訳のせいだとしても) 一切関知しませんのであしからず。素晴らしいカスタム関数を発表してくれた sixfriedrice.com の Jesse Antunes / Geoff Coffey に感謝します。
Since many people were impressed with my named parameters article, I decided to write up another post about the dictionary functions. Actually in all fairness I think three people actually liked it. Vincenzo Menanno, Chris Wack and Sam Barnum this post’s for you!
"named parameters (名前付きパラメータ)" 記事 への皆さんの食いつきがなかなかにすばらしいので、"the Dictionary functions" についての別の post を書くことにしました。まあ、公平にみて、3人の人たちがこれを気に入ってくれると考えています。Vincenzo Menanno, Chris Wack and Sam Barnum この post は君たち向けです!
Note: This article was revised November 23, 2007. I added the handyDictReplace function. -Geoff
Note: この記事は、2007/11/23 に改訂しました。重宝な DictReplace 関数を付け足しました。 - Geoff
First I must warn you, I have left the names of the custom functions the same as the functions we use internally. This means they may seem a little obtuse so feel free to change them. I’m also not getting to in-depth into how they actually work because it could take an extra 5 pages or so (yea I know Geoff… I’m lazy… deal with it). I’m sure most of you will get them pretty quickly despite my inept explanations. Oh yea, I also suggest going back and reading the named parameters post before getting into this post otherwise it probably won’t make much sense.Enjoy…
まず、最初の注意として…内部的に使っているカスタム関数の名前はそのまま残しました。ちょこっとダサイかも知れませんので、自由に変更してください。それに、どのように振る舞うかの詳細についてまでは触れていません。そこまでやると、簡単にもう5ページくらいかかってしまうので…はいはい面倒くさがりでごめんね。ほとんどの方は、私のダサダサな説明などいらないくらいにサクっとおわかりになるでしょうし。そうそう、 以前に post した "named parameters" の記事についても読んでいただいておいた方がよろしいでしょう。じゃないと、あんまわからない話になってしまうかも。楽しんでください...
Note: For the duration of this article I will refer to the custom functionPassParameter( name ; value ) in my previous post as #( ). This saves me 12 key strokes and won’t confuse me because that’s what I call it internally.
Note; 以前 “PassParameter ( name ; value )” として紹介したカスタム関数を#( )としています。こいつのおかげで、12キーストローク楽になりましたし、関数の内部で使っているので別に自分は混乱しないです。( bison 注:2011/02/12 21:09:18 修正しますた。by 今泉さんのありがたいツッコミ)
Using a Dictionary in the Script Result
スクリプト結果で、Dictionary を使う
I actually posted this in the comments of the Named Parameters post. The idea here is that you can not only use the named parameter idea in your script parameters but in your script results as well. So just place your dictionary values in the script result dialog of the Exit Script script step and you’ve go yourself named script results. I like to create a little shortcut to access them like so:
さて、これについては、"Named Parameters" の記事のコメントで post しました。このアイデアがここで意味するものは…named parameter のアイデアは、スクリプトパラメータだけでなく、スクリプト結果でも同様に使えるんだよ…ということです。ですから、スクリプト終了のスクリプトステップの スクリプト結果のダイアログに、あなたの dictionary の値を置いたものをスクリプト結果と名付けて処理を進めれるわけです。私は、以下のようなちょっとしたショートカットを作るのが好きです;Name: #R ( name )
Definition:
DictGet ( Get (ScriptResult) ; name )
DictGet ( Get (ScriptResult) ; name )
Checking for a Name in the Dictionary
Dictionary の中の名前をチェックする
There’s also a point where you may want to check if your dictionary contains a certain value. You could do this by simple using your DictGet() custom function on your Dict. By design, a call to the DictGet() will return empty if the name you are looking for isn’t there. That’s when I made DictContains?
また、「特定の値が あなたの dictionary の中に含まれているかどうか」をチェックしたいときもあるでしょう。これは、シンプルに あなたの Dect について、DictGet ( ) カスタム関数を使うことで可能です。仕組みとして、あなたが探しているものがそこに無ければ、DictGet ( ) をコールすると、空値が返ります。それで、DictContains? を作ったのです。Name: DictContains? ( dict, name )
Definition
Let (
pattern = "<:" & name & ":="; Position(dict; pattern; 1; 1) > 0
)
Let (
pattern = "<:" & name & ":="; Position(dict; pattern; 1; 1) > 0
)
All this is doing is checking the dictionary structure for the name of the value you are looking for and returning true if it finds the value and false if it doesn’t.
これが行うことのすべては、あなたが探している値の名前で、dictionary 構造 をチェックして、存在すれば true を返し、存在しなければ false を返すということです。
Note: This will not find any nested dictionary values. So if you were to store a dictionary within a dictionary ie. #( “Account” ; #( “Name” ; “Jesse” ) & #( “Job” ; “Writing confusing custom functions” ) ) you wouldn’t be able to use the DictContains? custom function to see if Job is in the dictionary because it is inside the account dictionary.
Note: 入れ子になった distionary の値は見つけられません。ですから譬えば…#( “Account” ; #( “Name” ; “Jesse” ) & #( “Job” ; “Writing confusing custom functions” ) )といった dictrionary において、"Job" が dictionary にあるかどうかをチェックするのにDictContains? を使うことはできません。なぜなら、"Job" は、Account dictionary の内部に存在するからです。
Removing an Entry from a Dictionary
Dictionary から エントリを削除する
You never know when, but there will be a point where you think… “Man, I wish I could remove a value from my dictionary.” Well, maybe you won’t… but I wrote this thing anyway. If you happen to bump into this situation, you can use the nifty function below. DictRemove() simply removes the dictionary name/value pair specified from the dictionary passed in.
いつとは言えませんが、こう考えることもあるでしょう。「なあ、オイラの dictionary の中から値を削除したいんだけど…」…まあ、ないかもしれませんが…とにかくそれについて書きました。もし、ばったり、そんな状況に出くわしたなら、下記の気の利いた関数を使うことができます。DictRemove ( ) は、特定の name/value のペアを、受け渡された dictionary からシンプルに削除します。Name: DictRemove ( dict , name )
Definition:
Let(
[
pattern = "<:" & name & ":="; entry_start = Position( dict ; pattern ; 1 ; 1); entry_end = Position( dict ; ":>" ; entry_start + 1; 1);
dict_beginning = If( entry_start > 0 ; Left ( dict ; entry_start - 1 ) );
rest_of_dict = Middle( dict ; entry_end + 2 ; 999999 );
new_dict = dict_beginning & rest_of_dict
];
If( entry_start > 0 ; new_dict ; dict )
)
Let(
[
pattern = "<:" & name & ":="; entry_start = Position( dict ; pattern ; 1 ; 1); entry_end = Position( dict ; ":>" ; entry_start + 1; 1);
dict_beginning = If( entry_start > 0 ; Left ( dict ; entry_start - 1 ) );
rest_of_dict = Middle( dict ; entry_end + 2 ; 999999 );
new_dict = dict_beginning & rest_of_dict
];
If( entry_start > 0 ; new_dict ; dict )
)
Replacing an Entry in a Dictionary
Dictionary のエントリを置換する
This function is primarily for convenience. It combines DictRemove with a new entry to effectively replace a value in the dictionary in one shot:
この関数は、やたら便利だったらありゃしません。DictRemove と新エントリを結合して、一発で dictionary 中の値を効果的に置き換えます。Name: DictReplace ( dict, name, value )
DictRemove(dict, name) & #(name, value)
Returning the Top Name in a Dictionary
Dictionary 中の Top Name を返す
This custom function was designed to return the name of the first name-value pair in the dictionary. Nothing too special, but I if used in conjunction with the DictRemove() function above, you can pop off the top value of the dictionary with ease.
このカスタム関数は、dictionary 中の 最初の name/value のペアの name を返します。特別なことは何もしていませんが、上記の DictRemove ( ) 関数と連携させて使うと、簡単に、最初の値を消すことができます。Name: DictFirst( dict )
Definition:
Let(
[startValue = "<:"; endValue = ":="; positionOfStartValue= Position( dict ; startValue ; 1 ; 1 ); endOfStartValue= If( positionOfStartValue > 0 ; positionOfStartValue + Length(startvalue); -1 );
beginningOfEndValue= Position( dict; endValue; endOfStartValue; 1 );
found = If( beginningOfEndValue > -1 and endOfStartValue > -1 ; True; False );
lengthFoundValue = beginningOfEndValue - endOfStartValue;
foundValue = Middle( dict; endOfStartValue ; lengthFoundValue )];
If( found ; foundValue ; "" )
)
Let(
[startValue = "<:"; endValue = ":="; positionOfStartValue= Position( dict ; startValue ; 1 ; 1 ); endOfStartValue= If( positionOfStartValue > 0 ; positionOfStartValue + Length(startvalue); -1 );
beginningOfEndValue= Position( dict; endValue; endOfStartValue; 1 );
found = If( beginningOfEndValue > -1 and endOfStartValue > -1 ; True; False );
lengthFoundValue = beginningOfEndValue - endOfStartValue;
foundValue = Middle( dict; endOfStartValue ; lengthFoundValue )];
If( found ; foundValue ; "" )
)
Adding to a Dictionary
Dictionary に追加する
This custom function is ridiculously easy. It’s really just a shortcut that looks a little more succinct then actually performing the action manually.
このカスタム関数は、バカほど簡単です。実際に手動で行うよりほんの少し簡潔にしたショートカットです。Name:DictAdd( dict; name; value )
Definition:
dict & #( name ; value )
dict & #( name ; value )
Dictionary To String
Dictionaryを文字列に
This is quite frankly my favorite custom function ever. Serioulsy, I have a ton of ridiculous functions that no one uses but me, but this is the creme de la creme. I’ll get slightly more indepth about this function because it can be a little tricky to understand. Here is the signature of the function:
これは、実際率直に言って、お気に入りのカスタム関数です。マジに、自分以外だれが使うねん…な関数を山ほど使っていますが、こいつは、最高です。ただ理解するのにちょこっとトリッキーかも知れないので、やや詳細に言及します。これがこの関数の書式です。
Name: DictToString
Parameters:
Dict: A dictionary of your choosing
Format: format you would like to display the data in.
Parameters:
Dict: A dictionary of your choosing
Format: format you would like to display the data in.
The real magic of this function comes from the Format parameter. This parameter will dictate how you want the data displayed. The function goes through each and every dictionary entry and will put it into whichever format you specific. To achieve this functionality a replace is performed on the Format. $name is replaced with the name of the dictionary entry and $value is replaced with the value of the dictionary entry. Here is the function:
この関数のキモは、Format parameter です。このパラメータには、「どのようにデータを表示させたいか」を記述します。この関数は、個々の dictionary エントリに対して実行され、あなたの指定したフォーマットに仕上げます。$name は、dictionary エントリの name と、$value は、value と置き換えられます。以下がその関数です。Name: DictToString( Dict ; Format )
Definition:
Let(
[
firstName = DictFirst ( dict );
rawdata = DictGet(dict; firstName) ;
data = If( not IsEmpty( DictFirst( rawdata ) ) ; DictToString( rawdata ; Format ); rawdata );
rest = DictRemove( dict ; firstName )
];
If( not IsEmpty(firstName) ;
Substitute(
format;
["$name"; firstName ];
["$value"; data ]
)
&
If (
not IsEmpty(rest);
DictToString(rest; Format)
)
; dict )
)
Let(
[
firstName = DictFirst ( dict );
rawdata = DictGet(dict; firstName) ;
data = If( not IsEmpty( DictFirst( rawdata ) ) ; DictToString( rawdata ; Format ); rawdata );
rest = DictRemove( dict ; firstName )
];
If( not IsEmpty(firstName) ;
Substitute(
format;
["$name"; firstName ];
["$value"; data ]
)
&
If (
not IsEmpty(rest);
DictToString(rest; Format)
)
; dict )
)
0コメント