проблема master / detail с dbexpress

У меня есть приложение master / detail, написанное на Delphi 2010 / dbExpress с использованием firebird 2.3. Я обнаружил проблему.

Если у меня есть две или три или более идентичных строк данных в деталях, изменение любых данных в одной из них также изменяет данные в других строках, я думаю, это связано с тем, что обновление использует только invoice_id и serial в качестве ключей и данных одинаково в обоих случаях, обновление выполняется в двух случаях.

Основные данные Invoice_id, serial, customer_id, date 1, A, 1.12 / 12/2010

Подробные данные Invoice_id, серийный номер, количество, описание, Цена 1, A, 10, КОРОБКИ НЕКОТОРЫХ ВЕЩЕСТВ, 52,52 1, A, 10, КОРОБКИ НЕКОТОРЫХ ВЕЩЕСТВ, 52,52

Думаю, я могу исправить это, используя поле ltes name ir line_no, в котором каждая строка будет иметь другой номер, и поэтому данные можно будет различить, чтобы сделать обновление следующим образом:

Line_no, Invoice_id, serial, qty, description, Price 1.1, A, 10, КОРОБКИ НЕКОТОРЫХ ВЕЩЕСТВ, 52.52 2.1, A, 10, КОРОБКИ НЕКОТОРЫХ ВЕЩЕСТВ, 52.52

Таким образом, информация такая же, но у нее также есть line_no, чтобы различать информацию в обновлении.

Кто угодно знает, как это сделать на стороне клиента, в наборе clientdataset,

Большое спасибо и привет


person Alejandro Jourdan    schedule 17.12.2010    source источник
comment
Если обе строки идентичны, dbexpress и 99% уровней подключения к данным для 99% языков / фреймворков столкнутся с проблемами при их обновлении, потому что нет стандартного способа написать оператор обновления для изменения только одной из строк, а не обоих. за раз, поэтому измените свой дизайн и определите первичный ключ, в любом случае это хорошая практика.   -  person jachguate    schedule 18.12.2010


Ответы (1)


Кажется, что в вашей подробной таблице нет первичного ключа (при условии, что invoice_id является внешним ключом для главной таблицы. Чтобы убедиться, что FireBird (или любая подключенная база данных dbExpress) обновляет правильную запись, вы должны добавить первичный ключ (поле autoinc) к таблице деталей.

person Birger    schedule 17.12.2010
comment
В этом и заключается проблема, клиент не знает значение autoinc, потому что оно генерируется на сервере, мне нужно сгенерировать какое-то значение на стороне клиента, например, номер строки или что-то, что дифференцирует значения в таблице подробностей - person Alejandro Jourdan; 17.12.2010
comment
После того, как строки добавлены на клиенте и зафиксированы на сервере, у них должен быть идентификатор, который вы можете использовать для их обновления. Я не понимаю, как у вас может не быть удостоверения личности? - person Birger; 18.12.2010