へ~、こんなこともできるんだ!ネタ。
MySQL を使っている方には「何を今更」かもしれないが、Firebird では動かないのではないか(最新版では試していないが)。
select
A.GRPID, A.TEAMNAME, Count(A.MEMBERID)
/* Join して中間テーブルを作成 */
from (
select MEMBERID, GRPID,
(select TEAMNAME from TEAMINFO T where T.MEMBERID=M.MEMBERID) as TEAMNAME
from MEMBERS M
) A
group by A.GRPID, A.TEAMNAME
;
SELECT が3段になっているケースで、3段目で取得した項目を1段目の GROUP BY で指定できる。
2014年12月4日木曜日
2014年11月25日火曜日
【Excel】 セルの文字データを表す「'」(シングルクォート)を削除する
複数のセルの数式を規則的に変更したくて、
1) とりあえず先頭の「=」を「'=」に置換し、
2) いろいろと置換・編集した結果を、
3) 再び数式に戻そうと、先頭の「'=」を「=」に置換しようとしたら、
・・・残念ながら先頭の「'」はデータとして認識してくれない。
ググってみたらそういう操作はできないらしい。
以下のプログラムを作って解決 :
Sub ChangeToFormula()
' 「=」で始まる文字データを式に変更する
' 操作 : 変更したい範囲を選択して、このマクロを実行
Dim wCell As Range
For Each wCell In Selection
If (Left(wCell.Value, 1) = "=") Then
wCell.Formula = wCell.Value
End If
Next wCell
End Sub
1) とりあえず先頭の「=」を「'=」に置換し、
2) いろいろと置換・編集した結果を、
3) 再び数式に戻そうと、先頭の「'=」を「=」に置換しようとしたら、
・・・残念ながら先頭の「'」はデータとして認識してくれない。
ググってみたらそういう操作はできないらしい。
以下のプログラムを作って解決 :
Sub ChangeToFormula()
' 「=」で始まる文字データを式に変更する
' 操作 : 変更したい範囲を選択して、このマクロを実行
Dim wCell As Range
For Each wCell In Selection
If (Left(wCell.Value, 1) = "=") Then
wCell.Formula = wCell.Value
End If
Next wCell
End Sub
2014年11月11日火曜日
【excel vba】 UTF-8 でテキストを入出力する
1.vbaエディタで「ツール → 参照設定」を開き、「Microsoft ActiveX Data Objects 2.8 Library」にチェックが入っていることを確認。
2.クラスモジュール
1)クラスモジュールを作成し、プロパティウィンドウからモジュール名を U8Stream とする。
2)以下のコードを貼りつける。
~~~~~~~~~
Option Explicit
'UTF-8 でテキストファイルを読込み・書き出し
' 参照設定で Microsoft ActiveX Data Objects x.x Library を選択のこと(x.x はバージョン番号)。
'
'使い方 :
'1)読み込み
'Sub test_r()
' Dim wStream As U8Stream, rx As Long
'
' Set wStream = New U8Stream
' wStream.U8SOpen "C:\UserFiles\U8STest.txt", Mode:="r"
' rx = 1
' For rx = 1 To 999
' If (wStream.U8SEOS) Then Exit For
' ActiveSheet.Cells(rx, 1).Value = wStream.U8SReadText
' Next rx
' wStream.U8SClose
'End Sub
'
'2)書き出し
'Sub test_w()
' Dim wStream As U8Stream, endRow As Long, rx As Long
'
' Set wStream = New U8Stream
' endRow = ActiveCell.SpecialCells(xlLastCell).Row
' wStream.U8SOpen "C:\UserFiles\U8STest_w.txt"
' For rx = 1 To endRow
' wStream.U8SWriteText ActiveSheet.Cells(rx, 1).Value
' Next rx
' wStream.U8SClose
'End Sub
Private pFNam As String
Private pStream As Object
Private pBOM As Boolean
Private pModeInput As Boolean
'ストリームを開く
Public Function U8SOpen(ByVal FNam As String, _
Optional ByVal Mode As String = "w", _
Optional ByVal BOM As Boolean = False, _
Optional ByVal Charset As String = "UTF-8", _
Optional ByVal LineSeparator As Integer = adCR) As Boolean
' FNam : ファイル名
' Mode : Read or Write (第一文字で判定;小文字可)
' BOM : True = pBOM あり、False = なし(デフォルト)
' Charset : 文字セットの名称
' LineSeparator: 行区切り文字; CR .. 13, LF .. 10, CRLF .. -1
U8SOpen = False
pFNam = FNam: pBOM = BOM
pModeInput = (LCase(Left(Mode, 1)) <> "w")
Set pStream = New ADODB.Stream
'Initialize the stream
With pStream
.Open
.Type = adTypeText
.Position = 0
.Charset = Charset
.LineSeparator = LineSeparator
End With
If (pModeInput) Then
pStream.LoadFromFile (pFNam)
End If
U8SOpen = True
End Function
'ストリームからテキストを行単位で入力
Public Function U8SReadText() As Variant
U8SReadText = False
If (Not (pModeInput)) Then
Err.Raise Number:=9990, Description:="書き出しストリームとして開かれています。"
End If
If (Not (pStream.EOS)) Then
U8SReadText = pStream.ReadText(adReadLine)
End If
End Function
'ストリームの終了をチェック
Public Function U8SEOS() As Boolean
U8SEOS = pStream.EOS
End Function
'ストリームにテキストを出力
Public Function U8SWriteText(aStr As String) As Boolean
U8SWriteText = False
If (pModeInput) Then
Err.Raise Number:=9991, Description:="読み込みストリームとして開かれています。"
End If
pStream.WriteText aStr, adWriteLine 'supply line sep.
U8SWriteText = True
End Function
'ストリームを解放
Public Function U8SClose() As Boolean
'出力モードではストリームをファイルに上書きで保存する。
U8SClose = False
If (pModeInput) Then
'for Read mode .. nothing to do here.
Else
'for Write mode ..
'ストリームをファイルに保存し、解放する
If (Not pBOM) Then 'delete BOM
Dim byteData() As Byte
With pStream
.Position = 0
.Type = adTypeBinary
.Position = 3
byteData = pStream.Read
.Close
.Open
.Write byteData
End With
End If
pStream.SaveToFile pFNam, adSaveCreateOverWrite
End If
Set pStream = Nothing
U8SClose = True
End Function
~~~~~~~~~
2.クラスモジュール
1)クラスモジュールを作成し、プロパティウィンドウからモジュール名を U8Stream とする。
2)以下のコードを貼りつける。
~~~~~~~~~
Option Explicit
'UTF-8 でテキストファイルを読込み・書き出し
' 参照設定で Microsoft ActiveX Data Objects x.x Library を選択のこと(x.x はバージョン番号)。
'
'使い方 :
'1)読み込み
'Sub test_r()
' Dim wStream As U8Stream, rx As Long
'
' Set wStream = New U8Stream
' wStream.U8SOpen "C:\UserFiles\U8STest.txt", Mode:="r"
' rx = 1
' For rx = 1 To 999
' If (wStream.U8SEOS) Then Exit For
' ActiveSheet.Cells(rx, 1).Value = wStream.U8SReadText
' Next rx
' wStream.U8SClose
'End Sub
'
'2)書き出し
'Sub test_w()
' Dim wStream As U8Stream, endRow As Long, rx As Long
'
' Set wStream = New U8Stream
' endRow = ActiveCell.SpecialCells(xlLastCell).Row
' wStream.U8SOpen "C:\UserFiles\U8STest_w.txt"
' For rx = 1 To endRow
' wStream.U8SWriteText ActiveSheet.Cells(rx, 1).Value
' Next rx
' wStream.U8SClose
'End Sub
Private pFNam As String
Private pStream As Object
Private pBOM As Boolean
Private pModeInput As Boolean
'ストリームを開く
Public Function U8SOpen(ByVal FNam As String, _
Optional ByVal Mode As String = "w", _
Optional ByVal BOM As Boolean = False, _
Optional ByVal Charset As String = "UTF-8", _
Optional ByVal LineSeparator As Integer = adCR) As Boolean
' FNam : ファイル名
' Mode : Read or Write (第一文字で判定;小文字可)
' BOM : True = pBOM あり、False = なし(デフォルト)
' Charset : 文字セットの名称
' LineSeparator: 行区切り文字; CR .. 13, LF .. 10, CRLF .. -1
U8SOpen = False
pFNam = FNam: pBOM = BOM
pModeInput = (LCase(Left(Mode, 1)) <> "w")
Set pStream = New ADODB.Stream
'Initialize the stream
With pStream
.Open
.Type = adTypeText
.Position = 0
.Charset = Charset
.LineSeparator = LineSeparator
End With
If (pModeInput) Then
pStream.LoadFromFile (pFNam)
End If
U8SOpen = True
End Function
'ストリームからテキストを行単位で入力
Public Function U8SReadText() As Variant
U8SReadText = False
If (Not (pModeInput)) Then
Err.Raise Number:=9990, Description:="書き出しストリームとして開かれています。"
End If
If (Not (pStream.EOS)) Then
U8SReadText = pStream.ReadText(adReadLine)
End If
End Function
'ストリームの終了をチェック
Public Function U8SEOS() As Boolean
U8SEOS = pStream.EOS
End Function
'ストリームにテキストを出力
Public Function U8SWriteText(aStr As String) As Boolean
U8SWriteText = False
If (pModeInput) Then
Err.Raise Number:=9991, Description:="読み込みストリームとして開かれています。"
End If
pStream.WriteText aStr, adWriteLine 'supply line sep.
U8SWriteText = True
End Function
'ストリームを解放
Public Function U8SClose() As Boolean
'出力モードではストリームをファイルに上書きで保存する。
U8SClose = False
If (pModeInput) Then
'for Read mode .. nothing to do here.
Else
'for Write mode ..
'ストリームをファイルに保存し、解放する
If (Not pBOM) Then 'delete BOM
Dim byteData() As Byte
With pStream
.Position = 0
.Type = adTypeBinary
.Position = 3
byteData = pStream.Read
.Close
.Open
.Write byteData
End With
End If
pStream.SaveToFile pFNam, adSaveCreateOverWrite
End If
Set pStream = Nothing
U8SClose = True
End Function
~~~~~~~~~
2014年9月13日土曜日
【Delphi, Firebird】今さらながら、Devartのドライバでdbexpressに接続
設計時には問題なく接続できていたのに、実行したら
「不明なドライバです: DevartInterBase」
と出る。
動いているプログラムと見比べても悪い所がなかなか見つからない。
uses に DbxDevartInterbase を追加しなければいけなかったのだ。3時間ほども無駄にしてしまった。
Readme.html にはそんな記述がないが、最初に見つけたときはどうしたのだったか。
「不明なドライバです: DevartInterBase」
と出る。
動いているプログラムと見比べても悪い所がなかなか見つからない。
uses に DbxDevartInterbase を追加しなければいけなかったのだ。3時間ほども無駄にしてしまった。
Readme.html にはそんな記述がないが、最初に見つけたときはどうしたのだったか。
2014年7月28日月曜日
[Delphi]StringGrid の列幅を設計時の設定する
StringGrid は個々の列幅を設定するプロパティがないので、通常は実行時の OnCreate 等で
| with StringGrid1 do begin
| ColWidths[0] := 24; ColWidths[1] := 64; ・・・
| end;
のように列幅の設定をしていると思うが、自分で書いたプログラムでは設計時にちゃんと列幅が設定されているではないか。どうやったのか思い出せなくてググってみたが適切な記事にヒットしない。出来ている StringGrid をテキスト表示してみたらわかりました。フォームをテキスト表示にしてエディタで編集するだけ。
| object StringGrid1: TStringGrid
| Left = xxx
| ・・・
| ColWidths = ( 64 80 240 32 ・・・) ← のように!
| end
| with StringGrid1 do begin
| ColWidths[0] := 24; ColWidths[1] := 64; ・・・
| end;
のように列幅の設定をしていると思うが、自分で書いたプログラムでは設計時にちゃんと列幅が設定されているではないか。どうやったのか思い出せなくてググってみたが適切な記事にヒットしない。出来ている StringGrid をテキスト表示してみたらわかりました。フォームをテキスト表示にしてエディタで編集するだけ。
| object StringGrid1: TStringGrid
| Left = xxx
| ・・・
| ColWidths = ( 64 80 240 32 ・・・) ← のように!
| end
2014年3月28日金曜日
Firebird のシステム情報を取得
テーブル一覧を取得する :
select RDB$RELATION_NAME as TABLES from RDB$RELATIONS
where (RDB$VIEW_SOURCE is NULL) and (RDB$SYSTEM_FLAG = 0)
order by RDB$RELATION_NAME;
項目一覧を取得する :
select RDB$FIELD_NAME as COLUMN_NAME from RDB$RELATION_FIELDS
where RDB$RELATION_NAME = 'PRODUCTS' order by RDB$FIELD_POSITION;
select RDB$RELATION_NAME as TABLES from RDB$RELATIONS
where (RDB$VIEW_SOURCE is NULL) and (RDB$SYSTEM_FLAG = 0)
order by RDB$RELATION_NAME;
項目一覧を取得する :
select RDB$FIELD_NAME as COLUMN_NAME from RDB$RELATION_FIELDS
where RDB$RELATION_NAME = 'PRODUCTS' order by RDB$FIELD_POSITION;
登録:
投稿 (Atom)