![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
IBDataSet, Master-Detail и Insert [D7, FireBird 1.5]
grav © (2008-05-20 09:45:00)Есть три связанных IBDataSet.
MasterDS-DetailDS1-DetailDS2. Соответственно Предприятие-Здания-данные по зданию. Предприятий много, у каждого прежприятия зданий много, у каждого здания одна запись с данными (площадь, стоимость и т.д.).
Список предприятий не меняется. Здания могут добавляться, редактироваться и удаляться. Данные по зданию могут редактироваться, удаляться вместе со зданием и добавляться вместе со зданием.
Встака записей в таблицу здания проходит без проблем. Вставка в тблицу с данными по зданию проходит без ошибок, но в таблицу не попадают. Почему? Как отследить что не так, если никаких ошибок не выводится?
Reindeer Moss Eater (2008-05-23 10:08:00) [21]Потому что транзакции разные и читающая транзакция должна завершиться и начаться заново. Реконнект для этого не нужен (если конечно транзакциями кто-то управляет).
grav (2008-05-23 10:02:00) [22]Объясните еще пожалуйста одну вещь по транзакциям.
После того как я сделал MainForm.WriteTr.Commit; почему данные становятся доступными только после отключения/подключения к БД?
И соответственно, если не произвести отключение/подключение, то есть возможность забить дублирующие данные
ANB (2008-05-22 14:45:00) [23]
> Да, так работает. спасибо.
> Вот только не радует наличие такого кода для каждого поля:
>
>
> if LoadEd.Text='' then
> AddSQL.ParamByName('LOAD').Clear
> else
> AddSQL.ParamByName('LOAD').AsString:=LoadEd.Text;
Особенность ИБ/ФБ, для которого пустая строка и нулл - разные значения.
Не скажу, что плохая особенность, но однако . . .
Sergey13 (2008-05-22 14:20:00) [24]> [80] grav (22.05.08 13:53)
А нужен ли в этих полях NULL? Может проще заполнять значения по умолчанию 0? Например на onNewRecord датасета. Или на потерю фокуса едита.
В любом случае это косяк в программе, ИМХО, если
> [62] grav (22.05.08 11:22)
> Если в предыдущей записи данные в поле присутствуют, то
> при вставке очередной записи с нулевым полем вылетает ошибка.
> Если запись с нулевым полем первая, то ошибку нет.
grav (2008-05-22 13:53:00) [25]
> Sergey13 © (22.05.08 13:36) [79]
Спасибо, что не бросаете :)
Данные вводит пользователь. Если под циклом имелась ввиду работа пользователя, то да он есть :) Пользователь вводит данные организации, потом данные первого здания, потом данные объектов первого здания, потом вводит данные второго здания, обекты второго здания и т.д.
Sergey13 (2008-05-22 13:36:00) [26]> [70] grav (22.05.08 12:26)
> Нет циклов никаких.
Откуда тогда всякие солова типа "если они при вставке предыдущей записи не были пустыми" берутся?
Вобщем мой телепатор перегрелся и сдох. Я пас.
grav (2008-05-22 13:04:00) [27]
> Reindeer Moss Eater © (22.05.08 12:51) [76]
> AddSQL.ParamByName('Load').Clear
Да, так работает. спасибо.
Вот только не радует наличие такого кода для каждого поля:
if LoadEd.Text='' then
AddSQL.ParamByName('LOAD').Clear
else
AddSQL.ParamByName('LOAD').AsString:=LoadEd.Text;
grav (2008-05-22 12:56:00) [28]
> Reindeer Moss Eater © (22.05.08 12:51) [76]
> AddSQL.ParamByName('Load').Clear
Это если NULL вставить нужно?
Reindeer Moss Eater (2008-05-22 12:51:00) [29]AddSQL.ParamByName('Load').Clear
Reindeer Moss Eater (2008-05-22 12:50:00) [30]если прграммироать в автошколе учился, то да. нужна отдельная перменная на каждый едит.
grav (2008-05-22 12:46:00) [31]
> Reindeer Moss Eater © (22.05.08 12:39) [73]
Угу, в автошколе.
А надо сначала завести для каждого TEdit переменную, потом проверить не пустое ли поле и если пустое присвоить переменной NULL.
AddSQL.ParamByName('Load').AsInteger:=NULL; ?
Или другой алгоритм есть?
Reindeer Moss Eater (2008-05-22 12:39:00) [32]Есть в таблице поле Load типа Integer. Произвожу вставку данных через параметр :LOAD из поля LoadEd (TEdit).
AddSQL.ParamByName('Load'). AsString:=LoadEd.Text;
это так в автошколе учили? с целочисленными полями работать через строки?
Reindeer Moss Eater (2008-05-22 12:29:00) [33]А если в пределах одной транзакции две вставки сделать сначала с LoadEd.Text<>'' а потом с LoadEd.Text:='' будет ошибка.
первое присвоение с неравно типизирует параметр.
после этого в параметре при присвоениях ожидается адекватное значение, а не абракадабкра.
grav (2008-05-22 12:28:00) [34]
> Reindeer Moss Eater © (22.05.08 12:25) [69]
Ну докопаться до чего угодно можно. А вот ответить трудно. Правда, чтобы ответить еще и знать нужно.
grav (2008-05-22 12:26:00) [35]
> Sergey13 © (22.05.08 12:21) [67]
Нет циклов никаких.
Если анализировать каждый TEdit на пустоту, то для каждого придется переменную заводить.
И вообще, зачем тогда параметры? Формировал бы каждый раз новый запрос и все. Вроде бы параметры как раз и нужны для облегчения задачи этой.
Reindeer Moss Eater (2008-05-22 12:25:00) [36]какие у тебя умные транзакции.
знают о существовании эдитов и о том, что в них написано.
grav (2008-05-22 12:23:00) [37]
> Reindeer Moss Eater © (22.05.08 12:18) [66]
Чего не так то?
Если выполнить этот запрос с LoadEd.Text:=''; Будет все ОК.
Если выполнить с LoadEd.Text<>''; Тоже все ОК.
А если в пределах одной транзакции две вставки сделать сначала с LoadEd.Text<>'' а потом с LoadEd.Text:='' будет ошибка.
Sergey13 (2008-05-22 12:21:00) [38]> [65] grav (22.05.08 12:10)
Перед присвоением значения параметру анализируй значение LoadEd.Text на пустоту и меняй параметр соответственно.
но вот странно, что
> Если запись с нулевым полем первая, то ошибку нет.
все таки в цикле может быть косяк, ИМХО.
Reindeer Moss Eater (2008-05-22 12:18:00) [39]странно, да?
grav (2008-05-22 12:10:00) [40]Вот такой запрос
INSERT INTO DATA (ID_ORG, ID_BUILD, ID_OBJ, GEN_S, LONG_NET,PRISE_B,PRISE_M,'+
'IZNOS_B, IZNOS_M,STEPEN_B, STEPEN_M, WATER, SEWER, HEAT, ID_MATERIAL )'+
' values (:ID_ORG,:ID_BUILD,:ID_OBJ,:GEN_S, :LONG_NET,:PRISE_B,:PRISE_M,'+
':IZNOS_B, :IZNOS_M,:STEPEN_B, :STEPEN_M, :WATER, :SEWER, :HEAT, :ID_MATERIAL)
Вот так вот вводятся параметры
AddSQL.ParamByName('Load').AsString:=LoadEd.Text;
Оказывается эта ошибка (conversion error from string "") не только по этому полю вылезает, но и по другим пустым, если они при вставке предыдущей записи не были пустыми