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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

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

Цитата:
Зачем же тогда downto применять?
Согласен)
Вот сейчас сделал такой код:
Код:
procedure TForm8.BitBtn8Click(Sender: TObject);
var
 i,k,j: integer;
begin
 i:=1;
 while Form8.StringGrid1.Cells[1,i] <> '' do
 begin
 Form8.Table_jur.Append;
  if Form8.Table_jur.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

 for k:=4 to Form8.StringGrid1.ColCount - 1 do
     Form8.Table_jur.Insert;
     Form8.Table_jur.FieldByName('Fam_jur').AsString:=Form8.StringGrid1.Cells[1,i];
     Form8.Table_jur.FieldByName('Imy_jur').AsString:=Form8.StringGrid1.Cells[2,i];
     Form8.Table_jur.FieldByName('Otche_jur').AsString:=Form8.StringGrid1.Cells[3,i];
     Form8.Table_jur.FieldByName('God_jur').AsInteger:=StrToInt(Form8.StringGrid1.Cells[4,29]);
     Form8.Table_jur.FieldByName('Chetvert').AsString:=Form8.StringGrid1.Cells[2,28];
     Form8.Table_jur.FieldByName('Pred_jur').AsString:=Form8.StringGrid1.Cells[2,29];
     Form8.Table_jur.FieldByName('Klass').AsString:=Form8.StringGrid1.Cells[4,28];
     Form8.Table_jur.FieldByName('Data').AsString:=Form8.StringGrid1.Cells[k,0];
     Form8.Table_jur.Post;
//     Form8.Table_jur.Refresh;
  Inc(i);
 end;
end;
Все данные заносятся, а дата нет. Чего я тут намудрил? В идеале, мне надо, чтобы в БД в таблице данные хранились в таком виде, в котором таблица представлена во вложении. . Как перелопатить мой код, чтобы добиться такого?
Изображения
Тип файла: jpg Безымянный.jpg (32.6 Кб, 139 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 02.08.2009 в 07:13. Причина: Добавил вложение для ясности :)
artemavd вне форума Ответить с цитированием
Старый 02.08.2009, 13:54   #12
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Тип поля Data в таблице БД может не быть строкой.
Data может быть зарезервированным словом для БД и тогда поле не может иметь такое наименование.

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

Последний раз редактировалось Karabash; 02.08.2009 в 13:56.
Karabash вне форума Ответить с цитированием
Старый 02.08.2009, 14:23   #13
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Data может быть зарезервированным словом для БД
Нет, я не дмаю, что здесь в слове проблема. Ибо заменив название "Data" на "Kogda", эфеект был тот же самый.
Сейчас я пытался переделать код. И получилось вот что:
Код:
procedure TForm8.BitBtn8Click(Sender: TObject);
var
 i,k,j: integer;
begin
 i:=1;
 while Form8.StringGrid1.Cells[1,i] <> '' do
 begin
 Form8.Table_jur.Append;
  if Form8.Table_jur.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

  for k:=4 to Form8.StringGrid1.ColCount  do

     Form8.Table_jur.Insert;
     Form8.Table_jur.FieldByName('Fam_jur').AsString:=Form8.StringGrid1.Cells[1,i];
     Form8.Table_jur.FieldByName('Imy_jur').AsString:=Form8.StringGrid1.Cells[2,i];
     Form8.Table_jur.FieldByName('Otche_jur').AsString:=Form8.StringGrid1.Cells[3,i];
     Form8.Table_jur.FieldByName('God_jur').AsInteger:=StrToInt(Form8.StringGrid1.Cells[4,29]);
     Form8.Table_jur.FieldByName('Chetvert').AsString:=Form8.StringGrid1.Cells[2,28];
     Form8.Table_jur.FieldByName('Pred_jur').AsString:=Form8.StringGrid1.Cells[2,29];
     Form8.Table_jur.FieldByName('Klass').AsString:=Form8.StringGrid1.Cells[4,28];
     Form8.Table_jur.FieldByName('Data').AsDateTime:=StrToDateTime(DateToStr(Form8.DateTimePicker1.Date));
     Form8.Table_jur.Post;
  Inc(i);
 end;
end;
Когда я из полей ввода заполнил данные (выбрал четверть, предмет, год, ввел название класса, ввел ФИО учеников, выбрал дату из DateTimePicker, поставил типа оценки за этот день и нажал на кнопку внесения данных в БД (код выше), то все нормально занеслось. После этого я сохранил этот лист в файл Excel. Затем я перезапускаю свою программу, загружаю свой лист в мою прогу. Затем я должен снова выбрать дату (она должна стать следующей после предыдущей). Но, она не следующей встает, а затирает ту, что уже была, оставляя оценки. Так не должно быть. А когда воторой раз нажимаю на кнопку внесения данных, то появляется ошибка "DataSource_jur nor insert or edit mode" (типа такой. )Как исправить? Вот код, который предложил мне, Уважаемый Stilet, чтобы дата располагалась друг за другом в ячейках грида в нулевой(первой) строке:
Код:
procedure TForm8.DateTimePicker1CloseUp(Sender: TObject);
begin
 Form8.StringGrid1.Cells[Form8.StringGrid1.Tag + 4,0]:=FormatDateTime('dd.mm',Form8.DateTimePicker1.Date);
  if Form8.StringGrid1.Tag < Form8.StringGrid1.ColCount then
    begin
     Form8.StringGrid1.Tag:=Form8.StringGrid1.Tag + 1;
    end;
end;
Этот код работал хорошо для кода в посте №11. Как его передалать для кода в посте №12?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 02.08.2009 в 14:28.
artemavd вне форума Ответить с цитированием
Старый 02.08.2009, 14:42   #14
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Измененное значение Tag (StringGrid1.Tag:=StringGrid1.Tag + 1) не сохраняется при выходе из программы.
Значение это надо либо где-то хранить (ini, реестр, БД), или после запуска программы и подгрузки данных выяснять на какой колонке кончаются даты и уже номер этой колонки + 1 присваивать свойству Tag (это перед выполнением процедуры DateTimePicker1CloseUp).
Если я правильно понял проблему.

Последний раз редактировалось Karabash; 02.08.2009 в 14:50. Причина: Добавлены некоторые детали
Karabash вне форума Ответить с цитированием
Старый 02.08.2009, 14:51   #15
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
или после запуска программы и подгрузки данных выяснять на какой колонке кончаются даты и уже номер этой колонке присваивать свойству Tag
А как это в виде кода будет выглядеть?
Цитата:
Если я правильно понял проблему.
Попробуем сначала сделать с датой.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.08.2009, 15:04   #16
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Опять же в цикле (при входе или в функции/процедуре, где происходит загрузка данных в грид и после этой загрузки):
Код:
for i := 4 to StringGrid1.ColCount-1 do
  if StringGrid1[i, 0] = '' then begin
    StringGrid1.Tag := i - 4;
    break;
  end;

Последний раз редактировалось Karabash; 02.08.2009 в 15:07.
Karabash вне форума Ответить с цитированием
Старый 02.08.2009, 15:25   #17
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Попробовал Ваш код, вроде получилось. Только прищлось заменить i - 4 на i - 3. Казалось бы, теперь данные должны заноситься. Но нет. Выдается ошибка при повторном нажатии на кнопку такого плана "Table_jur: Dataset not in edit or insert mode" и выделяет в коде вот эту строчку:
Код:
procedure TForm8.BitBtn8Click(Sender: TObject);
var
 i,k,j: integer;
begin
 i:=1;
 while Form8.StringGrid1.Cells[1,i] <> '' do
 begin
 Form8.Table_jur.Append;
  if Form8.Table_jur.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

  for k:=4 to Form8.StringGrid1.ColCount  do

     Form8.Table_jur.Insert;
     Form8.Table_jur.FieldByName('Fam_jur').AsString:=Form8.StringGrid1.Cells[1,i];
     Form8.Table_jur.FieldByName('Imy_jur').AsString:=Form8.StringGrid1.Cells[2,i];
     Form8.Table_jur.FieldByName('Otche_jur').AsString:=Form8.StringGrid1.Cells[3,i];
     Form8.Table_jur.FieldByName('God_jur').AsInteger:=StrToInt(Form8.StringGrid1.Cells[4,29]);
     Form8.Table_jur.FieldByName('Chetvert').AsString:=Form8.StringGrid1.Cells[2,28];
     Form8.Table_jur.FieldByName('Pred_jur').AsString:=Form8.StringGrid1.Cells[2,29];
     Form8.Table_jur.FieldByName('Klass').AsString:=Form8.StringGrid1.Cells[4,28];
     Form8.Table_jur.FieldByName('Data').AsDateTime:=StrToDateTime(DateToStr(Form8.DateTimePicker1.Date));
     Form8.Table_jur.Post;
  Inc(i);
 end;
end;
???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 02.08.2009, 15:43   #18
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Form8.Table_jur.Append;
Form8.Table_jur.Insert;
Надо оставить либо одно, либо другое (опять же неизвестен тип БД).
А ошибка на самом деле относится к предыдущей строке. Уж так отладчик устроен в D7. Т.е. при первом же присвоении значения полю происходит ошибка.
Karabash вне форума Ответить с цитированием
Старый 02.08.2009, 15:52   #19
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
опять же неизвестен тип БД
тип Paradox. BDE.
Я убрал Form8.Table_jur.Append. Прошелся отладчиком. Он выдает ошибку сразу после строки:
Код:
procedure TForm8.BitBtn8Click(Sender: TObject);
var
 i,k,j: integer;
begin
 i:=1;
 while Form8.StringGrid1.Cells[1,i] <> '' do
 begin
 Form8.Table_jur.Append;
  if Form8.Table_jur.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

  for k:=4 to Form8.StringGrid1.ColCount  do

     Form8.Table_jur.Insert;
     Form8.Table_jur.FieldByName('Fam_jur').AsString:=Form8.StringGrid1.Cells[1,i];
     Form8.Table_jur.FieldByName('Imy_jur').AsString:=Form8.StringGrid1.Cells[2,i];
     Form8.Table_jur.FieldByName('Otche_jur').AsString:=Form8.StringGrid1.Cells[3,i];
     Form8.Table_jur.FieldByName('God_jur').AsInteger:=StrToInt(Form8.StringGrid1.Cells[4,29]);
     Form8.Table_jur.FieldByName('Chetvert').AsString:=Form8.StringGrid1.Cells[2,28];
     Form8.Table_jur.FieldByName('Pred_jur').AsString:=Form8.StringGrid1.Cells[2,29];
     Form8.Table_jur.FieldByName('Klass').AsString:=Form8.StringGrid1.Cells[4,28];
     Form8.Table_jur.FieldByName('Data').AsDateTime:=StrToDateTime(DateToStr(Form8.DateTimePicker1.Date));
     Form8.Table_jur.Post;
  Inc(i);
 end;
end;
Я ее закоментировал. Снова запускаю. Опять ошибка. На этот раз отладчик показывает на Form8.Table_jur.Post. Я и его в коменты отправил. Опять запускаю. Снова ошибка. И меня выбрасывает на строчку:
Код:
Form8.Table_jur.FieldByName('Data').AsDateTime:=StrToDateTime(DateToStr(Form8.DateTimePicker1.Date));
???
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 02.08.2009 в 16:04.
artemavd вне форума Ответить с цитированием
Старый 02.08.2009, 16:00   #20
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

В коде та же самая логическая ошибка (сразу не заметил), которая была в коде какого-то предыдущего поста: цикл for без операторных скобок (begin..end). Поэтому в цикле выполняется только оператор Insert, другие не выполняются (вернее, выполняются один раз после цикла). Поэтому происходит ошибка "Dataset not in edit or insert mode". Метод Post разместив переданные в поля данные переводит DataSet в нормальный режим и тогда можно повторно использовать Insert. Если же Post не было (как в нашем случае), то следующий вызов Insert генерит такую ошибку.

Последний раз редактировалось Karabash; 02.08.2009 в 16:10. Причина: Некоторые пояснения
Karabash вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка даты в БД artemavd БД в Delphi 4 07.08.2009 18:06
Задача с циклом for в c++ Many man Помощь студентам 5 14.12.2008 12:01
Вставка в поле Edit EVO-X Общие вопросы Delphi 10 11.07.2008 22:25
Вставка текущей даты в БД! Oleg Romanchuk БД в Delphi 5 21.08.2007 19:59
Вставка даты в несколько DBDateTimeEditEh одновременно!? John_chek Компоненты Delphi 3 12.02.2007 16:34