Мне нужно импортировать данные в базу данных старой программы выставления счетов. Технология кажется архаичной, но я не отчаиваюсь и, может быть, кто-нибудь подскажет решение.
Я создал из компонентов в Delphi 2005 (у меня есть доступ к нему, и я нашел некоторую документацию об этом для Paradox) TTable (имя: ParadoxTable), TDataSource (ParadoxDataSource) и TDBGrid, все привязано и указывает на правильную базу данных после запуска команды ParadoxTable .Active: = True; в TDBGrid все отображается правильно. Я могу добавить запись вручную, сохранить запись и так далее. Но когда я пытаюсь сделать это с помощью кода, я каждый раз получаю сообщение
Ключевое нарушение. Индекс: DPN_UNQ
но у меня нет такого имени в заголовке таблицы (первый уникальный столбец - DPN_ID).
После извлечения из забытого кода форума добавил на всякий случай строчку, содержащую присвоение уникального номера (более того, без этой линейки эффект такой же):
ParadoxTable.disablecontrols;
// Create a variant Array
aField := VarArrayCreate(
[0,ParadoxTable.Fieldcount-1],
VarVariant);
// read values into the array
for i := 0 to (ParadoxTable.Fieldcount-1) do
begin
aField[i] := ParadoxTable.fields[i].Value;
end;
aField[0] := '5'; // this added line of course changed nothing
ParadoxTable.AutoCalcFields := True;
ParadoxTable.Append;
// Put array values into new the record
for i := 0 to (ParadoxTable.Fieldcount-1) do
begin
if (ParadoxTable.fields[i].CanModify) then
ParadoxTable.fields[i].Value := aField[i];
end;
ParadoxTable.Post; // here i got exception error
ParadoxTable.enablecontrols;
В результате, как и в прикрепленном изображении, добавляется запись (когда я опускаю строку с ParadoxTable.Post;), уникальный номер не добавляется, и все попытки подтвердить и принять эту запись вручную вызывают ошибку нарушения ключа, и ни при каких обстоятельствах. Как я могу присвоить значение первой переменной / столбцу.
for i := 0 to (ParadoxTable.Fieldcount-1) do
begin
if ParadoxTable.fields[i].Name<> 'DPN_ID' then
if (ParadoxTable.fields[i].CanModify) then
ParadoxTable.fields[i].Value := aField[i];
end;
а также
for i := 1 to (ParadoxTable.Fieldcount-1) do // with omiting first [0] aField
begin
if ParadoxTable.fields[i].Name<> 'DPN_ID' then
if (ParadoxTable.fields[i].CanModify) then
ParadoxTable.fields[i].Value := aField[i];
end;
каждый раз с одинаковым эффектом. Что я делаю неправильно? Любой другой простой способ? Я пропустил все поиски на третью страницу гугла;) и ни один код не работал должным образом. Таких баз данных много в программе, в которую я их пытаюсь импортировать, из-за чего, например, выпадает вопрос их открытия из MS Acess.
У меня есть доступ к более новым версиям Delphi / RAD при необходимости, но я не нашел в них компонента TTable, на котором была описана вся информация о базах данных Paradox, которые я нашел в сети. Может, меня вообще должен заинтересовать какой-нибудь другой метод? Например, может быть, в более новых версиях Delphi это проще решить с помощью других компонентов?
Заранее благодарим вас за руководство.