Получить кол-во записей в таблице SQLite и др.

Вопросы программирования и использования среды Lazarus.

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

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 16.11.2015 17:17:35

Сережа писал(а):В моем случае будет выглядеть так?
Null = 0
Not null = 1

Выбрать сразу запросом нужные значения:
Код: Выделить всё
select
  case when aaa.number is null then 0 else 1 end
from
  aaa

Сережа писал(а):Белое поле...а если нажать то (memo) видно

Поставить в колонке ReadOnly:=true
Ну и ButtonStyle:=cbsNone

Достаточно просто вместо написания кучи кода...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 16.11.2015 20:48:22

alexs писал(а):select
  case when aaa.number is null then 0 else 1 end
from
  aaa

увы не смог осилить эту запись на свой лад...слишком мало знаний видимо
силами гугла накопал некоторый код, адаптировал для себя, НО в результате получаю все что хотел да только строго не в той колонке где надо, а во всех остальных =))
Код: Выделить всё
procedure TMainForm.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
         with RxDBGrid1.Columns[7] do begin
       if RxDBGrid1.datasource.dataset.fieldbyname('Img_file').value = null then begin
       ImageList1.Draw(RxDBGrid1.Canvas,Rect.Left+2,Rect.Top, 0);
       end
       else
        ImageList1.Draw(RxDBGrid1.Canvas,Rect.Left+2,Rect.Top, 1) ;
     end;
end;

Вроде и написал что с 7й колонкой работаю...а чет все строго наоборот вышло... :oops:
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Little_Roo » 16.11.2015 21:07:53

Сережа писал(а):Вроде и написал что с 7й колонкой работаю.

Нумерация идет с 0
RxDBGrid1.Columns[7-1]
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 639
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 16.11.2015 21:37:56

Little_Roo писал(а):RxDBGrid1.Columns[7-1]

нее, тогда она рисовала бы на один столбец правее
а тут, из 7 столбцов (мне нужно в 7м) таблицы, рисует в каждом, кроме 7го =)
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 17.11.2015 09:42:33

Вы жестоки :-)
Зачем же во всех колонках рисовать???
RxDBGrid.OnDrawColumnCell - событие вызывается во время отрисовки КАЖДОЙ колонки.
Вам либо надо проверять что событие вызвано для вашей колонки через параметр Column
Либо (что проще) - посмотреть в сторону события OnDrawColumnCell у самой колонки. Оно будет гарантированно вызваться только для указанного столбца.

PS
Хотя я всё же рекомендую разобраться с запросом - будет проще.
http://clients.intelvps.ru/knowledgebas ... icle&id=17 - вот ещё пример на case
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 17.11.2015 12:42:35

С запросом не ясно совсем..добавил отдельный sqlquery, там попытался записать запрос как советовали...не пошоо...ошибки... Мне же надо проверять есть ли что то в поле или там null, поле типа блоб, туда я гружу фотки, а в сетке отображается где есть фотка там иконка галочка(жму и открываю превью) где нет там крестик. Проверяю это через if dbgrid1.datasource.dataset.fieldbyname('img_file').value = null then begin...
В базе в поле img_file я храню сами картинки, поле типа blob, а в поле test2 типа varchar планирую отображать иконки.
Это в стандартной сетке, в рх это не работает. Выше я писал код который в рх-сетке заполняет все поля кроме нужного мне, я вписал его в ondrawcolumncell не таблицы а поля и в итоге пропало все и в т.ч. текст других полей... Добавлял условие if column.index = 9 then begin... Ничего...белым бело... Застрял :|
П.с. даже когда закоментил весь бред который написал в адрес рх сетки, она все равно белая:))
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 17.11.2015 15:51:42

Код: Выделить всё
procedure TSprTobarForm.RxDBGrid3Columns9DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  L:Integer;
begin
  L:=Rect.Left + 2;
  if (not quSpr3spr_3_date_post_first.IsNull) and (IncMonth(quSpr3spr_3_date_post_first.AsDateTime, quSpr1spr_1_new_count_period.AsInteger) > Now) then
    TradeDataModule.Spr3StatesImageList.Draw(RxDBGrid3.Canvas, L, (Rect.Top + Rect.Bottom) div 2 - 8, 0);

  Inc(L, 17);
  if quSpr3spr_3_image_exists.AsBoolean then
    TradeDataModule.Spr3StatesImageList.Draw(RxDBGrid3.Canvas, L, (Rect.Top + Rect.Bottom) div 2 - 8, 1);

  Inc(L, 17);
  if not quSpr3spr_3_info.IsNull then
    TradeDataModule.Spr3StatesImageList.Draw(RxDBGrid3.Canvas, L, (Rect.Top + Rect.Bottom) div 2 - 8, 2);

  Inc(L, 17);
  if quSpr3similar_exists.AsBoolean then
    TradeDataModule.Spr3StatesImageList.Draw(RxDBGrid3.Canvas, L, (Rect.Top + Rect.Bottom) div 2 - 8, 3);

  Inc(L, 17);
  if quSpr3exists_action.AsBoolean then
    TradeDataModule.Spr3StatesImageList.Draw(RxDBGrid3.Canvas, L, (Rect.Top + Rect.Bottom) div 2 - 8, 5);
end;

Вот пример ручной отрисовки колонки из моей проги
Там в одной колонке отрисовывается достаточно много флагов. Может этот пример поможет?
Этот обработчик именно на колонке.


И ещё

Чему равняется RxDBGrid.DefaultDrawing ?
У меня он стоит по умолчанию - в true
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 17.11.2015 19:56:03

Я конечно понимаю что сильно туплю от недостатка знаний и опыта, но хотелось бы конечно разобраться все же с этой темой, и другие может почитают=)
Итак, давайте по порядку...
1.у меня был работоспособный код, который делал все как нужно, но не там где я хотел (вместо 7й колонки рисовал иконки во всех остальных.)
Код: Выделить всё
procedure TMainForm.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
         with RxDBGrid1.Columns[7] do begin
       if RxDBGrid1.datasource.dataset.fieldbyname('Img_file').value = null then begin
       ImageList1.Draw(RxDBGrid1.Canvas,Rect.Left+2,Rect.Top, 0);
       end
       else
        ImageList1.Draw(RxDBGrid1.Canvas,Rect.Left+2,Rect.Top, 1) ;
     end;
end;

Как и советовали, прописал его же не для всей сетки, а только для выбранного поля, туда где должны появляться иконки...в итоге ничего не появилось вообще и остальной текст пропал (по клику виден). RxDBGrid.DefaultDrawing = true - всегда! вообще не трогаю пока эти все настройки. Самое интересное что если брать эти каляки-маляки в { комменты }, то все равно сетка белая, пока не понял как все вернуть, вроде помогает удаление процедуры OnRxDBGrid1Columns7DrawColumnCell или та же но для всей сетки... пробовал на лазарусе 1.4.0 и 1.4.4; rxnew 2.8.2.181

2. Советовали мне воспользоваться запросом с условием, для дальнейшей связки всего этого с imagelist и keylist. Добавил новый SQLQuery, по кнопке добавил такой код, но что дальше делать я не понял) как то же надо связать этот запрос с keylist и imagelist :?: :?:
Код: Выделить всё
SQLQuery6.SQL.Clear;
SQLQuery6.SQL.Add('SELECT case when Img_File is null then 0 else 1 end from MainTable');
SQLQuery6.Active:=true;

Изображение
Img_file - поле куда я пишу картинки через Опендиалог, тип поля - blob, поле test2 - поле с типом varchar, в нем должны появляться иконки в зависимости от значений в поле Img_file - если там есть вложение, значит иконка1, если нет вложения значит иконка2... Со стандартной сеткой у меня это выглядит так:Изображение
Дорвался до инэта, сразу все рассказал, чтоб поняли,простили и помогли разобраться :)
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 18.11.2015 09:55:19

У вас есть Firebird? - я скину на нём тестовый пример.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 18.11.2015 15:20:39

Firebird у меня нет, но ради такого дела я уже скачал и устанавливаю, надеюсь и из лазаруса смогу подключиться
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 18.11.2015 16:30:15

Вот небольшой пример
работает со стандартной базой от птицы
Визуализируем запрос:
Код: Выделить всё
select
  CUSTOMER.CUSTOMER,
  CUSTOMER.ADDRESS_LINE2,
  case when CUSTOMER.ADDRESS_LINE2 is null then 0 else 1 end as flag
from
  CUSTOMER

В в грде в колонке FLAG отображаем иконку из ImageList
Картинку выбираем через поле KeyList:
Если в запросе FLAG=0 (это когда ADDRESS_LINE2 is null) то отображаем 1-ю картинку
Если в запросе FLAG=1 (это когда ADDRESS_LINE2 не равна null) то отображаем 2-ю картинку

Ну и на сладкое в итоговой строке считаем кол-во строк
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 18.11.2015 21:39:14

alexs писал(а):работает со стандартной базой от птицы

хорошо бы еще на этот файлик посмотреть =) стандартная это значит идет вместе с firebird? через поиск такое не нашел.
а вообще при запуске проекта возникает ошибка:
Поток=TForm1:Корневой узел=:TForm1
Класс компонента:TSQLQuery
Error reading SQLQuery1.Options: Unknown property: "Options"
Положение в потоке:4096

ну в целом то я вижу что там даже кода никакого нет в примерчике, просто запрос и все... Себе FireBird вроде поставил, даже коннект есть. Если я создам таблицу с такими же полями как у вас, получается что записав или не записав в ячейки поля ADDRESS_LINE2 значения, я должен получить в колонке FLAG разные иконки? :) выглядит все просто, надо пробовать

Upd. все же нашел файлик бд - EMPLOYEE.FDB из папки examples, оно ведь?
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 19.11.2015 10:03:12

Сережа писал(а): EMPLOYEE.FDB из папки examples, оно ведь?

Да.
При штатной установке птицы >= 2.1 вам ничего не надо создавать
Это база из примеров. На неё штатно настроен алиас employee в файле aliases.conf.

В принципе можете создать свою базу. Для этого удобно пользоваться IBExpert-ом.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение Сережа » 20.11.2015 23:43:08

Alexs, вот когда посмотрел ваш пример, сразу все стало ясно и понятно, еще больше стало ясно каким сложным путем изначально я пытался это решить...здесь в примере все так просто оказалось!!! :oops: По аналогии сделал в своем приложении то же самое, для Rx сетки дополнительной...все отлично работает! Теперь буду исправлять все ранее написанное под стандартную сетку на Rx, надеюсь проблем не возникнет :)
п.с. заодно и познакомился с FireBird - так много слышал об этой субд, и вот... пощупал) (еще слона советуют))
Может даже бросить sqlite и сделать на firebird(сервер осилил вроде, даже таблицу создать смог :D )? у меня то все там простенькое, храню инфу, вывожу отчеты в эксель....думаю в птичке запросы примерно такие же будут, зато ведь многопользовательская база получится, с правами доступа, и возможностью одновременной записи...крутяк 8)

:arrow: Большое спасибо всем кто помог разобраться с моими вопросами, имел терпение и желание помочь новичку :!: Успешных компиляций вам :!:
Сережа
новенький
 
Сообщения: 33
Зарегистрирован: 02.07.2015 00:24:15
Откуда: Воронеж

Re: Получить кол-во записей в таблице SQLite и др.

Сообщение alexs » 21.11.2015 22:06:04

Если вам хватает sqlite - то и используйте её.

Просто для каждой задачи - свой сервер
Я в своё время переполз в большом проекте с птицы на слоника. Миграция прошла достаточно легко - за счёт похожести синтаксиса.

Но слоник - он для мелких задач вроде как избыточен. И чтобы на нём была хорошая производительность - его надо настраивать.
Так что моё мнение:
1 юзер - хватит и sqlite (например - хранение локальных настроек)
1 - 100 юзеров - прекрасно работает птица
>100 - надо уже на PG смотреть.

Хотя до миграции вышеупомянутого проекта с птицы на слона - в системе одновременно работало порядка 300 пользователей. Причём именно работало - вбивали первичку и формировали промежуточную аналитику.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru