Основы работы с БД

Любые обсуждения, не нарушающие правил форума.

Модератор: Модераторы

Сообщение Troublemaker » 27.04.2008 18:35:46

Vadim писал(а):TroublemakerПорядок работы стандартный. На форме:
- SdfDataset (для примера), как контейнер содержащий текстовый файл с данными.
Можете меня обсмеять, но поиск по сайту *.freepascal.org по слову sdfdataset не принес никакой осмысленной информации. Это я плохо искал?

Или я неправильно понял суть задачи?
Увы, неправильно.

Попробую снова объяснить на среднепотолочном примере.

Есть база в дбф. Тупо: одна таблица MyTable, в ней два поля: MyBool и MyInteger.

Я создал DBFDataset. Связал его с DS. DS связал с DBGrid.

Как мне объяснить гриду, какие поля MyTable в каких столбцах и в каком формате отображать? Что и куда нужно занести? Какая связь между name столбцов в гриде и именами полей, если вообще такая есть? Если ее нет, то как ее создать?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Сообщение m_guest » 27.04.2008 19:37:59

*Идете в свойства DBGrid
*Находите свойство Columns
*Щелкаете на кнопке ("три точки")
*Появляется окно редактирования свойства Columns
*Используя кнопку "Добавить", добавляете необходимое количество столбцов в таблицу
*Выделяя по очереди добавленный столбцы через Инспектор объектов настраиваете (в частности: привязать к определенному полю можно через свойство FieldName; в свойстве Title настраиваете заголовок; логические поля настраиваются через свойства ValueChecked/ValueUnchecked - по умолчанию там 1 и 0 соответственно..)
m_guest
постоялец
 
Сообщения: 193
Зарегистрирован: 14.08.2005 15:10:21

Re:

Сообщение Troublemaker » 28.04.2008 04:28:28

m_guest писал(а):*Выделяя по очереди добавленный столбцы через Инспектор объектов настраиваете (в частности: привязать к определенному полю можно через свойство FieldName
То есть, все-таки здесь я вбиваю имя поля, как оно задано у меня в datasource? Вот это мне и было непонятно.
Спасибо.

Сразу не допер, что надо бы датасет сделать активным, без этого в дропдауне fieldname для grid.columns нет списка возможных полей. Вроде элементарно, но нигде про это ни слова. :(

По поводу boolean. Как я понял, в dbgrid их можно отображать только в виде текста типа t/f? И никак (я помню про МСЕ, но речь про стандартную lcl) нельзя изобразить чекбоксом?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Vadim » 28.04.2008 06:41:55

Troublemaker писал(а):Можете меня обсмеять,...

Да чего же обсмеивать, возможно что тема по текстовым файлам, как источникам данных еще на форуме не поднималась.
Работать с этим компонентом можно так-же, как и с TDBF, только источником данных будет обычный текстовый файл, где каждое значение в строке разделено каким-нибудь разделителем (запятая, табуляция или ещё какой-нибудь символол :) )
Это довольно удобно когда переносишь данные между разными системами баз данных, например между MS SQL и Postgres, т.к. практически каждый сервер баз данных умеет выдавать набор данных после запроса в текстовый файл с разделителями и, соответственно, загружать такой файл в таблицу.
Если сервера нет, то нужно использовать дополнительный компонент типа sdfdataset, который раскладывает данный из файла по ячейкам, чтобы их удобно было брать.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Основы работы с БД

Сообщение Troublemaker » 28.04.2008 06:50:46

Vadim писал(а):возможно что тема по текстовым файлам, как источникам данных еще на форуме не поднималась.
Работать с этим компонентом можно так-же, как и с TDBF

Спасибо, я знаю, что такое csv. Сложность в том, что я нигде не могу найти описания этих компонентов, а не их обсуждение на форуме. Получается совершенно идиотская ситуация: компонент есть, но какой его параметр для чего служит - знают только разработчики. Скачал fpc-lazarus-doc-html-20080420.tar.bz2, то есть, практически свежайший хелп. Но и там ни слова.

Или, опять же, это я не там ищу, а оно где-то лежит и спокойно меня дожидается?
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Vadim » 28.04.2008 06:56:19

Troublemaker писал(а):По поводу boolean. Как я понял, в dbgrid их можно отображать только в виде текста типа t/f? И никак (я помню про МСЕ, но речь про стандартную lcl) нельзя изобразить чекбоксом?

У меня стоит Lazarus 0.9.25 и там поля типа boolean отображаются в DBGrid именно чекбоксом по умолчанию.

Добавлено спустя 3 минуты 27 секунд:
Troublemaker писал(а):Сложность в том, что я нигде не могу найти описания этих компонентов

А возможно такого описания и нету. :)
Я готовлю небольшую статейку по работе с csv-файлами именно через компонент sdfdataset. Как только будет готово, выложу её здесь.

Добавлено спустя 11 минут 59 секунд:
Для примера объект типа tsdfdataset у нас будет называться просто sdf. :)
Сначала определим тип разделителей между колонками данных:
sdf.Delimiter:=';'; //Точка с запятой
Теперь самое интересное. :) Если в первой строке файла лежат названия колонок, то заявляем об этом компоненту:
sdf.FirstLineAsSchema:=True;
если нет, тогда с первой строки у нас начинаются сразу данные:
sdf.FirstLineAsSchema:=False;
В этом случае можно необходимые колонки с названиями и типа данных объявить вручную в поле FieldDefs. Нажать на три точки рядом с названием FieldDefs и откроется широкое поле творчества. :)
Далее нужно указать название файла:
sdf.FileName:='topsecret.txt'; //Подставите своё название
Теперь открываем:
sdf.Open; //Или sdf.Active:=True
и можно работать как с обычной таблицей...
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Основы работы с БД

Сообщение Troublemaker » 28.04.2008 07:16:16

Vadim писал(а):У меня стоит Lazarus 0.9.25 и там поля типа boolean отображаются в DBGrid именно чекбоксом по умолчанию.

Насколько я понимаю, .25 - это не официальный релиз?
Впрочем, в "моем" .24 тоже отображается, аж удивился, когда первый раз сейчас увидел.

Сложность в том, что я нигде не могу найти описания этих компонентов
А возможно такого описания и нету. Я готовлю небольшую статейку по работе с csv-файлами именно через компонент sdfdataset.
М-м... речь об описаниях компонентов ВООБЩЕ. Например, при компиляции всё проходит нормально, но во время исполнения memdset ругается на то, что не поддерживается тип поля tfBytes, хотя выбрать его в свойствах очень даже можно.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Vadim » 28.04.2008 07:17:36

Если в текстовом файле данные всегда будет одной и той же структуры, то лучше всего заранее объявить типы и названия полей в FieldDefs, а в самом файле держать только данные.

Добавлено спустя 5 минут 49 секунд:
Troublemaker писал(а):Насколько я понимаю, .25 - это не официальный релиз?

Нет, отчего же - вполне официальный. Только пока ещё не релиз. :) Как будет 1.0, тогда будет релиз. :)
Troublemaker писал(а):М-м... речь об описаниях компонентов ВООБЩЕ.

Если "вообще", то можно пользоваться любой книжкой по Дельфи. Если речь идёт о каком-то специфическом компоненте, которого в Дельфи нет, тогда конечно... :) В этом случае надо смотреть либо исходник компонента (мне такой просмотр хорошо помог, когда отказался компилироваться компонент ZEOS), либо обращаться на сайт разработчика компонента за документацией.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Основы работы с БД

Сообщение Troublemaker » 28.04.2008 08:27:19

(официал) Но на офсайте (sf.net) этой версии я не вижу, хотя и знаю об ее существовании. Выложена для скачивания только .24 от 21.11.07

(описания) В хелпе от 7 дельфи нашел memdataset. Удивлен, что нет метода createtable. Ну и как с ним работать тогда? :(

(файлы) Я уже определился: входные данные будут в тупом двоично-строчном шифрованном формате, внутренняя обработка - всё тот же MemDS. Надеюсь, мне удастся понять логику его работы.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Vadim » 28.04.2008 08:53:40

На офсайте они выкладывают более-менее протестированную промежуточную версию. Все остальные чисто для тестирования, в том числе и 25-ая. Взять текущую версию можно здесь:
ftp://ftp.freepascal.org/pub/lazarus/
Там только выбрать надо для какой ОСи.
Troublemaker писал(а):В хелпе от 7 дельфи нашел memdataset. Удивлен, что нет метода createtable. Ну и как с ним работать тогда?

Вот что я нашёл прямо в исходниках FreePascal:
procedure CreateTable;
Creates the needed in-memory structures after fielddefs were added.
See testpop.pp for an example.

Таким образом, после того как Вы задали все необходимые поля в FieldDefs, вызываете процедуру CreateTable и получаете готовыую табличку в памяти. Примерчик есть.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Основы работы с БД

Сообщение alexs » 28.04.2008 08:56:57

Attid писал(а):Troublemaker писал(а):можно ли в dbgrid отображать значения boolean-полей в виде чекбоксов - вкл/выкл?готового решения нет, ручками можно.

Attid - Не вводи в заблуждение - DBGrid умееет в виде чекбоксов показывать колонки - для этого в колонке необходимо смотреть свойство ButtonStyle - конкретно cbsCheckboxColumn.

Troublemaker
Для начала изучения пойдёт и dbf. Но если будет нужно изучать что либо реляционное - то лучше конечно сразу ставить какой либо сервер.
а для простейшего примера:
на форму ложиш TDbf
у неё в свойстве TableName указываеш исползуемый dbf-файл
потом на форму ложиш TDatasource
у него указываеш DataSet в твой TDbf
после этого кидай на форму лубой визуальный контрол - тот же DBGrid и указывай уже у него Datasource в положенный тобой Datasource.
чтобы всё это заработало у TDbf Active выставляй в true.

А вобще по работе с БД подойдёт любой учебник из дельфи. В инете их полно. только смотри особенности используемых тобой компонент доступа к данным (в примере это TDbf).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Основы работы с БД

Сообщение Troublemaker » 28.04.2008 10:51:10

alexs писал(а):DBGrid умееет в виде чекбоксов показывать колонки - для этого в колонке необходимо смотреть свойство ButtonStyle - конкретно cbsCheckboxColumn.
Гыть! Спасибо.
А теперь дайте, пожалуйста, ссылку на источник, где расписаны все возможные варианты этого свойства с примерами? Список значений не надо - я его могу посмотреть, но не верю, что все доходили до него методом научного тыка.

А вобще по работе с БД подойдёт любой учебник из дельфи. В инете их полно. только смотри особенности используемых тобой компонент доступа к данным (в примере это TDbf).

Пример к TDBF я уже смотрел. И выше написал, что отказался от него, сейчас хочу иметь дело только с таблицами в памяти. Писать самостоятельную обработку длинных списков и реляций между ними как-то не хочется. Как я понимаю, у меня есть только два варианта:

1. играть со всё тем же memdataset (да где ж его описание? хотя бы список методов и свойств? хелп по дельфи-7 говорит, что .createtable есть только у TTable, но не у memds)

2. что-то пробовать сделать с коллекциями, тем более, что именно так, коллекциями, данные и будут организованы: коллекция - модуль (2 вида) - данные модуля (вопросы/здания или же теория) - ответы к вопросам.

Однако использование подобия РСУБД позволит здорово сэкономить память за счет (забыл слово - когда в базе все данные хранятся минимально необходимое количество раз, а всё повторящееся выносится в связанные справочники).
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Re: Основы работы с БД

Сообщение Attid » 28.04.2008 11:04:24

alexs писал(а):Attid - Не вводи в заблуждение - DBGrid умееет в виде чекбоксов показывать колонки - для этого в колонке необходимо смотреть свойство ButtonStyle - конкретно cbsCheckboxColumn.

я ничаянно =) все равно настаиваю что в данной задаче БД как собаке пятая лапа
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Re: Основы работы с БД

Сообщение Vadim » 28.04.2008 11:08:08

Troublemaker писал(а):А теперь дайте, пожалуйста, ссылку на источник, где расписаны все возможные варианты этого свойства с примерами?

Экий Вы капризный, право слово. :) В хелпе Дельфи есть, кроме значения cbsCheckboxColumn, и в книгах по работе Дельфи с БД.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Основы работы с БД

Сообщение Troublemaker » 28.04.2008 11:28:37

Attid писал(а):
alexs писал(а):Attid - Не вводи в заблуждение - DBGrid умееет в виде чекбоксов показывать колонки - для этого в колонке необходимо смотреть свойство ButtonStyle - конкретно cbsCheckboxColumn.

я ничаянно =) все равно настаиваю что в данной задаче БД как собаке пятая лапа

Вот здесь я давал ссылку на черновик диплома.

Для обмена данными БД действительно не нужна. Но для внутренней работы, уверен, самое то. Если вас не затруднит глянуть мою писанину, то, возможно, вы сможете подсказать более приемлемый вариант.

Тупым поиском по всем файлам (FAR рулит "нипадецки") нашел /lazarus/docs/html/lcl/grids/howtousegrids.html... распечатал, свернул в трубочку, сижу, вкуриваю :)

Добавлено спустя 20 часов 11 минут 51 секунду:
Вроде что-то начинает получаться.

Сейчас вот какая заморочка. Создал и связал датасет, датасорс и грид. Поля видны, булево поле в автоматическом режиме показано как чекбокс, количество записей выводится правильно и меняется при добавлении/удалении посредством DBNavigator-a

mds:TMemDataset

Код: Выделить всё
procedure TMDSForm.FormCreate(Sender: TObject);
var a,b:byte;
begin
  //mds.CreateTable;
  mds.Open;
  b:=mds.FieldCount;
  StaticText1.Caption:=concat('[',IntToStr(b),']'); //показывает тройку - три поля в датасете, как и есть
  for a:=0 to b-1 do begin
      with StaticText1 do Caption:=concat(Caption,'[',mds.Fields.Fields[a].Name,']');
  end;
  for a:=1 to 20 do begin //создаем 20 записей в датасете
      mds.Append;
      mds.SetFields([true,chr(Random(27)+65),Random(10)]); //закомментированные строчки ниже тоже работают
      //mds.FieldValues['b1']:=Random(2)-1; //такой рандом даст значения от -1 до 0 включительно, это булево поле
      //mds.FieldValues['int1']:=Random(10);
      //mds.FieldValues['s1']:=chr(Random(27)+65); //произвольная буква латинского алфавита
      mds.Post;
  end;
  DBGrid1.Refresh;
end;


Код: Выделить всё
procedure TMDSForm.FormPaint(Sender: TObject); //обновление при перерисовке
var a,b:byte;
begin
     STRecordCount.Caption:=IntToStr(mds.RecordCount); //тоже статиктекст, показывает правильное кол-во записей в сете
      b:=mds.FieldCount;
      StaticText1.Caption:=concat('[',IntToStr(b),']');
      for a:=0 to b-1 do begin
     with StaticText1 do
         Caption:=concat(Caption,'[',mds.Fields.Fields[a].Name,']','[',mds.Fields[a].Name,']');
      end;
end;



Всё бы ничего, но вот только грид рисуется пустым и не дает возможности редактировать, а statictext1 во второй процедуре выглядит как "[3][][][][][][]", то есть, имена полей не читаются. Куда же они делись, если в проекте они четко есть и видны во всех дропбоксах, где должны быть видны.

На что надо обратить внимание, где может быть ошибка? Полные "исходники" проекта см. в аттаче.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Troublemaker
постоялец
 
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток

Пред.След.

Вернуться в Потрепаться

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru