Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Не редактируются ячейки DBgrid.


Автор: Vavik 6.5.2009, 08:42
Вывожу данные в DBgrid через ADOQuery. Жму кнопку "редактировать" выделеная ячейка DBGridа пеерходит в режим редактирования, но ничего не редактируется. Почему ? Readonly:=false, RequestLive не предлагать, у ADOQuery его нет, свойство Active=True.

Нашёл маленький проект, в нём через ADOQuery подключена база Access, всё редактируется. Подключился к своей бд postgresqlя и всё, нифига не работает.

Я конечно могу вбивать данные через Editыi, но это изврат, куда мне их 24 штуки пихать ? Через DBgrid удобней, а он не работает:(


Автор: Rodman 6.5.2009, 09:00
Цитата(Vavik @  6.5.2009,  08:42 Найти цитируемый пост)
Нашёл маленький проект, в нём через ADOQuery подключена база Access, всё редактируется. Подключился к своей бд postgresqlя и всё, нифига не работает.

нам нудно найти 3 отличия?
или примеры покажешь?

Автор: insoft 6.5.2009, 09:30
Vavik, используй ADODataSet и воспользуйся поиском ishimsity уже задавал такой вопрос и получил на него ответ

Автор: Vavik 6.5.2009, 10:52
Цитата(Rodman @ 6.5.2009,  09:00)
Цитата(Vavik @  6.5.2009,  08:42 Найти цитируемый пост)
Нашёл маленький проект, в нём через ADOQuery подключена база Access, всё редактируется. Подключился к своей бд postgresqlя и всё, нифига не работает.

нам нудно найти 3 отличия?
или примеры покажешь?

Ну вот этот проект, ток Бд на диск D кинуть надо.

Цитата(insoft @ 6.5.2009,  09:30)
Vavik, используй ADODataSet и воспользуйся поиском ishimsity уже задавал такой вопрос и получил на него ответ

Попробую...

Автор: insoft 6.5.2009, 10:59
Цитата(insoft @  6.5.2009,  09:30 Найти цитируемый пост)
ishimsity уже задавал такой вопрос и получил на него ответ

http://forum.vingrad.ru/forum/topic-256453/anchor-entry1849424/15.html#st_15_view_0

Автор: Akella 6.5.2009, 11:57
Vavik, видишь ли, есть понятие "нередактируемый запрос".

Автор: Kbl4AH 6.5.2009, 13:05
Цитата(Akella @  6.5.2009,  12:57 Найти цитируемый пост)
есть понятие "нередактируемый запрос".

а можно подробнее об этом?!
я раньше всегда думал, что в редактируемом запросе должно присутствовать какое-то уникальное поле (MySQL, Oracle)...
и мне действительно не понятна проблема Vavik... еще по прошлой его теме я заинтересовался и пошарил в нете...
и ничего не смог найти... возникло чувство (наверняка ошибочное), что в postgresql на самом деле нельзя юзать автоматически редактируемые НД...


но больше всего меня удивило, что, например, TADODataSet может редактировать набор из Oracle, полученный запросом select * from table,
а TOracleDataSet - не может (ему необходим запрос select t.*, t.rowid from table t)...
причем 1-й запрос вроде как "нередактируемый" получается...

Akella и др. форумчане, прокомментируйте, плиз, эту ситуевину...
также не откажусь, если вы ткнете меня носом в ссылки, где о данном вопросе можно почерпнуть какую-либо инфу... smile 

Автор: Kbl4AH 6.5.2009, 13:21
Vavik, у тебя запрос типа select * from table?
Кажется, нашел решение... Попробуй использовать запрос типа select oid, * from table...
Цитата

Редактируемый набор записей должен содержать поле - идентификатор записи с уникальными значениями, используемый для связывания записей таблицы базы данных и строк набора. Необходимо явно включать это поле в список запрашиваемых полей запроса SELECT. Для различных СУБД существуют различные подходы к реализации механизма связывания записей таблицы и строк набора.
- Некоторые СУБД имеют 'скрытые' поля - идентификаторы записей для каждой хранимой таблицы (ROWID в Oracle, OID в PostgreSQL). Эти поля создаются неявно, даже если вы не включали его описания в список полей оператора CREATE TABLE. 

ЗЫ. Akella и др. форумчане, мой вопрос актуален...

Автор: Akella 6.5.2009, 13:56
Цитата(Kbl4AH @  6.5.2009,  13:05 Найти цитируемый пост)
а можно подробнее об этом?!

Ссылка выше моего сообщения, там я написал, почему запрос не является "редактируемым"

Автор: Vavik 6.5.2009, 13:57
Цитата(Kbl4AH @ 6.5.2009,  13:21)
Vavik, у тебя запрос типа select * from table?
Кажется, нашел решение... Попробуй использовать запрос типа select oid, * from table...
Цитата

Редактируемый набор записей должен содержать поле - идентификатор записи с уникальными значениями, используемый для связывания записей таблицы базы данных и строк набора. Необходимо явно включать это поле в список запрашиваемых полей запроса SELECT. Для различных СУБД существуют различные подходы к реализации механизма связывания записей таблицы и строк набора.
- Некоторые СУБД имеют 'скрытые' поля - идентификаторы записей для каждой хранимой таблицы (ROWID в Oracle, OID в PostgreSQL). Эти поля создаются неявно, даже если вы не включали его описания в список полей оператора CREATE TABLE. 

ЗЫ. Akella и др. форумчане, мой вопрос актуален...

Не, так тож не хочет. 
Мне тут на другом форуме подсказали, что такое возможно когда ключевые поля незаданы.
Хотя кажется не в этом дело...подключился к БД Accessa, с одной таблицей без ключевых полей, всё норм редактирует.

Автор: Akella 6.5.2009, 13:58
Цитата(Kbl4AH @  6.5.2009,  13:05 Найти цитируемый пост)
select * from table,


Цитата(Kbl4AH @  6.5.2009,  13:05 Найти цитируемый пост)
причем 1-й запрос вроде как "нередактируемый" получается...


так это как раз и есть редактируемый запрос.

Добавлено через 9 минут и 17 секунд
Kbl4AH, по идее, если в запросе участвуют несколько таблиц, то такой запрос будет нередактируемый. Ну да, и ключевое поле должно быть, иначе откуда знать компонентам, какую именно запись редактировать. Если не будет ключевого поля, то есть опасность отредактировать больше одной записи. Представим, что у нас есть запрос:
Код
select name, phones from tphones

(ни name, ни phones не являются первичными ключами)
В гриде будет видно 2 поля. Теперь представим, что мы редактируем первую запись, где есть значения:
Вася Пупки | 777-0-777

SQL Update такого запроса будет такой: 
Код

update tphones set name = 'Пупки Василий', phones = '777-0-777'

--вот тут подвох
where name = 'Вася Пупки' and phones = '777-0-777'

в этом случае может отредактировать не только текущая запись, а ещё несколько других, попавших под условие where

ну может пример немного глуповат, но, надеюсь, что он, как бы, разъясняет ситуацию с отсутствием ключевого поля

Автор: Kbl4AH 6.5.2009, 16:02
Цитата(Akella @  6.5.2009,  14:56 Найти цитируемый пост)
Ссылка выше моего сообщения, там я написал, почему запрос не является "редактируемым"

так про редактирование объединных таблиц у меня нет вопросов...
у меня вопрос: почему АДОдатасет редактирует (и почему он редактирует, если не выбрано rowid) оракловый запрос select * from table, а ОРАКЛдатасет - нет... запрос-то ведь одинаковый... хотя... наверное, в ОраклДатаСете просто грамотно реализовали, чтоб явно разграничить редактиреумые и нередактируемые запросы...
Цитата(Vavik @  6.5.2009,  14:57 Найти цитируемый пост)
Мне тут на другом форуме подсказали, что такое возможно когда ключевые поля незаданы.Хотя кажется не в этом дело...подключился к БД Accessa, с одной таблицей без ключевых полей, всё норм редактирует.

так в цитате же именно это и написано!
Цитата(Vavik @  6.5.2009,  14:57 Найти цитируемый пост)
Не, так тож не хочет.

должен, т.к. OID и есть уникальное поле для этой БД... смотри уже свойства датасета, наверное, где-то запрет редактирования...
Цитата(Akella @  6.5.2009,  14:58 Найти цитируемый пост)
Ну да, и ключевое поле должно быть, иначе откуда знать компонентам, какую именно запись редактировать.

это понятно... тем более, что Oracle, PostgreSQL (псведополе) и MySQL (уникальный автоинкремент) их предоставляют по умолчанию...

Автор: Vavik 6.5.2009, 16:44
Слава яйцам, разобрался.
Делал так:
 Нажал 2 раза на ADOQuery, появилось окошко Fields editor, потом кликаем на нём правой кнопкой и выбираем add all Fields, ну а там выбираем поле и в свойстве Readonly ставим false smile

Автор: Kbl4AH 6.5.2009, 19:26
Цитата(Vavik @  6.5.2009,  17:44 Найти цитируемый пост)
Слава яйцам, разобрался.

используется OID в твоем запросе или нет? интересно, скажи smile 

Автор: Vavik 6.5.2009, 20:17
Цитата(Kbl4AH @ 6.5.2009,  19:26)
Цитата(Vavik @  6.5.2009,  17:44 Найти цитируемый пост)
Слава яйцам, разобрался.

используется OID в твоем запросе или нет? интересно, скажи smile

Неа)

Автор: Vavik 7.5.2009, 16:02
Таак, теперь как мне сделать

query1.FieldByName('id_poselok').asString:= ' А тут ячейка DBGRida '   м?

Автор: Akella 7.5.2009, 16:46
бредовый код, дб грид только отображает данные

Автор: Vavik 7.5.2009, 16:57
Я просто хочу использовать Dbgrid в качестве эдита.

Автор: insoft 7.5.2009, 16:57
Vavik, а зачем плодит темы и вопросы?
http://forum.vingrad.ru/forum/topic-257095/15.html

p.s. бр.. даже отвечать больше не буду...
модеры, что на форуме вообще все правила по отменяли????

Автор: Vavik 7.5.2009, 17:02
Цитата(insoft @ 7.5.2009,  16:57)
Vavik, а зачем плодит темы и вопросы?
http://forum.vingrad.ru/forum/topic-257095/15.html

p.s. бр.. даже отвечать больше не буду...
модеры, что на форуме вообще все правила по отменяли????

Ну вообще, я этот пост в той теме хотел написать, но он как-то здесь оказался  smile 
Ой, а он там оказывается тоже есть  smile  Магия!  smile 

Автор: insoft 7.5.2009, 17:03
Vavik, да не важно, одна тема - один вопрос!!!
в общем: решать модерам

Автор: Vavik 7.5.2009, 17:06
Цитата(insoft @ 7.5.2009,  17:03)
Vavik, да не важно, одна тема - один вопрос!!!
в общем: решать модерам

Неее, в этой я спрашивал, как сделать ячейки редактируемыми, а в той, как внести изменения в БД, используя DBGrid.

Короче вот так надо
Код

 Query1.append;
 Query1.fieldbyname('id_poselok').asString:='ячейка DBGrida';
 Query1.post;



"OnDrawColumnCell - наступает при необходимости перерисовать ячейку"
Что значит перерисовать ячейку ?

Только не надо говорить, что DBGrid нельзя в качестве эдита использовать. Пользуясь навигатором мы ведь данные в DBgrid вбиваем, вот я хочу тоже самое делать только без него.
Пока что делаю так
Код

public
  s:string;
...
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
s:=Column.Field.AsString;
Query1.fieldbyname('id_poselok').asString:=s;
end;

Но тогда он суёт значение, отображаемое из БД, а мне надо, чтобы то которое я только что вписал. Вот как это сделать ?


Автор: Akella 7.5.2009, 21:15
Цитата(Vavik @  7.5.2009,  16:57 Найти цитируемый пост)
Я просто хочу использовать Dbgrid в качестве эдита. 

не используй грид, используй датасет, ведь грид привязан к датасету

Автор: Vavik 8.5.2009, 07:51
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

Не добавляет.
Говорит "Не удаётся вставить пустую строку. Необходим хотя бы один столбец значений."

Автор: Kbl4AH 8.5.2009, 08:07
Цитата(Vavik @  8.5.2009,  08:51 Найти цитируемый пост)
Не добавляет.Говорит "Не удаётся вставить пустую строку. Необходим хотя бы один столбец значений."

добавь же ты oid в запрос...
ЗЫ. попробуй еще так
Код

ADOquery1.Append;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

Автор: Vavik 8.5.2009, 08:11
Цитата(Kbl4AH @ 8.5.2009,  08:07)
Цитата(Vavik @  8.5.2009,  08:51 Найти цитируемый пост)
Не добавляет.Говорит "Не удаётся вставить пустую строку. Необходим хотя бы один столбец значений."

добавь же ты oid в запрос...
ЗЫ. попробуй еще так
Код

ADOquery1.Append;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

Да и так тоже пробывал. OID не помогает, тоже самое мне пишет.

Автор: Kbl4AH 8.5.2009, 08:47
Цитата(Vavik @  8.5.2009,  09:11 Найти цитируемый пост)
Да и так тоже пробывал. OID не помогает, тоже самое мне пишет.

 smile 
тада вместо этого
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

попробуй это...
Код

ADOquery1.AppendRecord([null, 4, null]);

где в квадратных скобках указываются значения для всех полей вставляемой строки (null - пустые значения, не null - вставляемое значение)...
в моем примере НД содержит 3 поля... 2-е поле - id_poselok... 

Автор: Vavik 8.5.2009, 10:51
Цитата(Kbl4AH @ 8.5.2009,  08:47)
Цитата(Vavik @  8.5.2009,  09:11 Найти цитируемый пост)
Да и так тоже пробывал. OID не помогает, тоже самое мне пишет.

 smile 
тада вместо этого
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

попробуй это...
Код

ADOquery1.AppendRecord([null, 4, null]);

где в квадратных скобках указываются значения для всех полей вставляемой строки (null - пустые значения, не null - вставляемое значение)...
в моем примере НД содержит 3 поля... 2-е поле - id_poselok...

Не, всё равно не помогло, та же ошибка.

Автор: Kbl4AH 8.5.2009, 10:55
Цитата(Vavik @  8.5.2009,  11:51 Найти цитируемый пост)
Не, всё равно не помогло, та же ошибка.

у тебя походу автоматическая вставка идет, в которой значения полей отсутсвуют...
пиши полностью процедуру, в которой ошибка, указывай строку на которую ругается...
или говори последовательность твоих действий на форме, вызывающую ошибку...

Автор: Vavik 8.5.2009, 11:14
Цитата(Kbl4AH @ 8.5.2009,  10:55)
Цитата(Vavik @  8.5.2009,  11:51 Найти цитируемый пост)
Не, всё равно не помогло, та же ошибка.

у тебя походу автоматическая вставка идет, в которой значения полей отсутсвуют...
пиши полностью процедуру, в которой ошибка, указывай строку на которую ругается...
или говори последовательность твоих действий на форме, вызывающую ошибку...

Ничего он не выделяет, просто выдаёт ошибку) 
http://ipicture.ru/
Последовательность действий...запустил проект, нажал кнопку, ошибка, всё smile

Автор: Kbl4AH 8.5.2009, 11:18
Цитата(Vavik @  8.5.2009,  12:14 Найти цитируемый пост)
Ничего он не выделяет, просто выдаёт ошибку)

ты издеваешься? я уже текст ошибки прочел smile 
Цитата(Vavik @  8.5.2009,  12:14 Найти цитируемый пост)
Последовательность действий...запустил проект, нажал кнопку, ошибка, всё

так давай процедуру которая у тебя нажатие кнопки обрабатывает...



Автор: Vavik 8.5.2009, 12:12
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;
end;


Или так, без разницы)
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOquery1.Append;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;
end;

Автор: Kbl4AH 8.5.2009, 12:16
а так почему не пробовал? (в скобках должно быть столько значений, сколько полей выбирается в запросе)
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([null, 4, null]);
end;

Автор: Vavik 8.5.2009, 12:24
Цитата(Kbl4AH @ 8.5.2009,  12:16)
а так почему не пробовал? (в скобках должно быть столько значений, сколько полей выбирается в запросе)
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([null, 4, null]);
end;

Цитата(Vavik @ 8.5.2009,  10:51)
Цитата(Kbl4AH @ 8.5.2009,  08:47)
Цитата(Vavik @  8.5.2009,  09:11 Найти цитируемый пост)
Да и так тоже пробывал. OID не помогает, тоже самое мне пишет.

 smile 
тада вместо этого
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

попробуй это...
Код

ADOquery1.AppendRecord([null, 4, null]);

где в квадратных скобках указываются значения для всех полей вставляемой строки (null - пустые значения, не null - вставляемое значение)...
в моем примере НД содержит 3 поля... 2-е поле - id_poselok...

Не, всё равно не помогло, та же ошибка.

Автор: Kbl4AH 8.5.2009, 12:32
Vavik, по-моему, такой ошибки при следующем коде быть не может...
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([null, 4, null]);
end;

давай текст запроса в ADOQuery1...

Автор: Vavik 8.5.2009, 12:55
Цитата(Kbl4AH @ 8.5.2009,  12:32)
Vavik, по-моему, такой ошибки при следующем коде быть не может...
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([null, 4, null]);
end;

давай текст запроса в ADOQuery1...

select oid, * from poselok

Автор: Kbl4AH 8.5.2009, 13:09
Vavik, теперь назови все поля таблицы poselok... 

Автор: Vavik 8.5.2009, 13:13
Цитата(Kbl4AH @ 8.5.2009,  13:09)
Vavik, теперь назови все поля таблицы poselok...

OID, id_poselok, "Название"

Автор: Dmi3ev 8.5.2009, 13:21
Цитата

"Название" 

это поле такое???

Добавлено через 2 минуты и 53 секунды
Цитата

Vavik, теперь назови все поля таблицы poselok... 

тебя просят сделать что вроде этого

id - id чего-то там - тип: счетчик
name - имя чего-там - тип: текстовый (50)
и текст запроса
select * from t1;

Автор: Akella 8.5.2009, 13:26
Цитата(Vavik @  8.5.2009,  07:51 Найти цитируемый пост)
ADOquery1.Append;
ADOquery1.Edit;

советую изучить хотя бы простейшие методы работы с базами, если ты даже не знаешь, что такое Edit, а что такое Append

Автор: Kbl4AH 8.5.2009, 13:31
попробуй так...
Код

select t.*, t.oid from poselok t

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([4, null]);
end;

если опять ошибка, то измени запрос 
Код

select t.* from poselok t


Автор: Vavik 8.5.2009, 13:31
Цитата(Akella @ 8.5.2009,  13:26)
Цитата(Vavik @  8.5.2009,  07:51 Найти цитируемый пост)
ADOquery1.Append;
ADOquery1.Edit;

советую изучить хотя бы простейшие методы работы с базами, если ты даже не знаешь, что такое Edit, а что такое Append

Да знаю я, что это такое, а что не так ?

Автор: Dmi3ev 8.5.2009, 13:32
Цитата

советую изучить хотя бы простейшие методы работы с базами, если ты даже не знаешь, что такое Edit, а что такое Append 

Insert, Append для добавления открываешь (разница в том, куда добавиться запись)
Edit для редактирования открываешь
Post чтобы сохранить все это дело в базу
Почитать стоит...  smile 

Автор: Vavik 8.5.2009, 13:36
Цитата(Kbl4AH @ 8.5.2009,  13:31)
попробуй так...
Код

select t.*, t.oid from poselok t

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.AppendRecord([4, null]);
end;

если опять ошибка, то измени запрос 
Код

select t.* from poselok t


Не, не помогает. Вообще это уже на какой-то изврат похоже)) Решение проблемы намного проще.

Цитата(Dmi3ev @ 8.5.2009,  13:32)
Цитата

советую изучить хотя бы простейшие методы работы с базами, если ты даже не знаешь, что такое Edit, а что такое Append 

Insert, Append для добавления открываешь (разница в том, куда добавиться запись)
Edit для редактирования открываешь
Post чтобы сохранить все это дело в базу
Почитать стоит...  smile

Та знаю я это) чего вы мне это говорите) если есть ошибка, то скажите лучше где)

Автор: Dmi3ev 8.5.2009, 13:39
Vavik, а ты пробовал такой финт провернуть:
созадать еще один запрос и написать в нем:
INSERT INTO t1(f1, f2, f3) VALUES (1, '2', '3');
а потом выполнить его по нажатию на кнопку, потом обновить запрос на выборку и посмотреть как оно?
может у тебя ваще с бд траблы, кстати, че за какая БД?

Автор: Kbl4AH 8.5.2009, 13:40
Цитата(Vavik @  8.5.2009,  14:36 Найти цитируемый пост)
Не, не помогает.

ошибка та же?
Цитата(Vavik @  8.5.2009,  14:36 Найти цитируемый пост)
Решение проблемы намного проще.

конечно, проще smile электромагнитные помехи при телепатии - вот узкое место в решении данной проблемы...

ЗЫ. У тебя точно в таблице 2 поля не считая oid? Кстати, откуда ты знаешь, что поле oid есть в твоей таблице, ты ведь его не создавал?!

Автор: Dmi3ev 8.5.2009, 13:43
я про то, что надо бы ваще проверить, добавляется ли туда чего, или нет...
просто когда мне приходилось работать с пардоксом (бд такая стандартная), то запись не добавлялась, когда я запускал свое приложение из под билдера, а экзешник работал отлично, хз почему так было... мы это обсуждали и пришли к тому, что это глюк бд, потому как с остальными все работало, так что напиши просто статический запрос на добавление записи, если прокатит, то можно думать, а если нет... то тогда другое копать...

Автор: Vavik 8.5.2009, 13:45
Цитата(Dmi3ev @ 8.5.2009,  13:39)
Vavik, а ты пробовал такой финт провернуть:
созадать еще один запрос и написать в нем:
INSERT INTO t1(f1, f2, f3) VALUES (1, '2', '3');
а потом выполнить его по нажатию на кнопку, потом обновить запрос на выборку и посмотреть как оно?
может у тебя ваще с бд траблы, кстати, че за какая БД?

Через запросы БД без проблем редактируется. PostgreSql.

Цитата(Kbl4AH @ 8.5.2009,  13:40)
Цитата(Vavik @  8.5.2009,  14:36 Найти цитируемый пост)
Не, не помогает.

ошибка та же?
Цитата(Vavik @  8.5.2009,  14:36 Найти цитируемый пост)
Решение проблемы намного проще.

конечно, проще smile электромагнитные помехи при телепатии - вот узкое место в решении данной проблемы...

ЗЫ. У тебя точно в таблице 2 поля не считая oid? Кстати, откуда ты знаешь, что поле oid есть в твоей таблице, ты ведь его не создавал?!

Таже ошибка, таблицы точно две и OID точно есть)

Автор: Dmi3ev 8.5.2009, 13:46
Цитата

конечно, проще smile электромагнитные помехи при телепатии - вот узкое место в решении данной проблемы...

это да! еще надо учитывать место, откуда руки растут...
Цитата

ЗЫ. У тебя точно в таблице 2 поля не считая oid? Кстати, откуда ты знаешь, что поле oid есть в твоей таблице, ты ведь его не создавал?! 

ухаха, неужели все так плохо?
человек создал БД и не знает, сколько там полей и какие... Забавно...

Добавлено через 42 секунды
Цитата

Через запросы БД без проблем редактируется. PostgreSql. 

так почему ими и не воспользоваться??? что мешает???

Добавлено через 3 минуты и 11 секунд
Я, допустим, когда не стоит задача, которая требует работы не через запросы, всегда использую запросы, потому как запрос при работе с БД для меня как-то естественнее чем работа через методы компонента... хз, я так считаю...

Автор: Vavik 8.5.2009, 14:00
[QUOTE=Dmi3ev,8.5.2009,  13:46]
Цитата

так почему ими и не воспользоваться??? что мешает???

Ну таблиц просто много и у всех разное количество столбцов, у одной 24 например и делать 24 эдита как-то не очень) поэтому я хочу через ячейки Dbgrid редактировать как это делает DBNavigator

Автор: Kbl4AH 8.5.2009, 14:03
Vavik, а если так?
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery2.SQL.Text := 'insert into poselok (id_poselok) values (4)';
  ADOQuery2.ExecSQL;
  ADOQuery2.SQL.Text := 'commit'; 
  ADOQuery2.ExecSQL;
  ADOQuery1.Refresh;
  ADOQuery1.Last;
end;


Добавлено через 2 минуты и 26 секунд
Цитата(Vavik @  8.5.2009,  15:00 Найти цитируемый пост)
Ну таблиц просто много и у всех разное количество столбцов, у одной 24 например и делать 24 эдита как-то не очень) поэтому я хочу через ячейки Dbgrid редактировать как это делает DBNavigator

так ты определись, каким образом таблицу собираешься модифицировать...
я тебя не пойму то ли ты только в гриде, то ли с навигатором, то ли по нажатию кнопок собираешься это делать...

Автор: Vavik 8.5.2009, 14:08
Цитата(Kbl4AH @ 8.5.2009,  14:03)
Vavik, а если так?
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery2.SQL.Text := 'insert into poselok (id_poselok) values (4)';
  ADOQuery2.ExecSQL;
  ADOQuery2.SQL.Text := 'commit'; 
  ADOQuery2.ExecSQL;
  ADOQuery1.Refresh;
  ADOQuery1.Last;
end;

Ну через запрос я вот так делал 
Код

ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('insert into poselok (id_poselok, "Название") values ('''+ edit1.Text +''','''+ edit2.Text +''')');
ADOQuery1.ExecSQL;

Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

Автор: Kbl4AH 8.5.2009, 14:15
Цитата(Vavik @  8.5.2009,  15:08 Найти цитируемый пост)
Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

чтобы вставить запись в таблицу хватит только одной пары поле/значение...
а уже с автоматическим редактированием у тебя вроде проблем нет...

Автор: Vavik 8.5.2009, 14:30
Цитата(Kbl4AH @ 8.5.2009,  14:15)
Цитата(Vavik @  8.5.2009,  15:08 Найти цитируемый пост)
Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

чтобы вставить запись в таблицу хватит только одной пары поле/значение...
а уже с автоматическим редактированием у тебя вроде проблем нет...

Всмысли ?  smile 

Автор: JSBax 8.5.2009, 14:40
Цитата

Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

а если пробовать сделать не через 24 эдита, а через стринггрид, который ты сможешь редактировать, и после редактирования при помощи запроса записать в базу.

Автор: Dmi3ev 8.5.2009, 15:19
Цитата

Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

а через запрос работает?
ты просто понять не можешь, я тебе говорю это сделать для проверки, пока я так понимаю, ты еще ни разу не вставил ничего в базу, стоит проверить, возможно ли это, и если возможно, то уже пытаться справиться с кривыми ручками... ты проверял??? ты в бд хоть раз программно что-нибудь записал???

Добавлено через 2 минуты и 48 секунд
Цитата

"Название"

можешь поменять название у этого поля, просто меня напрягает, что по-русски написано, два поля так, одно так.
чем ты руководствуешься? сделай единообразно... все по англ.

Автор: Vavik 8.5.2009, 15:29
Цитата(Dmi3ev @ 8.5.2009,  15:19)
Цитата

Чтобы вбить в этот запрос значения нужны 2 эдита, а для запросы с другой таблицей, нужно 24, неудобно...

а через запрос работает?
ты просто понять не можешь, я тебе говорю это сделать для проверки, пока я так понимаю, ты еще ни разу не вставил ничего в базу, стоит проверить, возможно ли это, и если возможно, то уже пытаться справиться с кривыми ручками... ты проверял??? ты в бд хоть раз программно что-нибудь записал???

Да, я же сказал через запросы Бд без проблем редактируется. И добавлял и удалял и изменял.

Автор: Dmi3ev 8.5.2009, 15:31
Цитата

Да, я же сказал через запросы Бд без проблем редактируется. И добавлял и удалял и изменял. 

программно? или в самой БД? ты этого до сих пор не сказал...
Поле переименовал?

Автор: Vavik 8.5.2009, 15:34
Цитата(Dmi3ev @ 8.5.2009,  15:31)
Цитата

Да, я же сказал через запросы Бд без проблем редактируется. И добавлял и удалял и изменял. 

программно? или в самой БД? ты этого до сих пор не сказал...
Поле переименовал?

Да програмно, переименовал.

Автор: Dmi3ev 8.5.2009, 15:34
а еще почему для такого варианта, как ты написал
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

тебе не нужно 24 едита, а для того чтобы через запрос сделать нужно???
ЗЫ
То что ты делаешь через компоненты можно сделать через запрос, причем разницы никакой в плане того, что если делать так то нужно 24 едита, а если делать так то не нужно...

Добавлено через 2 минуты и 45 секунд
давай по порядку все
1) какие типы у полей
2) код, который ты используешь для того чтобы добавилось че-то на данный момент...

Автор: Vavik 8.5.2009, 15:48
Цитата(Dmi3ev @ 8.5.2009,  15:34)
а еще почему для такого варианта, как ты написал
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;

тебе не нужно 24 едита, а для того чтобы через запрос сделать нужно???
ЗЫ
То что ты делаешь через компоненты можно сделать через запрос, причем разницы никакой в плане того, что если делать так то нужно 24 едита, а если делать так то не нужно...

Ну можно сделать 24 таких строчки ADOquery1.FieldByName('id_poselok').asString:= '4';    smile 
А ещё лучше, чтобы название поля, бралось и помещалось сюда ADOquery1.FieldByName('id_poselok').asString:= '4'; при нажатии на принадлежащую этому полю ячейку.
Короче, проще говоря, я хочу делать, то что делает DBNavigator/

А если делать через запрос
Query1.SQL.add('insert into poselok ("Номер", "Название") values ('''+ edit1.Text +''','''+ edit2.Text +''')');
То я не знаю, как вбить в Values 24 значения, а потом поменять таблицы и всего 2.

Цитата(Dmi3ev @ 8.5.2009,  15:34)

давай по порядку все
1) какие типы у полей
2) код, который ты используешь для того чтобы добавилось че-то на данный момент...


Ну чего мне все таблицы со всеми полями перечислять) 
1)Номер(Integer), Название(character varying(64))
2)Я пока что ничего не использую) я выбираю или через запрос типа
Код

Query1.SQL.Clear;
Query1.SQL.add('insert into poselok (id_poselok, "Íàçâàíèå") values ('''+ edit1.Text +''','''+ edit2.Text +''')');
Query1.ExecSQL;

Или таким способом
Код

ADOquery1.Append;
ADOquery1.Edit;
ADOquery1.FieldByName('id_poselok').asString:= '4';
ADOquery1.post;


Автор: Dmi3ev 8.5.2009, 15:58
Цитата

Короче, проще говоря, я хочу делать, то что делает DBNavigator/

Код

ADOQuery1.Edit;
ADOQuery1.FieldByName('f1').AsString:=DBGrid1.Columns.Items[0].Field.AsString;
ADOQuery1.FieldByName('f2').AsString:=DBGrid1.Columns.Items[1].Field.AsString;
ADOQuery1.Post;

пишешь этот код на кнопку, только поля по своему называешь, и соответственно в Items[] индекс ставишь нужный
так вот далее запускаешь
нажимаешь на дбгрид, после этого нижимаешь стрелочку вниз ,появляется строка, ты туда записываешь новые данные, потом нажимаешь на кнопку, все... я написал ADOQuery1.Edit;, тк если он не переводит в режим редактирования, он открывает на запись все это дело...
должно работать
давай, пробуй быстрей...

Добавлено через 1 минуту и 51 секунду
индексы в Items[] ставишь, у первого поля 0, у второго 1, у третьего 2, думаю понятно...
зы
должно работать, хотя я в дельфи не рублю )))

Автор: Vavik 8.5.2009, 16:07
Цитата(Dmi3ev @ 8.5.2009,  15:58)
Цитата

Короче, проще говоря, я хочу делать, то что делает DBNavigator/

Код

ADOQuery1.Edit;
ADOQuery1.FieldByName('f1').AsString:=DBGrid1.Columns.Items[0].Field.AsString;
ADOQuery1.FieldByName('f2').AsString:=DBGrid1.Columns.Items[1].Field.AsString;
ADOQuery1.Post;

пишешь этот код на кнопку, только поля по своему называешь, и соответственно в Items[] индекс ставишь нужный
так вот далее запускаешь
нажимаешь на дбгрид, после этого нижимаешь стрелочку вниз ,появляется строка, ты туда записываешь новые данные, потом нажимаешь на кнопку, все... я написал ADOQuery1.Edit;, тк если он не переводит в режим редактирования, он открывает на запись все это дело...
должно работать
давай, пробуй быстрей...

Добавлено @ 16:00
индексы в Items[] ставишь, у первого поля 0, у второго 1, у третьего 2, думаю понятно...
зы
должно работать, хотя я в дельфи не рублю )))

Есть такая проблема, когда я ввёл в первом поле значение, перехожу на второе и то что ввёл в первом сбрасывается, на то что было) Вообщем вроде не работает так.



Автор: Dmi3ev 8.5.2009, 16:13
Цитата

И значения в эдит не заносились.
А ещё есть такая проблема, когда я ввёд в первом поле значение, перехожу на второе и то что ввёл в первом сбрасывается, на то что было) Вообщем вроде не работает так.

ууууу
короче слушай сюда:
пшешь код
Код

ADOQuery1.Edit;
ADOQuery1.FieldByName('id1').AsString:=DBGrid1.Columns.Items[0].Field.AsString;
ADOQuery1.FieldByName('poselok1').AsString:=DBGrid1.Columns.Items[1].Field.AsString;
ADOQuery1.FieldByName('name1').AsString:=DBGrid1.Columns.Items[2].Field.AsString;
ADOQuery1.Post;

этот код пишется на нажатие кнопки! поменяй названия полей, на те которые у меня (временно)
далее
запускаешь прогу
нажимаешь на дбгрид, чтобы он актвным стал
нажимаешь стрелочку вниз, появляется поле, там ты пишешь что-то, потом нажимаешь кнопку
все!
больше никаких собственных действий, ничего не надо...

Добавлено через 1 минуту и 49 секунд
прямо все копируй отсюда, даже названия полей не пиши, а копируй отсюда...

Автор: Vavik 8.5.2009, 16:22
Цитата(Dmi3ev @ 8.5.2009,  16:13)
Цитата

И значения в эдит не заносились.
А ещё есть такая проблема, когда я ввёд в первом поле значение, перехожу на второе и то что ввёл в первом сбрасывается, на то что было) Вообщем вроде не работает так.

ууууу
короче слушай сюда:
пшешь код
Код

ADOQuery1.Edit;
ADOQuery1.FieldByName('id1').AsString:=DBGrid1.Columns.Items[0].Field.AsString;
ADOQuery1.FieldByName('poselok1').AsString:=DBGrid1.Columns.Items[1].Field.AsString;
ADOQuery1.FieldByName('name1').AsString:=DBGrid1.Columns.Items[2].Field.AsString;
ADOQuery1.Post;

этот код пишется на нажатие кнопки! поменяй названия полей, на те которые у меня (временно)
далее
запускаешь прогу
нажимаешь на дбгрид, чтобы он актвным стал
нажимаешь стрелочку вниз, появляется поле, там ты пишешь что-то, потом нажимаешь кнопку
все!
больше никаких собственных действий, ничего не надо...

Добавлено @ 16:15
прямо все копируй отсюда, даже названия полей не пиши, а копируй отсюда...

Ах да, стрелочка вниз...забыл  smile 
Короче, может он что-то и добавляет, но возникает старая проблема
Цитата(Vavik @  8.5.2009,  11:51 Найти цитируемый пост)

http://ipicture.ru/


Автор: Dmi3ev 8.5.2009, 16:58
Цитата

Короче, может он что-то и добавляет, но возникает старая проблема

зайди в бд и поставь там в свойствах столбцов, что можно добавлять и пустые значения...
код рабочий, точно, я проверил даже на дельфи и бД акссесс, все работает, как часы...
дело в прокладке между стулом и компом... я в этом уверен...

Автор: Vavik 8.5.2009, 17:01
Цитата(Dmi3ev @ 8.5.2009,  16:58)
Цитата

Короче, может он что-то и добавляет, но возникает старая проблема

зайди в бд и поставь там в свойствах столбцов, что можно добавлять и пустые значения...
код рабочий, точно, я проверил даже на дельфи и бД акссесс, все работает, как часы...
дело в прокладке между стулом и компом... я в этом уверен...

Да там и так можно их добавлять.

Автор: Dmi3ev 8.5.2009, 17:43
Цитата

Да там и так можно их добавлять. 

Но почему-то он тебе на разрешает ведь так делать... Где-то косяк... Короче, я бы на твоем месте взял бы новенький АДОКвери, и попробовал бы на нем, и ДБГрид новенький, все должно работать... хз...

Автор: Kbl4AH 8.5.2009, 18:06
Dmi3ev, я тоже уже все мной сказанное проверил в новом проекте... у меня для TOracleDataSet все отрабатывает... я даж новый метод освоил - AppendRecord...
и я тоже уверен что дело в прокладке smile еще могли быть вопросы пока я не знал, что в PostgreSQL есть псевдополе и оно называется oid...
но щас у меня уже нет сил...

Vavik, попробуй все интересующие тебя вещи сделать с использованием MS Access... если с ним будет не так как ты хочешь - озвучивай... если все будет нормуль, то придецца обратиться к спецам по PostgreSQL... и отстань ты от этого DBNavigatora... все фихи мона сделать без него используя только интерфейс DBGrid, правда придецца несколько управляющих клавиш добавить... но в любом случае навигатор - не панацея... все что можно с ним - можно и без него...

Автор: Akella 8.5.2009, 18:34
Цитата(Vavik @  8.5.2009,  13:31 Найти цитируемый пост)
Да знаю я, что это такое, а что не так ? 

если бы знал, но не вызывал бы сразу редактирование после добавление. Обычно или добавление, или редактирование.

Автор: Vavik 8.5.2009, 19:32
Цитата(Kbl4AH @ 8.5.2009,  18:06)
Dmi3ev, я тоже уже все мной сказанное проверил в новом проекте... у меня для TOracleDataSet все отрабатывает... я даж новый метод освоил - AppendRecord...
и я тоже уверен что дело в прокладке smile еще могли быть вопросы пока я не знал, что в PostgreSQL есть псевдополе и оно называется oid...
но щас у меня уже нет сил...

Vavik, попробуй все интересующие тебя вещи сделать с использованием MS Access... если с ним будет не так как ты хочешь - озвучивай... если все будет нормуль, то придецца обратиться к спецам по PostgreSQL... и отстань ты от этого DBNavigatora... все фихи мона сделать без него используя только интерфейс DBGrid, правда придецца несколько управляющих клавиш добавить... но в любом случае навигатор - не панацея... все что можно с ним - можно и без него...

Я не имел ввиду редактирование с помощью навигатора,  его я просто привёл в пример, чтобы понятней было чего хочу)

Цитата(Akella @ 8.5.2009,  18:34)
Цитата(Vavik @  8.5.2009,  13:31 Найти цитируемый пост)
Да знаю я, что это такое, а что не так ? 

если бы знал, но не вызывал бы сразу редактирование после добавление. Обычно или добавление, или редактирование.

Да эт мне посоветывали,  я и попробывал, эт не я придумал. 

Цитата(Dmi3ev @ 8.5.2009,  17:43)
Цитата

Да там и так можно их добавлять. 

Но почему-то он тебе на разрешает ведь так делать... Где-то косяк... Короче, я бы на твоем месте взял бы новенький АДОКвери, и попробовал бы на нем, и ДБГрид новенький, все должно работать... хз...

Та я уже пробывал, заново проект сделать, всё равно таже фигня. Короче буду через запросы делать и в них вставлять значения как ты показал.

Всем спасибо, кто оказал помощь. Я ещё вернусь  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)