13 返信 最新の回答 日時: Aug 11, 2017 3:06 AM ユーザー:YukioTakaoka

    24時を超える時刻データのインポート

    ask

      初めまして。

      給与計算にFileMakerを利用しています。

      EXCELで作成した勤務データをFileMakerに取り込むのですが、

      24時を超える夜勤のものを取り込むとデータが変わってしまします。

      例えば、PM22時からAM3時の勤務をExcel上で【開始22:00 終了27:00】としていますが、

      インポートすると【開始22:00 終了3:00】となり勤務時間がマイナスになってしまいます。

      どうしたらこの問題が解決するでしょうか?

       

      Excelでの24時以降の表示形式は[h]:mmとしています。

      Excel2010とFileMakerPro12を利用しています。

       

      よろしくお願いします。

        • 1. Re: 24時を超える時刻データのインポート
          YukioTakaoka

          askさん、

           

          ひとつの参考ですが・・・

          FileMaker Pro 側の終了時刻のフィールドをテキストフィールドにして、取り込んでみると、Excelで「27:00」と入力されていた値が、「1900/01/01 3:00」という具合にインポートされてくることが分かります。

           

          このデータを日付部分と時刻部分に分割し、日付部分から、さらに日を取り出します。

          たとえば、「1900/01/01 3:00」であれば「1」です。

          この「1」は24時間以降の時に追加する1日の値になりますので、日が「1」であれば、24時間と言うことになります。

           

          この24時間を3時間に加えると、27時間という値を作り出すことができると思います。

           

          ご参考になれば幸いです。

          • 2. Re: 24時を超える時刻データのインポート
            ask

            ご回答ありがとうございます。

            実はまだFileMaker初心者で...

             

            『テキストフィールドにして、取り込んでみる』はできたのですが、それ以降が分かりません。初心者向けに教えていただけると嬉しいです。

             

            ちなみに、27:00は「1900/01/01 3:00」ではなく「1899/12/31 5:00」という形で取り込まれました。

             

            ご協力いただけると幸いです。

            • 3. Re: 24時を超える時刻データのインポート
              YukioTakaoka

              なるほど、私の手元のファイルと違う結果になりますね。

              Excelのバージョンによって変わるのでしょうか・・・ それはさておき。

               

              ちょっと手法を変えました。

              Excelかデータを取り込んだ時に、出勤時刻と退勤時刻を比較して、「出勤時刻 > 退勤時刻」の関係だった場合に、退勤時刻に24時間を足すという、見た目分かりやすい処理を退勤時刻の入力値の自動化オプションに設定してみました。

              もっと良い方法もあるかと思いますが、見た目の分かりやすさを優先しました。

               

              入力値の自動化オプションの設定の際には「フィールドに既存の値が存在する場合は置き換えない」チェックボックスはオフにしてくだい。

               

              また、24時間を単純に足すというのは、とても限定的な方法なのですが、勤務時間が48時間を超えるような場合も想定すると、退勤時の日付をデータとして持たせて、勤務時間を計算する方が確実とおもいます。

               

              ご参考になれば幸いです。

               

              スクリーンショット_2017-07-13_20_36_59.png

              1 人中 1 人が役に立つと言っています
              • 4. Re: 24時を超える時刻データのインポート
                ask

                たびたびすみません。

                 

                なるぼど~!!と思い、見よう見まねで試してみたのですが、エラーが出てしまいます。

                もしかして、ほかに設定されている条件なども関係しているのでしょうか?

                スクリーンショットで頂いている計算でも、他にも少しずつ変えて試してみても同じエラーが出ます。

                手取り足取りのような状況ですみません...キャプチャ.JPG

                • 5. Re: 24時を超える時刻データのインポート
                  YukioTakaoka

                  大きく別けて、Case関数を使用した計算式が3つあるようですね。

                  最初の顧客IDに関するCase関数は入れ子になって1つの計算式を成しています。その後ろに今回追加した計算式が独立して続いています。

                  このように独立したCase関数の条件判断式が2つ連なっているために、エラーになっています。

                  どの様のこををしたいのかを踏まえて工夫が必要と思います。

                   

                   

                  また、このように2つの異なる判断をする様な計算式を記述する場合には、工夫が必要と思います。

                  そもそも顧客IDが「115」の時の終了時刻に関して、なにやら処理をしている様ですが、終了時刻に入ってくる値の前提などの様な値なのでしょうか?

                  • 6. Re: 24時を超える時刻データのインポート
                    ask

                    遅くなってしまいました。

                     

                    上の2つの関数は既に私が使い始めたころから設定されており、そこまででは問題なく動いています。

                    顧客IDに関しては、「115」という値を「有給」と登録しているため、開始・終了時間が共に0:00になるように設定されています。

                     

                    もうひとつの関数がよくわからないんです…

                    数字を3つ入力すると 915 →   9:15

                       4つ入力すると 1145  →  11:45

                       4つより多く入力すると…?? 23:30 → 23:30

                    ということで合っていますか??

                     

                    この設定をされた方が既に退職されていてわからないんです…

                    • 7. Re: 24時を超える時刻データのインポート
                      YukioTakaoka

                      なるほど。「115」の件はわかりました。

                       

                      それと、時刻の入力が3桁または4桁、あるいはそれ以上の文字列という前提なのですね。

                      なるほど。

                       

                      さて、計算式の中に「Middle ( 終了時刻;3;2 )」と言う部分がありますが、

                      「23:30」と入力されてくると「23::3」になると思います。

                      「23:30」と入力されたら「23:30」にしたい場合は、「Middle ( 終了時刻;4;2 )」とする必要があります。

                       

                      Case(

                       PatternCount ( 終了時刻 ; ":" ) =0 and Length ( 終了時刻 )=3;Replace ( 終了時刻;2;0;":" );

                       PatternCount ( 終了時刻 ; ":" ) =0 and Length ( 終了時刻 )=4;Replace ( 終了時刻;3;0;":" );

                       Length ( 終了時刻 )>4;Left (終了時刻; 2 )&":"&Middle ( 終了時刻;4;2 );

                       終了時刻

                      )

                       

                      御参考になれば幸いです。

                      • 8. Re: 24時を超える時刻データのインポート
                        ask

                        確かに!!

                        「23:30」と入力すると「23::3」となってしまいますね!

                        試しに「23:30」と入力すると「?」となるのでなんでだろうと思っていましたが納得です!

                         

                        ここまでは以前から設定されていたもので、私の入社前から問題なく使えているようです。

                        (やはり最後の「Length ( 終了時刻 )>4;…」の部分が何を意図しているのか私にはわかりませんが…)

                         

                        なんとかして、一番初めに教えていただいた

                              Case(

                               Self<終了時間;Time(Hour(Self)+24;Minute(Self);0);

                               Self

                                )

                        が利用できる方法はないものでしょうか?(><)

                         

                        私は「Case(PatternCount ( 終了時刻 ; ":" ) =0 and Length ( 終了時刻 )=3…」この関数を全部消してしまったら良いんじゃないかと思います。

                        たぶん「23時30分」を入力したい時に「2330」と入力していたものを「23:30」と入力するだけになるんじゃないか、そうなるとExcelと一緒なので特に面倒でもないんじゃないかと思うんです。

                        しかし!!会社で長年使われているものなので私が変更するのは気が引けるし、何か不具合が生じたらと考えると言い出せません。

                         

                        両方の関数を使うにはどうしたらいいのでしょうか?(><)

                        • 9. Re: 24時を超える時刻データのインポート
                          user19752

                          入力方法が変わるので勝手に変えると苦情が出そうです。

                           

                          入れ子にするか、いったん変数に入れればOK

                           

                          Let ( Self = Case(PatternCount....) ;

                          Case ( Self<終了時間....)

                          )

                           

                          Selfは関数名なので別の変数名にした方がいいですが、これでも動くようです。

                          • 10. Re: 24時を超える時刻データのインポート
                            YukioTakaoka

                            お返事が遅くなりすみません。

                            そもそも、開始時刻と終了時刻が時刻タイプのフィールドでは無いようですので、その前提で計算式を考える必要があります。

                             

                            【終了時刻フィールドの入力値の自動化の計算式】

                            以下の計算式が実行されると、入力された終了時刻を従来の方法で時刻の形に成型し、かつ時刻タイプに変換します。

                            その処理を行った後に、終了時刻と開始時刻を比較して、開始時刻よりも終了時刻の値が小さければ、時に24を足して24時間を足すことで終了時刻を補正します。

                            この式を実行すると、終了時刻がテキストタイプであれば、24時間表記の時刻の形をしたテキストデータを作成することができます。

                             

                            Let(

                            [

                                 %ST=GetAsTime(開始時刻);

                                 %ED=終了時刻;

                                 %EDT=Case(

                                      PatternCount ( %ED ; ":" ) =0 and Length ( %ED )=3;GetAsTime(Replace (%ED;2;0;":" ));

                                      PatternCount ( %ED ; ":" ) =0 and Length ( %ED )=4;GetAsTime(Replace ( %ED;3;0;":"));

                                      Length (%ED)>4;Left (%ED; 2 )&":"&Middle ( %ED;4;2 );

                                      GetAsTime(%ED)

                                      )

                            ];

                                 Case(

                                 %EDT < %STT ; Time ( Hour ( %EDT )+24 ; Minute ( %EDT ) ; 0 );

                                 %EDT

                                 )

                            )

                             

                             

                            各関数の使い方などはヘルプを見て確認してください。

                            ただ、もし可能であればフィールドタイプも時刻タイプにするなど、抜本的な改修をした方が良いかもしれませんね。

                             

                            上記、御参考になりましたら幸いです。

                            • 11. Re: 24時を超える時刻データのインポート
                              ask

                              私も遅くなりすみません。

                               

                              それが…時刻タイプなんです…

                               

                              ひとつ思いついたのが、終了時刻はこのままにしておいて新たに「終了時刻 改」のようなフィールドを作るのはどうだろうと思いました。

                               

                              「終了時刻 改」に教えていただいた計算式

                              Case(

                                     終了時間<開始時間;Time(Hour(終了時間)+24;Minute(終了時間);0);

                                     Self

                                      )

                              を適用できないかと試行錯誤中です。

                              ただ、これもどこか間違えているようで…

                              さらに、他のいろいろなフィールドの値を決めるために、終了時刻が利用されているため、それの変更を漏れなくできるかも不安です。

                               

                              いかがお考えですか?

                              • 12. Re: 24時を超える時刻データのインポート
                                ask

                                YukioTakaoka さん!!

                                 

                                とうとう解決しました!

                                新しく計算タイプの「終了時間改」のようなものを作り、初めに教えていただいた式を使うことで、エラーもなく設定でき、うまく動くようになりました★

                                本当に長い間相談に乗ってくださりありがとうございました!!

                                またいろいろ改善を進めていこうと考えていますので、お時間ありましたらご教授をお願いいたします。@

                                • 13. Re: 24時を超える時刻データのインポート
                                  YukioTakaoka

                                  自己解決ですね!

                                  お疲れ様でした。