Как перенастроить путь к файлам данных в Clarion 5 IDE?
Есть проблема, система написана на Clarion 5, пришедшем из прошлого, и теперь ее нужно переписать на Java.
Для этого мне нужно разобраться с его текущим состоянием и как оно работает.
Я генерирую исполняемый файл через Генератор приложений (\*.APP-> \*.CLW -> \*.EXE, \*.DLL)
,
Но когда я запускаю его, я получаю сообщение:
File(\...\...\DAT.TPS) could not be opened. Error: Path Not Found(3). Press OK to end this application
А потом - halt, File Access Error
В чем может быть проблема? Возможно ли в Clarion 5 IDE перенастроить путь к файлам данных?
1 ответ
Обычно Clarion использует словарь данных (DCT) в качестве центра постоянных данных (файлов), которые будут использоваться программой. Есть и другие способы определения таблицы, но так как вы упомянули, что компилируете из приложения, я пришел к выводу, что ваше приложение связано с DCT.
В DCT у вас есть объявления для каждого файла, который будет использовать ваше приложение. В объявлении файла вы можете указать как логику, так и имя файла на диске. Сообщение об ошибке говорит, что у вас есть проблема в определении имени файла на диске.
Язык Clarion отделяет определение логической структуры данных от файла на диске. "Файл" для программы Clarion - это сложная структура данных, которая соответствует следующему:
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 о том, что передать менеджеру ODBC для подключения к базе данных. Проверьте Строки соединения для большого количества примеров строк соединения.
Проверьте определения DCT ваших файлов, чтобы увидеть, отражают ли они то, что ожидает драйвер.
Также имейте в виду, что Clarion позволяет смешивать разные драйверы файлов для одной и той же программы. Таким образом, вы можете адаптировать существующую программу для использования внешнего источника данных, если это необходимо.
Вот полная программа Clarion для передачи информации из файла ISAM в СУБД.
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' )
Что ж, этот пример программы служит только для того, чтобы показать, как должны использоваться различные элементы программы. Я не использовал окно, чтобы позволить пользователю отслеживать прогресс, и использовал примитивы Clarion, такие как ADD(), которые работают наверняка, но внутри цикла может представлять снижение производительности.
Намного лучше было бы заключить все чтение в транзакцию, открытую с помощью outputFile{ PROP:SQ } = 'BEGIN TRANSACTION'
и в конце выдайте outputFile{ PROP:SQL } = 'COMMIT'
,
Да, хотя PROP:SQL можно выполнить ЛЮБУЮ команду, принятую сервером, включая DROP DATABASE, поэтому она очень мощная. Используйте с осторожностью.
Gustavo