2012年10月11日木曜日

[ASP.NET]データグリッドビューのセルを結合風。



データグリッドビューでセルを縦に結合したい場合。

[joinCells]等で結合関数をネットで拾って来ればOKではないかと。
が、結合してしまうと、再読込の時等、
サーバサイドがズレてしまったセルから値をとってこようとしたりして
どうにも都合が悪い。
で、いつも結局、結合でなくて、他のセルを空白&線を消す処理にしている。

↓以下、そのバージョン。データバインドした後に。


'★使い方
'1つ目の引数は結合風にする列。2つ目の引数は比較に使用する列。
'-------------------------------

Me.joinCells(Me.dgrid, 3, 0)  '3列目を結合風。判断は0列目の値を基準とする。
Me.joinCells(Me.dgrid, 2, 0)  '2列目を結合風。判断は0列目の値を基準とする。
Me.joinCells(Me.dgrid, 1, 0)   '1列目を結合風。判断は0列目の値を基準とする。
'-------------------------------

'結合風関数。
#Region "joinCells"
    Public Sub joinCells(ByVal dg As GridView, ByVal column As Integer, _ 
                                               ByVal HikakuColumn As Integer)

        Dim numRow As Integer = dg.Rows.Count
        Dim baseIndex As Integer = 0
        Dim nextindex As Integer
        Dim baseCell As TableCell
        Dim nextCell As TableCell

        Do While (baseIndex < numRow)

            nextindex = baseIndex + 1
            baseCell = dg.Rows(baseIndex).Cells(column)

            Do While (nextindex < numRow)

                nextCell = dg.Rows(nextindex).Cells(column)

                If (getText(dg.Rows(nextindex).Cells(HikakuColumn)) = getText(dg.Rows(baseIndex).Cells(HikakuColumn))) Then
                    nextindex = nextindex + 1
                    nextCell.Text = ""
                    nextCell.Style.Item("border-top-color") = "white"
                Else
                    Exit Do
                End If
            Loop
            baseIndex = nextindex
        Loop
    End Sub
#End Region
#Region "getText"
    Public Function getText(ByVal tc As TableCell) As String
        Dim dblc As DataBoundLiteralControl
        dblc = tc.Controls(0)
        Return dblc.Text
    End Function
#End Region

2012年10月10日水曜日

[ASP.NET]ラジオボタンリストとjavascript


ラジオボタンリストを使用すると、
単なるidを指定してValue値をとることはできなくなる。
for文で回してやる必要があり。

★html側
'----------------------------------------------------------------
<asp:RadioButtonList ID="rdoManyama"   runat="server">
        <asp:ListItem Value="108" Selected="true">108本</asp:ListItem>
        <asp:ListItem Value="112">112本</asp:ListItem>
</asp:RadioButtonList>  


'---------------------------------------------------------------- 
★javascript側


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

 var Answer;
 var id = '<%=me.rdoManyama.clientID%>'
 for (var i = 0; i < document.all(id).length; i++){
                if(document.all(id)[i].checked == true)
                AnsWer= document.all(id)[i].value;
}

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


※忘れないメモ…
横並びに並べたい時:RepeatColumns="2" と数値を指定すればよい。

2012年8月22日水曜日

[SQL]指定したグループ別に通し番号を振る。

よく忘れるシリーズ。

SQL Serverにて指定したグループで通し番号を振るには
ROW_NUMBER() を使用します。
OVER()内でグループ単位を指定(複数もOK)、通し順を指定します。

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

SELECT
   ROW_NUMBER() OVER( PARTITION BY 市, 町  ORDER BY 引っ越して来た日 ) AS SEQ 
   名前, 市, 町, 引っ越して来た日
FROM
  住民台帳
ORDER BY
  市, 町, 引っ越して来た日
'---------------------------------------------

結果は

1,田中,広島市,南町,2012/01/01
2,佐藤,広島市,南町,2012/01/03
1,竹田,広島市,中町,2012/01/02
1,田中,福山市,北町,2012/01/02
2,田中,福山市,北町,2012/01/03

となります。

2012年8月20日月曜日

[VBA]ExcelVBAでWebサービスを読む。


----------------------------------------------------------
ExcelでWebサービスを読む方法。(SOAP方式。ASP.NETで作成。)
----------------------------------------------------------

①Excel2003の場合は、「Web Service Toolkit」をダウンロード+インストールしておくとよい。
  2003じゃなくてももし完成後に文字化けするようであれば、それはSOAP3.0入手のためダウンロードした方がいいとか悪いとか。


②既存の[ツール]→[参照設定]→「Microsoft SOAP Type Library」にチェックをいれて、SOAPのコードをいじれるようにしておく。


③「MyWebService」というクラスを作成してソースを以下の様にします。赤文字の追記を参照のこと。
========================================================================

Private MyWebService As SoapClient30
Private Const c_WSDL_URL As String = "http://●●●.asmx?wsdl"
Private Const c_SERVICE As String = "●●●●"
Private Const c_PORT As String = "●●●●" '※上記アドレスをブラウザで直接見ればPortやService名,Namespaceは書いてあります。
Private Const c_SERVICE_NAMESPACE As String = "http://●●●●/"
Private Sub Class_Initialize()
'*****************************************************************
'クラスがインスタンス化されるたびに、このサブルーチンが呼び出されます。
'変数 sc_ComplexTypes に SoapClient30 を割り当てます。
'*****************************************************************
Dim str_WSML As String
str_WSML = ""
Set MyWebService = New SoapClient30
MyWebService.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
'ProxyServer を <CURRENT_USER> に設定し、Internet Explorer の LAN 設定で定義されている
'プロキシ サーバーを使用します。
MyWebService.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
'Internet Explorer が自動検出に設定されている場合、EnableAutoProxy を True に設定して、
'プロキシ設定を自動検出するようにします。
MyWebService.ConnectorProperty("EnableAutoProxy") = True

End Sub
Private Sub Class_Terminate()
'*****************************************************************
'クラスが消滅するたびに、このサブルーチンが呼び出されます。
'変数 sc_ComplexTypes を Nothing に設定します。
'*****************************************************************
'エラー処理
On Error GoTo Class_TerminateTrap
Set MyWebService = Nothing
Exit Sub
Class_TerminateTrap:
WSRefScrCommonErrorHandler ("Class_Terminate")
End Sub
Private Sub WSRefScrCommonErrorHandler(str_Function As String)
'*****************************************************************
'このサブルーチンは、クラス エラー処理ルーチンです。
'サブルーチン、または関数でエラーが発生したときに呼び出されます。
'エラーが発生したサブルーチン名、または関数名とエラー内容を返します。
'*****************************************************************
' SOAP  エラー
If MyWebService.FaultCode <> "" Then
Err.Raise vbObjectError, str_Function, MyWebService.FaultString
' SOAP  以外のエラー
Else
Err.Raise Err.Number, str_Function, Err.Description
End If
End Sub
'=====================================================================
'↓↓使用する関数の宣言は以下に追加していきます↓↓
'=====================================================================
'例①:文字列(String)を投げて、文字列(String)で結果が返ってくる関数
 Public Function wsm_ExecuteScalar(ByVal str_SQL As String) As String
'エラー処理
On Error GoTo wsm_ExecuteScalarTrap
wsm_ExecuteScalar = MyWebService.ExecuteScalar(str_SQL)
Exit Function
wsm_ExecuteScalarTrap:
WSRefScrCommonErrorHandler "wsm_ExecuteScalar"
End Function

'例②:文字列(String)を投げて、データテーブル型で結果が返ってくる関数の場合は、DOMNodeListで宣言する!
Public Function wsm_GetDataTable(ByVal str_SQL As String) As MSXML2.IXMLDOMNodeList
'*****************************************************************
'"wsm_GetDataTable" は XML として定義されています。XML 変数の実装に関する詳細については、
'Microsoft Office 2003 Web Services Toolkit 2.0 ヘルプの「複合型 : XML」を参照してください。
'*****************************************************************
'エラー処理
On Error GoTo wsm_GetDataTableTrap
Set wsm_GetDataTable = MyWebService.GetDataTable(str_SQL)
Exit Function
wsm_GetDataTableTrap:
WSRefScrCommonErrorHandler "wsm_GetDataTable"
End Function
'=====================================================================
'↑↑使用する関数の宣言は以下に追加していきます↑↑
'=====================================================================

========================================================================
④作ったクラスを利用して、コードはこのように書きます。
========================================================================

Dim mySQL As String
mySQL = " SELECT * FROM 社員テーブル"
'Webサービスから
Dim MyWebService As New MyWebService
Dim Nodes As MSXML2.IXMLDOMNodeList
Set Nodes = MyWebService.wsm_GetDataTable(mySQL)

'中身確認したい場合は
'For i = 0 To Nodes.Length - 1
' MsgBox i & "=>" & vbCrLf & Nodes(i).nodeName & "=>" & vbCrLf & Nodes(i).Text
' Nodes.NextNode
'Next


Dim xNode As MSXML2.IXMLDOMNode
Set xNode = Nodes(1) 'Nodes(0)はヘッダー情報ぽいのでNodes(1)だけでOk
Dim NodeList As MSXML2.IXMLDOMNodeList
Set NodeList = xNode.selectNodes("NewDataSet/tmp") '←Node名はWebサービスによって変わる!あらかじめブラウザで結果を確認した方がヨイ

If NodeList.Length = 0 Then
 MsgBox ("対象データはありません")
 GoTo EndStep
End If


For Each obj In NodeList
'ここでセルに自由に加工する
With obj

Dim strMoji(16) As Variant
strMoji(0) = .childNodes(0).Text
strMoji(1) = .childNodes(1).Text
WS.Range(WS.Cells(intRow, 1), WS.Cells(intRow, 16)).Value = strMoji
End With

intRow = intRow + 1
Next

======================================================================== 

2012年7月13日金曜日

[その他]igoogleやgoogleリーダーの代わりのNetvibesで出来ること

igoogle→NetVibesから乗り換えメモ。
追記:googleリーダも終了になったのでさらに積むことに…。
追記:Myyahooも終了…そのうちichrome試します。


結論から言うと
「Web Page」ガジェットと「HTML」ガジェットを使いこなせばigoogleより便利に使えそう。

単純にRSSリーダとして使えばgoogleリーダーも兼用できるし。⇒◆RSS関係◆へ。


以下、出来たことと方法メモ。

2012年7月6日金曜日

[VS2005]外部ツールに「エクスプローラを開く」機能追加。

覚え書き。
VisualStudioにて、エクスプローラを簡単に呼び出せる設定追加。


「ツール」→「外部ツール」にて

「追加」ボタン

タイトル「エクスプローラ(&E)」
コマンド「explorer.exe」
引数(R)「/e,"$(ItemDir)."」

「適用」ボタン


[VS2005]Windows7における「発行されない」現象

ASP.NETにて
ファイル名「****(未使用).ASPX」のファイルがあったのだが

Windows 7 に移行した途端、コンパイルはできなくなるが発行をしても発行されなくなった。
(「発行は成功しました」とメッセージがでるが発行ファイルが出来ない。)

いろいろ調べた結果、「****(未使用).ASPX」のファイルを消すとうまくいった。


Windows 7 ではカッコ付の命名ファイルはNGか??




2012年6月29日金曜日

[ASP]画面が表示されるまで「お待ち下さい…」の表示を行なう。

From Evernote:

[ASP]画面が表示されるまで「お待ち下さい…」の表示を行なう。

以下の3ステップを行なう。

①全画面表示される前に準備出来たものから表示するおまじない。これを最初に書く。
<% Response.Buffer=false %>

②bodyタグに以下のonloadスクリプトを追加する。
<body onload="document.all['waitdiv'].style.display='none';">

③表示のdivを作成する。一番上に。
<div id="waitdiv" align="center">
     <br/>
     集計しています。お待ちください…
     <img src="image/roller.gif" border="0" alt="">
</div>

2012年6月21日木曜日

[SQL]SQL文での日付変換あれこれ。

From Evernote:

SQL文での日付変換あれこれ。

SQL文での日付変換あれこれ。


●yyyyMMdd(数値型)→Date型
---------------------------------------
SELECT    CONVERT(datetime, CAST(CA.数値型 AS VARCHAR), 112) AS 日付型
FROM      カレンダーテーブル AS CA 
---------------------------------------


●Date型→yy/MM(文字列)
---------------------------------------
SELECT     RIGHT(CONVERT(VARCHAR, CA.日付型,111),5) AS 文字列型
FROM       カレンダーテーブル AS CA 
---------------------------------------

2012年6月18日月曜日

[VB.NET]テキストボックスで指定の桁数を入力したら次へフォーカス

From Evernote:

[VB.NET]テキストボックスで指定の桁数を入力したら次へフォーカス

# Region " テキストボックス7桁でフォーカス移動"
     Private Sub txtTEST_KeyPress( ByVal sender As System.Object, _ 
            ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtTEST.KeyPress

        Dim strBefore As String = Me .txtTEST.Text.Trim
        If strBefore.Length = 6 AndAlso _
            Asc(e.KeyChar) <> Keys.Back AndAlso _
                e.KeyChar.ToString.Trim.Length = 1 AndAlso _
                    Me.txtEigen.SelectionStart = 6 Then
            Me.txtNEXT.Select()
        End If

    End Sub
# End Region

2012年6月15日金曜日

[VB.NET]テキストボックスにて条件に合わない入力の場合はキャンセル

From Evernote:

[VB.NET]テキストボックスにて条件に合わない入力の場合はキャンセル

  
Private Sub txtEigen_KeyPress( ByVal sender As System.Object,  _
   ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEigen.KeyPress
    
    '例:Aの入力をなかったことにする
     If e.KeyChar = "A" Then
         e.Handled = True
    End If

End Sub

[.NET]列挙型(Enum)のオリジナル使い方

From Evernote:

[.NET]列挙型(Enum)のオリジナル使い方

フツウに宣言して自分変数として使うけど、
その他色々使うメモ。

'宣言部==============================
Private Enum ABCD As Integer
        A = 1
        B = 2
        C = 3
        D = 4
End Enum

'①通常の使い方
If tmp = ABCD.A.GetHashCode
     MessageBox.Show("あたり")
End If
'②定義されている数や中身を知りたい場合
Dim cnt As Integer = 0 
For Each EnumNumber As ABCD In System.Enum.GetValues(GetType (ABCD))
     cnt += 1
     MessageBox.Show(EnumNumber)
Next


'ここからは自分流==============
     'これはEnum宣言と同じく作っておく
     Private Function GetName( ByVal Type As Type, ByVal Code As Integer ) As String

        Dim tmp As String = Nothing

        If Type Is GetType(ABCD) Then
            Select Case Code
                Case ABCD.A.GetHashCode
                    tmp = "えー"
                Case ABCD.B.GetHashCode
                    tmp = "びー"
                Case ABCD.C.GetHashCode
                    tmp = "しー"
                Case ABCD.D.GetHashCode
                   tmp = "でー"
            End Select
        End If

        Return tmp

    End Function

# End Region

'たとえば列挙したデータでデータテーブルを作りたい場合==============
  Dim dt As New DataTable
  dt.Columns.Add( "id" , GetType( Integer))
  dt.Columns.Add( "name" , GetType( String))
  For Each EnumNumber As ABCDIn System.Enum.GetValues(GetType (ABCD))
        Dim dr As DataRow = dt.NewRow
        dr.Item( "id" ) = EnumNumber
        dr.Item( "name" ) = GetName( GetType(ABCD), EnumNumber)
        dt.Rows.Add(dr)
  Next

2012年5月9日水曜日

[ACCESS]ACCESS2.0でODBC接続でもパスワードを聞かれる対応

From Evernote:

[ACCESS]ACCESS2.0でODBC接続でもパスワードを聞かれる対応

ACCESS2.0でSQLServerにリンクテーブルとして接続する場合、
ODBC設定でパスワードを入れているのに
毎回パスワードを聞かれる。

解決策が見つからなかったので、
一度接続するモジュールを作成し、
それをAutoExe(起動時に走るマクロ)に埋め込むことにした。
1度接続すれば以降は出ないので。


モジュールは以下。
'-----------------------------------------

Function SQLLogin ()

    Dim strDSN As String: strDSN = "systest.aa"
    Dim strDB As String: strDB = "testDB"
    Dim strUser As String: strUser = "user"
    Dim strPass As String: strPass = "pwd"
    Dim stConnect As String
  'ODBC名はここに
    stConnect = "ODBC;DSN=ここにODBC名;UID=" & strUser & ";PWD=" & strPass & ";DATABASE=" & strDB & ";"
    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)
    'レコードセットオブジェクトを閉じる
    RS2.Close
    Set RS2 = Nothing
    'データベースオブジェクトを閉じる
    DB2.Close
    Set DB2 = Nothing
   
End Function

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

2012年4月19日木曜日

[.NET]Hashテーブルを使ったクラス

From Evernote:

[.NET]Hashテーブル(辞書)を使ったクラス

Hashテーブル(dictionary型)を使ったクラスを持っておいて
1度宣言すれば
ループ時等で何度もマスタ読みに行かなくてラク。


'本文では==================================

Dim GetTanto As New GetTanto  '宣言

Dim TestArray(3) = {1000,2000,3000} 
For As Integer = 0 To TestTrray.Length - 1
   debug GetTanto.GetName(TestArray(i)) '表示
Next


'クラスは=======================================

'class_担当者をとってくる -------
Public Class GetTanto

# Region "Member"
        Private NameTBL As New System.Collections.Generic.Dictionary(Of Integer , String)
# End Region
# Region "Constructor"
        Sub New ()
            MyClass.ReadMaster()
        End Sub
# End Region
# Region "ReadMaster"
        Sub ReadMaster()

            Dim strSQL As String = "SELECT * from M_ 担当者"
            Dim objDS As New DataSet
            ADONET.FillDataset(STRCON, objDS, "Table" , strSQL)
            For i As Integer = 0 To objDS.Tables("Table").Rows.Count - 1
                With objDS.Tables("Table").Rows(i)
                    NameTBL.Add(.Item( "担当コード "), .Item( "担当者"))
                End With
            Next

        End Sub
# End Region
# Region "GetName"
        Public Function GetName( ByVal No As Object) As String

            Dim tmp As String = ""
            '合致するなら
            If NameTBL.ContainsKey(No) Then
               tmp = NameTBL(No).ToString.Trim
            End If
            Return tmp

        End Function
# End Region

End Class