Родились сегодня:
Rosiam


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

724

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

326

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

279

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

212

Беларусь, Минск


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


ID: 401888

puporev

Профессор

111

Россия, Пермский край


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-11 18:46:03-standard


Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 159517

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Hells
Дата: 03.02.2009, 18:04 Консультация закрыта
Поступило ответов: 1

Здравствуйте.

В базе данных одна из таблиц (ReceivedDocument) имеет три внешних ключа,

связывающих её с двумя другими таблицами (DocumentType, Organization).
В Delphi для работы с таблицами используются компоненты IBDataSet.
В свойстве InsertSQL IBDataSet'а, связанного с таблицей ReceivedDocument

вызывается хранимая процедура, добавляющая в таблицу новую запись.

Проблема в следующем: при попытке добавить запись в таблицу ReceivedDocument

выдаётся сообщение:

"validation error for column NUMDOCTYPE, value "*** null ***"".

NUMDOCTYPE - внешний ключ для связи с таблицей DocumentType.

При этом в таблице есть два внешних ключа, связывающих её с таблицей Organization - сдесь всё нормально.

Посмотрел SQL монитором что на самом деле передаётся на сервер - оказалось, что процедура вставки не вызывается, исключение возникает раньше.

При тестировании процедуры в IBExpert записи нормально добавляются - значит ошибка где-то в приложении. Вопрос: где её следует искать?

Ответ # 242831 от Del
Здравствуйте, Hells!

Представить код
1. Процедуры в IB
2. Код добавления записи на Delphi

Сами понимаете - телепаты в отпуске.

Я бы на вашем месте поставил бы break на нажатие, к примеру, кнопки "Занести" и проверил бы все значения полей.
Еще можно так (телепаты в отпуске, начинаем отгадывать):

procedure Form1.btnAddRecordClick(Sender: TObject);
var X: Integer;
S: string;
begin
S := '';
for X := 0 to IBDataSet1.Fields.Count-1 do begin
S := S + IBDataSet1.Fields[X].FieldName + ' = ';
if IBDataSet1.Fields[X].AsVariant = null then S := S + 'null'
else S := S + IBDataSet1.Fields[X].AsString;
S := S + #13#10;
end;
ShowMessage(S);
end;

Но лучше оттрасировать самостоятельно. Если не получится - пишите в почту, попробую помочь.

Del

Посетитель
03.02.2009, 22:10
Мини-форум консультации # 159517

Нет сообщений в мини-форуме

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

puporev

Профессор

Рейтинг: 111

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 73

Степанов Иван /REDDS

4-й класс

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0

Орловский Дмитрий

Мастер-Эксперт

Рейтинг: 0