Microsoft Visual FoxPro

Visual FoxPro は、マイクロソフトが開発販売しているデータ中心型オブジェクト指向/手続き型プログラミング言語である。1984年、Fox Softwareが開発した FoxProから発展した製品である。

1. 歴史
-----

1.1. FoxPro
-----------

FoxPro はテキストベースの手続き型プログラミング言語でありDBMSである。当初 Fox Software が開発販売し、後にマイクロソフトに引き継がれた。対応プラットフォームとしては、MS-DOS、Microsoft Windows、Macintosh、UNIX があった。

FoxPro は一般に「xBase言語」と呼ばれる言語の一種であり、その文法はdBASEプログラミング言語に基づいている。xBase言語とされるものには他に Clipper がある。xBase言語の初期の歴史については、dBASEを参照。

FoxProはデータベース管理システムだが、表間の関係をサポートしていない。つまり、関係データベースではないし、トランザクション処理能力もない。

最終版はFoxPro 2.6で、それ以降はVisual FoxProに引き継がれた。既に販売終了していてマイクロソフトもサポートしていないが、FoxProユーザーのコミュニティは現在も活動中である。FoxPro 2.6 for UNIX はIntel Binary Compatibility Standard  サポートライブラリを使ってLinuxやFreeBSDにインストール可能である。

FoxPro 2では、"Rushmore" という最適化エンジンが搭載され、データ検索や更新が高速化されている。Rushmoreは全てのデータ関係文を調べてフィルタ式を探し出す。フィルタ式が使われると、同じ式にマッチするインデックスを探す。また、FoxPro 2は当初WatCOM C++で書かれており、これには自前のメモリ拡張機能があった。FoxPro 2は拡張メモリにアクセスでき、DOSが管理可能なほぼ全てのメモリを使うことができた。HIMEM.SYSがロードされていない場合、FoxPro 2は自前の拡張機構を起動するようになっていた。

1.2. Visual FoxPro
------------------

Visual FoxProとしての最初のバージョンは3.0で、対応プラットフォームはMacintoshとWindowsのみに限定され、さらに後のバージョンではWindowsのみとなった。現在のVisual FoxProはCOMベースであり、マイクロソフトはMicrosoft .NET版を開発する予定はないとしている。

Visual FoxProは関係データベースエンジンと密に結合されている。この関係データベースはFoxProのxBase機能を拡張し、SQLクエリ/データ操作を追加サポートしている。多くのデータベース管理システムとは異なり、Visual FoxProは完全な動的プログラミング言語であり、追加の汎用プログラミング環境を必要としない。ファットクライアントのアプリケーション開発だけでなく、ミドルウェアやウェブアプリケーションも開発可能である。

1.3. 最近の動向
----------

2002年末、Visual FoxProをWineを使って Linuxで利用可能であることが示された。2003年、これを受けてマイクロソフトはWindows以外の上でFoxProを動作させることはライセンス契約に違反していると指摘した。

2005年12月、TIOBEの[1]にVFPが初めて上位20位以内にランキングされた。2007年3月には19位、2007年8月には22位、2008年4月には17位と推移している。

2007年3月、マイクロソフトはVFP 10は開発されないことを発表した。従って、2004年12月17日にリリースされたVFP 9が最後の商用バージョンとなる。VFP 9 のサポートはサービスパックの形式で行われている。

その発表と同時に、開発されていた次期バージョンSednaが発表された。これはVFP 9へのアドオンであり、SQL Server 2005、.NET Framework、Windows Vista、Office 2007、Windows Search、Team Foundation Server  などとの連携機能をサポートしている。マイクロソフトはこれをシェアードソースライセンスでCodePlex上でリリースした。ただし、VFPの中核部分は依然としてクローズドソースである。Sednaのリリースは2008年1月25日に行われた。2008年3月現在、VFP 9 SP2のXBaseコンポーネントは全てCodePlexから開発用に利用可能である。

2007年3月、FoxProのスペイン語コミュニティ[2]で草の根運動が始まり、マイクロソフトに対してVisual FoxProの開発継続か全ソースのオープンソース化を求める活動を展開した。2007年4月3日、この運動は業界メディアでも報道された。これに対してマイクロソフトは2007年4月3日、声明を発表した。それによると、新たなバージョンは開発せず、2015年までサポートを継続するとのこと。また、オープンソース化については最善の選択としているが、中核部のオープンソース化の具体的な予定は発表されていない。

2. バージョン情報
----------

2.1. FoxPro
-----------



2.2. Visual FoxPro
------------------



3. コード例
-------

Hello World の例: MESSAGEBOX

3.1. オブジェクト
-----------

loForm = CREATEOBJECT loForm.Show

DEFINE CLASS HiForm AS Form AutoCenter = .T. Caption = "Hello, World"

ADD OBJECT lblHi as Label WITH ; Caption = "Hello, World!" ENDDEFINE<WtXmlEndTag />

loMine = CREATEOBJECT ? loMine.cProp1 && これは動作する ? loMine.cProp2 && プログラムエラー: Property CPROP2 is not found.

? loMine.MyMethod1 && これは動作する。 ? loMine.MyMethod2 && プログラムエラー: Property MYMETHOD2 is not found.

DEFINE CLASS MyClass AS Custom cProp1 = "My Property" && パブリック・プロパティ HIDDEN cProp2 && プライベート・プロパティ

PROCEDURE Init && クラス・コンストラクタ This.cProp2 = "This is a hidden property." ENDPROC

PROCEDURE MyMethod1

This is a public method, calling a hidden method that returns
the value of a hidden property.RETURN This.MyMethod2 ENDPROC

HIDDEN PROCEDURE MyMethod2 && プライベート・メソッド RETURN This.cProp2 ENDPROC ENDDEFINE<WtXmlEndTag />

3.2. データハンドリング
--------------

&& テーブル生成 CREATE TABLE randData 

&& xBase と SQL DML コマンドを使ってランダムなデータを格納 FOR i = 1 TO 50 APPEND BLANK REPLACE iData WITH  * 100)

INSERT INTO randData  VALUES  * 100) ENDFOR

&& データ上に構造化インデックスを配置 INDEX ON iData TAG iData CLOSE ALL

&& xBase風コマンドでソートしたデータを表示 USE randData SET ORDER TO iData GO TOP LIST NEXT 10 && First 10 SKIP 81 LIST NEXT 10 && Last 10 CLOSE ALL

&& SQL DML コマンドでソート済みデータをブラウズ SELECT * ; FROM randData ; ORDER BY iData DESCENDING<WtXmlEndTag />

3.3. SQLパススルーを使ったODBCアクセス
-------------------------

&& ODBCデータソースに接続 LOCAL nHnd nHnd = SQLCONNECT 

&& SQL コマンドを実行 LOCAL nResult nResult = SQLEXEC  IF nResult < 0 MESSAGEBOX  RETURN ENDIF

&& リモートサーバからデータを検索し&& ローカルなデータカーソルにそれを格納 nResult = SQLEXEC 

&& リモートのテーブルにあるレコードを更新 LOCAL cAuthorID, cAuthorName cAuthorID = "1001" cAuthorName = "New name" nResult = SQLEXEC 

&& 切断 SQLDISCONNECT<WtXmlEndTag />

4. 脚注
-----

5. 外部リンク
--------

5.1. マイクロソフト
------------

[3]
[4]
[5]
[6]
[7]

5.2. その他
--------

[8]
[9]
[10]
[11]
[12]
[13] VFP 9.0 のオープンソースのアドオンを開発しようとしているコミュニティ
[14] VFP関連のメーリングリスト
[15]
[16]
[17]