2009/07/28
ADO と ADOX オブジェクトの Propertiesコレクション
ADO と ADOX オブジェクトの Propertiesコレクション
http://msdn.microsoft.com/ja-jp/library/dd263027.aspx
http://msdn.microsoft.com/ja-jp/library/dd263027.aspx
2009/07/27
access2007:分割フォームコントロール区別
分割フォーム上でデータシート側/フォーム側でのコントロール区別
Form.CurrentView プロパティ
Me.CurrentView = 1 フォームビュー
Me.CurrentView = 2 データシートビュー
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);
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 ;
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 cnStrhttp://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
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でログインしたら成功した。
インストール自体は無事に済んだが、セットアップウィザードが完了しない。
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
分割フォーム側で操作した時は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を使える
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を使える
登録:
投稿 (Atom)