Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2009, 12:52   #21
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Нет, время не задается. Только дата.
для общего развития додавим тему
если в IBExpert-е не рисуется в результате запроса/в данных таблички время, то это еще не означает что его там нет
потому что тип DATE все-таки содержит кроме даты еще и время
другой вопрос если ты сам обрезаешь данные при вставке/обновлении только до даты - хотя логично было бы на триггере писать текущую дату-время (как оно там в ФБ - 'TODAY')
soleil@mmc вне форума Ответить с цитированием
Старый 08.11.2009, 13:01   #22
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Только как будешь синхронизировать эти две
В смысле "синхронизировать"? . Таблица с ФИО и с количеством оценок - это два назависимые друг от друга StingGrid-a. В одной ученик, в другой количество его оценок.
Цитата:
Будет 100 учеников, допустим, появится полоса прокрутки.
Не будет. Не больше 25. Это ж класс .
Цитата:
Слева отличник выбран, а напротив оценки двоечника
Я не делал разделение учеников на двоечников и отличников.
Цитата:
Ну и раз этот запрос нужен для всех школьников, то может ну нафиг проверку на ID ученика?
Нужен для всего класса , чтобы для учеников из класса считалось.
Цитата:
Также можно прилепить триггеры на изменение оценок (добавление/изменение/удаление) и в таблицу spisok записывать число оценок. Поставили иванову двойку, увеличили spisok.ocenka2 на 1, исправили 3 на 4, уменьшили spisok.ocenka3 и увеличили spisok.ocenka4.
Да нет, это будет лишним
Цитата:
зато выборка учеников быстрее будет, т.к. не нужно будет СУБД каждый раз все оценки перелопачивать.
Перелопачивать нужно будет немного, поэтому я уверен, что для такой СУБД как Firebird это не будет проблемой

Я попробовал вывести результат запроса не в StringGrid, а в DBGridEh. Но выдается ошибка как во вложении. Что она значит? Где я ошибся?
Вот код:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;// Совершенно лишняя строка в данном случае
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT OCENKA, COUNT(OCENKA) FROM MARK WHERE (WITHSPISOK = 1) AND'+
' (DATAMARK >= 01.11.2009) AND (DATAMARK <= 10.11.2009) GROUP BY OCENKA';
 Form1.pFIBDataSet_raschet.Open;
// Form1.SG2.Cells[0,1]:=IntToStr(Form1.pFIBQuery7.FieldByName('OCENKA').AsInteger);
end;
P.S. Что Form1.pFIBQuery7, что Form1.pFIBDataSet_raschet разницы нет. Ошибка та же.
Изображения
Тип файла: jpg 1.jpg (57.1 Кб, 148 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось Stilet; 10.11.2009 в 13:37.
artemavd вне форума Ответить с цитированием
Старый 08.11.2009, 19:40   #23
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

даты либо в апострофы, либо параметром передавай
soleil@mmc вне форума Ответить с цитированием
Старый 10.11.2009, 13:34   #24
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот я сделал такой код:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT OCENKA, COUNT(OCENKA) FROM MARK WHERE (WITHSPISOK = 1) AND (DATAMARK >= 01.11.2009) AND (DATAMARK <= 10.11.2009) GROUP BY OCENKA';
 Form1.pFIBDataSet_raschet.ParamByName('???').Value:=  ;
 Form1.pFIBDataSet_raschet.ParamByName('???').Value:=  ;
 Form1.pFIBDataSet_raschet.Open;
end;
И он меня натолкнул на мысль, что что-то не то с датой. Ведь для того, чтобы обсчитать количество оценок за четверть, которая имеет начальную дату и конечную дату, нужно, чтобы оценки из таблицы MARK брались только те, которые относятся к той дате, которая входит в диапозон выбранной четверти, т.е. так как я нарисовал на скрине. Как это можно сделать? По идее запрос должен выглядить как то так:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT OCENKA, COUNT(OCENKA) FROM MARK,CHETVERTY WHERE (WITHSPISOK = 1) AND (DATASTART >= 01.11.2009) AND (DATAEND <= 10.11.2009) GROUP BY OCENKA';
 Form1.pFIBDataSet_raschet.ParamByName('DATASTART').Value:=Form1.sWebLabel17.Caption;
 Form1.pFIBDataSet_raschet.ParamByName('DATAEND').Value:=Form1.sWebLabel18.Caption;
 Form1.pFIBDataSet_raschet.Open;
end;
Например, пусть начальная дата 01.11.2009, а конечная 06.11.2009. Тогда в запросе должны участвовать даты 01.11.2009 и 03.11.2009 и 06.11.2009, а 09.11.2009 не участвует в запросе.
Изображения
Тип файла: bmp Безымянный.bmp (290.3 Кб, 143 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 10.11.2009 в 13:51.
artemavd вне форума Ответить с цитированием
Старый 10.11.2009, 17:26   #25
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

написал и непонятно - где вопрос-то был?
тебя смущает что ты отбор делаешь по DATASTART, DATAEND, а оценки у тебя по дате DATAMARK?
soleil@mmc вне форума Ответить с цитированием
Старый 10.11.2009, 18:52   #26
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
тебя смущает что ты отбор делаешь по DATASTART, DATAEND, а оценки у тебя по дате DATAMARK?
Ну да, типа этого. А скажите пожалуйста правильно ли я записал запрос этот:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT OCENKA, COUNT(OCENKA) FROM MARK,CHETVERTY WHERE (MARK.ONCHETVERT=CHETVERTY.ID) AND (WITHSPISOK = 1) AND (DATAMARK >= :DS) AND (DATAMARK <= :DE) GROUP BY OCENKA';
 Form1.pFIBDataSet_raschet.ParamByName('DS').Value:=StrToDate(Form1.sWebLabel17.Caption);
 Form1.pFIBDataSet_raschet.ParamByName('DE').Value:=StrToDate(Form1.sWebLabel18.Caption);
 Form1.pFIBDataSet_raschet.Open;
end;
Получается, что я первый раз передаю в DATAMARK параметр, отвечающий за начало четверти (DATASTART), а второй раз параметр отвечающий за конец четверти (DATAEND). Но меня смущает вот что: корректен ли с точки зрения логики данный запрос?)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 10.11.2009, 20:18   #27
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

для ответа на твой вопрос было бы неплохо заценить ддл таблиц (если бы ты хотя бы пользовался псевдонимами таблиц, то было бы хоть читабельно)
а то не очень понятно какие поля к чему относятся и для чего оно в запросе (если было в топике - дай номер поста, а то лень это все листать)

апд
раз автор пока спит, то выскажу свои мысли:
если есть связка четверти-оценки, то наверняка в табл.Четверти указан период этой четверти
и тогда незачем вообще использовать параметры - просто нужно ограничить отбор периодом четверти
что-то типа такого
Код:
SELECT 
  m.OCENKA, 
  COUNT(m.OCENKA) 
FROM 
  MARK m,
  CHETVERTY c
WHERE 0=0
  and m.ONCHETVERT=c.ID 
  AND WITHSPISOK = 1 /* здесь псевдоним таблицы сам проставишь */
  AND m.DATAMARK >= c.date_start 
  AND m.DATAMARK <= c.date_end 
GROUP BY m.OCENKA
красным выделил предполагаемые поля из табл. Четверти

Последний раз редактировалось soleil@mmc; 11.11.2009 в 10:02.
soleil@mmc вне форума Ответить с цитированием
Старый 11.11.2009, 16:27   #28
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

soleil@mmc, огромное спасибо за помощь. В итоге пока получился такой запрос:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT m.OCENKA, COUNT(m.OCENKA) FROM MARK m,CHETVERTY c WHERE 0=0 and (m.ONCHETVERT=c.ID) AND (WITHSPISOK = 1) AND (m.DATAMARK >= :DS) AND (m.DATAMARK <= :DE) GROUP BY m.OCENKA';
 Form1.pFIBDataSet_raschet.ParamByName('DS').Value:=StrToDate(Form1.sWebLabel17.Caption);
 Form1.pFIBDataSet_raschet.ParamByName('DE').Value:=StrToDate(Form1.sWebLabel18.Caption);
 Form1.pFIBDataSet_raschet.Open;
end;
Выводится результат пока в DBGridEh так:
OCENKA COUNT
3 1
4 2
5 1
А как сделать, чтобы в StringGrid выводилось так??:
2-ек 3-ек 4-ок 5-ок
0 1 2 1
То есть если какой-то оценки нет, то ставится 0. В данном случае у данного ученика двоек нет, поэтому 0. Очень нужно сделать в StringGrid) Подскажите как это реализовать на примере одного ученика??

Как исправить данный запрос, чтобы считались все виды оценок и для каждого вида оценки была отдельная колонка, которая бы состояла из названия колонки и количества оценок. А то выводится в вертикально. .
Уже чего только не пробовал не получилось:
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT m.OCENKA, COUNT(m.OCENKA) FROM MARK m,CHETVERTY c WHERE 0=0 and (m.ONCHETVERT=c.ID) AND (WITHSPISOK = 1) AND (m.DATAMARK >= :DS) AND (m.DATAMARK <= :DE) GROUP BY m.OCENKA';
 Form1.pFIBDataSet_raschet.ParamByName('DS').Value:=StrToDate(Form1.sWebLabel17.Caption);
 Form1.pFIBDataSet_raschet.ParamByName('DE').Value:=StrToDate(Form1.sWebLabel18.Caption);
 Form1.pFIBDataSet_raschet.Open;
end;
???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось Stilet; 18.11.2009 в 07:56.
artemavd вне форума Ответить с цитированием
Старый 14.11.2009, 17:16   #29
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

попробуй через case
Код:
select
  case when m.ocenka = 1 then sum(1) else 0 end oc_1,
  case when m.ocenka = 2 then sum(1) else 0 end oc_2,
  case when m.ocenka = 3 then sum(1) else 0 end oc_3,
  case when m.ocenka = 4 then sum(1) else 0 end oc_4,
  case when m.ocenka = 5 then sum(1) else 0 end oc_5
from 
  mark m,
  chetverty c 
WHERE 0=0 
    and m.onchetvert=c.id
    and withspisok = 1 
    and m.datamark >= :DS 
    and m.datamark <= :DE
З.Ы.: скобочки в условиях не нужны (за исключением случаев когда они там необходимы для выделения приоритета операций) и пиши в каком-нить одном регистре (лучше в нижнем, а то косишь под блондинку - человеку читать в нижнем регистре легче, а машине пофиг)

с другой стороны, если ты выводишь в стринггрид, то никаких проблем транспонировать данные запроса нет - просто при заполнении стринггрида нужно локейтить датасет
по типу
Код:
for i:=1 to 5 do begin
if Form1.pFIBDataSet_raschet.Locate('ocenka', i, []) then
    StringGrid[1, i] := Form1.pFIBDataSet_raschet.FieldByName('count').AsString
else
    StringGrid[1, i] := '0';
end;

Последний раз редактировалось soleil@mmc; 14.11.2009 в 17:20.
soleil@mmc вне форума Ответить с цитированием
Старый 14.11.2009, 18:52   #30
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

А для чего локейтить, Soleil? Чтобы транспонировать записи?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный расчет З/П VictorM Microsoft Office Excel 7 08.11.2009 16:51
Расчет зума Саня_Д Microsoft Office Excel 4 21.10.2009 15:21
Расчет количества в БД Excell, использование сводных таблиц? ITM Microsoft Office Excel 10 12.01.2009 14:41
Расчет средневзешенного zoman Microsoft Office Excel 2 05.12.2007 10:15