1 2 前へ 次へ 16 返信 最新の回答 日時: Apr 2, 2014 10:11 PM ユーザー:Nu-nrg

    関連レコードのテキストベースメール送信

    Nu-nrg

      タイトル

      関連レコードのテキストベースメール送信

      フォーラムに投稿

           関連レコードをPDFとかではなく、テキストベースでメール送信するには、どのような方法がベストでしょうか。
           関連レコードは検索条件でしぼったレコードです。
           「メールで送信」スクリプトステップに、トッピックと件名があり、件名は計算式を扱えますので、
           関連レコードをテキストベースでレコーごと、一定のフィールド順で続けて書き出すには、変数にループで改行文字含めて追記して行くという感じしか思いつかないのです。
           これしか方法はありませんでしょうか?
           ※できるならばレコード3の内容フィールドは何もないのでラベルっぽい文字列は表示しないように分岐したい

           メール本文サンプル)

           次の情報をお知らせします。
           ご興味ありましたらお問い合わせくださいますようお願いいたします。

           レコード1
           タイトル:あかさたな
           内容:200字くらい

           レコード2
           タイトル:はまやらわ
           内容:400字くらい

           レコード3
           タイトル:わをん
           内容:
           値段:800円

            

            


            

        • 1. Re: 関連レコードのテキストベースメール送信
          hiro_

               グローバルフィールドへ「フィールド内容の全置換」すると、面倒なLoopスクリプト処理のショートカット(簡略法)として使え、しかも高速です。

               この事案で例えれば、
               対象レコードに書き出し順でソートを掛けておき、
               目的の本文を入れるグローバルフィールドを次の計算値で全置換します。

                 Let([
                   $txt=Case(Get(レコード番号)=1; "次の情報をお知らせします。¶ご興味ありましたらお問い合わせくださいますようお願いいたします。"; $txt);
                   $add="¶" & List("レコード"&Get(レコード番号); "タイトル:"&タイトル; Case(内容<>""; "内容:"; 内容); Case(値段<>""; "値段:"&値段));
                   $txt=List($txt; $add)
                 ];
                   Case(Get(レコード番号)=Get(対象レコード数); $txt)
                 )

          • 2. Re: 関連レコードのテキストベースメール送信
            Nu-nrg

                 Hiroさん、ありがとうございます。
                 まだ試してなく恐縮ですが、グローバルフィールドを使わない手ってあるのでしょうか。
                 グローバルフィールドってちょっと抵抗がありまして。
                 もし別案があればご教示いただけると助かります。
                 PS:件数が多いとスピードは重視したほうが良いですね!

            • 3. Re: 関連レコードのテキストベースメール送信
              hiro_

              > グローバルフィールドってちょっと抵抗がありまして
                   とはどんな抵抗でしょうか? この事案では最善に思います。

                   フィールドを作らず計算値を直に本文指定する方法をお考えなら、
                   その計算値を得る仕組みの方がむしろ面倒で高負荷と思います。

                   余談ですがFMでは、何にでも使い回せる、一時変数置き場にグローバルフィールドを備えておくと何かと便利で、お奨めです。
                   複数必要な場合でも、繰り返しグローバルフィールドにしておけば備えはその1フィールドだけでカバーできます。

              • 4. Re: 関連レコードのテキストベースメール送信
                sago350@未来Switch

                     Ver13以降でしたら、集計フィールドの「一覧」を使うことで、対象レコードのフィールドを改行区切りで取得出来ますよ。

                http://www.filemaker.com/13help/ja/html/create_db.8.21.html

                • 5. Re: 関連レコードのテキストベースメール送信
                  Nu-nrg

                       Hiroさん、おっしゃるとおり理解しています。
                       ファイルメーカーのグローバルフィールドは特殊なので、できればノーマルな方法ができないかなという思考回路についついいってしまうものでして。折角のアイデアを教えていただいたので、もちろん試させていただこうと思っています。

                       変数を使った場合、phpの結合代入( .= )みたいなことが出来ないっぽいので、変数にループで追加するのは出来ないのかなとも思っていました。

                  • 6. Re: 関連レコードのテキストベースメール送信
                    Nu-nrg

                         Sago35さん、すみません、また環境を書き忘れました。
                         v12 adですが、ちょっと勉強してみます。

                    • 7. Re: 関連レコードのテキストベースメール送信
                      Nu-nrg
                           Let ( 
                           [
                           //もし関連レコードの番号が1番の場合は、最初の本文を変数txtに代入
                           $txt = Case (
                           Get ( レコード番号 ) = 1;  "次の情報をお知らせします。¶ご興味ありましたらお問い合わせくださいますようお願いいたします。” ; 
                           $txt
                           );
                            
                           //関連レコードの1つを専用の変数addに代入
                           //まず改行文字を入れ
                           $add="¶” &
                           //関連レコード1つの各フィールドを改行区切りテキストに 
                           List (
                           "レコード"&Get(レコード番号) ; 
                           "タイトル:”&タイトル; 
                           Case(内容<>""; "内容:"; 内容) ; 
                           Case(値段<>""; "値段:"&値段)
                           );
                            
                           //最初の文と関連レコードの1つを、変数$txtに入れなおす
                           $txt = List (
                           $txt; 
                           $add
                           )
                           ];
                            
                           //???
                           Case(
                           Get ( レコード番号 ) = Get ( 対象レコード数 ) ; 
                           $txt
                           )
                           )
                            
                            
                                
                                     目的の本文を入れるグローバルフィールドを次の計算値で全置換します。
                           
                                グローバルフィールドは専用テーブルに作りましたが、すみません、どのような処理で全置換するのでしょうか?
                                メール送信スクリプトステップのメッセージに計算式で$txtとするのでしょうけど、その前の処理がわかりません。

                                またloop処理が不要なのかも理解出来ていません。
                                レコードへ移動とかをしてloopしなくていいのでしょうか??

                                それと、Let内で最後のメゾットはどういう流れの必要でおこなっているのか理解出来ませんでした。
                                Let計算式はどこで使うのでしょうか。

                                教えていただけませんでしょうか!
                                 

                            

                      • 8. Re: 関連レコードのテキストベースメール送信
                        hiro_

                        > 変数を使った場合、phpの結合代入( .= )みたいなことが出来ないっぽいので、変数にループで追加するのは出来ないのかなとも思っていました。
                             正にそれをFM的に実装する最善の簡略手法と思います。
                             ここで全置換は、繰り返しループ処理と等価結果を一発で得る簡便な方法として採用しています。
                             ですから、全置換の1ステップだけで別段Loop処理は一切不要です。全置換自体がループ処理な訳です

                        > Let内で最後のメゾットはどういう流れ
                             全置換処理下でレコードごと毎回計算結果を書き出さす、最終レコードになってそれまで変数$txtに累積した生成全文を書き出しています。
                             Get(レコード番号)=Get(対象レコード数) は、最終レコードかの判定式です。

                             1.グローバル・テキストフィールド「変数」を追加作成。
                             2.スクリプトを作成。
                               ・フィールド内容の全置換[変数フィールド;値:※先の計算式]
                               ・メールを送信[メッセージ:変数フィールド]

                        • 9. Re: 関連レコードのテキストベースメール送信
                          Shin

                               >ファイルメーカーのグローバルフィールドは特殊なので、できればノーマルな方法

                               どこが特殊で、どうなればノーマルでしょうか。

                               変数が実装されていなかった時には、変数の代わりに常用していましたよ。

                               グローバルフィールド以外に、グローバル変数を使っても、同じようなことができますが、全置換の際に、ダミー的な動きをさせる必要があります。(あまり気持よい動きでは無いです)

                               >変数を使った場合、phpの結合代入( .= )みたいなことが出来ないっぽい

                               変数を設定で、例えば、$t に、$t & "aaaaa" を設定すれば、結合代入できますが。

                          • 10. Re: 関連レコードのテキストベースメール送信
                            Nu-nrg

                                 みなさま、色々とご教示いただきありがとうございました!
                                 変数の繰り返し$hoge[$count]と、その他変数の結合代入で解決いたしました。


                                 ----------スクリプト例----------

                                 変数を設定 [ $メール挨拶文; 値:"次の情報をお知らせします。" & "¶" &"ご興味ありましたらお問い合わせくださいますようお願いいたします。" & "¶" ]
                                 変数を設定 [ $メール結び文; 値:"よろしくお願いいたします。" ]
                                  
                                      変数を設定 [ $cnt; 値:0 ]
                                      レコード/検索条件/ページへ移動 [ 最初の ]
                                       
                            #関連レコードの1つの各フィールドを改行区切りで格納
                                      #フィールドがない部分の分岐はまだ記載していません
                                           Loop
                                           変数を設定 [ $cnt; 値:$cnt + 1 ]
                                           変数を設定 [ $レコード情報[$cnt]; 値:"レコード番号:" & Get (レコード番号 ) & "¶" & "タイトル:" & タイトル & "¶" & "内容:" & 内容 & "¶" && "¶" ]
                                           レコード/検索条件/ページへ移動 [ 次の; 最後まできたら終了 ]
                                           End Loop
                                  
                                  
                            #メール本文という変数にレコード数回ループで結合代入
                                      変数を設定 [ $cnt; 値:0 ]
                                      変数を設定 [ $max; 値:Get ( 対象レコード数 ) ]
                                      Loop
                                      Exit Loop If [ $cnt ≥ $max ]
                                      変数を設定 [ $cnt; 値:$cnt + 1 ]
                                      変数を設定 [ $メール本文; 値:$メール本文 & $レコード情報[$cnt] & "¶¶" ]
                                      End Loop
                                      #
                                      メールを送信 [ 電子メールクライアント経由で送信; メッセージ: $メール挨拶文 & "¶" & "¶" & $メール本文 & "¶¶" & $メール結び文 ]
                                      #
                                       
                                      --------------------------------
                                       
                                      Shinさんのご教示の通り、結合代入は出来ました。
                                      グローバルフィールドは昔は変数の代用というのは理解しています。しかしながらファイルメーカー特有なので、コードの可読性から出来る限り避けたいと思った次第です。余談ですが、グローバル変数はあとから探しにくいためあまり使わないようにしています。

                                      変数を配列(繰り返し)で使えるのと、配列の添字(繰り返し数)も変数が使えるのがとても便利でした。 

                                  

                            • 11. Re: 関連レコードのテキストベースメール送信
                              hiro_

                                   例示の様に長大なLoopスクリプトを組まない、折角の簡便な方法の提案なのですがねぇ。
                                   あくまでグローバルフィールドの使用を避けたいなら、少しレスポンスは落ちますが、
                                   既存の任意フィールドを代用して全置換を適用することも出来ます。
                                   そのフィールドは、変数に本文生成するループ処理の足場としてダミー利用するだけで、
                                   実際の生成結果は変数として直接メール送信へ渡されます。

                                   ----------スクリプト例(2ステップで完了)----------
                                   ・フィールド内容の全置換[タイトルフィールド;値:※計算式]
                                   ・メールを送信[メッセージ:$メール本文]

                                   ※ 計算式
                                    Let([
                                     $末尾フラグ= (Get(レコード番号)=Get(対象レコード数));
                                     $メール挨拶文=Case($末尾フラグ; List("次の情報をお知らせします。" ; "ご興味ありましたらお問い合わせくださいますようお願いいたします。" );
                                     $メール結び文=Case($末尾フラグ; "¶"&"よろしくお願いいたします。" );
                                     $レコード情報="¶" & List("レコード"&Get(レコード番号); "タイトル:"&タイトル; "内容:"&内容);
                                     $メール本文=List($メール本文; $レコード情報);
                                     $メール本文=List($メール挨拶文; $メール本文; $メール結び文)
                                     ];
                                     タイトルフィールド //自己フィールドを自己値で置換(表面的変化ナシ)、変数計算の為の偽装。1レコードごと書き換えるのでレスポンスは落ちる。
                                    )

                                    

                              • 12. Re: 関連レコードのテキストベースメール送信
                                Nu-nrg

                                     Hiroさん、すみません。
                                     前のスクリプト案ですが、別テーブルにグローバルフィールドを作るのではなくて、当該関連テーブル側にグローバルフィールドを作らないと行けないのですね。

                                     後者スクリプト案も、当該関連テーブル側の任意のフィールドを利用するということでしょうか。

                                     まだ、理解に苦しんでいます。
                                     もしや、全置換処理が該当レコードの順で書き変わるという、ある意味ループみたいな流れを利用しているということでしょうか。

                                • 13. Re: 関連レコードのテキストベースメール送信
                                  hiro_

                                       全置換は実体レコードを対象に実施される処理です。
                                       対象が関連参照レコードの場合は、「関連レコードへ移動;のみ表示」で関連テーブル側へ移動し
                                       実体レコード化して全置換するのが前提です。
                                       グローバルフィールドはレコードに紐付けされないので、どちらのテーブルにあっても理論的には構いません。
                                       既存フィールドを代用する場合は、関連テーブル側のフィールドであることが必須です。

                                       全置換での一覧文生成方のごく簡単な事例サンプルをアップしておきます。
                                       分かり易いため、サンプルは1テーブルでグローバルフィールドを利用するものです。
                                       ●サンプル「一覧生成.fmp12」→ http://yahoo.jp/box/_J77kj

                                  • 14. Re: 関連レコードのテキストベースメール送信
                                    Nu-nrg

                                         Hiro.さん、ファイルをダウンロードさせていただきました。
                                         なるほど、List関数をネスト的に利用するのはとても良いです。私はList関数を使ったことがなかったので、とても勉強になりました。

                                         すみません、まだLet内が理解出来ていない部分あります。

                                         $最後フラグ= ( Get ( レコード番号 ) = Get ( 対象レコード数 ) ) ;

                                         ですが、この計算式の意味が分かりません。
                                         レコード番号と対象レコード数が一致した時は、レコード番号(対象レコード数と等しい値でもある)を、フラグに入れる(値は極論なんでもいい、値があるかないかを後ほど判別するため)ということでしょうか?

                                    1 2 前へ 次へ