ACCESSの型変換(日付型)について

このQ&Aのポイント
  • ACCESSの型変換に関する問題解決方法を教えてください。
  • お客様からの作業依頼を受け、作業種別に応じた納品期限を関数で設定したいです。
  • 現在、納品期限のテーブルのフィールドの型変換でエラーが発生しています。解決策を教えてください。
回答を見る
  • ベストアンサー

ACCESSの型変換(日付型)について

諸賢者の皆様、よろしくお願いいたします。 【環境】 OS:WindowsXP ソフトウエア:ACCESS2003 【やりたいことの概要】  お客様より作業依頼を受領し、作業種別に応じて予め設定された作業期限を関数により求め、所定フィールドに設定したい。 【前提】 (1)テーブル「納品期限管理テーブル」  フィールド(1):プライマリーID(長整数型、固有値)  フィールド(2):作業番号(長整数型、固有値)  フィールド(3):受領日(日付型 書式は「yy/mm/dd hh:nn AM/PM」に設定)  フィールド(4):納品期限(テキスト型) (2)関数  モジュールに次の関数を作成。 Function 納品期限(作業番号 As Integer, 受領日 As Date, 受領時間 As Date) As Variant Dim date_received As Date '受領日 Dim time_received As Date '受領時 date_received = DateSerial(Year(受領日), Month(受領日), Day(受領日)) time_received = TimeSerial(Hour(受領時間), Minute(受領時間), Second(受領時間)) Select Case 作業番号 Case 101: '当日17時30分までの納品 納品期限 = date_received + TimeSerial(17, 30, 0) Exit Function Case 201: '翌日17時30分までの納品 納品期限 = (DateAdd("d", 1, date_received)) + TimeSerial(17, 30, 0) Exit Function Case 301: 'お客様との調整 納品期限 = "お客様との調整" Exit Function Case Else 納品期限 = "" End Select End Function 【これまでの試み】 (1)イミディエイトウインドウ  「?納品期限(101,#2008/5/20#,"9:00")」と入力すると「2008/05/20 17:30:00」と表示される。問題なし。 (2)フィールド更新  データを更新するため次のSQL文を実行する。  「UPDATE Job_List SET Job_List.担当受付日時 = 納品期限([作業番号],"#" & [担当受付日時] & "#","#" & Format([担当受付日時],"HH:NN") & "#");」  ■ここで問題発生。「型変換エラー」メッセージが出て、データを更新できません。  どなたか、解法を御教示願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

「担当受付日時」の属性は何ですか? 日付型なら "#" & [担当受付日時] & "#" ではなく、[担当受付日時]と記述します。 文字型ならFunction 納品期限()の引数を文字型とし、関数内で、IsDate、CDate関数を 使ってチェックと変換を行うべきです。 あと、気になった点を少し直してみました。 Function 納品期限(ByVal 作業番号 As Integer, ByVal 受領日 As Date, ByVal 受領時間 As Date) As Variant Select Case 作業番号   Case 101: '当日17時30分までの納品     納品期限 = Format(受領日, "YYYY/MM/DD 17:30:00")   Case 201: '翌日17時30分までの納品     納品期限 = Format(DateAdd("d", 1, 受領日), "YYYY/MM/DD 17:30:00")   Case 301: 'お客様との調整     納品期限 = "お客様との調整"   Case Else     納品期限 = "" End Select End Function (1)パラメータにByValキーワードを付けました。 (2)受領日の0時0分0秒を作る意味はないのでは? (3)受領時間は最終的に使用されないようです。 それと、SQLの中でユーザ関数を呼び出すと、遅いので、今回のように 4通りくらいならIif関数をネストしてみてはいかがでしょう。 =Iif(作業番号=101,Format(受領日,"YYYY/MM/DD 17:30:00") ,Iif(作業番号=201,Format(DateAdd("D",1,受領日),"YYYY/MM/DD 17:30:00") ,Iif(作業番号=301,"お客様との調整","")))

tarimuhelp
質問者

お礼

☆ 御礼 ☆  御指導に基づく作業を行い、次のSQL文でフィールドデータを更新できました。  UPDATE Job_List SET tbl.納品期限 = 納品期限([作業番号],[受領時間]);  これより、各種処理・画面の製作に移ります。  本当にありがとうございました。 <修正作業概要> 1 関数の修正  大変ありがとうございました。  特に、「Format(DateAdd("d", 1, 受領日), "YYYY/MM/DD 17:30:00")」の表現については全く未知のことでした。 2 テーブルの再作成  テーブルの設計による障害を避けるため、テーブルを再作成しました。                   拝

tarimuhelp
質問者

補足

 早速のご指導、まことにありがとうございました。  ご指摘の点について、記述誤り、表現不足がありましたことをお詫び申し上げます。  取り急ぎ御指導に基づき修正作業を行い、あらためて御礼を申し上げたく存じます。  よろしくお願いします。 <ご質問> 「担当受付日時」の属性は何ですか? <ご質問に対する回答> 下記に示すように、「受領日」の誤りであり、「受領日」は日付型としております。 <記述誤り> ----------誤り1---------- 【前提】 (1)テーブル「納品期限管理テーブル」  ----------修正1---------- (1)テーブル「Job_List」 ----------誤り2---------- 【これまでの試み】 (2)フィールド更新  データを更新するため次のSQL文を実行する。 「UPDATE Job_List SET Job_List.担当受付日時 = 納品期限([作業番号],"#" & [担当受付日時] & "#","#" & Format([担当受付日時],"HH:NN") & "#");」 ----------修正2---------- 「UPDATE Job_List SET Job_List.納品期限 = 納品期限([作業番号],"#" & [受領日] & "#","#" & Format([受領日],"HH:NN") & "#");」 <表現不足等> ・時間について  記述サンプルは簡略化してあり、午前中に作業依頼を受領したものは当日中に、午後のものは翌日に納品します。  よって、受領時間は必要な情報です。ただし、御指導により自分なりに考えた結果、「受領日」が日付と時間の情報をもっていたら、引数として組み込むことは不要と判断しますので、一から作り直します。 ・Iif関数について  有益な指導、ありがとうございます。ただ、作業種別は全部で39種あり、納品までの期限設定ルールは13種あります。また、営業日を勘案する処理を行う必要から、case文で処理したいと存じます。  以上

関連するQ&A

  • 先ほどの質問の続きですで申し訳ございません。

    Option Explicit Function getCode(MyTime As Date) As String  Dim wsTime As Date  wsTime = MyTime - Int(MyTime)  If wsTime = TimeSerial(5, 30, 0) Then   getCode = "A"  ElseIf ((wsTime >= TimeSerial(2, 45, 0)) And _      (wsTime < TimeSerial(5, 30, 0))) Then   getCode = "B"  ElseIf ((wsTime >= TimeSerial(1, 0, 0)) And _      (wsTime < TimeSerial(2, 45, 0))) Then   getCode = "C"  ElseIf wsTime < TimeSerial(1, 0, 0) Then   getCode = ""  Else   getCode = ""  End If End Function これで、参照セルを変えるでかけでみごとに動きました。 もう一点質問です。 Function で数式を呼び出せるとはわかりますが、 セルの内部に「=getCood(参照セル)」だけでは、申し訳ございませんがいまいち理解ができません。 あえて、通常の「 Sub...() 」で書いた場合はどうなるんでしょうか?

  • ACCESS クエリ 日付の条件でフラグ立て

    ACCESSクエリ上で [売上日][B][C] と言う並びのフィールドがあります。 [B]のフィールド条件に  ・[売上日]のデータが作業日の月の先月に属せば1を。   そうでなければ0を返す。 [C]のフィールド条件に  ・[売上日]のデータが作業日の月の先々月に属せば1を。   そうでなければ0を返す。 と言う指定したいと考えておりますが、上手くいきません。 Year([SalesDate])* 12 + DatePart("m", [SalesDate]) = Year(Date())* 12 + DatePart("m", Date()) - 1 では日付を返してしまうため、IIFと組み合わせようとしましたが上手くいきません。 上手いやり方を御存じの方がいらっしゃいましたら、何卒ご教授頂きたく存じます。 よろしくお願いいたします。

  • Access2000データのテキストファイル変換方法について

    いつもお世話になっております。 以前、この欄で質問させて頂いたCSVデータ変換の件については随分助かり、ありがとうございました。 このたび、Access2000のデータを、テキストファイル(タブによる区切り)に変換(明細ごとの区切りは改行文字を使用)する必要があり、下記のような記述を致しましたが、どうしても、「カンマ区切り」にしかなりません。 インターネットで調べると、テキスト(タブ区切り)の拡張子は「.txt」と説明されているのですが、何か記述が間違っているのでしょうか? 宜しくお願い致します。 (追伸)将来、必要になるかも知れないので、テキスト(スペース区切り)の記述についてもお願いできれば、と思います。 -- 記述内容 --------------------------------------------------- Dim adoRs As New ADODB.Recordset Dim strsql As String Dim strFile As String Dim 番号 As Long strsql = "SELECT" For 番号 = 1 To 34 If 番号 > 1 Then strsql = strsql & "," strsql = strsql & "フィールド" & CStr(番号) Next 'strsql = strsql & "FROM WT売掛管理表 ORDER BY フィールド1" strsql = "SELECT フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7,フィールド8,フィールド9,フィールド10,フィールド11,フィールド12,フィールド13,フィールド14,フィールド15,フィールド16,フィールド17,フィールド18,フィールド19,フィールド20,フィールド21,フィールド22,フィールド23,フィールド24,フィールド25,フィールド26,フィールド27,フィールド28,フィールド29,フィールド30,フィールド31,フィールド32,フィールド33,フィールド34 " & _ "FROM WT売掛管理表 ORDER BY フィールド1" adoRs.Open strsql, CurrentProject.Connection strFile = "C:\データフォルダ\変換データ.txt" Open strFile For Output Access Write As #1 Do Until adoRs.EOF For 番号 = 0 To 32 Write #1, CStr(adoRs.Fields(番号).Value), Next Write #1, CStr(adoRs.Fields(番号).Value) adoRs.MoveNext Loop adoRs.Close Close #1 MsgBox "データ変換処理が終了しました。", vbInformation Exit Sub -----------------------------------------------------

  • アクセス 今日の日付の個数のみクエリで表示したい

    テーブル1に「日のみ」フィールドを作成し 日のみ 2009/06/28 2009/06/28 2009/06/27 としました。 新規に選択クエリを作成し SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1 HAVING (((Count(テーブル1.日のみ)) Between Date() And Date()+1)); としたのですが、 0が返ってきます。 SELECT Count(テーブル1.日のみ) AS 日のみのカウント FROM テーブル1; だと3が返ってきます。 どうすれば今日の日付のみをカウントできるのでしょう? ご教授よろしくお願い致します。

  • 別名フィールドの型を指定

    例えば以下のようなSQL文からビューを作成した場合 SELECT CASE WHEN start_date IS NULL THEN '2010-01-01' WHEN start_date = '0000-00-00' THEN '2010-01-01' ELSE start_date END AS end_date FROM table_a start_dateフィールドはdate型ですが、別名が設定されるend_dateはvarchar型になってしまいます。 これをdate型にしてビューを作成する方法はありませんでしょうか。

  • Accessの連番(文字+日付+文字)2 (泣)

    先だって下記の質問をさせていただいた際には回答いただいてありがとうございました ≪質問≫ 下記のような連番を振る方法を教えてください "Eyymmdd A "E"は固定で yy(西暦2ケタ)mm(月)dd(日)A(Aから始め、同じ日だとB,C,…と最大26(Z)まで)振っていく。日が変わるとまたAから始まる 「テーブル名」連絡文書E 「クエリ名」連絡文書Eクエリ 「フォーム名」連絡文書E 「フィールド名」管理番号(テキスト型) E110105 A E110130 A E110130 B E110130 C E110202 A… と"E"を固定 yy(西暦2ケタ)mm(月)dd(日)Aから始まり、同日であればB,C~と 日が変わるとAからまた始まるという連番をふりたいです ≪いただいた回答≫ Function getNewSeq()   If Format(Date, "yymmdd") = Mid(DMax("管理番号", "連絡文書E"), 2, 6) Then     If Right(DMax("管理番号", "連絡文書E"), 1) = "Z" Then       MsgBox "Zまで一杯です"       Exit Function     End If     getNewSeq = "E" & Format(Date, "yymmdd") & " " & _           Chr(Asc(Right(DMax("管理番号", "連絡文書E"), 1)) + 1)   Else     getNewSeq = "E" & Format(Date, "yymmdd") & " " & "A"   End If End Function さらに、フォームでも デザインビューでフォームのプロパティのイベントの、「レコード移動時」に Private Sub Form_Current() If Me.NewRecord Then Me!管理番号 = getNewSeq End If End Sub 補足をさせていただいたデバックも何度かテーブルからやり直し できるようになりました!! 本当に助かりました しかし、新たにわからない事態が起きてしまいました ご教示下さい フォームを単票形式で作成して、上記の連番が振れるようになりました しかし、データシート(形式)でフォームを作成したところ連番が振られなくなってしまいました 同じAccess内でではなく、新規作成したり、同じAccess内でのフォーム新規作成をしてみましたが、できません データシートでの連番は無理なのでしょうか? 「テーブル名」連絡文書E 「クエリ名」連絡文書Eクエリ 「フォーム名」連絡文書E2 「フィールド名」管理番号(テキスト型) テーブルとクエリは前回と同じものを使いました 何卒ご教示お願いいたします

  • Access エラー解除方法?

    AccessのVBAにて 前任者が作成したプログラムの変更を行っているのですが、コンボボックスから色を指定して印刷時にエクセルのセルを 塗りつぶすプログラム Public Function chgExcelColorCode(ByVal ColorNo As String) As Long On Error GoTo chgExcelColorCodeErr chgExcelColorCode = 2 Select Case ColorNo Case "" chgExcelColorCode = 2 Case "白色" chgExcelColorCode = 2 Case "水色" chgExcelColorCode = 34 Case "黄色" chgExcelColorCode = 36 Case "緑色" chgExcelColorCode = 35 Case "紫色" chgExcelColorCode = 39 Case "ピンク色" chgExcelColorCode = 38 Case "オレンジ色" chgExcelColorCode = 40 Case "イエロー" chgExcelColorCode = 6 Case "ライトブルー" chgExcelColorCode = 20 Case "Lグリーン" chgExcelColorCode = 4 End Select chgExcelColorCodeExit: Exit Function chgExcelColorCodeErr: Call S_Err("chgExcelColorCode", Err) GoTo chgExcelColorCodeExit End Function 以上でイエロー、ライトブルー、Lグリーンを追加したのですが Lグリーンのみうまく登録できません。 指定するコンボボックスの値集合ソースは増やしているのですが エラー内容は -2147217833 指定されたデーター量がフィールドサイズを超えています。データー量を減らし、挿入または貼り付けを行ってください。 モジュール名InsertData 以上のようになります。 何を修正すればエラー解除できるのでしょうか?

  • access シフトキー無効

    質問させていただきます。 コマンドボタンでシフトキーの有効無効を設定します。 パスワードを入れ、正しければ有効、間違っていれば無効となるようにしたいのですが、逆になっています。正しいパスワードを入れるとシフトキーが無効となります。間違っているパスワードを入れるとシフトキーが有効となります。 訂正の仕方をご教授お願いします。 functionプロシージャに以下 Function NoShiftKey() Dim strMsg1 As String Dim strMsg2 As String strMsg1 = "再起動の後、Shiftキィーが有効になります。" strMsg2 = "再起動の後、Shiftキィーが無効になります。" Select Case InputBox("MAGI解除します") ' --- A Case 1234 ' --- B ChangeProperty "AllowBypassKey", dbBoolean, False ' --- C MsgBox strMsg2 Case Else ChangeProperty "AllowBypassKey", dbBoolean, True ' --- D MsgBox strMsg1 End Select End Function Function ChangeProperty(strPropName As String, _ varPropType, varPropValue) As Integer ' --- A On Error GoTo エラー Dim dbs As Database Dim prp As Property Const conPropNotFoundError = 3270 Set dbs = CurrentDb dbs.Properties(strPropName) = varPropValue ChangeProperty = True Exit Function エラー: If Err = conPropNotFoundError Then Set prp = dbs.CreateProperty(strPropName, _ varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ChangeProperty = False Exit Function End If End Function ----------------------------------------------------------- コマンドボタンのクリック時に以下 Private Sub コマンド52_Click() Call NoShiftKey ' --- A End Sub ----------------------------------------------------------------

  • SQL文 日付

    VB6.0  ACCESS2000 Dim strToday As Date text1.text = 2002年12月1日 strToday = Format(Form1.Text1.Text, "yyyy/mm/dd") strSQL = "SELECT * From DAPT_生産指示 WHERE 予定作業開始日時 = strToday" & _ "ORDER BY 予定作業開始日時" として実行すると クエリ式の構文エラー:演算子がありません とでます。 よろしくお願いします。

  • access 自作関数をフォームで使うとき

    お世話になります。 ACCESS2000でシステムを作っています。 商品コードを年・月をコード化したものに、日付2ケタを足したものを作成する scdという関数を作り、フォームのフィールドに、表示したのですが、 #Name!?と表示されていうまくいきません。 どうすればいいですか? 関数は以下のようになっています。 Public Function scd() As String Dim hiduke As Date Dim yc As String Dim mc As String Dim dc As String Dim strtmp As String hiduke = Date '年コードを設定 Select Case Year(hiduke) Case Is = 2012 yc = "a" Case Is = 2013 yc = "b" Case Is = 2014 yc = "c" Case Is = 2015 yc = "d" Case Is = 2016 yc = "e" Case Is = 2017 yc = "f" Case Else MsgBox "年コードを追加してください" End Select '年コードを設定 Select Case Month(hiduke) Case Is = 1 mc = "a" Case Is = 2 mc = "b" Case Is = 3 mc = "c" Case Is = 4 mc = "d" Case Is = 5 mc = "e" Case Is = 6 mc = "f" Case Is = 7 mc = "g" Case Is = 8 mc = "h" Case Is = 9 mc = "i" Case Is = 10 mc = "j" Case Is = 11 mc = "k" Case Is = 12 mc = "l" End Select '日付を設定 dc = Format(hiduke, "dd") strtmp = yc & mc & dc scd = strtmp End Function