Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизЗаполнение dbGrid Найти похожие ветки
← →
Andrick © (2004-05-25 16:47) [0]Помогите. Есть dbGrid+ MySQL. Есть апишный проект, в котором результаты запроса должны выдаваться на грид. Но заполнить грид не получается.
Table и Query не подходят - по результатам запроса грид либо виден, либо отсутствует, что через указанные компоненты реализовать не могу. Стринггрид тоже малоприятен, но рассматривался.
Поможите!!!!!
← →
Sandman25+1 (2004-05-25 16:53) [1]>по результатам запроса грид либо виден, либо отсутствует
DBGrid.Visible := Table.Active and (Table.RecordCount > 0)
← →
Andrick © (2004-05-26 17:37) [2]За видимость спасибо, но по прежнему желательно ручное заполнение dbGrid"а. А еще лучше вклиниться между связкой TAdoQuery и TDataSource (необходимо проверять кое-какие параметры и возможно, ресортировать данные в необходимый формат вывода)
← →
Vlad © (2004-05-26 17:41) [3]
> Andrick © (26.05.04 17:37) [2]
Ничего не понял.
У тебя есть TAdoQuery и TDataSource, так в чем проблема ?
Не знаешь как грид к TDataSource подключить ?
← →
Sandman25+1 (2004-05-26 17:48) [4][2] Andrick © (26.05.04 17:37)
Ручное заполнение DBGrid означает, что используется StringGrid, в цикле идет пробег по всем записям, а для каждой записи пробег по всем полям. Оно вам надо?
← →
Sandman25+1 (2004-05-26 17:51) [5]Формат вывода полей можно задавать либо в Field.OnGetText, либо в DBGrid.OnDrawColumnCell
← →
HSolo © (2004-05-26 17:53) [6]Заведите буферный DataSet в памяти (например, TClientDataSet, или что-нибудь вроде kbmMemTable, RxMemoryData...) Заполняйте его вручную чем хотите и показывайте в DBGrid-е
← →
Andrick © (2004-05-27 08:47) [7]А чем конкретно можно заполнить этот промежуточный датасет?
Все остальные варианты и ежу понятны.
Насчет ресортировки - не всегда удается создать такой Select, который полностью соответствует формату вывода в грид (используется MySQL 3.23), поэтому необходимо реорганизовывать данные, например, поднимать строки в столбцы. А непосредственно формат (в смысле данных в ячейках) менять пока не надо (это легко делается при ручном заполнении). К тому же желательна полная работоспособность грида (т.е. его обычная функциональность, как до изменения).
И как я уже говорил, ручное заполнение СтрингГрида - уже пройденный этап (и потому изничтоженный)
← →
Anatoly Podgoretsky © (2004-05-27 08:53) [8]Забыть про базы данных.
← →
HSolo © (2004-05-27 09:37) [9]>А чем конкретно можно заполнить этот промежуточный датасет?
Если это потомок TDataSet - то всем тем, с чем умеет обращаться TDataSet
>Насчет ресортировки - не всегда удается создать такой Select, который полностью соответствует формату вывода в грид (используется MySQL 3.23), поэтому необходимо реорганизовывать данные, например, поднимать строки в столбцы.
Можно в run-time создать нужные поля, потом заполнить. И сортировка у TClientDataSet и RxMemoryData есть
>желательна полная работоспособность грида (т.е. его обычная функциональность, как до изменения).
А куда ж она денется :) Или Вы хотите редактировать данные буферного dataset-а, и чтобы изменения попадали в базу? И это можно сделать - да хотя бы в обработчике AfterPost
← →
Andrick © (2004-05-28 08:44) [10]
> >А чем конкретно можно заполнить этот промежуточный датасет?
>
> Если это потомок TDataSet - то всем тем, с чем умеет обращаться
> TDataSet
А команды может кто-нибудь подсказать? Я уже недели две бьюсь - проект пишется на MySQL API и Делфи, все подключения выполняются через mysql_connect без помощи BDE, что исключает использование ЛЮБЫХ стандартных или сторонних TTable, TQuery и прочего. Единственное исключение - TAdoQuery (используется ODBC-драйвер). А любой промежуточный датасет, неважно, будет ли это TClientDataSet или его предок, требует для своего открытия заполнения либо свойства TableName, либо указания имени провайдера (последнее и используется в TADOQuery ;)))) ). Но даже вспомогательный датасет при задании имени провайдера будет работать с предоставляемыми им данными - и именно эти данные мне необходимо считать и по-своему поменять. А при закрытом датасете никакие изменения производиться не будут (((((((
Поэтому, если кто может подсказать КОМАНДЫ для заполнения изменения полей датасета (или ручного заполнения грида, без разницы), помогите. Больше ничего не нужно :)))) (все-таки, не первый год замужем, только с базами данных на таком уровне не приходилось работать)
← →
Andrick © (2004-05-28 08:50) [11]В дополнение к только что случайно прочитанному топику - я знаю разницу между датасетом и дбгридом. Фишка в том, что желательно знать именно как заполнить этот грид данными, полученными не из BDE или ODBC. В проекте ODBC может использоваться только в нескольких местах - при выдаче общих таблиц, например, а на реальные нужды проекта его возможностей недостаточно - приходится изгаляться
← →
slgeo © (2004-05-28 08:55) [12]
> Поэтому, если кто может подсказать КОМАНДЫ для заполнения
> изменения полей датасета (или ручного заполнения грида,
> без разницы), помогите. Больше ничего не нужно :)))) (все-таки,
> не первый год замужем, только с базами данных на таком уровне
> не приходилось работать)
Какие команды? Insert,Append,Edit,Delete,Post?
← →
slgeo © (2004-05-28 09:05) [13]
> А любой промежуточный датасет, неважно, будет ли это TClientDataSet
> или его предок, требует для своего открытия заполнения либо
> свойства TableName, либо указания имени провайдера (последнее
> и используется в TADOQuery
В этом вы глубоко ошибаетесь, компонента RxMemoryData,есть подобная и в пакете EhLib, хранит набор данных непосредственно в памяти и не требует никакого провайдера, также как и TClientDataSet, если он работает в локальном режиме (указано имя файла для сохранения таблицы).
← →
Andrick © (2004-06-01 12:56) [14]Спасибо за помощь:
slgeo - за подсказку о компоненте;
Sandman25+1 - за нашедшуюся подсказку совсем в другом топике (http://delphimaster.net/view/3-1085649670/).
Грид заполнился, вот только одного понять не могу - где данные? :(( Почему-то вместо данных упорно выдаются их адреса и никакие буфера или преобразования типов не помогают. Кто подскажет?
Я использую AppendRecord в следующем виде:
for I := 0 to mysql_num_fields(AMySQLRes) - 1 do // По всем полям базы
begin
buf := AMySQLRow[i]; //Считали текущее поле
Form1.MemTableEh1.SetFieldData(MemTableEh1.Fields[i], buf, false); //Другая подпрограмма тоже использовалась
end; // for
Поля инициализируются отдельно до заполнения MemTableEh1, потом идет CreateDataSet (спасибо, Sandman25+1), у уж потом указанный цикл. Для простоты в FieldsDef все поля считаю строками PChar или PAnsiChar (это соответствует возвращаемому MySQL значению. В смысле, MySQL через API любые данные возвращает как PChar). Где ошибка?
← →
Sandman25 © (2004-06-01 14:19) [15]Какого типа buf? Возможно, нужно Form1.MemTableEh1.SetFieldData(..., buf^, ...)
← →
Andrick © (2004-06-01 16:56) [16]Нет, в SetFieldData buf типа pointer. Я потом в исходниках EhLib перепроверил - он самостоятельно по указанному типу данных преобразует строки. Кстати, SetFieldData в MemTable вообще не доступен - это я его вытащил из protected в public. Окромя этого ничего не делал.
← →
Sandman25 © (2004-06-01 17:05) [17]Тогда мне непонятна строка buf := AMySQLRow[i]
Какого типа AMySQLRow?
Попробуйте buf := @AMySQLRow[i] (или @AMySQLRow[i][1], если это массив строк).
← →
Andrick © (2004-06-01 17:09) [18]> Тогда мне непонятна строка buf := AMySQLRow[i]
AMySQLRow[i] - это порядковый номер указателя на строку со значением поля.
AMySQLRow - грубо говоря, массив из значений PChar.
← →
Sandman25 © (2004-06-01 17:14) [19]"указатель на строку"?
AMySQLRow: array ... of PString?
или все-таки array of string?
Если последнее, то нужно @AMySQLRow[i][1]
← →
Andrick © (2004-06-01 17:16) [20]AMySQLRow : array of PChar
← →
Sandman25 © (2004-06-01 17:19) [21]И что мы увидим при ShowMessage(AMySQLRow[0])?
← →
Andrick © (2004-06-01 17:23) [22]Не знаю, не пробовал. Знаю, что кусок программы
var buf: string;
begin
buf := AMySQLRow[0]^
end;
выдает именно то, что нужно, а именно, строку с данными, а не адрес.
← →
Sandman25 © (2004-06-01 17:25) [23]Запустите вот это. Тогда поймете, почему я спрашиваю.
procedure TForm1.FormCreate(Sender: TObject);
var p: pchar;
s: string;
begin
s := "1234";
p := @s[1];
showmessage(p);
s := p^;
showmessage(s);
end;
← →
Andrick © (2004-06-01 17:28) [24]Прямо сейчас не могу - я дома уже. Но суть понял - похоже, в случае с PChar нужно искусственно преобразовать адрес. Так?
Не пойму, зачем :((((((
← →
Sandman25 © (2004-06-01 17:30) [25]Не совсем так.
s := "1234";
p := @s[1];
showmessage(p); // выдает 1234
showmessage(p^); // выдает 1
поэтому [22] Andrick © (01.06.04 17:23) нам мало помогает. Нужно узнать, что же находится в AMySQL[0], причем полностью, без ^
← →
Andrick © (2004-06-01 17:36) [26]При пошаговом на [22] Andrick © (01.06.04 17:23) точно выдает строку полностью - проверял, т.е.
buf := AMySQL[0]
buf присваивается абсолютно правильно. И еще. Мой дельфин постоянно ругается на строки, не позволяя присвоить String в AnsiString и т.п. К чему бы это? (Последний раз со строками работал еще в приснопамятном TP, извините)
← →
Sandman25 © (2004-06-01 17:46) [27]что-то мы не туда рулим, ИМХО. Как описаны параметры MemTableEh1.SetFieldData?
Насчет строк - проверьте, что стоит опция Project/Options/Compiler/Huge Strings и что нет директивы $H-
← →
Andrick © (2004-06-01 17:50) [28]Huge string включена - факт. Директивы тоже точно нет.
А вот описание параметров - SetFieldData (Field: TField, buf: pointer [, NativeFofmat: boolean] ). По-моему так. Точнее узнаю только завтра - дома к компу почти не подхожу и проект с собой gjnjve не забираю
← →
Sandman25 © (2004-06-01 17:54) [29][28] Andrick © (01.06.04 17:50)
Тогда вроде бы должно работать. Ведь buf указывает на данные, судя по Вашим ответам. Может, данные неверно отображаются?
PS. Через 10 минут я тоже домой сваливаю
← →
Andrick © (2004-06-02 06:15) [30]Нашел я ошибку, причем не у себя. В исходниках MemTableEh есть процедура SetFieldData, а в ней спрятана процедура
procedure BufferToVar(var Data: Variant);
Так вот, внутри этой процедуры пропущен признак данных, т.е. стоитbegin
case Field.DataType of
ftString, ftFixedChar, ftGuid:
Data := String(PChar(Buffer));
вместоbegin
case Field.DataType of
ftString, ftFixedChar, ftGuid:
Data := String(PChar(Buffer^));
Такие вот пироги.
Единственное, что пока не работает - AppendRecord, приходится идти через огороды
← →
Sandman25 © (2004-06-02 08:55) [31][30] Andrick © (02.06.04 06:15)
Я уже начал подозревать, что глюк действительно связан с компонентом. С нестандартными компонентами всегда есть шанс нарваться на неприятность. Хорошо, что хоть исходники есть.
← →
Andrick © (2004-06-02 09:57) [32]А с AppendRecord поможете? Достали огороды
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.031 c