0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21

Проблемы с DBGrid

16.06.2009, 22:29. Показов 6550. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2009, 22:29
Ответы с готовыми решениями:

Проблемы при выводе в DBgrid
У меня в Table1, цена выводится со знаком вопроса: Как сделать нормальный вывод? В Database Desktop формат стоит - $(Money)

Проблемы с DBGrid
Здравствуйте уважаемые программисты форума! Возникла проблема при написании курсового проекта. В программе DBGrid каждую строчку...

DBGrid. Проблемы со связью
Здравствуйте! никак не могу справиться с проблемой. курсовая "турфирма". Хочу, чтоб при выборе страны, и нажатии на кнопку "О...

40
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.06.2009, 22:46
1.
C++
1
TCustomDBGrid::Columns::Items[index]::Width
2.
C++
1
TField:DisplayLabel
и назначай что хочешь
1
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
17.06.2009, 06:56  [ТС]
1. Я не могу понять, каким образом определить index, в самом DBGrid изначально отсутствуют столбцы, они появляются только после выполнения запроса SQl к базе Access.
C++
1
1 TCustomDBGrid::Columns::Items[index]::Width
Может быть после выполнения запроса, где-то появляются эти index?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.06.2009, 09:02
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
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
17.06.2009, 15:04  [ТС]
С размерами столбцов, вроде разобрался, просто написал функцию, которая проверяет ширину 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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
17.06.2009, 15:11
так не имя же надо полю задавать, а либо колонке Caption, либо DisplayLabel для поля
1
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
25.06.2009, 15:16  [ТС]
Извиняюсь, снова за вопрос, но в ходе работы возникла опять проблема, теперь я создал отдельную форму поместил на нее также DBGrid, DBNavigator, пытаюсь редактировать базу с его помощью. База состоит из 2-х связанных таблиц. При попытке изменения полей второй таблицы, билдер выдает ошибку: 'Недостаточно сведений ключевого поля для обновления'.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
25.06.2009, 15:30
по моему скромному опыту скажу так: ну его в топку этот навигатор... проще свой создать, он хоть будет управляемый... на счет связанных таблиц, то редактировать можно те из них, у которых представлены ключевые поля в таблице (вроде бы так, точно не помню), но лучше все же по отдельности... проще всего и, кстати, быстрее всего редактировать запросами, но для этого я обычно создаю форму редактора... а там уже можно писать все, что угодно...
1
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
25.06.2009, 17:44  [ТС]
извиняюсь опять за тупые вопросы:
1. создать самому навигатор - это хорошо, но к сожалению, я пока не знаю как...
2. можно хотябы один пример запроса редактирования, или же литературу, какую-нить...
Таблицы конечно связаны ключевыми полями
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
26.06.2009, 01:17
не про связку речь, а про их указание в select...
1) всего лишь почитайтие ман по TQuery и TTable, там все ответы
2) изучайте sql, желательно под свою базу, потому что стандарт единый, но в каждой из них есть свои особенности
0
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 07:08  [ТС]
Доброго времени суток, все в ту же тему вопрос:
Делаю поиск по таблицам, в 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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.07.2009, 09:58
а вы смотрели, какие данные туда попадают, все переменные заполнены? просто в режиме трассировки гляньте, какой вид имеет у вас запрос... в первом, например, не везде стоят звездочки в условиях с Like
0
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 11:13  [ТС]
По поводу первого запроса добавил * в like, вывел эту же строку в ShowMessage(...), выдает нормальный запрос со звездочками, где надо, но к сожалению, все-равно не ищет неполные строки( Я новичок, а как посмотреть какой вид имеет запрос?
А по поводу второго, вместо всех этих переменных, пишу обычный запрос, просто как строку, ищет нормально, но опять-таки Like не работает...
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.07.2009, 11:24
а вы эти запросы проверяли в самом аксессе? они там нормально работают?
а все значения можно увидеть в режиме пошагового выполнения программы...
0
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 12:20  [ТС]
режим пошагового запуска программы, запускается F7, а где посмотреть состояние запросов?
Первый запрос со всеми звездочками в access работает нормально, второй запрос тоже (но он выдает в билдере ошибку: Недопустимое использование Null).
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.07.2009, 12:30
stan, добавь breakpoint для AdoQuery->SQL->Text, только для своих запросов, и остановись после формирования самих запросов и глянь, что там храниться
0
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 13:29  [ТС]
Вот, теперь получилось посмотреть, вроде все нормально, если чего не проглядел:
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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.07.2009, 13:44
у тебя точно рабочие запросы, потому что мне они что-то сильно глаза режут
0
0 / 0 / 0
Регистрация: 16.06.2009
Сообщений: 21
08.07.2009, 13:57  [ТС]
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
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
08.07.2009, 14:03
вот такое работает?
что-то свежее:
spravochnik.Name = \"Стер\" OR \"Стер\" =\"\" OR spravochnik.Name like \"Стер*\
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.07.2009, 14:03
Помогаю со студенческими работами здесь

проблемы с dbgrid и excel
Суть вопроса в чём:есть таблица в экселе,её я подключил через ado и вывел с помощью dbgrid,прогрумма запускается,все данные отлично...

Проблемы с заголовков в DBgrid
Доброго времени суток. Есть код, который выводит всю таблицу в excel, кроме заголовков. Они у меня почему-то становятся одинаковыми-т.е....

проблемы с DBGrid, фильтрами и окном поиска
Всем гуру от Дельфи -хелп ми. Имеется форма с компонентом DBCRTLGrid и подключенной через BDE базой basa.dbf (на форме значит есть...

Проблемы с кодировкой при выгрузке данные в dbGrid
Здравствуйте, столкнулся с проблемой: Я использую MyDac для подключения к БД MySql и выгружаю данные в dbGrid, ну так вот после выгрузке...

Запросы: для выбранного в DBGrid сотрудника отобразить информацию в другом DBGrid
Добрый вечер! Вот какой вопрос необходимо для выбранного сотрудника в DBGrid отобразить информацию в другом DBGrid допустим об образовании....


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

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

Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru