| パラダイム | オブジェクト指向、手続き型、4-GL |
|---|---|
| 開発者 | VFP コミュニティ |
| 初登場 | 2001年 |
| 安定リリース | 6.03 / 2013年1月29日 |
| タイピングの規律 | ダイナミック、弱い |
| 実装言語 | ビジュアルフォックスプロ9SP2 |
| OS | ウィンドウズ |
| ライセンス | マサチューセッツ工科大学 |
| ファイル名拡張子 | 一般的な拡張子 .avfp その他の拡張子 extensionless |
| Webサイト | アクティブvfp.codeplex.com |
ActiveVFP (別名AVFP ) は、動的な Web ページを作成するためのWeb 開発用に設計されたサーバー側スクリプトフレームワークです。PHPに似ていますが、ネイティブのVisual Foxpro (VFP) 言語とデータベース(またはMicrosoft SQLやMySQLなどの他のデータベース) を使用する ActiveVFP は、 Model-View-Controller (MVC) Web アプリケーションやRESTful APIでも使用できます。ActiveVFP は完全に無料のオープン ソースであり、Microsoft Visual FoxPro や追加のソフトウェアを購入する必要はありません。
ActiveVFP は、もともと 2001 年に作成されました。ActiveVFP の主な実装は現在、 activevfp.codeplex.comの Foxpro コミュニティによって作成されており、ActiveVFP の正式なリファレンスとして機能します。ActiveVFP は、MIT ライセンスに基づいてリリースされたフリー ソフトウェアです。
ActiveVFP は、データベースとデータベース機能が言語に組み込まれているため、サーバー側 Web 言語およびフレームワークの中ではユニークです。
構文
ActiveVFP は、Microsoft が作成した最新バージョンである Visual FoxPro 9 SP2 に存在するネイティブ Visual Foxpro 言語を使用します。通常のデスクトップ バージョンの VFP ランタイムの代わりに、マルチスレッドVFP ランタイム vfp9t.dll が使用されます。 [1]
ActiveVFP を使用すると、VFP コンパイラは区切り文字内の VFP コードのみを実行します。区切り文字の外側にあるものは VFP によって処理されません。最も一般的な区切り文字は、ASP スタイルの短縮形 <% または <%= および %> です。<% %> は FoxPro コード ブロックを実行し、<%= %> は変数を直ちに出力します。これらすべての区切り文字の目的は、HTML などの非 VFP コードから VFP コードを分離することです。
Web プログラミング用に ActiveVFP で使用できる主なオブジェクトは、oRequest、oResponse、oSession (および従来の Active Server Pages (ASP) で使用できたすべてのオブジェクト) です。これらのオブジェクトは、Visual FoxPro 内でのみ使用され、FoxPro で Web プログラミングを実行します。
FoxPro 言語には、Basic などの他のプログラミング言語と非常によく似たコマンドが含まれています。ループには、他のプログラミング言語に精通している人なら誰でも簡単に理解できる do、if、while、for、else コマンドが含まれます。コマンドは、「command」と「endcommand」の形式をとります。この言語には、広範なデータベース操作およびインデックス作成コマンドもあります。[2]
PHPと同様に、ActiveVFPは自動メモリガベージコレクション(GC)と動的/弱い型付け[3]を活用し、プログラマーの生産性を向上させます。
ActiveVFP は、「スクリプト」モードに加えて、モデル ビュー コントローラー (MVC) 設計も提供します。コントローラーは、Foxpro .prg ファイルにある FoxPro クラス コードで構成されます。出力は、他の最新の MVC 実装と同様に、.avfp ビュー、JSON などで構成できます。モデルは、DBF ファイルまたはその他のバックエンド データベースにすることができます。
例
- テーブルを開いてレコードを一覧表示するためのHTMLコードに埋め込まれた VFP コード
<!DOCTYPE html>
<html>
<head>
<meta charset= "utf-8" > <title> HTML内のVFPコード</title>
...
<% *設定lnTotPerPage = 10 lnpagenumbers = 5 lnStart = VAL ( oRequest . querystring ( "page" )) lcButton = oRequest . querystring ( "nav" ) * sql SELE * FROM Customer INTO CURSOR tCursor *ページ番号を作成START = 0 lnPageMax = 0 lnPageBegin = 0 lnRowCount = RECCOUNT () SET PROC to oProp . AppStartPath + 'prg\pages' ADDITIVE lcPages = pages ( lnTotPerPage , lnpagenumbers , lnStart , lcButton , lnRowCount ) %>
...
<% FOR lnX = lnPageBegin TO lnPageMax IF lnX <= lnRowCount GOTO lnX %> <tr> <td width= "40%" ><font face= "helvetica, arial" size= "2" > <a hhref= " <%= JustPath ( oProp . ScriptPath ) +[/ detail . avfp ? cust_id =]+ ; ALLTRIM ( cust_id ) %> "> <%= tCursor . company %></a></font></td> <td width= "36%" ><font face= "helvetica, arial" size= "2" > <%= tCursor .連絡先%></font></td> <td width= "24%" ><font face= "helvetica, arial" size= "2" color= "#000000" > <%= tCursor . Title %></font></td> </tr> <% ENDIF ENDFOR %>
...
<%= lcページ%>
- MVC Web アプリケーション用の VFP コントローラー コード
* customers.prg -Customers コントローラー
* * Main.prg および .AVFP スクリプト コードをバイパスします
*
DEFINE CLASS customer ers Controller AS rest Control ler
*
PROCEDURE openData
SELECT 0
USE ( THIS .homeFolder + "customers.dbf" ) ALIAS customer ers
ENDPROC
PROCEDURE infoAction && GET www.hostname.com/app/customers/info
RETURN "homeFolder: <b>" + THIS .homeFolder + "</b>"
ENDPROC
手順getAction && GET www.hostname.com/app/customers/<id>
LOCAL cCustId
cCustId = THIS .Params[1]
THIS .openData()
SELECT CUSTOM ERS
LOCATE FOR custId = cCustId
IF FOUND ()
LOCAL cJSON
**USE mydbf &&テストエラー
*簡単なJSON
cJSON = [{ "custId" : "] + RTRIM(custId) + [" , "custName" : "] + RTRIM(custName) + [" ,] + ;
[ "custStat" : "] + RTRIM(custStat) + [" }]
RETURN cJSON
終了
終了処理
PROCEDURE listAction && GET www.hostname.com/app/customers/
LOCAL cHTML
cHTML = ""
*oEmp=newOBJECT('schedbizobj','c:\avfp5.61Demo\prg\utiltest2.prg')
SET PROC to substr (oProp.AppStartPath,1, AT ( [\] ,oProp.AppStartPath,2))+ 'prg\AVFPutilities' ADDITIVE && ADDITIVE を使用してください。そうしないと、問題が起こります。THIS
.openData ()
SELECT CUSTOM ERS
cHTML = oHTML.mergescript( FILETOSTR ( substr (oProp.AppStartPath,1, AT ( [\] ,oProp.AppStartPath,2))+ 'viewtest.avfp' ))
RETURN cHTML
終了処理
PROCEDURE helloworld && カスタム メソッド (&& GET www.hostname.com/app/customers/helloworld/)
LOCAL cHTML
cHTML = ""
*USE mydbf
*SET PROC to substr(oProp.AppStartPath,1,AT([\],oProp.AppStartPath,2))+'prg\AVFPutilities' ADDITIVE && ADDITIVE を使用してください。そうしないと、問題が起こります。
cHTML = oHTML.mergescript( FILETOSTR ( substr (oProp.AppStartPath,1, AT ( [\] ,oProp.AppStartPath,2))+ 'hello.avfp' ))
RETURN cHTML
終了処理
手順getemployees && カスタム メソッド (&& GET www.hostname.com/app/customers/getemployee/<id>
oJSON = NEWOBJECT ( 'json'、'json.prg' )
パスを oProp.AppStartPath+ 'data\AVFPdemo41\'に設定
e.emp_id を id として、e.first_Name を firstName として、e.last_Name を lastName として、e.title を title として、[ image s/Emps/]+e .pictureをpicture として、count(r.emp_id) を reportCount として選択します。従業員 e
から従業員 r を左に結合します。VAL (r.reports_to) = VAL (e.emp_id) 。INTO
Cursor SearchResults。e.last_Name 、e.emp_id、e.first_Name、e.title、e .pictureでグループ化します。e.last_Name、e.first_Name で順序付けします。
oJSON .keyforカーソルs= "items"
* JSONデータとプロパティを送り返す
oResponse .ContentType = "application/json;charset=utf-8"
oResponse.Write(oJSON.stringify( 'SearchResults' ))
oResponse .Flush
lcHTMLout =[]
ENDPROC
************************************************* **********************
ENDDEFINE
参考文献
- ^ カルビン・シア著『Advanced VFP Servers』、Microsoft
- ^ Visual FoxPro コードサンプル
- ^ Windows Web スクリプトの比較
外部リンク
- 公式サイト
