Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.012 c
3-1201906445
md10
2008-02-02 01:54
2008.07.13
delete record


15-1212046676
Azize
2008-05-29 11:37
2008.07.13
GeForse vs ATI


2-1213422535
WebSQLNeederr
2008-06-14 09:48
2008.07.13
Как скопировать в TImage изображение <img> загруженной в TWebBrow


2-1213165605
Кирей
2008-06-11 10:26
2008.07.13
отображение русского текста в компонентах BDE и RAVE


2-1213088896
Kaer
2008-06-10 13:08
2008.07.13
Как оптимизировать скорость работы кода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский