Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
ВнизIBDataSet, Master-Detail и Insert Найти похожие ветки
← →
grav (2008-05-20 12:46) [40]Убрал для эксперимента из DetailDS2 связывающий DataSource. Все работает.
Вообще тройная связка это нормально (MasterDS-DetailDS1-DetailDS2)?
← →
grav (2008-05-20 13:35) [41]Догадался я почему не сохраняются данные при редактировании.
Поскольку я использую кэширование, то по нажатию кнопки Выход на форме производится проверка UpdatesPending всех IBDataSet. Если хоть одно UpdatesPending=True, то я делал ApplyUpdates всех пяти датасетов, независимо в каком поменялись данные, но по порядку начиная с MasterDS.
ApplyUpdates видимо надо делать с нижнего уровня связки мастер -детайл.
Лично для меня это не тривиально и до конца не понятно. Объясните, кто может.
Со вставкой я еще не разобрался.
← →
grav (2008-05-20 13:52) [42]Ой как все криво то.
Загнал добавление новой строки в таблицу DATA в кнопку сохранить.
Сначала подтверждаю добавление новой записи в таблицу BUILDING:
BuildDS.Post;
Потом добавляю новую строку в DATA
DetailDS2.Insert;
DetailDS2.FieldByName("ID_ORG").AsInteger:=DetailDS1.FieldByName("ID_ORG").AsInt eger;
DetailDS2.FieldByName("ID_BUILD").AsInteger:=DetailDS1.FieldByName("ID").AsInteg er;
DetailDS2.FieldByName("ID_OBJ").AsInteger:=0;
DetailDS2.Post;
Остальные поля в таблицу DATA заносятся уже редактированием.
← →
Anatoly Podgoretsky © (2008-05-20 15:14) [43]> grav (20.05.2008 10:40:15) [15]
У тебя сколько было в школе по математике 100 * 100 <> 1000 далеко не равно.
Слушай, а где это детей допускают до таких больших проектов?
У меня на примете есть хорошая девочка, может возьмете в проект?
← →
Anatoly Podgoretsky © (2008-05-20 15:14) [44]> ЮЮ (20.05.2008 10:43:16) [16]
Почему может, это вообще то норма.
← →
Anatoly Podgoretsky © (2008-05-20 15:15) [45]> Sergey13 (20.05.2008 10:53:19) [19]
Может, как и организация без зданий.
← →
grav (2008-05-20 15:58) [46]
> Anatoly Podgoretsky © (20.05.08 15:14) [43]
Мне вообще то 4-й десяток давно. Ну обшибся, с кем не бывает. Чего мелкие цифры считать то?
> Слушай, а где это детей допускают до таких больших проектов?
Это разве большой проект? Так, мелочь.
← →
grav (2008-05-20 16:00) [47]
> Anatoly Podgoretsky © (20.05.08 15:15) [45]
Не может. Производится целевое обследование, есть выборка и чуть более 6 тыс организаций. У всех есть здания, во всх зданиях есть объекты.
← →
grav (2008-05-20 16:03) [48]
> Anatoly Podgoretsky ©
Лучше бы по делу написали что нибудь. Вроде бы не раз от вас получал дельные советы.
Непонятна логика (правила) работы с IBDataSet. В интернете не нашел ничего.
Вот есть MasterDS-DetailDS1-DetailDS2. Делается вставка в DetailDS1 и DetailDS2.
Каков порядок Insert и Post в этих двух датасетах?
← →
Anatoly Podgoretsky © (2008-05-20 16:28) [49]> grav (20.05.2008 15:58:46) [46]
Ни фига себе мелкие, на 54 миллиона записей ошибся
← →
Anatoly Podgoretsky © (2008-05-20 16:29) [50]grav (20.05.08 16:00) [47]
Жизнь она накажет строго.
Так как насчет девочки то?
← →
Sergey13 © (2008-05-20 16:39) [51]> [42] grav (20.05.08 13:52)
Я кажется понял твою проблему.
Итак:
В мастер новая запись вставляется, в первый детайл вставляется, в во второй детайл не вставляется? Так?
Похоже на то что первый детайл при посте не знает ID своей новой зписи. Он узнает ее при переоткрытии.
Установлено ли свойство GeneratorField (кажется так называется) у первого детайла (который здания)?
И вообще, при заведении связанных М-Д данных пользоваться "гридовой" логикой не совсем правильно, ИМХО.
← →
grav (2008-05-20 17:50) [52]
> Anatoly Podgoretsky © (20.05.08 16:29) [50]
> Так как насчет девочки то?
Она в Нижнем Новгороде что ли?
← →
grav (2008-05-21 09:34) [53]
> Sergey13 © (20.05.08 16:39) [51]
> В мастер новая запись вставляется, в первый детайл вставляется,
> в во второй детайл не вставляется? Так?
Да, так.
Вот так вставляется >grav (20.05.08 13:52) [42]
Видимо надо делать так:
MasterDS.Insert;
.....
MasterDS.Post;
DetailDS1.Insert;
...
DetailDS1.Post;
DetailDS2.Insert;
....
DetailDS2.Post;
И нельзя так:
MasterDS.Insert;
DetailDS1.Insert;
DetailDS2.Insert;
...
MasterDS.Post;
DetailDS1.Post;
DetailDS2.Post;
← →
Sergey13 © (2008-05-21 09:55) [54]> [53] grav (21.05.08 09:34)
> И нельзя так:
Ну это в общем то и логично. Я и писал об этом
> [51] Sergey13 © (20.05.08 16:39)
> при заведении связанных М-Д данных пользоваться "гридовой"
> логикой не совсем правильно, ИМХО.
Ты вставляешь связанные многоуровневые данные. Данные верхнего уровня необходимы для данных нижнего. Но БД на момент ввода их не знает - отсюда и проблемы.
Я такие вставки предпочитаю делать используя таблицы в памяти (типа RxMemoryData). Заполняю их вводимыми сущностями, а потом (по кнопке Сохранить) одной транзакцией вставляю их в БД с помощью скрипта.
← →
Виталий Панасенко © (2008-05-21 10:30) [55]А что, было так ?!
> MasterDS.Insert;
> DetailDS1.Insert;
> DetailDS2.Insert;
> ...
> MasterDS.Post;
> DetailDS1.Post;
> DetailDS2.Post;
← →
grav (2008-05-21 10:54) [56]
> Sergey13 © (21.05.08 09:55) [54]
> Я такие вставки предпочитаю делать используя таблицы в памяти
Ну этого я не умею, первый раз слышу про такое. Надо будет почитать
← →
Sergey13 © (2008-05-21 10:57) [57]> [56] grav (21.05.08 10:54)
Это просто компоненты типа датасет (со всеми вытекающими от сюда свойствами) которые не опираются ни на какие данные из БД. Типа временных таблиц, но не сервере, а на клиенте.
← →
grav (2008-05-21 11:01) [58]
> Виталий Панасенко © (21.05.08 10:30) [55]
> А что, было так ?!
Да, было - grav (20.05.08 11:46) [30]
Мне представлялось логичным это. Т.к. обычно для вставки я использовал IBQuery, последовательно исполняя запросы.
В чем вообще смысл Insert и Post?
Что происходит при выполнении данных команд (или чего это)?
У меня сложилось впечатление, что Insert - означает использование запроса из InsertSQL и больше ничего. Post, видимо, аналогичен IBQuery.ExecSQL; Я прав?
← →
Виталий Панасенко © (2008-05-21 14:51) [59]
> У меня сложилось впечатление, что Insert - означает использование
> запроса из InsertSQL и больше ничего. Post, видимо, аналогичен
> IBQuery.ExecSQL; Я прав?
примерно...это все сделано, ИМХО, для однотипности оперций..все наследники TDataSet имеют переопределенные методы insert/Append/AppendRecord/Delete/Edit.. только для разных движков содержимое разное.. для Paradox Edit еще и блокирует запись, для остальных по разному
← →
grav (2008-05-22 10:57) [60]Вопрос не в тему.
Есть в таблице поле Load типа Integer. Произвожу вставку данных через параметр :LOAD из поля LoadEd (TEdit).
AddSQL.ParamByName("Load").AsString:=LoadEd.Text;
Когда поле LoadEd пустое, через раз работает без ошибок, через раз ошибка конвертирования из строки "".
← →
Reindeer Moss Eater © (2008-05-22 11:01) [61]через раз ошибка конвертирования из строки "".
А ты вызывай exec через этот раз и будет счастье
← →
grav (2008-05-22 11:22) [62]Через раз это вот почему.
В таблицу в пределах одной транзакции вставляется несколько записей.
Если в предыдущей записи данные в поле присутствуют, то при вставке очередной записи с нулевым полем вылетает ошибка. Если запись с нулевым полем первая, то ошибку нет.
Чего не так то?
← →
Sergey13 © (2008-05-22 11:33) [63]> [62] grav (22.05.08 11:22)
> Чего не так то?
Например цикл как-нибудь криво написан. Но ты же реальный код не даешь - одни огрызки.
← →
Reindeer Moss Eater © (2008-05-22 11:37) [64]Чего не так то?
Тебе про это сама ошибка своим текстом рассказывает. Что там у тебя не так.
← →
grav (2008-05-22 12:10) [65]Вот такой запрос
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 "") не только по этому полю вылезает, но и по другим пустым, если они при вставке предыдущей записи не были пустыми
← →
Reindeer Moss Eater © (2008-05-22 12:18) [66]странно, да?
← →
Sergey13 © (2008-05-22 12:21) [67]> [65] grav (22.05.08 12:10)
Перед присвоением значения параметру анализируй значение LoadEd.Text на пустоту и меняй параметр соответственно.
но вот странно, что
> Если запись с нулевым полем первая, то ошибку нет.
все таки в цикле может быть косяк, ИМХО.
← →
grav (2008-05-22 12:23) [68]
> Reindeer Moss Eater © (22.05.08 12:18) [66]
Чего не так то?
Если выполнить этот запрос с LoadEd.Text:=""; Будет все ОК.
Если выполнить с LoadEd.Text<>""; Тоже все ОК.
А если в пределах одной транзакции две вставки сделать сначала с LoadEd.Text<>"" а потом с LoadEd.Text:="" будет ошибка.
← →
Reindeer Moss Eater © (2008-05-22 12:25) [69]какие у тебя умные транзакции.
знают о существовании эдитов и о том, что в них написано.
← →
grav (2008-05-22 12:26) [70]
> Sergey13 © (22.05.08 12:21) [67]
Нет циклов никаких.
Если анализировать каждый TEdit на пустоту, то для каждого придется переменную заводить.
И вообще, зачем тогда параметры? Формировал бы каждый раз новый запрос и все. Вроде бы параметры как раз и нужны для облегчения задачи этой.
← →
grav (2008-05-22 12:28) [71]
> Reindeer Moss Eater © (22.05.08 12:25) [69]
Ну докопаться до чего угодно можно. А вот ответить трудно. Правда, чтобы ответить еще и знать нужно.
← →
Reindeer Moss Eater © (2008-05-22 12:29) [72]А если в пределах одной транзакции две вставки сделать сначала с LoadEd.Text<>"" а потом с LoadEd.Text:="" будет ошибка.
первое присвоение с неравно типизирует параметр.
после этого в параметре при присвоениях ожидается адекватное значение, а не абракадабкра.
← →
Reindeer Moss Eater © (2008-05-22 12:39) [73]Есть в таблице поле Load типа Integer. Произвожу вставку данных через параметр :LOAD из поля LoadEd (TEdit).
AddSQL.ParamByName("Load").AsString:=LoadEd.Text;
это так в автошколе учили? с целочисленными полями работать через строки?
← →
grav (2008-05-22 12:46) [74]
> Reindeer Moss Eater © (22.05.08 12:39) [73]
Угу, в автошколе.
А надо сначала завести для каждого TEdit переменную, потом проверить не пустое ли поле и если пустое присвоить переменной NULL.
AddSQL.ParamByName("Load").AsInteger:=NULL; ?
Или другой алгоритм есть?
← →
Reindeer Moss Eater © (2008-05-22 12:50) [75]если прграммироать в автошколе учился, то да. нужна отдельная перменная на каждый едит.
← →
Reindeer Moss Eater © (2008-05-22 12:51) [76]AddSQL.ParamByName("Load").Clear
← →
grav (2008-05-22 12:56) [77]
> Reindeer Moss Eater © (22.05.08 12:51) [76]
> AddSQL.ParamByName("Load").Clear
Это если NULL вставить нужно?
← →
grav (2008-05-22 13:04) [78]
> 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;
← →
Sergey13 © (2008-05-22 13:36) [79]> [70] grav (22.05.08 12:26)
> Нет циклов никаких.
Откуда тогда всякие солова типа "если они при вставке предыдущей записи не были пустыми" берутся?
Вобщем мой телепатор перегрелся и сдох. Я пас.
← →
grav (2008-05-22 13:53) [80]
> Sergey13 © (22.05.08 13:36) [79]
Спасибо, что не бросаете :)
Данные вводит пользователь. Если под циклом имелась ввиду работа пользователя, то да он есть :) Пользователь вводит данные организации, потом данные первого здания, потом данные объектов первого здания, потом вводит данные второго здания, обекты второго здания и т.д.
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.01 c