|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Имеется база данных Access. В таблице 2 поля: id (autonumber), name (string) Код на открытии окна: dw_1.SetTransObject(sqlca) dw_1.Retrieve() dw_1.InsertRow(0) //Теперь пишем имя 111 и жмем на кнопочку сохранить: dw_1.Update() // Все отлично. Все сохраняется. Теперь вносим изменение в имя. Например, пишем 111333 и опять жмем на сохранить. Получаем ошибку. Проблема в автономере. Первый раз (при статусе New!) база сама поставила номер. Во второй раз номер NULL. Если сделать dw_1.SetItem(1, 'id', max_number_from_db), то, в зависимости от Key Modification получим другие ошибки: Use Delete then Insert - нельзя удалить строку, где id is NULL. Use Update - нельзя изменять автономер. Но id по-видимому, все равно NULL. Как победить? Делать Retrieve() после сохранения нельзя. Insert напрямую в базу данных тоже нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 11:56 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
уберите id (автономер) из updateable columns ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 12:51 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
да, забыл : для id установлено identity? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 12:53 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
PaulJBуберите id (автономер) из updateable columns Не помогает. Проблема в NULL. для id установлено identity? - Нет ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 13:15 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
автордля id установлено identity? - Нет Установите ... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 14:03 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
... и проверьте значение колонки в DW после первого апдейта. Когда вставляете запись insertrow(0) - id= null После апдейта (INSERT-а) - id в DW должно быть автоматически заполнено значением (автономер), полученным из базы. Если этого нет, то каким-то образом сразу после апдейта (INSERT-а) получите идентификатор, вставьте его в поле DW id и не забудьте сделать dw.resetupdate(). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 14:13 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
PaulJB... и проверьте значение колонки в DW после первого апдейта. Когда вставляете запись insertrow(0) - id= null После апдейта (INSERT-а) - id в DW должно быть автоматически заполнено значением (автономер), полученным из базы. Если этого нет, то каким-то образом сразу после апдейта (INSERT-а) получите идентификатор, вставьте его в поле DW id и не забудьте сделать dw.resetupdate(). Установите ... - Рояля не играет :( проверьте значение колонки в DW после первого апдейта - NULL Проблема в автономере. Первый раз (при статусе New!) база сама поставила номер. Во второй раз номер NULL. Если сделать SetItem, то... (мы с этого начали - см. первый пост). ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 15:44 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
а через что к базе коннект? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 16:14 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
C Access есть определенный геморрой в этом плане Поставьте для update properties - Key Columns Modification - Use Update, Primary Key - id Identity column - id И уберите id из обновления Но как показала практика - работает такая фишка через раз Я делал абсолютно левую таблицу где получал именно значение для ключа, а доставал примерно так Код: sql 1. 2. 3. 4. 5. 6. 7.
Ну или попроще Код: sql 1.
А потом работал как с уникальным значением ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 16:29 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Если после dw_1.SetItem(1, 'id', max_number_from_db) значение колонки остается NULL, то метод не отработал. Или значение есть, а ошибка осталась? А у Вас есть возможность узнать: какое значение будет иметь поле с автономером перед инсертом. Например в ASA есть возможность узнать будущее значение поля с autoincrement перед INSERT-ом. Если такая возможность есть, то задача решается просто, но при усдлвии, что Access позволяет изменять поле с автономером. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2013, 20:02 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
RiskaИмеется база данных Access. В таблице 2 поля: id (autonumber), name (string) Код на открытии окна: dw_1.SetTransObject(sqlca) dw_1.Retrieve() dw_1.InsertRow(0) //Теперь пишем имя 111 и жмем на кнопочку сохранить: dw_1.Update() // Все отлично. Все сохраняется. Теперь вносим изменение в имя. Например, пишем 111333 и опять жмем на сохранить. Получаем ошибку. ... Когда вставили пустую строку (т.е. когда id - autonumber и нет больше обязательных полей типа NOT NULL) нужно изменить статус этой строки. А потом через select получить max(id) и уже для этого значения внести изменения в строку и потом их сохранить. P.S. судя из вышесказанного, autonumber - операция, которая только мешает и вносит проблемы ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 00:34 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Получить номер можно и до и после Update(). Но что толку-то? Еще раз объясню проблему. Вставили строку, написали имя (в id ничего не пишем). Сделали Update(). Все прошло хорошо. Строка сохранилась, но в DW в строке осталось пустое место в id. Из базы данных селектом получаем этот номер. Делаем SetItem. Теперь номер этот виден в DW(можно добавить AcceptText()). Делаем Update() - получаем ошибку "id is NULL". Такое впечатление, что база данных просто игнорирует все, что связано с автономером. Если после первого Update сделать dw_1.Retrieve(), то проблема решается. Но делать Retrieve на все строки нельзя, а ReselectRow опять таки выдает ошибку "NULL". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 10:55 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
да, победить можно просто убрав с поля счетчик руками делать номер: SELECT max(id) INTO :li_maxid FROM table; прибавлять единицу, ну и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 11:43 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
RiskaИз базы данных селектом получаем этот номер. Делаем SetItem. Теперь номер этот виден в DW(можно добавить AcceptText()). Делаем Update() - получаем ошибку "id is NULL". Такое впечатление, что база данных просто игнорирует все, что связано с автономером.я правда не проверял, но думаю что оно сравнивает с original buffer'ом а в DW виден все таки primary buffer (даже и с accepttext'ом) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 11:59 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
maniac85да, победить можно просто убрав с поля счетчик руками делать номер: SELECT max(id) INTO :li_maxid FROM table; прибавлять единицу, ну и т.д. Это и ежу понятно :) Как со счетчиком устаканить? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:01 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
maniac85RiskaИз базы данных селектом получаем этот номер. Делаем SetItem. Теперь номер этот виден в DW(можно добавить AcceptText()). Делаем Update() - получаем ошибку "id is NULL". Такое впечатление, что база данных просто игнорирует все, что связано с автономером.я правда не проверял, но думаю что оно сравнивает с original buffer'ом а в DW виден все таки primary buffer (даже и с accepttext'ом) А это идея! Сейчас проверю. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:02 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Riskamaniac85пропущено... я правда не проверял, но думаю что оно сравнивает с original buffer'ом а в DW виден все таки primary buffer (даже и с accepttext'ом) А это идея! Сейчас проверю.все равно в original buffer значение нельзя поменять ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:16 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Мы победили!!! Спасибо! Нужно было сделать Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:23 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
чо, можно оказывается? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:25 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
авторВсе прошло хорошо. Строка сохранилась, но в DW в строке осталось пустое место в id. Из базы данных селектом получаем этот номер. Делаем SetItem. Теперь номер этот виден в DW(можно добавить AcceptText()). Как я писал выше, обязательно после SetItem сделайте resetupdate() - в этом секрет. Этот метод скажет ДВ что он не обновлялся, потому что так и есть. Попробую обьяснить детальнее: Когда Вы вставили строку в ДВ, и затем обновили ее поля у нее статус= NewModified и при Update будет вызван INSERT. Для инсерта значение в поле ID по барабану и поэтому все Ок. По идее, после отработки INSERT ДВ предполагает, что заполнилось поле Identitycolumn (оно же и KeyColumn), но этого не произошло и оно осталось NULL. При этом статус строки в ДВ = NotModified . Вы меняете значение поля ID на номер. Статус строки = DataModified . Update будет вызывать UPDATE ... WHERE id = NULL, потому что ДВ подставляет предыдущее значение и это логично. Вы бы делали также, если бы писали руками UPDATE. В этом месте нам надо его (ДВ) "обмануть" - это и сделает метод resetupdate(). После ResetUpdate, перед следующим Update(), ДВ будет думать, что ничего не происходило, т.е. поля не менялись. Последовательность действий такая: - insertrow(0) - setitem(row, 'name','bla bla bla') - update() - получаем значение ID - setitem(row, 'id', <значение>) - resetupdate() - ... Теперь измените какое либо поле и выполните Update() снова. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 12:46 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Как я писал выше, обязательно после SetItem сделайте resetupdate() - в этом секрет. После ResetUpdate, перед следующим Update(), ДВ будет думать, что ничего не происходило, т.е. поля не менялись. Это ничего не дает. В строке id как было, так и осталось NULL. После изменения "name" в UPDATE опять будет Error: "... id is NULL". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 15:13 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Не понял ... Вы выполнили: dw_1.SetItem( row, 'ID', max_number_from_db) // этот номер в поле ID сохранился (появился)? dw_1.resetupdate() // Этот номер max_number_from_db из поля ID исчез? O_o Заметьте, dw_1.update() между этими вызовами нет - и это очень важно. В целом, строкой: dw_1.Object.id.Original[current_row] = max_number_from_db Вы сделали тоже самое, что я делал методами DW. Как говорится - "Те же яйца, только в профиль ..." :) Просто, иногда, DotNotation не подходит и приходится использовать стандартные методы. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 16:10 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
ResetUpdate() просто обнуляет флаги. Никакого отношения к id эта функция не имеет. Т.е. естественно, что номер остается. Но проблема в том, что, как высказался предыдущий оратор, Код: sql 1.
А в оригинале был NULL (когда мы вставили строку). После dw_1.Update() база автоматом добавила номер, а в DW этот номер не попал. И ни какие игры с флагами этот номер в оригинальный буфер не принесут. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 18:33 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
Ну ладно ... думаю, дальнейший спор не уместен - главное, что Вы решили свою проблему :) Может это разные методв работы ДВ с разными БД, но у меня такой метод прокатывал на ASA. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2013, 19:17 |
|
Row changed between retrieve and update
|
|||
---|---|---|---|
#18+
RiskaКак со счетчиком устаканить? Пробовали? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2013, 19:29 |
|
|
start [/forum/topic.php?fid=15&fpage=13&tid=1335437]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 177ms |
0 / 0 |