Back     Next Page

Access2000で家族メール?  その3

  2001.07.01 tsuchiya

前回作成した受信トレイを手直しします。
着信メールのリストボックスの値集合ソースを修正します。
SELECT メールサーバー.ID, 送信者.送信者, メールサーバー.送信日時, メールサーバー.件名, メールサーバー.宛先
FROM 送信者 INNER JOIN メールサーバー ON 送信者.ID = メールサーバー.送信者
WHERE (((メールサーバー.宛先)=[OpenArgs]) AND ((メールサーバー.フラグ)="1"));

赤字の部分が変更されました。
メールサーバー.ID メールサーバーテーブルのIDフィールドを追加しました。
実際のリストボックスには表示する必要がありませんが、メールの詳細を出したり返信メールのデータを書き込む時必要になります。
送信者.送信者 前回作成した送信者テーブルとメールサーバーテーブルをリンクすることにより送信者をA,B,・・でなく、
けいちゃんのように表示します。
FROM 送信者 INNER JOIN メールサーバー ON 送信者.ID = メールサーバー.送信者 2つのテーブル間のリンクの様子です。
1対他のリンクテーブルは、SQLでこう表現される訳です。
[OpenArgs] OpenArgsは受信トレイフォームを開くとき他のフォームから貰って来る引数です。
誰の受信トレイを開くかこの引数で決定します。OpenArgsについては後で詳しく説明します。
SQL文に慣れるため(私自身が?)あえて解説しましたが、やはりクエリービューの方が解りやすいです。下図です。
同様に返信メール、送信済み、完了済みのリストボックスの値集合ソースを変更します。詳細は省略します。
さらにいくつかのテキストボックスとコマンドボタンを追加します。
OpenArgs ="C" として C(けいちゃん)の受信トレイを開きます。
話が前後しますが受信トレイを開く元のフォームを作成します。
このフォームがスタートアップのフォームになります。(下図)
5人分の名前のボタンをアカウントオプショングループ内に入れます。
例えばパパが押されるとアカウントの値が1、ショウちゃんが押されるとアカウントの値が5になります。
さて下図のスタートボタンにより各者の受信トレイが開く仕組みを作ります。
先ほどのアカウントの値を変数Accountに代入します。ただし1のときA、2のときB、・・・5のときEとします。
スタートボタンのクリックイベントを作成します。
Private Sub スタート_Click()

  Dim Account As String ’Accountを文字型変数として宣言します。
  Select Case アカウント
   Case 1
     Account = "A"
   Case 2
     Account = "B"
   Case 3
     Account = "C"
   Case 4
     Account = "D"
   Case 5
     Account = "E"
   Case Else
     MsgBox "アカウントを指定してください。" 
     Exit Sub ’名前のボタンがどれも押されずスタートした場合受信トレイを開きません。
 End Select

  DoCmd.Close ’家族メールへようこそのフォームを閉じます。
  DoCmd.OpenForm "受信トレイ", acNormal, , , , acDialog, Account 
           ’Accountを引数にして受信トレイを開きます。

End Sub
もうお解りかと思いますが、OpenArgsについて解説します。
スタートボタンのクリックイベントの最後の文
DoCmd.OpenForm "受信トレイ", acNormal, , , , acDialog, Account
AccountOpenArgsに相当します。

Microsoft AccessヘルプからOpenForm メソッドの解説を抜粋します。
      Visual Basic で "OpenForm/フォームを開く" アクションを実行します。
      構文
      DoCmd.OpenForm formname[, view][, filtername][, wherecondition][, datamode][, windowmode][, openargs]
      OpenForm メソッドには、次の引数があります。
          ---中略---
   openargs
文字列式です。この文字列式を使ってフォームの OpenArgs プロパティを設定すると、Open イベント プロシージャなどの
フォームモジュールの中のコードで使うことができるようになります。OpenArgs プロパティは、マクロおよび式でも、参照できます。
Microsoft Accessヘルプ終わり

ところで、家族メールへようこそのフォームにパスワード関係のコントロールがいくつかありました。
当然、1台のパソコンですべての人が使う仕様になる訳ですからセキュリティを考えなくてはなりません。
しかし現在はコントロールを配置しただけで、コードを記述していません。
セキュリティの件は、最終段階で作成することにしましす。

ここまでで、家族メールへようこそのフォームから指定された人の受信トレイを開くことができました。


ここで再度メールソフトの機能を確認しておきます。
     1.新規メールを書いて送信する。(作成済み) ←今日は最後に、この部分を完成します。
     2.メールを受信して読む。 ←現在はイメージの段階
     3.返信メールを書いて送信する。 ←現在はイメージの段階
2.3については次回、完成予定とし、。今日は1を完成します。
けいちゃんの受信トレイを例に話を進めてきましたが、受信トレイから新規メールを書くボタンから開くフォームを完成させます。
まず、新規メールを書くボタンのクリックイベントを書きます。
ここでもOpenArgsが活躍します。OpenArgsがリレーのバトン代わりになります。

Private Sub 新規メールを書く_Click()

  Dim Account As String
  Account = OpenArgs
  DoCmd.OpenForm "新規メール", acNormal, , , , acDialog, Account

End Sub

開いたフォームが下図です。

この連載の一番最初に作成したフォームを手直ししました。
送信者を表示、宛先をコンボボックスからリストボックスへ変更、キャンセルボタンを追加しました。

送信ボタンのクリックイベントを修正します。(2001.07/06一部訂正しました。)

Private Sub 送信_Click()
 
  If Me!宛先 = OpenArgs Then ’ここでもOpenArgsが活躍します。
    MsgBox "自分宛にメールは送れません!"
    Exit Sub
  End If
  If Me!宛先 = "" Or IsNull(Me!宛先) Then
    MsgBox "宛先は?"
    Exit Sub
  End If
  If Me!件名 = "" Or IsNull(Me!件名) Then
    MsgBox "件名は?"
    Exit Sub
  End If
  If Me!送信内容 = "" Or IsNull(Me!送信内容) Then
    MsgBox "送信内容は?"
    Exit Sub
  End If

  Dim db As Database
  Dim rs As Recordset
  Set db = CurrentDb
  Set rs = db.OpenRecordset("メールサーバー", dbOpenDynaset)
  Dim new_ID As Long ’IDを長整数型で宣言します。

  rs.AddNew
  ID発行 new_ID ’ID発行サブプロシージャで新規IDを発行してもらいます。
  rs!ID = new_ID
  rs!送信者 = OpenArgs
  rs!宛先 = Me!宛先
  rs!送信日時 = Now()  '現在時刻を記します。
  rs!件名 = Me!件名
  rs!送信内容 = Me!送信内容
  rs!フラグ = "1" '新規のメールであることを記します。
  rs.Update
  rs.Close
  db.Close
  Me!宛先 = ""
  Me!件名 = ""
  Me!送信内容 = ""
  MsgBox "メール送信しました。"
  受信トレイ更新 ’2001.07.08 この1行追加しました。

End Sub
Private Sub ID発行(新規ID As Long)

  Dim rs As Recordset
  Set rs = CurrentDb.OpenRecordset("メールサーバー")
  If rs.BOF Then
    新規ID = 1
    Exit Sub
  End If
  新規ID = DMax("ID", "メールサーバー") + 1 ’メールサーバーテーブルのIDフィールドの最大値に1を加える。
  rs.Close

End Sub
Private Sub キャンセル_Click()

  DoCmd.Close ’無条件にフォームを閉じます。

End Sub

以上、受信トレイ、新規メールを送信が完成しました。
今日は少しハードでした。ふぅー(ためいき)

Back     Next Page