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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2009, 06:52   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Печаль Проблема с составлением цикла

Добрый день! Ребята, я уже всю голову сломал, думая над тем, как правильно составить цикл. Что нужно? Нужно чтобы данные заносились в БД с полями Data, Mark_2, Mark_3, Mark_4, Mark_5 и расставлялись правильно. Начало цикла должно идти с четвертой колонк, т.е. for i:=4. Вноситься должны только непустые столбцы. Нужно в итоге, чтобы получилась БД, в которой бы была дата и в этой же строке оценка (либо 2, либо 3, либо 4, либо 5). Помогите пожалуйста с этим циклом? Не могу сообразить ((
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 11.08.2009, 08:01   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Код:
var
i:integer;
...
while not Table1.Eof do
begin
Table2.Insert;
   for i:=3 to 8 do
   begin
   Table2.FieldByName('Data').asVariant:=Table1.FieldByName('Data').asVariant;
   if not Table1.FieldByName('Mark_2').IsNull 
      then Table2.FieldByName('Mark_2').asString:=Table1.FieldByName('Mark_2').asString
      else if not Table1.FieldByName('Mark_3').IsNull 
                then Table2.FieldByName('Mark_3').asString:=Table1.FieldByName('Mark_3').asString
                else if not Table1.FieldByName('Mark_4').IsNull 
                          then Table2.FieldByName('Mark_4').asString:=Table1.FieldByName('Mark_4').asString
                          else Table2.FieldByName('Mark_5').asString:=Table1.FieldByName('Mark_5').asString;
   end;
Table2.Post;
Table1.Next;
end;
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 11.08.2009, 08:53   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нужно чтобы данные заносились в БД с полями Data, Mark_2, Mark_3, Mark_4, Mark_5 и расставлялись правильно
А не лучше это SQL-ом сделать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2009, 09:09   #4
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

мне почему то тоже показалось, что дело может решится 1 запросом.
vovk вне форума Ответить с цитированием
Старый 11.08.2009, 10:34   #5
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

+1 всё в 1 запрос через Case

пример

Код:
case sex when 1 then 'М' else 'Ж' end as SEX
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 13.08.2009, 04:46   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Yurk@
Что-ито я Ваш код не очень понял. У меня заноситься должно в одну таблицу, а Вы написали еще Table1. Можете поясниить какую таблицу Вы подразуевали под Table1?
P.S. Я кстати забыл выложить скриншоты таблиц. Вот. На рисунке 7777 таблица, из которой должны заноситься данные. На рисунке 8888 таблица БД ку заносятся. А на рисунке 8888-Копия таблица, которая должна выглядеть когда в нее занесутся данные. Поле OnID это поле, по которому таблица 8888 (table_marks) будет связана с таблицей jur (список с ФИО учеников).
Изображения
Тип файла: jpg 7777.jpg (57.0 Кб, 153 просмотров)
Тип файла: jpg 8888.jpg (3.3 Кб, 142 просмотров)
Тип файла: jpg 8888 - копия.jpg (4.8 Кб, 167 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.08.2009, 09:01   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы не обижайтесь, но, имхо, Вы неправильно спроектировали БД.

Я бы рекомендовал сделать нормальную таблицу ОЦЕНКИ (Уникальный ID записи
ID ученика
ID предмета, за который оценка
Дата оценки
Собственно оценка)

конечно, при формировании отчёта прийдётся повозиться с "разворачиванием" таблички с фамилиями и оценками (такая операция называетя транспонирование таблицы). Но зато, Вы легко сможете формировать любые другие отчёты.
Кроме того, подобная структура позволить максимально упростить интерфейс ввода/редактирования/удаления оценок...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.08.2009, 14:16   #8
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Я бы рекомендовал сделать нормальную таблицу ОЦЕНКИ (Уникальный ID записи
ID ученика
ID предмета, за который оценка
Дата оценки
Собственно оценка)
Вы имели ввиду такую таблицу, как во вложении?
Цитата:
при формировании отчёта прийдётся повозиться с "разворачиванием" таблички с фамилиями и оценками (такая операция называетя транспонирование таблицы).
Можете на примере пояснить что это значит?)
Изображения
Тип файла: jpg таблица.jpg (5.4 Кб, 146 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 14.08.2009, 00:12   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

artemavd, ну, во-первых, Вы, как проектировщик БД и разработчик софта, можете сами решать, какая структура Вам удобнее, понятнее и эффективнее. Как всегда, выигрывая в одном, проигрываешь в другом.

во-вторых, то, что я предлагаю - это исключительно мой личный взгляд... Это отнюдь не истина в последней инстанции, так, просто один из вариантов.

Теперь чуть-чуть подробнее о том, что я предлагаю.
Принципиальное отличие от того, что имеется у Вас, в том, что нет полей MARK_2, MARK_3 и т.д.
есть только одно цифровое поле MARK - там находится число - полученная оценка.
Остальные поля такие же, как я предлагал.
Такой подход позволит писать красивые и простые запросы.


p.s. картинки лучше выкладывать на специальные сервера картинок, либо, если выкладываете сюда, то надо паковать картинки в архив и выкладывать его. Движок форума почему-то сильно уменьшает картинки, рассмотреть что-то нереально... ;(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.08.2009, 15:18   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Я решил сделать по-другому структуру БД. Получилось почти. В две из трех таблицы данные заносятся хорошо. А вот в ту, где с датой по-прежнему не получается . Не ругайтесь пожалуйста, а если кто может, то помогите пожалуйста дописать код:
Код:
procedure TForm8.BitBtn8Click(Sender: TObject);
var
 i,k,l:integer;
begin
 i:=1;
 while Form8.StringGrid1.Cells[1,i] <> '' do begin
  if Form12.Table1.Locate('Fam_jur;Imy_jur;Otche_jur',VarArrayOf([Form8.StringGrid1.Cells[1,i],
                                 Form8.StringGrid1.Cells[2,i],Form8.StringGrid1.Cells[3,i]]),
                                 [loCaseInsensitive,loPartialKey]) = False then
  begin
   Form12.Table1.Insert;
   Form12.Table1.FieldByName('Fam_jur').AsString:=Form8.StringGrid1.Cells[1,i];
   Form12.Table1.FieldByName('Imy_jur').AsString:=Form8.StringGrid1.Cells[2,i];
   Form12.Table1.FieldByName('Otche_jur').AsString:=Form8.StringGrid1.Cells[3,i];
   Form12.Table1.Post;
   Form12.Table1.Refresh;
  end;

  begin
   Form12.Table2.Insert;
   Form12.Table2.FieldByName('Chetvert_jur_2').AsString:=Form8.StringGrid1.Cells[2,28];
   Form12.Table2.FieldByName('Predm_jur_2').AsString:=Form8.StringGrid1.Cells[2,29];
   Form12.Table2.FieldByName('Klass_jur').AsString:=Form8.StringGrid1.Cells[4,28];
   Form12.Table2.Post;
   Form12.Table2.Refresh;
  end;

//вот отсюда начались проблемы. 
  for k:=4 to Form8.StringGrid1.ColCount - 1 do
  if Form8.StringGrid1.Cells[k,0] <> '' then
  begin
   Form12.Table3.Insert;
   Form12.Table3.FieldByName('Data_jur_2').AsDateTime:=????
  end;;
 Inc(i);
 end;
end;
Третья таблица с датой имеет такие поля: Data_jur_2 (тип D), Mark_jur (тип N). Как составить цикл, чтобы он заносил дату и оценки из таблицы (пост №6)?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в программе на С++, множественное исполнение цикла Vikelf Помощь студентам 1 25.05.2009 09:31
Переход от цикла к циклу не выходя из цикла (без multithreading) Qousio Общие вопросы C/C++ 2 16.05.2009 09:27
Помогите с составлением БЛОК СХЕМЫ kiko Паскаль, Turbo Pascal, PascalABC.NET 1 28.11.2008 11:35
помогите с составлением программ tuborg777 Microsoft Office Excel 2 03.06.2008 20:45