일반적으로 Clarion은 데이터 사전 (DCT)을 프로그램에서 사용할 영구 데이터 (파일)의 중심으로 사용합니다. 당신이 테이블을 정의 할 수있는 다른 방법이 있지만 APP에서 컴파일한다고 언급 했으므로 APP가 DCT에 연결되어 있다고 결론 내리고 있습니다.
DCT에는 응용 프로그램에서 사용할 모든 파일에 대한 선언이 있습니다. 파일 선언에서 논리 및 디스크 파일 이름을 알릴 수 있습니다. 오류 메시지는 디스크 파일 이름의 정의에 문제가 있음을 나타냅니다.
Clarion 언어는 논리 데이터 구조 정의를 디스크 파일과 구분합니다. 클라리온 programm에 대한 "파일"은 다음에 따르는 복잡한 데이터 구조이다 : 위의 기본적인 선언 구문
structName FILE, DRIVER('driverType'), NAME('diskFileName')
key KEY(keyName)
index INDEX(indexName)
recordName RECORD
field DATATYPE
.
.
END
END
, 그리고 실제 예는 것 같은
orders FILE, DRIVER('TopSpeed'), NAME('sales.dat\orders')
ordersPK KEY(id), PRIMARY
customerK INDEX(customerID)
notes MEMO(4096)
RECORD RECORD
id LONG
customerID LONG
datePlaced DATE
status STRING(1)
END
END
orderItems FILE, DRIVER('TopSpeed'), NAME('sales.dat\items')
itemsPK KEY(orderID, id), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL(10, 2)
unitPrice DECIMAL(10, 2)
END
END
위의 두 선언과 함께 동일한 디스크 파일에있는 두 개의 논리 파일이 있습니다. 이것은 TopSpeed 파일 드라이버와 같은 일부 파일 드라이버에 제공되는 기능입니다. 시스템 설계자가 동일한 디스크 파일에 어떤 파일이 상주 할 것인지 결정해야하며, 다른 경우 해당 파일에 대해 이야기 할 수 있습니다.
현재로서는 파일 선언의 NAME 속성을 변경하지 않았으며 사용중인 드라이버가 다중 파일 저장소를 지원하지 않는다는 문제가 발생할 수 있습니다.
위와 동일한 경우이지만 SQL 데이터베이스를 대상으로 수정 된 파일 정의가 있습니다. 당신이주의를 지불하는 경우
szDBConn CSTRING(1024) ! //Connection string to DB server
orders FILE, DRIVER('ODBC'), NAME('orders'), OWNER(szDBconn)
ordersPK KEY(id), PRIMARY
customerK INDEX(customerID)
notes MEMO(4096), NAME('notes')
RECORD RECORD
id LONG, NAME('id | READONLY')
customerID LONG
datePlaced DATE
status STRING(1)
END
END
orderItems FILE, DRIVER('ODBC'), NAME('order_items'), OWNER(szDBconn)
itemsPK KEY(orderID, id), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL(10, 2)
unitPrice DECIMAL(10, 2)
END
END
이제, 파일 선언에서 참조되는 szDBconn
변수 선언의 존재를 알 수 있습니다. 이 작업은 Clarion 파일 드라이버 시스템에 dabase에 연결하기 위해 ODBC 관리자에게 전달할 내용을 알리는 데 필요합니다. 많은 연결 문자열 예제는 Connection Strings을 확인하십시오.
파일의 DCT 정의가 드라이버의 예상 내용을 반영하는지 확인하십시오.
또한 Clarion은 동일한 프로그램에서 다른 파일 드라이버를 혼합 할 수 있다는 점을 유의하십시오. 따라서 필요한 경우 기존 프로그램을 사용하여 외부 데이터 소스를 사용할 수 있습니다.
다음은 ISAM 파일의 정보를 DBMS로 전송하는 완전한 Clarion 프로그램입니다.
PROGRAM
MAP
END
INCLUDE('equates.clw') ! //Include common definitions
szDBconn CSTRING(1024)
inputFile FILE, DRIVER('dBase3')
RECORD RECORD
id LONG
name STRING(50)
END
END
outuputFile FILE, DRIVER('ODBC'), NAME('import.newcustomers'), |
OWNER(szDBconn)
RECORD RECORD
id LONG
name STRING(50)
backendImportedColumn STRING(8)
imported GROUP, OVER(backendImportedColumn)
date DATE
time TIME
END
processed CHAR(1)
END
END
CODE
IF NOT EXISTS(COMMAND(1))
MESSAGE('File ' & COMMAND(1) & ' doesn''t exist')
RETURN
END
imputFile{ PROP:Name } = COMMAND(1)
OPEN(inputFile, 42h)
IF ERRORCODE()
MESSAGE('Error openning file ' & inputFile{ PROP:Name })
RETURN
END
szDBconn = 'Driver={{PostgreSQL ANSI};Server=192.168.0.1;Database=test;' & |
'Uid=me;Pwd=plaintextpassword'
OPEN(outputFile, 42h)
IF ERRORCODE()
MESSAGE('Error openning import table: ' & FILEERROR())
RETURN
END
! // Lets stuff the information thatll be used for every record
outputFile.imported.date = TODAY()
outputFile.imported.time = CLOCK()
outputFile.processed = 'N'
! //arm sequential ISAM file scan
SET(inputFile, 1)
LOOP UNTIL EOF(inputFile)
NEXT(inputFile)
outputFile.id = inputFile.id
outputFile.name = input.name
ADD(outputFile)
END
BEEP(BEEP:SystemExclamation)
MESSAGE('File importing completed')
글쎄,이 예제 프로그램은 프로그램의 다른 요소가 어떻게 사용되어야하는지 보여주는 목적으로 만 사용됩니다. 사용자가 진행 상황을 추적 할 수 있도록 창을 사용하지 않았고, ADD()와 같은 Clarion의 프리미티브를 사용했지만 루프 내부에서 성능이 저하 될 수 있습니다.
outputFile{ PROP:SQ } = 'BEGIN TRANSACTION'
으로 열린 트랜잭션에서 전체 읽기를 캡슐화하고 마지막에 outputFile{ PROP:SQL } = 'COMMIT'
을 발행하는 것이 훨씬 더 좋습니다.
예, PROP : SQL 사용자가 DROP DATABASE를 포함하여 서버에서 허용하는 명령을 실행할 수 있기 때문에 매우 강력합니다. 조심해서 사용하십시오.
구스타보
오류가 발생하지 않았습니다. 그러나 실행될 때 - 데이터 파일을 찾지 못합니다. –