Как перенастроить путь к файлам данных в 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

Другие вопросы по тегам