База данных Delphi Paradox - создание дубликата записи | Ошибка нарушения ключа

Мне нужно импортировать данные в базу данных старой программы выставления счетов. Технология кажется архаичной, но я не отчаиваюсь и, может быть, кто-нибудь подскажет решение.

Я создал из компонентов в 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 это проще решить с помощью других компонентов?

Заранее благодарим вас за руководство.


person kwadratens    schedule 13.07.2018    source источник
comment
Такая же ошибка, если вставить другой НАЗВА, например Назва_тест? Подозреваю, что в поле NAZWA есть уникальный индекс ...   -  person zdzichs    schedule 15.07.2018
comment
Для более новых версий Delphi вы можете установить BDE из дополнительных загрузок (см. Свою учетную запись на edn.embarcadero.com), таким образом вы можете использовать BDE и TTable даже в Токио. Проблема заключается в приложении Database Desktop для управления Paradox / BDE, которое не работает в новейших сборках Win10 (1709 и выше).   -  person zdzichs    schedule 15.07.2018
comment
Да! Оно работает! Я изменил строку следующим образом: aField [1]: = 'NAME _' + IntToStr (Random (100)); и теперь он отлично работает. Есть ли какое-нибудь значение, которое я могу прочитать и узнать, что этот вариант уникален, например, canmodify? Или как это проверить? Спасибо! :) :) :)   -  person kwadratens    schedule 17.07.2018
comment
Вы можете сначала попытаться найти данное значение в NAZWA. Если она присутствует, измените запись (если применимо), если ее нет, добавьте новую запись. Canmodify сообщает о поле, а не о конкретной записи / строке (docwiki .embarcadero.com / Libraries / Tokyo / en /).   -  person zdzichs    schedule 17.07.2018


Ответы (1)


Ваш код выглядит правильным. Вставка не выполняется из-за ограничений базы данных.

Возможно, таблица имеет составной уникальный поддерживаемый вторичный индекс с именем «DPN_UNQ» в полях «NAZWA» и «JM» или в полях «DPN_ID», «DPN_UNQ» и «NAZWA». Это предотвратит вставку вашей пятой тестовой записи. Конечно, если индекс также включает другие поля, вы можете вставлять записи, добавляя отличительные значения в эти поля.

Вам нужно больше узнать о структуре таблицы, прежде чем вы узнаете, как ограничить данные для вставки.

Базы данных Paradox не обязаны содержать таблицы схем. Некоторые дизайнеры и администраторы баз данных будут записывать свою документацию в INFORMATION_SCHEMA.db или в другой подобный файл, но BDE не будет проверять эту таблицу на наличие ошибок. Базы данных Paradox обычно бесполезны, если должным образом не задокументированы вне самих таблиц.

Как указывает @zdzichs, Delphi традиционно поставляется с утилитой Database Desktop, которая в основном представляет собой Paradox для Windows с новым брендом. С помощью этой утилиты вы можете изучить структуру любой таблицы, включая ограничения и вторичные индексы.

person A. I. Breveleri    schedule 17.07.2018
comment
Вы читали мои комментарии под вопросом? Конечно да;) А чем ваш ответ отличается от них, кроме более широкой проработки? Еще раз: все версии Delphi СОДЕРЖАТ Desktop Database Desktop, которого достаточно для исследования структуры базы данных. В более новых версиях (включая Токио) это просто дополнительная загрузка. - person zdzichs; 17.07.2018
comment
Спасибо за информацию. Правильно ли я понимаю, что мне нужно использовать, например, компонент TDatabase для проверки этой базы данных? - person kwadratens; 17.07.2018
comment
Просто загрузите таблицу за таблицей в Database Desktop, нажмите кнопку «Реструктуризация» и изучите поля и индексы. Пожалуйста, помните, что для запуска утилиты вам потребуется версия Windows до 10 (подойдет виртуальная машина, старая машина XP или Vista). - person zdzichs; 18.07.2018