4 返信 最新の回答 日時: Jul 7, 2015 1:21 AM ユーザー:parc_box

    「賞味期限起算日」を用意しないといけないということが判明し調整で詰...

    parc_box

      タイトル

      「賞味期限起算日」を用意しないといけないということが判明し調整で詰まってます……。

      フォーラムに投稿

      お世話になっております。

      賞味期限を出す為に賞味期限起算日を出す計算式を用意しようとして詰まってます。
      ★この関数を使うと、小分製造日がa~dまで任意の日付が入ってる場合、正常に動作します。
      ★しかし、小分製造日が全て空欄で、製造日だけ入力すると、賞味期限起算日が空欄のままとなってしまいます。
      →結果、賞味期限日の値は「0001/04/29」となります。(賞味期限日数は120日[計算上は119日])

      フィールドは次の通りです。
      ※フィールド[賞味期限起算日]を算出する為の計算式です。

      [入庫日]:日付
      [製造日]:日付~通常、入庫日と同じ日。小分製造日が入ってる時は無視してもらう。
      [小分製造日 a]:日付 ※たまに発生。前日製造のあまりや返品分などの製造日。
      [小分製造日 b]:日付 ※たまに発生。前日製造のあまりや返品分などの製造日
      [小分製造日 c]:日付 ※たまに発生。前日製造のあまりや返品分などの製造日
      [小分製造日 d]:日付 ※たまに発生。前日製造のあまりや返品分などの製造日
      [賞味期限起算日]:日付 ※計算値自動入力

      <!-- ここから賞味期限起算日計算式 -->

      Case (

      /* 小分製造日の最小値に13日を足した値が今日の日付よりも前ならば、賞味期限起算日[以下、起算日]は「小分製造日の最小値に13を足した値」 */
      Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 < Get ( 日付 ) ;
      Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 ;

      /* 小分製造日の最小値に13日を足した値が今日の日付よりも後ならば、起算日は「今日の日付」 */
      Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 > Get ( 日付 ) ;
      Get ( 日付 ) ;

      /* 小分製造日が全て空欄で製造日に13を足した値が今日の日付よりも大きい場合、起算日には製造日を入れる。小分製造日部分を削除しても結果に変化なし*/
      小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" and 製造日 + 13 > Get ( 日付 ) ;
      製造日 ;

      /* 小分製造日が全て空欄で製造日に13を足した値が今日の日付より小さい場合、起算日には製造日+13の値を入れる。小分製造日部分を削除しても結果に変化なし*/
      小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" and 製造日 + 13 < Get ( 日付 ) ;
      製造日 + 13 ;

      )
      <!-- ここまで -->

      どこか、基本的な所が理解出来てないと思うのですが、よろしくお願い致します。

      %E8%B3%AA%E5%95%8F%E7%94%BB%E5%83%8F_150707.png

        • 1. Re: 「賞味期限起算日」を用意しないといけないということが判明し調整で詰...
          sago350@未来Switch

          どういう動きになって欲しいですか?

          賞味期限起算日が空欄なのは、このチェックが入っているからかと。

          • 2. Re: 「賞味期限起算日」を用意しないといけないということが判明し調整で詰...
            parc_box

            ありがとうございます!

            その部分のチェック、確かに入ってました。恥ずかしいです。
            で、起算日に値は入ったのですが、その内容は「0001/01/13」となっておりました。

            当方が希望してる起算日の内容は──。
            製造日に13日を足した日付と今日の日付を比較し、今日の日付よりも前になるなら、起算日に製造日に13日を足した日付を。
            製造日に13日を足した日付と今日の日付を比較し、今日の日付よりも後になるなら、起算日に今日の日付を。
            ──このように日付を設定したいのです。

            ──更に私サイドでも手を加えて…。

            現在、製造日を次の様な計算式に変更しました。

            何れかの[小分製造日]が入力されてる場合は製造日が空欄になるような計算式です。
            (製造日はキチンと動いてます)

            [製造日の計算式]
            If ( 小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" ; 入庫日 ; "" )

            それに伴い、賞味期限起算日は次の様な計算式になったのですが、状況は変わらず。

            [賞味期限起算日の計算式]

            Case (

            /* 小分製造日の最小値に13日を足した値が今日の日付よりも前ならば、賞味期限起算日[以下、起算日]は「小分製造日の最小値に13を足した値」 */
            Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 < Get ( 日付 ) ;
            Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 ;

            /* 小分製造日の最小値に13日を足した値が今日の日付よりも後ならば、起算日は「今日の日付」 */
            Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 > Get ( 日付 ) ;
            Get ( 日付 ) ;

            /* 製造日に13を足した日付が今日の日付より前ならば、起算日は製造日に13を足す。相変わらず起算日は空欄のまま */
            製造日 + 13 < Get ( 日付 ) ; 製造日 + 13 ;

            /* 製造日に13を足した日付が今日の日付より後ならば、起算日は今日の日付。相変わらず起算日は空欄のまま */
            製造日 + 13 > Get ( 日付 ) ; Get ( 日付 ) ;

            )

            製造日に13日を足した値と今日の日付を比較し、今日の日付よりも前になるなら、起算日に製造日に13日を足した日付を入れる。
            製造日に13日を足した値と今日の日付を比較し、今日の日付よりも後になるなら、起算日に今日の日付日付を入れる。
            ──としたいのです。小分製造日が入った場合は、最初の方と同様でキチンとした日付を返してくれてます。

            • 3. Re: 「賞味期限起算日」を用意しないといけないということが判明し調整で詰...
              user14047

              Case の中の条件の順番が違います。
              小分製造日が空欄の場合の Min (小分製造日 a; ...) + 13 のをだけの式でその式の値を確認してみてください。
              その値 < Get ( 日付 ) の条件に当てはまってしまいますので、そこで評価されてしまいます。

              それと、

              小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" and 製造日 + 13 > Get ( 日付 )

              も条件としておかしいです。

              小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" and 製造日 + 13

              で返ってくる値は 1 か 0 ですので、1 か 0 と Get ( 日付 )を比べても意味がないので、

              小分製造日 a = "" and 小分製造日 b = "" and 小分製造日 c = "" and 小分製造日 d = "" and ( 製造日 + 13 > Get ( 日付 ))

              と括弧で括ってやる必要があります。

              以上を纏めてこんな式でどうでしょうか?

              Let (
                   [
                   ~小分製造日の最小値 = Min ( 小分製造日 a ; 小分製造日 b ; 小分製造日 c ; 小分製造日 d ) + 13 ; 
                   ~小分製造日が全て空欄 = IsEmpty ( 小分製造日 a ) and IsEmpty ( 小分製造日 b ) and IsEmpty ( 小分製造日 c ) and IsEmpty ( 小分製造日 d )
                   ] ; 
                   Case (
                        /* 小分製造日が全て空欄で製造日に13を足した値が今日の日付よりも大きい場合、起算日には製造日を入れる。*/
                        ~小分製造日が全て空欄 and ( 製造日 + 13 > Get ( 日付 ) ) ;
                             製造日 ;
              
                        /* 小分製造日が全て空欄で製造日に13を足した値が今日の日付より小さい場合、起算日には製造日+13の値を入れる。*/
                        ~小分製造日が全て空欄 and ( 製造日 + 13 < Get ( 日付 ) ) ;
                             製造日 + 13 ;
              
                        /* 小分製造日の最小値に13日を足した値が今日の日付よりも前ならば、賞味期限起算日[以下、起算日]は「小分製造日の最小値に13を足した値」 */
                        ~小分製造日の最小値 < Get ( 日付 ) ;
                             ~小分製造日の最小値 ;
              
                        /* 小分製造日の最小値に13日を足した値が今日の日付よりも後ならば、起算日は「今日の日付」 */
                        ~小分製造日の最小値 > Get ( 日付 ) ;
                             Get ( 日付 )
                   )
              )
              
              • 4. Re: 「賞味期限起算日」を用意しないといけないということが判明し調整で詰...
                parc_box

                思わず声が出そうでした。

                それにしてもCaseの中の順番が違うのには気が付きませんでした。
                Caseの場合、順番に注意しないと途中で途切れてしまうというのは頭のなかにあったのですが、こんがらがってワケが分からなくなってたのかもしれません。実際、もう、何が何やら分からくなってました。

                それと()の使い方もよくわかってなかったですね。

                それにしても、初期にコチラで教わったLet関数、これまで何度も考えてたのですが、今回の解説で初めて「あ、そういうこと?」と理解するための糸口を指先に感じる事が出来たといいますか……。

                どうもありがとうございました。