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


Автор: AKN 25.3.2006, 12:34
Подскажите, как обратится к ячейке DBGrida и получить ее текст? нужно сделать такую вот вставку:

Код

Query1.Close;
Query1.SQL.Add('IUPDATE');
Query1.SQL.Add('sotrudniki_data');
Query1.SQL.Add('SET');
Query1.SQL.Add('(tel = ' + Edit1.Text);
Query1.SQL.Add('mob_tel =' + Edit2.Text);
Query1.SQL.Add('birsday =' + Edit3.Text);
Query1.SQL.Add('WHERE');
Query1.SQL.Add('ID = ' + ??текст первого столбца грида);
Query1.ExecSQL;



спасибо!

Автор: bas 25.3.2006, 14:25
Цитата(AKN @ 25.3.2006, 12:34 Найти цитируемый пост)
Подскажите, как обратится к ячейке DBGrida и получить ее текст

Грид данных не содержит, а только отображает , но приэтом полностью синхронизирован с набором данных.
Поэтому
Цитата(AKN @ 25.3.2006, 12:34 Найти цитируемый пост)
Query1.SQL.Add('ID = ' + ??текст первого столбца грида);

Можно смело обращаться к текущей записи грида через
DBGrid.DataSource.DataSet. а дальше все тривиально.

Автор: AKN 25.3.2006, 15:51
дело вот в чем:

Код

select 
           s.ID, 
           s.nam, 
           sd.tel, 
           sd.mob_tel,  
           sd.birsday,  
           sd.status, 
           sd.doljnost, 
           sd.date_priema
from 
sotrudniki s,
sotrudniki_data sd 
where s.id = sd.id


, теперь мне нужно заполнить данные на сотрудников (поля в таблице sotrudniki_data), я и пишу:

Код

Query1.Close;
Query1.SQL.Add('UPDATE');
Query1.SQL.Add('sotrudniki_data');
Query1.SQL.Add('SET');
Query1.SQL.Add('(tel = ' + Edit1.Text);
Query1.SQL.Add('mob_tel =' + Edit2.Text);
Query1.SQL.Add('birsday =' + Edit3.Text);
Query1.SQL.Add('WHERE');
Query1.SQL.Add('ID(таблицы куда вставляются данные) = ' + DBGrid1.DataSource.DataSet.FieldValues['ID'](АйДи сотрудника в таблице сотрудников));
Query1.ExecSQL;

а он говорит типа поле не найдено.

Просто то что мне нужно содержится в первом столбце текущей записи грида

З.Ы. таблица парадоксовская, будет на фаерберде

Автор: Vit 25.3.2006, 16:14
Как минимум так:

Код

Query1.Close;
Query1.SQL.Add('UPDATE');
Query1.SQL.Add('sotrudniki_data');
Query1.SQL.Add('SET');
Query1.SQL.Add('(tel = ' + Quotedstr(Edit1.Text));
Query1.SQL.Add('mob_tel =' + Quotedstr(Edit2.Text));
Query1.SQL.Add('birsday =' + Quotedstr(Edit3.Text));
Query1.SQL.Add('WHERE');
Query1.SQL.Add('ID = ' + Quotedstr(DBGrid1.DataSource.DataSet.FieldByName('ID').asString));
Query1.ExecSQL;


Но ошибок может быть и гораздо больше зависит от предыдущего кода и структуры таблиц

Автор: av78 25.3.2006, 16:39
а можно так, например:

Код

IBSQL1.SQL.Clear;
IBSQL1.SQL.Append('UPDATE TBL_UNIT_MEASURE SET TBL_UNIT_MEASURE.NAME= ''' + InputString + ''' WHERE TBL_UNIT_MEASURE.ID=''' + DBGrid1.Fields[0].AsString + '''');
IBSQL1.Prepare;
IBSQL1.ExecQuery;


где
DBGrid1.Fields[0].AsString

и есть обращение

Автор: AKN 25.3.2006, 22:58
Vit, на

Код

 Query1.SQL.Add('ID = '+DBGrid1.DataSource.DataSet.FieldByName('ID').asString);


ругается, говорит что полей ID не найдено. Похоже проблема в том, что у меня в обоих таблицах поле одинаково называется... Можно как-то его идентифицировать конкретнее?
На
Код

Query1.SQL.Add('ID = ' + Quotedstr(DBGrid1.DataSource.DataSet.FieldByName('ID').asString));
- тоже ругается - говорит что ошибка ввода в файл при компиляции...

Автор: Vit 27.3.2006, 16:20
Цитата(AKN @ 25.3.2006, 13:58 Найти цитируемый пост)
ругается, говорит что полей ID не найдено. Похоже проблема в том, что у меня в обоих таблицах поле одинаково называется... Можно как-то его идентифицировать конкретнее?



Нету там в запросе двух таблиц. Мой код выполняет один запрос к одной таблице 'sotrudniki_data', и вообще то что Вы делаете похоже на какую-то кашу... Приведите целиком код процедуры, скорее всего

1. Ошибки генерятся не моим кодом, а в следствии хаотичного использования компонентов
2. Сама постановка задачи "значение ячейки DBGrida" говорит о полном непонимании того как дельфи работает с базами данных. Вот тут статья:

http://vingrad.ru/ART-DELPHI-000034

читать до полного просветления



Цитата(AKN @ 25.3.2006, 13:58 Найти цитируемый пост)
тоже ругается - говорит что ошибка ввода в файл при компиляции...


А можно по английски точное сообщение об ошибке? Я за 13 лет работы с Дельфи ни разу не видел ошибки "ввода в файл"!

Боюсь что отвечая Вам на Ваши вопросы в той форме в которой они сформулированы - это борьба с ветряными мельницами. Скорее всего проблем в данных конкретных вопросах нет вовсе, проблемы гораздо проще (для меня) и гораздо сложнее (для Вас).
Моя рекомендация будет:
1. Прочитать ту статью
2. Если понятнее не станет, опубликовать код а не кусочек, будем все вместе ставить его с головы на ноги

Автор: bas 27.3.2006, 16:42
Цитата(Vit @ 27.3.2006, 16:20 Найти цитируемый пост)
Если понятнее не станет, опубликовать код а не кусочек, будем все вместе ставить его с головы на ноги

Согласен.
Куда смотрит грид и куда вставляем данные и как эти поля (ID) называються в этих источниках данных?

Автор: AKN 28.3.2006, 13:12
постановка задачи:

есть таблица

_____________________________
ID | name
_________|___________________
1 | ИВАНОВ
2 | СИДОРОВ
3 | ПЕТРОВ



есть вторая таблица (данные о сотрудниках)
_________________________________________|___________________________
ID (сотрудника из первой таблицы) | номер телефона и т.д.
|
_________________________________________|___________________________
1 | Null (эти поля еще пустые)
2 | Null
3 | Null
4 | Null


Задача: заполнить (наглядно) вторую таблицу, то есть пользователю будет предоставлена таблица, в которой в первом поле будут фамилии сотрудников, а остальные поля будут пустыми. Он заполнит нужные поля напротив сотрудника, нажмет кнопку и информация будет зафиксирована в базе данных. Проблема в том, что пользователь может заполнить поля напротив любого сотрудника, т.е. нужно узнать, какому же сотруднику будет принадлежать данная информация


например:

_________________________________________|___________________________
ID (сотрудника из первой таблицы) | номер телефона и т.д.
|
_________________________________________|___________________________
ИВАНОВ | Null (эти поля еще пустые)
СИДОРОВ | Null
ПЕТРОВ | г. Харьков


Мне нужно узать, куда же вставлять вот этот "г. Харьков", напротив какого же сотрудника?

Т. е. в результате выполнонной вставки таблица 2 стала


_________________________________________|___________________________
ID (сотрудника из первой таблицы) | номер телефона и т.д.
|
_________________________________________|___________________________
1 | Null (эти поля еще пустые)
2 | Null
3 | г. Харьков
4 | Null


Надеюсь разписанов более-менне понятно...

Автор: Tror 28.3.2006, 13:45
ну во первых ID (сотрудника из первой таблицы) во второй таблице это
никак не
ИВАНОВ, СИДОРОВ, ПЕТРОВ, а 1, 2, 3,

ИВАНОВ, СИДОРОВ, ПЕТРОВ -- это name из первой таблицы

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

Автор: sexton 28.3.2006, 13:46
Если я правильно понял - читай материалы по отношениям master-detail между таблицами.

Автор: AKN 28.3.2006, 13:52
Tror,
Цитата

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

потому что эти имена сотрудников еще будут использоваться в нескольких больших таблицах, а введение ID должно значительно уменьшить размер базы данных

Цитата

ну во первых ID (сотрудника из первой таблицы) во второй таблице это
никак не
ИВАНОВ, СИДОРОВ, ПЕТРОВ, а 1, 2, 3,
ИВАНОВ, СИДОРОВ, ПЕТРОВ -- это name из первой таблицы


ну
ошибся- там будет типа

Код

SELECT name FROM sotrudniki WHERE ID = <значение>

Автор: Vit 28.3.2006, 16:38
Цитата(AKN @ 28.3.2006, 04:12 Найти цитируемый пост)
Задача: заполнить (наглядно) вторую таблицу, то есть пользователю будет предоставлена таблица, в которой в первом поле будут фамилии сотрудников, а остальные поля будут пустыми.


Так, ответить точно не могу, потому как не знаю синтаксиса SQL Firebird, но в большинстве баз данных возможны запросы типа:

Код

Update Table1
Set t1.Field1=t2.Field1
From Table1 t1
Inner join Table2 t2 on t1.id=t2.id


Т.е. одним запросом заполняется вся таблица. Более конкретно - см. синтаксис SQL запроса Update в документации по Firebird.


Цитата(AKN @ 25.3.2006, 06:51 Найти цитируемый пост)
.Ы. таблица парадоксовская, будет на фаерберде


Мороки будет очень много по переводу, там и синтаксис SQL разный и архитектура и логика работы.



Цитата(AKN @ 28.3.2006, 04:12 Найти цитируемый пост)
Проблема в том, что пользователь может заполнить поля напротив любого сотрудника, т.е. нужно узнать, какому же сотруднику будет принадлежать данная информация


Это проблема архитектуры. Первая и вторая из приведенных вами таблиц должны быть сопоставлены по полям ID. Т.е. Иванов если он под номером 3 в первой таблице он должен идти и под номером 3 во второй таблицы. Вы не должны предоставлять пользователю возможность редактировать что угодно где угодно, и не должны давать редактировать поле ID, чтобы реализовать это вы должны:

1. Отказаться от DBGrid как метода ввода данных пользователем
2. ПОказывать пользователю форму с обычными или DB компонентами типа TEdit или TDBEdit - пусть вводит свои данные. Если использовать DB компоненты, то надо сначала позиционировать запись именно на конкретного человека и пусть заполняет, а если обычные компоненты, то по нажатию кнопки Save сохранить введенные данные под его номером.



PS. Ваши проблемы начались с того самого момента как вы поставили DBGrid на форму. Удалите его, и вы сможете наконец начать работать с базой данных по нормальному.


Автор: AKN 29.3.2006, 09:55
Vit, огромное спасибо за качественный и полный ответ. Тема закрыта. Всем спасибо.

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