2012-07-23 2 views
1

문제가 있습니다. 시스템은 Clarion 5에서 작성되었으며 과거에는 Java로 다시 작성해야합니다.Clarion 5 IDE에서 데이터 파일의 경로를 재구성하는 방법은 무엇입니까?

이렇게하려면 현재 상태와 작동 방식을 처리해야합니다.

저는 Application Generator (\*.APP-> \*.CLW -> \*.EXE, \*.DLL)을 통해 실행 파일을 생성합니다. - 문제가 될 수 있습니다 무엇에 halt, File Access Error

File(\...\...\DAT.TPS) could not be opened. Error: Path Not Found(3). Press OK to end this application

: 그리고 나는 그것을 실행할 때

는하지만이 메시지가? Clarion 5 IDE에서 데이터 파일의 경로를 재구성 할 수 있습니까?

+0

오류가 발생하지 않았습니다. 그러나 실행될 때 - 데이터 파일을 찾지 못합니다. –

답변

2

일반적으로 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를 포함하여 서버에서 허용하는 명령을 실행할 수 있기 때문에 매우 강력합니다. 조심해서 사용하십시오.

구스타보

+0

구스타보, 그런 상세한 답변을 해주셔서 감사합니다! 필요한 많은 정보! 지금은 이해. –

+1

그게 바로 Stackoverflow입니다! –

+0

그래 맞아! 이것은 최고의 리소스입니다! –

관련 문제