2012年3月13日火曜日

[ACCESS2.0]ACCESS2.0でSQLServerを読みに行く

From Evernote:

[ACCESS2.0]ACCESS2.0でSQLServerを読みに行く

97以降ならADOで読みにいってたんだけど
2.0はDAOじゃないとダメなのかな?
ということでDAOで作り直し。


 'チェックフラグ
 Dim ChkFLG As Integer: ChkFLG = 0
 '*2.0*
 Dim stConnect As String
 stConnect = "ODBC;DSN=****;UID=****;PWD=****;DATABASE=****;"
 Dim WS As WorkSpace
 Dim DB2 As Database 'データベースオブジェクト変数
 Dim RS2 As Recordset 'レコードセットオブジェクト変数
 Set WS = DBEngine.Workspaces(0)
 Set DB2 = WS.OpenDatabase("", False, False, stConnect)
 Dim mySQL As String
 mySQL = "SELECT * FROM sysobjects WHERE xtype IN ('N' , 'U' ) ORDER BY name"
 Set RS2 = DB2.OpenRecordset(mySQL, db_open_Dynaset)
 Do Until RS2.EOF 'レコードの終わり
      If RemoteTblName = RS2.Fields("Name") Then
           ChkFLG = 1
           Exit Do
      End If
 RS2.MoveNext
 Loop
 'レコードセットオブジェクトを閉じる
 RS2.Close
 Set RS2 = Nothing
 'データベースオブジェクトを閉じる
 DB2.Close
 Set DB2 = Nothing

2012年3月12日月曜日

[ACCESS]ACCESS97/2000→ACCESS2.0用のVBA変換

From Evernote:

[ACCESS]ACCESS97/2000→ACCESS2.0用のVBA変換

フツウの人はまずナイと思うけど
ACCESS97/2000用に書いたVBAをACCESS2.0で実行させることに。

その際、色々記述方法が変わるのでその対比表。


●Dim FlgTest As Boolean 
Boolean型は使えない。Integer等に変換。

●Set db = CurrentDb  
 CurrentDbの記述NG。
  '---------------------------------------
 Set db = DBEngine.WorkSpaces(0).Databases(0) 
  '---------------------------------------
  または 
  '---------------------------------------
  Set db = DBEngine(0)(0)
  '---------------------------------------
 と書く。

●For Each tb In db.TableDefs
ForEach分がダメみたいなので、この場合は
  '---------------------------------------
     For i = 1 To db.TableDefs.Count    
          Set tb = db.TableDefs(i - 1)
  '---------------------------------------
となる。

●Dim db As DAO.Database, tb As DAO.TableDef
  ACCESS2.0に関してはDAOも何もないので?
  '---------------------------------------
Dim db As Database, tb As TableDef
  '---------------------------------------
に。

[SQLServer]テーブルの一覧を習得する。

From Evernote:

[SQLServer]テーブルの一覧を習得する。



MEMO:こちら参考。


SELECT B.NAME AS OWNER, A.NAME, A.TYPE

FROM sysobjects A JOIN sysusers B ON A.UID = B.UID

WHERE A.TYPE IN('U', 'IF', 'TF', 'V', 'P') AND A.STATUS >= 0

ORDER BY A.TYPE, A.NAME

2012年3月9日金曜日

[SQLServer]テーブルを消す!

From Evernote:

[SQLServer]テーブルを消す!

ぽちぽちチェックして削除するのは面倒くさい。


テーブル毎に

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

use [TestDB]
GO


DROP TABLE  [dbo].[マスターテーブル1] 

DROP TABLE  [dbo].[マスターテーブル2] 

DROP TABLE  [dbo].[マスターテーブル3] 

GO

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

というスクリプトを用意して一度に実行すればOK

2012年3月7日水曜日

[ASP.NET]クライアントスクリプトを埋め込む

From Evernote:

[ASP.NET]クライアントスクリプトを埋め込む

サーバ側の処理を行った後にjavascriptを動作させたい場合です。

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

'サーバ処理をした後に…

Dim objSB As New StringBuilder
        With objSB
            .Append("<SCRIPT language='JavaScript'>" & vbCrLf)
            .Append("showWindow('excel.aspx'")
            .Append("','Print',200,100);")
            .Append("</SCRIPT>" & vbCrLf)
            If Not Me.ClientScript.IsClientScriptBlockRegistered("clientScript") Then
                Me.ClientScript.RegisterClientScriptBlock(Me.GetType, "clientScript", .ToString)
            End If
        End With

'-------------------------------------------
'ちなみに…
'RegisterClientScriptBlockは<form>タグの直後に
'RegisterStartupScriptは</form>タグの前に'
'埋め込みます。という意味です。

2012年3月6日火曜日

[VB.NET]データベースと連動しないDataSetを作成

From Evernote:

[VB.NET]データベースと連動しないDataSetを作成

よく忘れるので…

オリジナルDataTableを作るロジックです。

Dim objTable As New DataTable
Dim objDR As DataRow

objTable.Columns.Add(New DataColumn("項目1", GetType(String) ) )
objTable.Columns.Add(New DataColumn("項目2", GetType(Integer) ) )

objDR = objTable.NewRow
objDR("項目1") = "あああああ"
objDR("項目2") = 123
objTable.Rows.Add(objDR)

2012年3月5日月曜日

[ASP.NET]javascriptでサーバー処理前の確認

From Evernote:

[ASP.NET]javascriptでサーバー処理前の確認

これもよく忘れる。
javascript側でサーバサイドに行くかどうかを制御する。

ボタンにこれを埋め込みます。
↓↓↓↓↓↓↓↓↓


OnClientClick="javascript:return confirm(' この入庫情報を削除します!\n元には戻せませんが、よろしいですか?\n');"

2012年3月4日日曜日

[ASP.NET]テーブルオブジェクト追加

From Evernote:

[ASP.NET]テーブルオブジェクト追加

行数、列数を指定して、テーブルオブジェクトを作って返します。
サーバーサイドでむりくりテーブル作って表示する際とかに使うかな。


#Region "指定の行列でテーブルオブジェクトを作成"
    ''' <summary>
    ''' 指定の行列でテーブルオブジェクトを作成
    ''' </summary>
    ''' <param name="Gyo"></param>
    ''' <param name="Retsu"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>

    Public Shared Function CreateTableObj(ByVal Gyo As Integer,    ByVal Retsu As Integer) As Table

        Dim objTable As New Table
        Dim objRow As New TableRow
        For i As Integer = 0 To Gyo
            objRow = New TableRow
            For j As Integer = 0 To Retsu
                objRow.Cells.Add(New TableCell)
            Next
            objTable.Rows.Add(objRow)
        Next
        Return objTable
    End Function
#End Region

2012年3月1日木曜日

[EXCELVBA]Web Service ToolkitによるVBA→Webサービス参照

From Evernote:

[EXCELVBA]Web Service ToolkitによるVBA→Webサービス参照

Web Service Toolkit を使うと 
ExcelVBA→Webサービスを参照できるようになります。

■実装方法

①Web Service Toolkitをダウンロード


②インストールが完了すると
Visual Basic Editorのメニューに「Web Service References」が追加されます。

この「Web Service References」から表示されるダイアログの「Web サービス URL」にwsdlを入力すると
   soap clientクラスが生成されます!

     ※WSDL…Webサービスアドレス+"?wsdl"
     (Webサービスのためのインターフェイス記述言語)

 


③クラスが出来ました。

  

     
     ②-1.例えば、Webサービスからこんなクラスが自動生成されたとして…
     '-----------------------------------------------------------------
Public Function wsm_ExecuteScalar(ByVal str_Sql As String) As String
    '*****************************************************************
    'http://*****/******/*******.asmx?wsdl から作成されたプロキシ関数です。
    '*****************************************************************

    'エラー処理
    On Error GoTo wsm_ExecuteScalarTrap

    wsm_ExecuteScalar = sc_WSCommon.ExecuteScalar(str_Sql)

Exit Function
wsm_ExecuteScalarTrap:
    WSCommonErrorHandler "wsm_ExecuteScalar"
End Function
     '-----------------------------------------------------------------


     ②-2.このクラスを使った読み方はこんなコードとなります↓。

     '-----------------------------------------------------------------
Private Sub CommandButton1_Click()

On Error GoTo errhand

    Dim SimeiC As Long
    SimeiC = ThisWorkbook.Sheets("Sheet1").Range("C3").Value

    ThisWorkbook.Sheets("sheet1").Range("E4") = ""

    Dim clsws_WSCommon As New clsws_WSCommon 'Soap Client
    Dim results As String
    results = clsws_WSCommon.wsm_ExecuteScalar("SELECT 氏名 FROM T_個人情報 WHERE 氏名コード= '" & SimeiC & "'")
       
    ThisWorkbook.Sheets("sheet1").Range("E4") = results
   
   
    Exit Sub


errhand:
    MsgBox "Error #" + Err.Number + ": " + Err.Description

End Sub
      '-----------------------------------------------------------------


②-3.ちなみに受け渡しがDataTable変数(.NET)のクラスの場合はどうなるか…
'-----------------------------------------------------------------
Public Sub wsm_AddDataTable2(ByRef any_Tbl As MSXML2.IXMLDOMNodeList, ByVal str_TableName As String, ByVal str_Sql As String)
    '*****************************************************************
    'http://*****/******/*******.asmx?wsdl から作成されたプロキシ サブルーチンです。
    '
    '"
any_Tbl" は XML として定義されています。XML 変数の実装に関する詳細については、
    'Microsoft Office 2003 Web Services Toolkit 2.0 ヘルプの「複合型 : XML」を参照してください。
    '*****************************************************************



    'エラー処理
    On Error GoTo wsm_AddDataTable2Trap


    sc_WSCommon.AddDataTable2 any_Tbl, str_TableName, str_Sql


Exit Sub
wsm_AddDataTable2Trap:
    WSCommonErrorHandler "wsm_AddDataTable2"
End Sub
'-----------------------------------------------------------------

②-4.DataTable変数は、IXMLDOMNodeListに変換されています。これは以下のように読みます
'-----------------------------------------------------------------
Private Sub CommandButton2_Click()


On Error GoTo errhand


    Dim JigyobuC As Long
    JigyobuC = ThisWorkbook.Sheets("Sheet1").Range("C6").Value


    Dim clsws_WSCommon As New clsws_WSCommon
   
    Dim strSQL As String
    strSQL = "SELECT 部門コード,部門名 FROM V_部門 WHERE 事業部コード = '" & JigyobuC & "'"
             
    Dim Nodes As MSXML2.IXMLDOMNodeList
    clsws_WSCommon.wsm_AddDataTable2 Nodes, "test", strSQL

       
    Dim y As Integer
    y = 8
   
    Dim xNode As MSXML2.IXMLDOMNode
    For Each xNode In Nodes
        Dim NodeList As MSXML2.IXMLDOMNodeList
        Set NodeList = xNode.selectNodes("NewDataSet/test/部門名")
        For Each obj In NodeList
           'MsgBox obj.nodeName & " : " & obj.Text
           Range("E" & y) = obj.Text
           y = y + 1
        Next
    Next xNode
   
    Exit Sub
       
errhand:
    MsgBox "Error #" + Err.Number + ": " + Err.Description
   
End Sub
'-----------------------------------------------------------------
もはやXMLNodeの勉強。




■基礎知識!




  Web Service ToolkitはWebサービスを使うためのローカルクラスを自動生成するツールに過ぎない。
  あくまでSOAP ToolKit 3.0 を使って接続しているのがポイント。
  (他の端末でもあらかじめSOAPToolkit3.0は入っている??みたいなのでインストール不要)

ちなみにインストールせずに自分でSOAPで読むコードを直接書いてもいいんだけど
どうも既存の[ツール]→[参照設定]→「Microsoft SOAP Type Library」では日本語が文字化けするので
SOAP Toolkit 3.0 ダウンロードついでにOffiece Web Service をインストールして
自動生成することにした訳です。