Microsoft Visual FoxPro

Visual FoxPro は、マイクロソフトが開発販売しているデータ中心型オブジェクト指向/手続き型プログラミング言語である。1984年、Fox Softwareが開発した FoxPro（当初の名称は FoxBASE）から発展した製品である（Fox社は1992年にマイクロソフトに吸収合併された）。

 歴史 

 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 (FPU26)はIntel Binary Compatibility Standard (ibcs2) サポートライブラリを使ってLinuxやFreeBSDにインストール可能である。

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

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

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

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

2005年12月、TIOBEのProgramming Community IndexにVFP（正確にはFoxPro/xBase）が初めて上位20位以内にランキングされた。2007年3月には19位、2007年8月には22位、2008年4月には17位と推移している。

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

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

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

 バージョン情報 

 FoxPro 
+Extant Versions by OSVersionFP 2.0FP 2.5FP 2.6 MS-DOS Yes Yes Yes Windows 3.1 to XP Yes Yes Yes Macintosh No Yes Yes SCO UNIX No No Yes Linux & FreeBSD No No Yes Windows 2000 No No Yes

 Visual FoxPro 
+Supported Windows VersionsVersionVFP 3.0VFP 5.0VFP 6.0VFP 7.0VFP 8.0VFP 9.0 Windows 3.x Yes No No No No No Windows NT 4.0 Yes Yes Yes Yes No No Windows 95 Yes Yes Yes ランタイムのみ No No Windows 98 Yes Yes Yes Yes ランタイムのみ ランタイムのみ Windows Me Yes Yes Yes Yes ランタイムのみ ランタイムのみ Windows 2000 Yes Yes Yes Yes Yes Yes Windows XP Yes Yes Yes Yes Yes Yes Windows Server 2003 ? ? Yes Yes Yes Yes Windows Vista ? Yes Yes Yes Yes Yes

 コード例 
Hello World の例:
MESSAGEBOX("Hello World")

 オブジェクト 
loForm = CREATEOBJECT("HiForm")
loForm.Show

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

 ADD OBJECT lblHi as Label WITH ;
 Caption = "Hello, World!"
ENDDEFINE

loMine = CREATEOBJECT("MyClass")
? loMine.cProp1 && これは動作する（'&'が2つで行末までコメント）
? 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

 データハンドリング 
&& テーブル生成
CREATE TABLE randData (iData I)

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

 INSERT INTO randData (iData) VALUES (RAND() * 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

 SQLパススルーを使ったODBCアクセス 
&& ODBCデータソースに接続
LOCAL nHnd
nHnd = SQLCONNECT ("ODBCDSN", "user", "pwd")

&& SQL コマンドを実行
LOCAL nResult
nResult = SQLEXEC (nHnd, "USE master")
IF nResult < 0
 MESSAGEBOX ("MASTER database does not exist!")
 RETURN
ENDIF

&& リモートサーバからデータを検索し
&& ローカルなデータカーソルにそれを格納
nResult = SQLEXEC (nHnd, "SELECT * FROM authors", "QAUTHORS")

&& リモートのテーブルにあるレコードを更新
LOCAL cAuthorID, cAuthorName
cAuthorID = "1001"
cAuthorName = "New name"
nResult = SQLEXEC (nHnd, "UPDATE authors SET auth_name = ?cAuthorName WHERE auth_id = ?cAuthorID")

&& 切断
SQLDISCONNECT(nHnd)