Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Флейм
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.08.2014, 18:53
АНЯ17 АНЯ17 вне форума
Прохожий
 
Регистрация: 16.08.2014
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
По умолчанию Набор Данных статистика

Здравствуйте,
как сделать что бы из Набор Данных-считала поле пол в edit1.text и edit2.text количество полов ?
так написала ...
Код:
For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[sex].Text:='Муж';
Table1.Fields.Fields[sex].Text:='Жен';
end;
Админ: Пользуемся тегами для оформления кода!

оно не работает ???
за ран спс.
Изображения
Тип файла: jpg 2014-08-16_173343.jpg (50.8 Кбайт, 6 просмотров)

Последний раз редактировалось Admin, 16.08.2014 в 19:19.
Ответить с цитированием
  #2  
Старый 16.08.2014, 18:58
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
Восклицание

Тебе количество нужно узнать? сколько мужиков сколько женщин??
__________________
Нет ничего не возможного. Вопрос только во времени...
Ответить с цитированием
  #3  
Старый 16.08.2014, 18:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

На первый взгляд Table1.First в цикле возвращает указатель каждый раз на первую запись ( Next попробуйте), переменная цикла тоже не используется - просто крутится
Ответить с цитированием
  #4  
Старый 16.08.2014, 19:01
Аватар для Electronic_Arts
Electronic_Arts Electronic_Arts вне форума
Местный
 
Регистрация: 13.07.2006
Адрес: на земле
Сообщения: 559
Версия Delphi: XE5
Репутация: 18
По умолчанию

Код:
begin
Edit1.text:='0';
Edit2.text:='0';
for I := 1 to Table1.RecordCount do
begin
if table1.FieldByName('sex').Value='Man' then
edit1.text:=inttostr(strtoint(Edit1.text)+1);
end else
begin
edit2.text:=inttostr(strtoint(Edit2.text)+1);
end;
Table1.next;
end;
__________________
Нет ничего не возможного. Вопрос только во времени...

Последний раз редактировалось Electronic_Arts, 16.08.2014 в 19:03.
Ответить с цитированием
Этот пользователь сказал Спасибо Electronic_Arts за это полезное сообщение:
АНЯ17 (16.08.2014)
  #5  
Старый 16.08.2014, 19:18
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда уж лучше так
Код:
var
m, j: integer;
...
m:= 0;
j:= 0;
Table1.First;

while Table1.Eof do
begin
if Table1.FieldByName('sex').Value='Муж' then
Inc(m)
else
Inc(j);
Table1.next;
end;
Edit1.text:= IntToStr(m);
Edit2.text:= IntToStr(j);
хотя запросом намного легче и быстрее
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
АНЯ17 (16.08.2014)
  #6  
Старый 16.08.2014, 20:36
АНЯ17 АНЯ17 вне форума
Прохожий
 
Регистрация: 16.08.2014
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Пасибо, за ответ. Все работала

Последний раз редактировалось АНЯ17, 16.08.2014 в 20:50.
Ответить с цитированием
  #7  
Старый 24.08.2014, 18:08
Heneken Heneken вне форума
Новичок
 
Регистрация: 11.09.2011
Сообщения: 73
Версия Delphi: Delphi XE6
Репутация: 10
По умолчанию

Цитата:
Сообщение от АНЯ17
Здравствуйте,
как сделать что бы из Набор Данных-считала поле пол в edit1.text и edit2.text количество полов ?
так написала ...
Код:
For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[sex].Text:='Муж';
Table1.Fields.Fields[sex].Text:='Жен';
end;
Админ: Пользуемся тегами для оформления кода!

оно не работает ???
за ран спс.

Запрос который посчитает все и сразу
'SELECT COuNT(SEX) from имя таблицы group by SEX' -запрос будет корректен если в вашей таблице нет повторяющихся людей.
Никаких ластов , фирстов и циклов не надо
Ответить с цитированием
  #8  
Старый 28.08.2014, 15:16
Аватар для Mrak
Mrak Mrak вне форума
Местный
 
Регистрация: 26.01.2013
Адрес: МО
Сообщения: 438
Версия Delphi: XE2
Репутация: 17
По умолчанию

Цитата:
Сообщение от Heneken
Запрос который посчитает все и сразу
'SELECT COuNT(SEX) from имя таблицы group by SEX' -запрос будет корректен если в вашей таблице нет повторяющихся людей.
Никаких ластов , фирстов и циклов не надо
+ 1
Пользуйте только Query

Но 2е циферки все же однозначно не дают понять сколько "м", а сколько "ж"
Добавим WHERE
Код:
SELECT COUNT(sex) FROM <имя таблицы> WHERE sex = "муж" GROUP BY sex
__________________
Я за здоровый экстрим!
Спасибо за "спасибо")
Ответить с цитированием
  #9  
Старый 28.08.2014, 20:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ох уж эти советчики. Даже запрос правильный дать не могут.
Код:
SELECT Sex, COUNT(Sex) FROM <имя таблицы> GROUP BY Sex
Получишь 2 или 3 записи (3 - если можно поле Sex оставлять пустым).

Еще вариант - использовать компоненты, которые позволяют автоматически посчитать подобную статистику, например cxGrid из набора DevExpress.

Ну и кодом, как предложил Alegun. Ну и желательно в таком коде запоминать положение курсора и восстанавливать его после окончания подсчета.
Ответить с цитированием
  #10  
Старый 29.08.2014, 08:57
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Цитата:
Сообщение от lmikle
Ох уж эти советчики. Даже запрос правильный дать не могут.
Ага. Давайте их забаним.
__________________
Не стоит путать форумы с богадельнями. © Bargest
Ответить с цитированием
  #11  
Старый 02.09.2014, 16:37
АНЯ17 АНЯ17 вне форума
Прохожий
 
Регистрация: 16.08.2014
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Код:
SELECT podra, sex, count(*) as C  FROM roj WHERE  d_reg between :f and :j GROUP BY podra, sex ORDER BY 1, 2'

Я хотела бы из поля (с) результаты кол-во полов с подразделение указать(вынести) в Edit1.text и Edit2.text.
Например Октябрьский район Муж=1 в(Edit1.text) и Жен=1 в (Edit2.text ) и дале Первомайский р. Муж=3 в(Edit3.text). . . и.т.д


и в итоге должна получатся так

Октябрьский район Муж.1 Жен.1
Изображения
Тип файла: jpg 2014-09-02_173813.jpg (39.1 Кбайт, 10 просмотров)
Ответить с цитированием
  #12  
Старый 02.09.2014, 19:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Делай селект из подселекта.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #13  
Старый 02.09.2014, 20:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, а тут гораздо интереснее. Т.е. теперь нам надо развернуть вертикальную таблицу в горизонтальную (наверное, не совсем точное описание, скажем так, надо объединить строки для одинакового отдела в одну). Действительно, это можно сделать с помощью запроса из запроса, НО я советую делать это с построением view, т.к. это будет, наверное, эффективнее.
1. Создаем вью из твоего запроса:
Код:
create view roj_sex as select podra, sex, count(*) as c from roj group by podra, sex;
(я упростил немного для отладки)

2. А теперь пишем запрос, который собирает данные в одну кучку:
Код:
select podra, sum(case when sex = 'mal' then C else 0 end) as c_mal, sum(case when sex = 'fem' then C else 0 end) as c_fem from roj_sex group by podra;

Пример результата:
Код:
 PODRA | C_MAL | C_FEM
-------+-------+-------
 podr  |     1 |     1

PS. сорри, на этой системе русского языка нет. так что пришлось по английски писать пол.
Ответить с цитированием
  #14  
Старый 06.09.2014, 09:03
АНЯ17 АНЯ17 вне форума
Прохожий
 
Регистрация: 16.08.2014
Сообщения: 22
Версия Delphi: delphi 7
Репутация: 10
Смущение

c основой этой запросик оно 100% работает как надо только, но Первомайский район. . . Для нахождения других районов хм

Код:
SELECT podra, sex, count(*) as C  FROM roj WHERE  d_reg between :f and :j GROUP BY podra, sex ORDER BY 1, 2'

Код:
 var
 Ap,xl,sv,sm,podr1,podr2,C: Variant;// peremeni sv = пол жен sm = пол муж
   i: integer;
    f,j : TdateTime;
   rc,p,q : Integer;
   mypodra, sex : string;

Код:
db.AdsQueryStatistic.First;
rc := db.AdsQueryStatistic.RecordCount;
//mypodra:='Октябрьский район';// 
mypodra:='Первомайский район';


for i:=0 to rc do //а ты уверена что с 1 а не с 0, я просто сейчас не могу проверить
begin
  if db.AdsQueryStatistic.FieldByName('podra').Value = mypodra then
  begin
     sex:=db.AdsQueryStatistic.FieldByName('sex').Value;
     p:=db.AdsQueryStatistic.FieldByName('C').Value;
     if sex = 'Жен' then
     begin
        Ap.Range['b2'] := p;
  //      Ap.Range['b3'] := p;
       // continue;
     end;
     if sex = 'Муж' then
     begin
        Ap.Range['c2'] := p;
    //    Ap.Range['c3'] := p;
       // break;
     end;
  end;
  db.AdsQueryStatistic.next;
end;

Для нахождения других районов ??? не знаю пока
А что надо делать с Октябрьский район ????
// Ap.Range['b3'] := p;???


за ран спс.
Ответить с цитированием
  #15  
Старый 08.09.2014, 14:14
Heneken Heneken вне форума
Новичок
 
Регистрация: 11.09.2011
Сообщения: 73
Версия Delphi: Delphi XE6
Репутация: 10
По умолчанию

Цитата:
Сообщение от АНЯ17
Для нахождения других районов ??? не знаю пока
А что надо делать с Октябрьский район ????
// Ap.Range['b3'] := p;???
за ран спс.

Правильный запрос и понимание работы GROUP BY и ORDER BY гораздо проще решит вашу задачу без колдовства с before и прочим:
Код:
db.sql.tex:=' SELECT podra,sex, count(sex)   FROM roj  GROUP BY sex,podra ORDER BY podra '
db.active:=true;
Запрос выведет

Район - Пол - Количество
- Октябрьский / муж / 1000
- Октябрьский / жен / 200
- Петровский / муж / 300
- Петровский / жен / 2000
И т д.
GROB BY сгруппирует сначало по полу потом по району, ORDER BY упорядочит все ваши записи по району.

Далее в цикле:
Код:
while not db.Eof do //Ложь- когда цикл будет на последней строчке таблицы,если запрос ничего не вернет в цикл не зайдет
begin//С таким циклом не надо никаких First и last
db.fields[0].asstring //- тут ваш район
db.fields[1].asstring //- тут пол для конкретного района
db.fields[2].asstring //- тут количество по конкретному полу и району
db.next;//Я надеюсь что в ваших районах всегда хотя бы по 1 мужчине и женщине есть..поэтому 
//строки в таблице всегда будут парными =)
end;
В теле цикла можете использовать что хотите. Но если нужно по конкретному району(например для вставки в ваши Edit-ы),то достаточно добавить WHERE в запрос:

db.sql.tex:=' SELECT podra,sex, count(sex) FROM roj WHERE podra= UPPER('+quotedstr(Ansiuppercase('Октябрьский'))+') GROUP BY sex,podra ORDER BY podra'
db.active:=true;

quotedstr- Это операнд апострофов, код готов для вставки в Delphi =)
UPPER-Изменяет регистр букв.. для SQL чтоб уж 100% =)
Ansiuppercase()-Изменяет регистр букв для String.. чтоб уж 100% =)
Так гораздо проще и не надо извращаться с циклами и лишними условиями и писать можее сразу в Excel без кучи левых переменных.
Да и вообще судя по фото ,что вы хотите получить..достаточно привязать это сразу к DbGird без всяких циклов..только использование Last First уже обязательно,иначе выведет не все строки
P/S Код писал сразу на форуме,поэтом синтаксические ошибки не исключены)

Последний раз редактировалось Heneken, 08.09.2014 в 14:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter