2009年6月6日土曜日

最大値のレコードだけを集める

ある特定の項目の最大値にあたるレコードの集まりだけを取り出す。。。
単にMAX関数を使うだけではSQLは完成しない。。。
さらに、その最大値が日付だった場合、指定の日付を最大値とみなして抜き出すことをしようものなら、さらに工夫が必要だ。

そこで例題 本日が 2009年 4月1日として その日現在の集合を抜き出す。20000101~ 20041231 までは 10 200501001 ~ 20081231 までは 20というよな運用として
テーブル名 T
データ
FA       FB      FC
--------------------------------------------
abc      20000101     10
abc      20050101     20
abc      20090101     30
abc      20100101     40
def      20040401     50
def      20090331     60
def      20091231     70
def      20100101     80
ghi      20030501     90
ghi      20090501     100
ghi      20100501     110

結果
F1       F2      FC
--------------------------------------------
abc      20090101     30
def      20090331     60
ghi      20030501     90

SELECT Q1.F1, Q1.F2, T1.FC FROM T
AS T1 INNER JOIN
(SELECT FA AS F1,
 MAX(CASE WHEN FB >'20090401' THEN
 '00000000'
ELSE
 FB
END)
AS F2 FROM T
GROUP BY FA)
AS Q1
ON Q1.F1=T1.FA
AND Q1.F2=T1.FB

ポイントはサブクエリで指定の日付を超えた場合に'00000000'と変換する部分がポイント
尚、Micrsoft Access ではサポートをしていないらしいとのことで、エラーが発生
ちなみに CASE を使用する場合には Accessでは IIf を使用する。
Accessではストアドをキックしてレコードを抜き出した方がよさそうである

2009年5月22日金曜日

リモートデスクトップでデュアルディスプレイ

XPproのリモートデスクトップで前からほしかった機能・・・
リモートデスクトップのバージョン6.0以上により可能だということだ。
SP3をインストールすると自動的に6.0に変更されるのでSP3はインストール必須。


尚、方法はrdpからショートカットを作成しそのプロパティからアドレスを
表示してアドレスを変更すして "/span" のオプションを追加すると出来る。
(例)
C:\WINDOWS\system32\mstsc.exe /span C:\Remote\Default.rdp

Default.rdpとして個別に作成したリモート接続用アイコンのみがWide画面で表示される。

横並びにしか対応していないので、それ以外の使い方をしたい場合には不可。

また、エクスペリエンスで余計な画面描写は避けた方がいいです。
本日の夜、早速試してみたい

2009年3月3日火曜日

クエリ内の1フールドで指定した数で文字列を分離する ACCESS for VBA

通常のACCESS VBAでの関数は解らないが、ある文字列を指定した数で2つに分離するとなるとなかなか大変である。

そこで独自に関数を作成してクエリ内で使用することにより簡単に分離が可能な関数をメモします。

この関数の場合は全角半角の文字が混入しても指定した半角数を対象にします。
(例)東京ディズニーランド(15文字)10で分けたい場合 東京ディズニ  -ランドのように出来ます。

まず、ACCESSのモジュール内に Functionのモジュールを作成

Function MyLenLeft(ByVal a, ByVal b)
 Dim c, LenName
 c = 0
 Dim i, nul
 nul = 0
 For i = 0 To Len(a) - 1
  Dim k
  k = Mid(a, i + 1, 1)
  If (Asc(k) And &HFF00) = 0 Then  
    c = c + 1
  Else
   c = c + 2
  End If
  If c <= b * 1 Then
   LenName = LenName & k
  End If
  Next
  MyLenLeft = LenName
End Function

Function MyLenMidOver (ByVal a, ByVal b)
 Dim c, LenName
 c = 0
 Dim i, nul
 nul = 0
 For i = 0 To Len(a) - 1
  Dim k
  k = Mid(a, i + 1, 1)
  If (Asc(k) And &HFF00) = 0 Then  
    c = c + 1
  Else
   c = c + 2
  End If
  If c <= b * 1 Then
   LenName = LenName & k
  End If
  Next
  MyLenMidOver = LenName
End Function


この2つをコピペで作成して
クエリ内に LeftやRight等の関数と同じように使用する。

(例)住所の列がものすごく長い場合に30文字で分けたい場合
住所A:MyLenLeft(住所、30)、住所B:MyLenMidOver(住所、30)
これで綺麗に分割できます。

なにかと便利な関数ですので他の用途にも応用が利くと思います。

2009年2月16日月曜日

パッケージ データへの分散クエリの実行

データ変換サービス (DTS) パッケージをリンク サーバーとして登録し、パッケージに対して分散クエリを実行できます。この機能によって、各種のソース (たとえば、Oracle と DB2 データ ソース) からのデータを単一のパッケージに統合し、そのデータを変換し、変換された分散クエリの結果を外部のデータ コンシューマに公開することができます。
パッケージ データに対して分散クエリを実行するには、sp_addlinkedserver ストアド プロシージャを使用して、パッケージをリンク サーバーとして定義する必要があります。次のコード例では、DTS パッケージに対して sp_addlinkedserver を使用する方法を示しています。sp_addlinkedserver 'DTSOLEDBPkg', 'PackageName', 'DTSPackageDSO', '/FC:\Dts\Dts01.dts')
sp_addlinkedserver コマンドで、各引数は以下のようになります。
DTSOLEDBPkg は、作成するリンク サーバーの名前です。
PackageName は、OLE DB データ ソースの製品名です。ここでは、任意の名前または NULL 文字列を指定できます。
DTSPackageDSO は、DTS パッケージの OLE DB プロバイダ名です。
最後の引数は、ファイル DTS01.dts の場所を指定します。
パッケージをリンク サーバーとして定義したら、このパッケージをデータ変換元として含む分散クエリを実行できます。以下に分散クエリの例を示します。Northwind データベースの Orders テーブルに対し、Oracle サーバーの Customer テーブルからデータを取得するパッケージとの結合操作を行います。このクエリでは、Orders テーブルと Customers テーブルに共通キー CustomerID があることを想定しています。SELECT a.OrderID, a.CustomerID, a.OrderDate, b.Companyname, b.Region
FROM Orders AS a, dtsLink...packageNameOracle AS b
WHERE a.CustomerID = b.CustomerID
このクエリの packageNameOracle は DTS パッケージ名です。ただし、パッケージの複数ステップをデータ ソースとして使用する場合は、パッケージ ステップ名を指定できます。

パッケージ データへの分散クエリの実行

データ変換サービス (DTS) パッケージをリンク サーバーとして登録し、パッケージに対して分散クエリを実行できます。この機能によって、各種のソース (たとえば、Oracle と DB2 データ ソース) からのデータを単一のパッケージに統合し、そのデータを変換し、変換された分散クエリの結果を外部のデータ コンシューマに公開することができます。
パッケージ データに対して分散クエリを実行するには、sp_addlinkedserver ストアド プロシージャを使用して、パッケージをリンク サーバーとして定義する必要があります。次のコード例では、DTS パッケージに対して sp_addlinkedserver を使用する方法を示しています。sp_addlinkedserver 'DTSOLEDBPkg', 'PackageName', 'DTSPackageDSO', '/FC:\Dts\Dts01.dts')
sp_addlinkedserver コマンドで、各引数は以下のようになります。
DTSOLEDBPkg は、作成するリンク サーバーの名前です。
PackageName は、OLE DB データ ソースの製品名です。ここでは、任意の名前または NULL 文字列を指定できます。
DTSPackageDSO は、DTS パッケージの OLE DB プロバイダ名です。
最後の引数は、ファイル DTS01.dts の場所を指定します。
パッケージをリンク サーバーとして定義したら、このパッケージをデータ変換元として含む分散クエリを実行できます。以下に分散クエリの例を示します。Northwind データベースの Orders テーブルに対し、Oracle サーバーの Customer テーブルからデータを取得するパッケージとの結合操作を行います。このクエリでは、Orders テーブルと Customers テーブルに共通キー CustomerID があることを想定しています。SELECT a.OrderID, a.CustomerID, a.OrderDate, b.Companyname, b.Region
FROM Orders AS a, dtsLink...packageNameOracle AS b
WHERE a.CustomerID = b.CustomerID
このクエリの packageNameOracle は DTS パッケージ名です。ただし、パッケージの複数ステップをデータ ソースとして使用する場合は、パッケージ ステップ名を指定できます。

SQL Server の複数インスタンス上の分散クエリ

Accessの様に別々のODBCからのリンクテーブルをクエリでJOINする場合に有効である。



SQL Server の複数のインスタンスを実行するサーバーで Microsoft® SQL Server™ 2000 のインスタンスを指定する際には、分散クエリで使用される Transact-SQL 要素に構文上の変更を加える必要はありません。インスタンスを分散クエリに指定するには、以下のモードのどちらかを使用します。
sp_addlinkedserver の @datasrc パラメータに 'server_name/instance_name' という構文を使用してサーバー名を指定します。
接続文字列に Server=server_name; INSTANCENAME=instance_name を指定します。
インスタンスを指定しない場合、分散クエリは指定されたサーバー上の SQL Server 2000 の既定のインスタンスに接続されます。
以下に、サーバー名 London 上に Payroll という名前の特定インスタンスを指定する例を示します。-- Define a linked server on an instance of SQL Server using @datasrc.
sp_addlinkedserver
@server = 'LondonPayroll1',
@provider = 'SQLOLEDB',
@datasource = 'London/Payroll'
-- Define a linked server on an instance of SQL Server using
-- INSTANCENAME in a provider string.
sp_addlinkedserver
@server = 'LondonPayroll2',
@provider = 'SQLOLEDB',
@provstr = 'Server=London;INSTANCENAME=Payroll'
-- Specify an instance of SQL Server in OPENDATASOURCE
-- using Data Source.
SELECT *
FROM OPENDATASOURCE(
'SQLOLEDB',
'Data Source=London/Payroll;User ID=MyUID;Password=MyPass'
).Northwind.dbo.Categories
-- Specify an instance of SQL Server in OPENROWSET
-- using a provider string.
SELECT a.*
FROM OPENROWSET(
'SQLOLEDB',
'Data Source=London;INSTANCENAME=Payroll;
User ID=MyUID;Password=MyPass',
Northwind.dbo.Categories
) AS a
-- Specify an instance of SQL Server in OPENROWSET
-- using a the datasource parameter.
SELECT a.*
FROM OPENROWSET(
'SQLOLEDB','London/Payroll','MyUID','MyPass',
'SELECT * FROM Northwind.dbo.Categories'
) AS a

2009年2月2日月曜日

windows2000 でタスクの強制終了

再起動を行えない場合に該当のタスクのみ終了したい場合に、終了出来ないきことがままある。

その場合はXP移行で使用可能なtaskkillコマンドが有効であるがWindows2000ではそのままでは使用出来ない。

そこで追加のセットアップをする必要がある。


Windows 2000 CD-ROM をセットします。
「Microsoft Windows 2000 CD」画面が起動するので、[この CD を参照(B)] をクリックします。
Support\Tools フォルダにある Setup.exe をダブルクリックします。

そうするとインストールが開始されるのでそのまま終了。

その後は以下のコマンドで有効である。

コマンドプロンプトで kill 696

※696はタスク番号です。

これでほぼ終了することが可能である。