スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Outlook 予定表登録マクロ

Outlookで予定表を登録するマクロを作ってみた。
ExcelやAccessでマクロを作ることはあっても、Outlookでマクロを組み込むのは初めてで、どんな用途があるのかわからなかったが、意外と簡単に組み込めた。とはいってもあまりヘルプも充実していないし、入門サイトもないので、手探りで予定表のオブジェクトがどれかを探した。
以下がそのマクロ、本来作る必要もないのだが、なぜか会議出席依頼が来たときに自動的に登録されず、しかたなくマクロを作った次第だ。ただ単にメール本文からWhenとWhereを読み込んで登録するだけ。定期的な予定にはまだ対応していない。


Sub CreateAppoint()
Dim myolapp As Outlook.Application
Dim myItem As AppointmentItem
Dim objMsg As MailItem

Dim idxWhen As Long
Dim idxDate As Long
Dim idxWhere As Long
Dim idxWhereEnd As Long
Dim idxHyphen As Long

Dim starttime As String
Dim endtime As String

'カレントメール
Set objMsg = ActiveInspector.CurrentItem

idxWhen = InStr(objMsg.Body, "When:")

If idxWhen = 0 Then
MsgBox "When:がないので登録しません"
End
End If

idxDate = InStr(objMsg.Body, "日")
idxWhere = InStr(objMsg.Body, "Where:")
idxWhereEnd = InStr(idxWhere, objMsg.Body, vbCrLf)

idxHyphen = InStr(objMsg.Body, "-")
starttime = Mid(objMsg.Body, idxHyphen - 5, 5)
endtime = Mid(objMsg.Body, idxHyphen + 1, 5)

'予定表にセットする
Set myolapp = CreateObject("Outlook.Application")
Set myItem = myolapp.CreateItem(olAppointmentItem)
myItem.Subject = objMsg.Subject
myItem.start = DateValue(Mid(objMsg.Body, idxWhen + 5, idxDate - idxWhen - 4)) + TimeValue(starttime)
myItem.Duration = DateDiff("n", TimeValue(starttime), TimeValue(endtime))
myItem. Location = Mid(objMsg.Body, idxWhere + 7, idxWhereEnd - idxWhere - 7)
myItem.Save

MsgBox "登録しました。"

End Sub


スポンサーサイト

MySQL 参照制約

awkでCreate Table文修正

この問題は根深い。新たにデータベースを作成してそこにCREATE文を実行するとOKだった。なので、いったんデータベースを削除してから実行した。確か前はこれでうまく行ったのだが、今回は駄目。MySQLを再起動したりとかしたがこれもだめ。
errno 121が何なのかネットで検索してもわからないので、ソースを当たることに。121で検索をかけると、

manual.html
InnoDB: Let InnoDB's FOREIGN KEY parser to remove the latin1 character 0xA0 from the end of an unquoted identifier. The EMS MySQL
Manager in ALTER TABLE adds that character after a table name, which
caused error 121 when we tried to add a new constraint.

my_base.h
121 /* Dupplicate key on write */

と出てくる。やはり参照制約の問題だ。
バージョン4.1.10aを入れれば直るかと思ってバージョンアップしたが駄目。
しかし腑に落ちないのは、データベースを削除したにもかかわらずどこかに参照制約の情報が残っていることだ。
dataディレクトリの以下のファイルには削除したデータベースの情報が残っている。
ib_logfile0
ib_logfile1
ibdata1
もしやこれが原因かと思い、荒業でこれらを削除した。デーモンを起動すると、再作成された。そしてCREATEスクリプトを実行すると、きちんと作成された。ところがテーブルをDropしてから再作成しようとするとエラーになる(なお、Dropもtypeをinnodbからmyisamに変えないとできない)。

制約を単体で削除したいと思うがそれはできないようだ。
参照制約を張っている列を削除しようとするが、
ERROR 1025 (HY000): Error on rename of...(errno: 150)
となる。
もはやお手上げ。
MySQLでは、同一のテーブルに対する参照制約は使ってはならない。
というのが結論。やろうとするなら、先の荒業でlogfileを削除して再作成するほかない。

なんか非常につまらないことに時間を使っている気がする。
先日、商用サイトでMySQLをよく使っているフリーSEコミュニティの主と話をしたとき、innodbではなくmyisamを使うとのこと。トランザクションは必要としないと。
データベースというかアプリケーションにとってトランザクションは基本中の基本と考えていた私にとって、これはまったく別の世界だ。
まあ、作りがしっかりしていれば、トランザクションが必要とされる機会はめったに発生しないが。今までにも、一連のトランザクションで例外が発生したときに、きちんとロールバックさせていないソースコードを何度か見たことがあるが、そのアプリケーションは稼動して2年間無事に動いている。おそらく不整合が合っても気づいていないのだろうと推測する。


MySQLサーバーで月間2億ページビュー

これを見る限り、MySQLも使い道によっては、きちんと実運用で使えるのだろう。この記事は今度本屋に行った時に読んでみたい。
しかし、今Oracleで動いているシステムをすべてMySQLでリプレースできるかというと甚だ疑問な気がする。

awkでCreate Table文修正

昨日、MCEAのDB研究会に出て、awkを使って、Excelのデータ(CSV)からCreate文を生成するスクリプトを紹介してもらった。今まで、ログの解析とかちょっとしたことでawkを使っていたが、こういう用途では使ったことがなかったので参考になった。

早速使ってみた。
今自分が持っているErwinでは、MySQLのスクリプトは出力できないので、Oracle用に出力したものを、MySQLに変更することにした。awkを使うと、sedを使って単純に置換するよりももっと複雑なことができる。簡単な置換は、sedで行い、ちょっと凝ったことはawkを使った。

BEGIN {
print "alter table m_group engine=myisam;\n"
}
{
if ($0 ~ /CREATE/) {
print $0
table = $3
next
}
else if ($0 ~ /PRIMARY/) {
print " CRDT TIMESTAMP NOT NULL,"
print " UPDT TIMESTAMP NOT NULL,"
print $0
idx = index($3,")")
key = substr($3,2,idx-2)
}
else if ($0 ~ /\);/) {
# print ") type=innodb;\n"
print ");\n"
print "alter table "table" engine=innodb;"
print "alter table "table" default charset=SJIS;"
if (table ~ /(M_GROUP|M_ACTITEM|M_ITEM|M_FAVORITE|M_CONTAINER|T_BALANCE|M_PARTNER|M_USER|T_RECORD|M_PLAN)/) {
print "alter table "table" modify "key" INTEGER AUTO_INCREMENT;"
}
next
}
else {
print $0
}
}

CREATE TABLE .. からテーブル名を取得し、CREATE文のあとにALTER文を挿入する。
各テーブルに、作成日時・更新日時を追加する。Erwinで全テーブルに一括で登録できればいいが今持っているのではできないので、awkで追加した。まあ、このぐらいはsedでもできそうだが。

awkはよかったものの、またMySQLで苦戦することになる。前に発行できたSQLがなぜかエラーになる。CREATE文の最後に type=innodb;を指定すると、

ERROR 1005 (HY000): Can't create table '.\acctbook\m_group.frm' (errno: 121)

となってしまう。前はこれでうまく行ったはずだが。ネットで調べてみると、参照制約があると何かと問題があるようだ。そのほかにも、データベースをいったん削除し、再作成してみるとうまくいったりとかいったこともあった。上記のCreate文も別のデータベース上で実行すると何のエラーも出ない。不可解なことが多い。おそらく今うまくいったものも明日にはエラーになるかも知れない。

あと、Date型でデフォルトにnow()を指定すると、0000-00-00がセットされてしまう。TIMESTAMP型を指定すると、default指定していなくても、現在時刻がデフォルトではいる。

バグなのか使い方が悪いせいなのか、わからないことが多い。本当にこれ商用で使えるのだろうかと思ってしまう。

プロフィール

dayan

Author:dayan
小職は、SE(システムエンジニア)を専門としておりますが、技術的な情報を中心に、それ以外に経済関連の日記、たわいもない日記も載せていきます。
[公式HPもよろしく!]

天気予報

-天気予報コム- -FC2-
リンク
ブロとも申請フォーム

この人とブロともになる

カテゴリー
最近の記事
ブログ内検索
最近のコメント
最近のトラックバック
RSSフィード
月別アーカイブ


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。