Microsoft Access Club Access超初心者対象Forum Access初級者対象Forum Access VBA Tips Forum DAO、ADO、SQL Forum

     

リストへもどる

投稿記事の一括表示

タイトル添付ファイル型コントロールの複写
記事No42823
投稿日: 2017/10/09(Mon) 07:36
投稿者TakT
解決済: ON
OS:Windows10
Access Version:Access2016
添付ファイル型フィールドを持つレコード群で、新規レコードに既存レコードの添付ファイル型フィールドを複写したい場合、どのような手順で実現できますか。

タイトルRe: 添付ファイル型コントロールの複写
記事No42824
投稿日: 2017/10/12(Thu) 15:58
投稿者mayu
解決済: ON
> 新規レコードに既存レコードの添付ファイル型フィールドを複写したい場合、
> どのような手順で実現できますか。

以下にサンプルを載せておきます。


テーブル名: t_sample
(
  rid  --> オートナンバー( 主キー )
  日付 --> 日付/時刻型
  添付 --> 添付ファイル型
)

データ例:

 rid   日付   添付
---------------------------
 1  2017/09/30  @(2)
 2  2017/10/04  @(0)
 3  2017/10/10  @(1)


'-----------------------------------------------------------------------
' /*
' *******************************************************
' *
' *  rid --> 1 の添付ファイル型フィールドの値を
' *  新規レコードにコピー
' *
' *******************************************************
' */
Sub sample()
  Dim rsFromParent As DAO.Recordset
  Dim rsToParent   As DAO.Recordset
  Dim rsFromChild  As DAO.Recordset2
  Dim i            As Long
  Dim strSQL       As String
  
  strSQL = "SELECT * FROM t_sample WHERE rid = 1 ;"
  Set rsFromParent = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  
  If (rsFromParent.EOF) Then
    rsFromParent.Close
    Set rsFromParent = Nothing
    Exit Sub
  End If
  
  Set rsFromChild = rsFromParent.Fields("添付").Value
  Set rsToParent = CurrentDb.OpenRecordset("t_sample", dbOpenDynaset)
  
  rsToParent.AddNew
  rsToParent.Fields("日付").Value = Date
  
  With rsToParent.Fields("添付").Value
    While (Not rsFromChild.EOF)
      .AddNew
      For i = 0 To rsFromChild.Fields.Count - 1
        If (rsFromChild.Fields(i).DataUpdatable) Then
          If (Not IsNull(rsFromChild.Fields(i).Value)) Then
            .Fields(i).Value = rsFromChild.Fields(i).Value
          End If
        End If
      Next i
      .Update
      rsFromChild.MoveNext
    Wend
    .Close
  End With
  
  rsToParent.Update
  
  rsFromChild.Close
  rsFromParent.Close
  rsToParent.Close
  
  Set rsFromChild = Nothing
  Set rsFromParent = Nothing
  Set rsToParent = Nothing
End Sub

'-----------------------------------------------------------------------

実行結果:

 rid   日付   添付
---------------------------
 1  2017/09/30  @(2)
 2  2017/10/04  @(0)
 3  2017/10/10  @(1)
 4  2017/10/12  @(2)

タイトルRe^2: 添付ファイル型コントロールの複写
記事No42825
投稿日: 2017/10/12(Thu) 23:42
投稿者TakT
解決済: ON
mayu 様
質問への応答有難うございました。
VBAの利用経験が少ないので、ご提示のコードの動作確認に少々時間が必要です。
確認でき次第、改めて御礼を申し上げます。

タイトルRe^3: 添付ファイル型コントロールの複写
記事No42826
投稿日: 2017/10/13(Fri) 14:53
投稿者mayu
解決済: ON
> VBAの利用経験が少ないので、ご提示のコードの動作確認に少々時間が必要です。

添付型フィールドに対しての自動化は、数値型 や 文字列型 と違い
フォーム上のコントロールを介してのアクションは存在せず、
全て DAO の Recordset, Recordset2 を操作して実装することになりますので
VBA中級程度のスキルは必要になります。

ついでなので、タイトルである
> 添付ファイル型コントロールの複写
のサンプルも以下に載せておきます。
( ※ テーブルとレコードは 記事No:42824 のデータを流用 )


 単票フォーム : f_sample
┌─────────────────────────────┐
│                             │
│                             │
│      rid              日付      │
│  ┌───────┐      ┌────────┐  │
│  │  txt_rid  │      │  txt_日付  │  │
│  └───────┘      └────────┘  │
│                             │
│                             │
│      ( 前レコードの添付ファイルと同期 )      |
│         ┌────────┐          │
│         │  cmd_copy  │          │
│         └────────┘          │
│     ┌─────────────────┐     │
│     │                 │     │
│     │                 │     │
│添付データ│      ath_添付       │     │
│     │                 │     │
│     │                 │     │
│     └─────────────────┘     │
│                             │
│                             │
└─────────────────────────────┘

 ※ レコードソース:   SELECT * FROM t_sample ORDER BY rid ;



 コントロール名  コントロール種別  コントロールソース
-------------------------------------------------------------
   txt_rid     TextBox       rid
   txt_日付     TextBox       日付
   cmd_copy     CommandButton    
   ath_添付     Attachment      添付



複写方法ですが、コマンドボタン( cmd_copy )を押した際に
現在フォーム上に表示されているレコードの rid 未満の最大値
つまり
前レコードのデータを現在表示中のレコードにコピーします。

なお、カレントレコードの 添付ファイル型フィールドに
値が登録されている場合は、追加ではなく、入れ替えになります。

'----------------------------------------------------------------------------------
' フォームモジュール
'----------------------------------------------------------------------------------
Private Sub cmd_copy_Click()
  Dim rs2Reference  As DAO.Recordset2
  Dim i             As Long
  Dim strSQL        As String
  
  If (Me.NewRecord) Then
    If (IsNull(Me.txt_rid.Value)) Then
      Me.txt_日付.SetFocus
      MsgBox Prompt:="日付を入力するか、添付に何かデータを登録して下さい" _
         , Buttons:=vbExclamation _
         , Title:="実行不可"
      Exit Sub
    End If
  End If
  RunCommand acCmdSaveRecord
  
  strSQL = "SELECT TOP 1 * " & vbNewLine _
      & "FROM t_sample " & vbNewLine _
      & "WHERE rid < " & CStr(Me.txt_rid.Value) & vbNewLine _
      & "ORDER BY rid DESC ;"
  
  With CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
    If (.EOF) Then
      .Close
      Exit Sub
    End If
    
    Set rs2Reference = .Fields("添付").Value
    
    With Me.Recordset
      .FindFirst "rid = " & CStr(Me.txt_rid.Value)
      .Edit
      
      With .Fields("添付").Value
        While (Not .EOF)
          .Delete
          .MoveNext
        Wend
        
        While (Not rs2Reference.EOF)
          .AddNew
          For i = 0 To rs2Reference.Fields.Count - 1
            If (rs2Reference.Fields(i).DataUpdatable) Then
              If (Not IsNull(rs2Reference.Fields(i).Value)) Then
                .Fields(i).Value = rs2Reference.Fields(i).Value
              End If
            End If
          Next i
          .Update
          rs2Reference.MoveNext
        Wend
        .Close
      End With
      
      .Update
    End With
    
    rs2Reference.Close
    Set rs2Reference = Nothing
    
    .Close
  End With
End Sub

タイトルRe^4: 添付ファイル型コントロールの複写
記事No42828
投稿日: 2017/10/15(Sun) 09:59
投稿者TakT
解決済: ON
mayu 様

重ねてのご教示有難うございました。
>
> 添付型フィールドに対しての自動化は、数値型 や 文字列型 と違い
> フォーム上のコントロールを介してのアクションは存在せず、
> 全て DAO の Recordset, Recordset2 を操作して実装することになりますので
> VBA中級程度のスキルは必要になります。
>
とのご指摘、痛み入ります。

ご提示のコードの実行確認は(私にも)出来ました。
当面の課題は、指定レコードの添付ファイル型フィールドを
新規レコードの該当フィールドに複写することです。
No.42824 の sample() を一部改訂して対応したいと思います。

- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

ページの先頭へ 前ページへ戻る