2009/07/28

楽しい情報満載だぜ(゚▽゚*)ニパッ♪

嘘です。(゚▽゚*)ニパッ♪

ADO と ADOX オブジェクトの Propertiesコレクション

ADO と ADOX オブジェクトの Propertiesコレクション
http://msdn.microsoft.com/ja-jp/library/dd263027.aspx

2009/07/27

access2007:分割フォームコントロール区別

分割フォーム上でデータシート側/フォーム側でのコントロール区別
Form.CurrentView プロパティ
Me.CurrentView = 1 フォームビュー
Me.CurrentView = 2 データシートビュー

2009/07/21

更新できないRecordset

tblPuroduct,tblCategoryでjoinしたRecordsetは更新ができない。
SELECT tblPuroduct.*, tblCategory.CategoryName
FROM tblPuroduct
LEFT JOIN tblCategory USING (CategoryID);
USINGとは** ON tblPuroduct.CategoryID = tblCategory.CategoryID
ODBC接続しているのであるが、おそらく制約で更新できるRecordsetにならない。
ADO動的プロパティを使ってみてもうまくいった試しがないから、別の手段で。

手段1
リンクテーブルとフォームプロパティUniqueTable使用
手段2
joinで結合するFieldを読み取り専用にしちゃう
SELECT tblPuroduct.*, IFNULL(tblCategory.CategoryName,'')
FROM tblPuroduct
LEFT JOIN tblCategory ON USING (CategoryID);

2009/07/13

MySQL:Insert Update Trigger

schema:testに親テーブルp01と子テーブルc01
p01.childrowsにc01のレコード数が入るイメージで、
insert,update時にtirggerを回す
***** p01 *****
CREATE TABLE `test`.`p01` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`childrows` int(11) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=cp932;

***** c01 *****
CREATE TABLE `test`.`c01` (
`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Chilldname` varchar(10) NOT NULL,
`pID` int(11) DEFAULT NULL,
`isDeleted` int(1) DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=cp932;

***** inset_trigger *****
delimiter //
create trigger c01_after_insert
after insert on test.c01
for each row
begin
update p01
set childrows = (select count(*) from c01 where pID = new.pID and c01.isDeleted = 0)
where ID = new.pID;
end//
delimiter ;

***** update trigger *****
delimiter //
create trigger c01_after_update
after update on test.c01
for each row
begin
if new.isDeleted <> old.isDeleted then
update p01
set childrows = (select count(*) from c01 where pID = new.pID and c01.isDeleted = 0)
where ID = new.pID;
end if;
end//
delimiter ;

2009/07/10

access2007:パスワードロックしたaccdbからリンクテーブル作成

MSDNlibraryみたんだけどエラー出るから直した
Sub CreateLinkedAccessTable(strDBLinkFrom As String, _
                            strDBLinkTo As String, _
                            strLinkTbl As String, _
                            strLinkTblAs As String, _
                            Pswd As String)

Dim catDB As ADOX.Catalog
Dim tblLink As ADOX.Table

 Set catDB = New ADOX.Catalog
 catDB.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                          "Data Source=" & strDBLinkTo & _
                          ";Jet OLEDB:Database Password=" & Pswd & ";"

 Set tblLink = New ADOX.Table
 With tblLink
  .Name = strLinkTblAs
  Set .ParentCatalog = catDB
      .Properties("Jet OLEDB:Create Link") = True
      .Properties("Jet OLEDB:Link Datasource") = strDBLinkFrom
      .Properties("Jet OLEDB:Remote Table Name") = strLinkTbl
      .Properties("Jet OLEDB:Link Provider String") = ";pwd=" & Pswd
  End With

 catDB.Tables.Append tblLink

 Set catDB = Nothing
End Sub

2009/07/09

access2007:パスワードロックしたaccdbのテーブル列挙

Sub ListAccessTables()
Dim catDB As ADOX.Catalog
Dim tblList As ADOX.Table
Dim dbDir As String, Pswd As String

    dbDir = "\\hogehoge\hogehoge.accdb"
    Pswd = "Passw0rd"

    Set catDB = New ADOX.Catalog

    catDB.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
                             "Data Source=" & dbDir & ";" & _
                             "Jet OLEDB:Database Password=" & Pswd & ";"

    For Each tblList In catDB.Tables
        If tblList.Type = "TABLE" Then
            Debug.Print tblList.Name & vbTab & tblList.Type
        End If
    Next
    Set catDB = Nothing
End Sub

access2007:パスワードロックしたaccdbへのアクセス

Dim cn As New ADODB.Connection
Dim cnStr As String, dbDir As String, Pswd As String

    dbDir = "\\hogehoge\database\hogeDB.accdb"
    Pswd = "Passw0rd"
    cnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Data Source=" & dbDir & ";" & _
            "Jet OLEDB:Database Password=" & Pswd & ";"
    cn.Open cnStr
http://www.connectionstrings.com/
ここは有益だ

2009/07/07

ADO:CSV読み込み

ADOを使用した、CSV→recordset
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim strFolder As String, cnStr As String
Dim fileName As String, selectSQL As String

cnStr = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="
strFolder = "C:\hogehoge"
fileName = "hogehoge.csv"
selectSQL = "SELECT * FROM " & fileName

cn.Open cnStr & strFolder
rs.Open selectSQL, cn, adOpenKeyset, adLockReadOnly

Do Until rs.EOF
  **お好みのupdate処理**
rs.MoveNext
Loop

rs.Close: cn.Close
Set rs = Nothing: Set cn = Nothing

ヘッダがないなら、Jetです。
cnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
strFolder = "C:\hogehoge;"
exProp = "Extended Properties=""text;HDR=No;FMT=Delimited;"";"
cn.Open cnStr & strFolder & exProp

mySQL-Win-x64

win2008SVstdいじくり倒し用サーバにmySQL5を導入してみた。
インストール自体は無事に済んだが、セットアップウィザードが完了しない。
administratorでログインしたら成功した。

2009/07/02

access2007:分割フォーム

分割フォーム上でDirty時のみ押下できるButtonControl(更新ボタン)を配置した場合
分割フォーム側で操作した時はRequeryしてやらないと反映されない。

Private Sub Form_Undo(Cancel As Integer)
Me.btnUpdate.Enabled = False
Me.btnUpdate.Requery
End Sub

Private Sub Form_Current()
Me.btnUpdate.Enabled = False
Me.btnUpdate.Requery
End Sub

Private Sub Form_Dirty(Cancel As Integer)
Me.btnUpdate.Enabled = True
Me.btnUpdate.Requery
End Sub

access2007:UniqueTableプロパティ

非連結フォーム+ADO接続で、Inner Joinで複数のテーブルを連結している場合、UniqueTableプロパティを指定すると更新ができるようになる。削除追加はできるけどやらない。
Unique側更新だけにとどめる。
Private Sub Form_Open(Cancel As Integer)
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim selectSQL As String, fld As ADODB.Field

selectSQL = "SELECT tblProducts.sID, tblProducts.商品名, tblCategories.CategoryID, tblCategories.Category FROM tblCategories INNER JOIN tblProducts ON tblCategories.CategoryID=tblProducts.cID;"

Set cn = Application.CurrentProject.Connection

rs.CursorLocation = adUseClient
rs.Open selectSQL, cn, adOpenKeyset, adLockOptimistic

Set Me.Recordset = rs
Me.UniqueTable = "tblProducts"
For Each fld In rs.Fields
  Me.Controls(fld.Name).ControlSource = fld.Name
Next

Set rs = Nothing: Set cn = Nothing
End Sub
Unique側については、Form_Errorで7787、30014を使える