Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IBDataSet, Master-Detail и Insert [D7, FireBird 1.5]


Страницы:   1 2 3 4 5 6

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 "") не только по этому полю вылезает, но и по другим пустым, если они при вставке предыдущей записи не были пустыми


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо