Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/27: Рейтинг темы: голосов - 27, средняя оценка - 4.67
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
1

Проблемы с DBGrid

16.06.2009, 22:29. Просмотров 4947. Ответов 40
Метки нет (Все метки)

Доброго времени суток, я новичок, у меня возникли следующие проблемки:
На форме имеются ADOConnection, ADOQuery, DataSource, DBGrid
Соответственно ADOConnection настраиваю на базу данных Access, ADOQuery на ADOConnection, а DataSource на ADOQury. Соответственно DBGrid на DataSource.
При создании формы, пишу запрос на вывод таблиц из Access:
C++
1
ADOQuery1->SQL->Add("SELECT spravochnik.[Name], spravochnik.[FName], spravochnik.[SName], spravochnik.[Org], data.[Job], data.[Division], data.[GNumber], data.[CNumber], data.[SNumber] FROM spravochnik LEFT JOIN data ON spravochnik.[GNumber]=data.[GNumber] ");
Таблица выводится, все хорошо, но вот только есть пара проблем:
1. Размер столбцов слишком большой, все столбцы не влезают в ширину окна...
2. Названия столбцов в Access'е я сделал на англ. языке, для более простого и корректного (в плане кодировки) написания запросов, и в DBGrid они отображаются тоже на англ. языке, хотелось бы на русском...
Если не составит труда, будьте добры, кто знает ответ...
P.S. Если необходимо могу отправить проект.
P.P.S. Заранее благодарю за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2009, 22:29
Ответы с готовыми решениями:

Проблемы при выводе в DBgrid
У меня в Table1, цена выводится со знаком вопроса: Как сделать нормальный...

[C++ builder XE] DBGrid. Удаление/добавление/изменение БД mysql через DBGrid
Здравствуйте! Возможно тема заезженная, но не чего путнего не нашел(может...

Добавление записи в DBGrid и получение записи в DBGrid Другой формы
К проекту подключена Access .mdb БД. Имеется 2 формы. На обоих формах есть...

DBGrid
Ребзя есть вопрос к вам!! Помогите как в DBGride Убрать вообще выделение...

DBGRID
НЕОБХОДИМО ЧТОБ ПРИ НАЖАТИИ НА ПОЛЕ ДБ ГРИД ИНФОРМАЦИЯ ЗАНПАСИЛАСЬ В ЭДИТ...

40
oxotnik
1625 / 1098 / 75
Регистрация: 21.08.2008
Сообщений: 4,619
Записей в блоге: 1
16.06.2009, 22:46 2
1.
C++
1
TCustomDBGrid::Columns::Items[index]::Width
2.
C++
1
TField:DisplayLabel
и назначай что хочешь
1
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
17.06.2009, 06:56  [ТС] 3
1. Я не могу понять, каким образом определить index, в самом DBGrid изначально отсутствуют столбцы, они появляются только после выполнения запроса SQl к базе Access.
C++
1
1 TCustomDBGrid::Columns::Items[index]::Width
Может быть после выполнения запроса, где-то появляются эти index?
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
17.06.2009, 09:02 4
stan, вообще структуру грида вы можете создать сами с помощью колонок, что-то вроде такого:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TMainForm::SetField()
{
  TColumn *Column;
  for(int i = 0; i < DataSource1->DataSet->FieldCount - 4; i++){
    Column = DBGrid1->Columns->Add();
    Column->Field = DataSource1->DataSet->Fields->Fields[i];
    Column->Title->Caption = IInterface->GridInfo->Strings[i];
    Column->Alignment = taCenter;
  }
}
1
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
17.06.2009, 15:04  [ТС] 5
С размерами столбцов, вроде разобрался, просто написал функцию, которая проверяет ширину DBGrid, и делит на количество столбцов:
C++
1
2
3
4
5
6
int widthcolumn;
widthcolumn = (DBGrid->Width)/(DBGrid->FieldCount);
for(int i = 0; i < (DBGrid->FieldCound); i++)
{
DBGrid->Columns->items[i]->Width = widcol;
}
По ширине столбцов, все становится вроде как нормально.
Только вот вопрос имен столбцов, остается открытым, имена переносятся из базы Access, а они там по-английски.
Пытался присвоить:
C++
1
DBGrid->Fields[1]->Name = "АБВГД";
Но билдер выдает ошибку.
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
17.06.2009, 15:11 6
так не имя же надо полю задавать, а либо колонке Caption, либо DisplayLabel для поля
1
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
25.06.2009, 15:16  [ТС] 7
Извиняюсь, снова за вопрос, но в ходе работы возникла опять проблема, теперь я создал отдельную форму поместил на нее также DBGrid, DBNavigator, пытаюсь редактировать базу с его помощью. База состоит из 2-х связанных таблиц. При попытке изменения полей второй таблицы, билдер выдает ошибку: 'Недостаточно сведений ключевого поля для обновления'.
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
25.06.2009, 15:30 8
по моему скромному опыту скажу так: ну его в топку этот навигатор... проще свой создать, он хоть будет управляемый... на счет связанных таблиц, то редактировать можно те из них, у которых представлены ключевые поля в таблице (вроде бы так, точно не помню), но лучше все же по отдельности... проще всего и, кстати, быстрее всего редактировать запросами, но для этого я обычно создаю форму редактора... а там уже можно писать все, что угодно...
1
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
25.06.2009, 17:44  [ТС] 9
извиняюсь опять за тупые вопросы:
1. создать самому навигатор - это хорошо, но к сожалению, я пока не знаю как...
2. можно хотябы один пример запроса редактирования, или же литературу, какую-нить...
Таблицы конечно связаны ключевыми полями
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
26.06.2009, 01:17 10
не про связку речь, а про их указание в select...
1) всего лишь почитайтие ман по TQuery и TTable, там все ответы
2) изучайте sql, желательно под свою базу, потому что стандарт единый, но в каждой из них есть свои особенности
0
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 07:08  [ТС] 11
Доброго времени суток, все в ту же тему вопрос:
Делаю поиск по таблицам, в 1-й таблице пишу запрос:
C++
1
Form2->ADOQuery1->SQL->Add("WHERE (" + nametabl1 + "." + namefield1 + " = \"" + searchname + "\" OR \"" + searchname + "\" =\"\" OR " + nametabl1 + "." + namefield1 + " like \"" + searchname + "*\") AND (" + nametabl2 + "." + namefield6 + " = \"" + searchdivision + "\" OR \"" + searchdivision + "\" = \"\" OR " + nametabl2 + "." + namefield6 + " like \"" + searchdivision + "\") AND (Cstr(" + nametabl1 + "." + namefield7 + ") = \"" + searchgnumber + "\" OR \"" + searchgnumber + "\" = \"\" OR CStr(" + nametabl1 + "." + namefield7 + ") like \"" + searchgnumber + "\") ");
Поиск по этой таблице работает практически нормально, единственное, когда вводится, например неполное имя поиск ничего не выдает, хотя есть оператор "like".
А по другой таблице пишу:
C++
1
Form2->ADOQuery1->SQL->Add("WHERE(" + nametabl1 + "." + namefield1 + " = \"" + searchname + "\" OR \"" + searchname + "\" =\"\" OR " + nametabl1 + "." + namefield1 + " like \"" + searchname + "*\") AND (Cstr(" + nametabl1 + "." + namefield2 + ") = \"" + searchgnumber + "\")");
пишет: "Недопустимое использование Null".
P.S. Заранее благодарю за ответ...
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
08.07.2009, 09:58 12
а вы смотрели, какие данные туда попадают, все переменные заполнены? просто в режиме трассировки гляньте, какой вид имеет у вас запрос... в первом, например, не везде стоят звездочки в условиях с Like
0
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 11:13  [ТС] 13
По поводу первого запроса добавил * в like, вывел эту же строку в ShowMessage(...), выдает нормальный запрос со звездочками, где надо, но к сожалению, все-равно не ищет неполные строки( Я новичок, а как посмотреть какой вид имеет запрос?
А по поводу второго, вместо всех этих переменных, пишу обычный запрос, просто как строку, ищет нормально, но опять-таки Like не работает...
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
08.07.2009, 11:24 14
а вы эти запросы проверяли в самом аксессе? они там нормально работают?
а все значения можно увидеть в режиме пошагового выполнения программы...
0
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 12:20  [ТС] 15
режим пошагового запуска программы, запускается F7, а где посмотреть состояние запросов?
Первый запрос со всеми звездочками в access работает нормально, второй запрос тоже (но он выдает в билдере ошибку: Недопустимое использование Null).
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
08.07.2009, 12:30 16
stan, добавь breakpoint для AdoQuery->SQL->Text, только для своих запросов, и остановись после формирования самих запросов и глянь, что там храниться
0
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 13:29  [ТС] 17
Вот, теперь получилось посмотреть, вроде все нормально, если чего не проглядел:
1.
SQL
1
2
3
4
5
6
"SELECT spravochnik.[Name], spravochnik.[FName], spravochnik.[SName], spravochnik.[Org], data.[Job], data.[Division], data.[GNumber], data.[CNumber], data.[SNumber] 
FROM spravochnik LEFT JOIN data ON spravochnik.[GNumber]=data.[GNumber] 
\r\nWHERE (spravochnik.Name = \"Стер\" OR \"Стер\" =\"\" OR spravochnik.Name like \"Стер*\") 
AND (data.Division = \"Ц\" OR \"Ц\" = \"\" OR data.Division like \"Ц*\") 
AND (Cstr(spravochnik.GNumber) = \"324\" OR \"324\" = \"\" OR CStr(spravochnik.GNumber) like \"324*\") 
\r\nORDER BY spravochnik.Name\r\n"
2.
SQL
1
2
3
"SELECT Directions.Direction, Directions.Kod, Directions.Lsr, Directions.Switch, Directions.Pbx, Directions.ICNum FROM Directions 
\r\nWHERE (Directions.Direction = \"Москва\" OR \"Москва\" =\"\" OR Directions.Direction like \"Москва*\") AND (Cstr(Directions.Kod) = \"700\")
\r\nORDER BY Directions.Direction\r\n"
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
08.07.2009, 13:44 18
у тебя точно рабочие запросы, потому что мне они что-то сильно глаза режут
0
stan
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 13:57  [ТС] 19
1-й запрос работает, но только вот с ним проблема с оператором like, он просто не работает...
А со вторым сложнее билдер выдает ошибку "Недопустимое использование NULL"
Вот полностью код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
void __fastcall TForm1::ASearchExecute(TObject *Sender)
{
 AnsiString nametabl1;
 AnsiString nametabl2;
 AnsiString namefield1;
 AnsiString namefield2;
 AnsiString namefield3;
 AnsiString namefield4;
 AnsiString namefield5;
 AnsiString namefield6;
 AnsiString namefield7;
 AnsiString namefield8;
 AnsiString namefield9;
 AnsiString searchname;
 AnsiString searchdivision;
 AnsiString searchgnumber;
 
 switch (PageControl1->ActivePageIndex){
 case 0 :{ nametabl1 = "spravochnik";
           nametabl2 = "data";
           namefield1 = "Name";
           namefield2 = "FName";
           namefield3 = "SName";
           namefield4 = "Org";
           namefield5 = "Job";
           namefield6 = "Division";
           namefield7 = "GNumber";
           namefield8 = "CNumber";
           namefield9 = "SNumber";
           searchname = Edit1->Text;
           searchdivision = Edit2->Text;
           searchgnumber = Edit3->Text;
           Form2->ADOQuery1->Active = false;
           Form2->ADOQuery1->SQL->Clear();
           Form2->ADOQuery1->SQL->Add("SELECT " + nametabl1 + ".[" + namefield1 + "], " + nametabl1 + ".[" + namefield2 + "], " + nametabl1 + ".[" + namefield3 + "], " + nametabl1 + ".[" + namefield4 + "], " + nametabl2 + ".[" + namefield5 + "], " + nametabl2 + ".[" + namefield6 + "], " + nametabl2 + ".[" + namefield7 + "], " + nametabl2 + ".[" + namefield8 + "], " + nametabl2 + ".[" + namefield9 + "] FROM " + nametabl1 + " LEFT JOIN " + nametabl2 + " ON " + nametabl1 + ".[" + namefield7 + "]=" + nametabl2 + ".[" + namefield7 + "] ");
           Form2->ADOQuery1->SQL->Add("WHERE (" + nametabl1 + "." + namefield1 + " = \"" + searchname + "\" OR \"" + searchname + "\" =\"\" OR " + nametabl1 + "." + namefield1 + " like \"" + searchname + "*\") AND (" + nametabl2 + "." + namefield6 + " = \"" + searchdivision + "\" OR \"" + searchdivision + "\" = \"\" OR " + nametabl2 + "." + namefield6 + " like \"" + searchdivision + "\") AND (Cstr(" + nametabl1 + "." + namefield7 + ") = \"" + searchgnumber + "\" OR \"" + searchgnumber + "\" = \"\" OR CStr(" + nametabl1 + "." + namefield7 + ") like \"" + searchgnumber + "\") ");
           Form2->ADOQuery1->SQL->Add("ORDER BY " + nametabl1 + "." + namefield1); break;}
 
 case 1 :{ nametabl1 = "Directions";
           namefield1 = "Direction";
           namefield2 = "Kod";
           namefield3 = "Lsr";
           namefield4 = "Switch";
           namefield5 = "Pbx";
           namefield6 = "ICNum";
           searchname = Edit4->Text;
           searchgnumber = Edit5->Text;
 
           Form2->ADOQuery1->Active = false;
           Form2->ADOQuery1->SQL->Clear();
           Form2->ADOQuery1->SQL->Add("SELECT " + nametabl1 + "." + namefield1 + ", " + nametabl1 + "." + namefield2 + ", " + nametabl1 + "." + namefield3 + ", " + nametabl1 + "." + namefield4 + ", " + nametabl1 + "." + namefield5 + ", " + nametabl1 + "." + namefield6 + " FROM " + nametabl1 + " ");
           Form2->ADOQuery1->SQL->Add("WHERE(" + nametabl1 + "." + namefield1 + " = \"" + searchname + "\" OR \"" + searchname + "\" =\"\" OR " + nametabl1 + "." + namefield1 + " like \"" + searchname + "*\") AND (Cstr(" + nametabl1 + "." + namefield2 + ") = \"" + searchgnumber + "\")");
           Form2->ADOQuery1->SQL->Add("ORDER BY " + nametabl1 + "." + namefield1); break;}
 }
 
 Form2->ADOQuery1->Active = true;
 Form2->ADOQuery1->ExecSQL();
 Form2->ShowModal();
}
Вот таким образом я ищу по таблицам, если не сожно, может кто увидит в чем проблема?
P.S. Заранее спасибо за ответ...
0
Lord_Voodoo
Супер-модератор
8609 / 2237 / 133
Регистрация: 07.03.2007
Сообщений: 10,826
Завершенные тесты: 1
08.07.2009, 14:03 20
вот такое работает?
что-то свежее:
spravochnik.Name = \"Стер\" OR \"Стер\" =\"\" OR spravochnik.Name like \"Стер*\
0
08.07.2009, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2009, 14:03

Button,DbGrid
В общем на форме разместила кнопку Button и нужно сделать так чтобы по ее...

DBGrid не обновляется
Ребят, чего-то не могу разобраться в чем может быть проблема. На второй форме...

Работа с DBgrid
Привет всем! Ребят у меня такой вопрос: как в DBGrid изменить в столбце...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru