비주얼 폭스프로

폭스프로

폭스프로(FoxPro)는 텍스트 기반 절차적 프로그래밍 언어이고 DBMS이다. 당초 폭스 소프트웨어가 개발 판매하고 나중에 마이크로소프트에 인수되었다. 지원되는 플랫폼은 도스, 마이크로소프트 윈도, 맥킨토시, 유닉스 등이 있었다.
폭스프로는 일반적으로 "xBase" 언어의 일종이며, 그 문법은 dBase 프로그래밍 언어를 기반으로 한다. xBase 언어로 하는 것에는 다른 클리퍼가 있다. (xBase 언어의 초기 역사에 대해서는 dBASE를 참고)
폭스프로는 데이터베이스 관리 시스템이지만, 테이블 간의 관계를 지원하지 않는다. 즉, 관계형 데이터베이스는 아니고, 트랜잭션 처리 능력도 없다.
최종 버전은 폭스프로 2.6이다. 그 이후는 비주얼 폭스프로에 인수되었다. 이미 단종되어 마이크로소프트도 지원하고 있지 않지만, 폭스프로 사용자 커뮤니티는 현재도 활동 중이다. 폭스프로 2.6 for UNIX (FPU26)는 Intel Binary Compatibility Standard (ibcs2) 지원 라이브러리를 사용하여 리눅스와 FreeBSD에 설치 가능하다.
폭스프로 2에서 "Rushmore"라는 최적화 엔진을 탑재하여 데이터 검색 및 업데이트 속도가 빨라진다. Rushmore는 모든 데이터 관계 문장을 찾으 필터 식을 찾아낸다. 필터 표현식을 사용하면 동일한 표현식에 일치하는 인덱스를 찾는다. 또한 폭스프로 2는 당초 WatCOM C++로 작성되었으며, 여기에는 자기 부담의 메모리 확장 (당시의 최신 기술)이 있었다. 폭스프로 2는 확장 메모리에 액세스하고 DOS에서 관리 가능한 거의 모든 메모리를 사용할 수 있었다. HIMEM.SYS가 로드되지 않는 경우, 폭스프로 2는 자기 부담의 확장 계획을 시작하도록되어 있었다.

비주얼 폭스프로

비주얼 폭스프로의 첫 번째 버전은 3.0에서 해당 플랫폼은 맥킨도시와 윈도에만 한정되며, 또한 이후 버전에서는 윈도에만 한정되었다. 현재 비주얼 폭스프로는 COM기반이며 마이크로소프트는 마이크로소프트 닷넷 버전을 개발할 예정은 없다고 하고 있다.
비주얼 폭스프로는 관계형 데이터베이스 엔진과 밀접하게 결합되어 있다. 이 관계 데이터베이스 폭스프로의 xBase 기능을 확장하여 SQL쿼리, 데이터 작업을 추가 지원하고있다. 많은 데이터베이스 관리 시스템과는 달리 비주얼 폭스프로는 전체의 동적 프로그래밍 언어이며, 추가 범용 프로그래밍 환경을 필요로하지 않는다. 팻 클라이언트의 응용 프로그램 개발뿐 아니라 미들웨어나 웹 응용 프로그램도 개발 가능하다.

최근 동향

2002년 말, 비주얼 폭스프로를 와인을 사용하여 리눅스에서 사용할 수있는 것이 나타났다. 2003년, 이에 따라 마이크로소프트는 윈도 이외에서 비주얼 폭스프로를 동작시키는 것은 라이선스 계약을 위반하고 있다고 지적했다.
2005년 12월, TIOBE의 Programming Community Index에 VFP(정확하게는 FoxPro/xBase)가 처음으로 상위 20위 권에 들었다. 2007년 3월에는 19위, 2007년 8월에는 22위, 2008년 4월 17위를 들었다.
2007년 3월, 마이크로소프트는 비주얼 폭스프로 10은 개발되지 않는 것을 발표했다. 따라서 2004년 12월 17일에 출시된 VFP 9가 마지막 상용 버전이다. VFP 9 지원 서비스 팩 형식으로 이루어지고 있다.(2005년 12월과 2007년 10월 출시)
그 발표와 동시에 개발되어 차기 버전 Sedna (코드명)가 발표되었다. 이것은 VFP 9에 대한 추가 기능이며, 마이크로소프트 SQL 서버 2005 닷넷 프레임워크, 윈도 비스타, 마이크로소프트 오피스 2007, Windows Search, Team Foundation Server (TFS) 등과의 연계 기능 을 지원하고있다. 마이크로소프트는 이것을 소스 공유 라이선스 코드플렉스에서 선보였다. 그러나 비주얼 폭스프로의 핵심 부분은 여전히 닫힌 소스이다. Sedna 릴리스는 2008 년 1 월 25 일 열렸다. 2008 년 3 월 현재 VFP 9 SP2 (Sedna 포함) XBase 구성 요소는 모두 코드플렉스에서 개발용으로 사용할 수 있다.
2007년 3월 폭스프로 스페인어 커뮤니티 MasFoxPro에서 풀뿌리 운동이 시작하며, 마이크로소프트의 비주얼 폭스프로의 개발을 요구하고 또는 전체 소스를 오픈 소스로 배포를 요구하는 활동을 전개했다. 2007년 4월 3일, 이 운동은 업계 미디어에서 보도된. 이에 대해 마이크로 소프트는 2007년 4월 3일에 성명을 발표하며, 새로운 버전은 개발하지 않고 2015년까지 지원을 계속한다고 밝혔다. 또한 오픈 소스화에 대해서는 최선의 선택하고 있지만, 핵심 부품의 오픈 소스화의 구체적인 계획은 발표되고 있지 않다.

예제 소스

Hello World 의 예제:
MESSAGEBOX("Hello World")

객체

loForm = CREATEOBJECT("HiForm")
loForm.Show(1)

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
  ENDPROCENDDEFINE

데이터 처리(Data Handling)

&& 테이블 생성
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 10SKIP 81
LIST NEXT 10 && Last 10CLOSE ALL

&& SQL DML 명령에서 정렬된 데이터를 검색
SELECT * ;
  FROM randData ;
  ORDER BY iData DESCENDING

SQL Pass Through를 사용한 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!")
  RETURNENDIF

&& 원격 서버에서 데이터를 검색
&& 로컬 데이터 커서 그것을 저장
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)