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

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

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

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

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

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

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

и зачем нужно запускать вот такой цикл:
Код:
 while Form1.SG1.Cells[1,i] <> '' do
видимо, поэтому все висит

и зачем делать это?
Код:
 Form13.pFIBDataSet_rezult.Insert;
 Form13.pFIBDataSet_rezult.Close;

Последний раз редактировалось soleil@mmc; 12.12.2009 в 20:47.
soleil@mmc вне форума Ответить с цитированием
Старый 12.12.2009, 20:57   #12
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Абсолютно верно.
Неохота было сначала даже просматривать код, а сейчас пробежался - Inc(i) висит вне цикла...
Ну, а это:
Код:
Form13.pFIBDataSet_rezult.Insert;
Form13.pFIBDataSet_rezult.Close;
видимо, какое-то ноу-хау...
mihali4 вне форума Ответить с цитированием
Старый 12.12.2009, 21:10   #13
Roof
Форумчанин
 
Аватар для Roof
 
Регистрация: 01.02.2007
Сообщений: 785
По умолчанию

к слову о коде - гораздо проще, на мой взгляд, выявлять ошибки, если прописывать with. Я уже не представляю работу в делфи без него, когда куча строк с одним объектом.
Изо всей благодати
В руках крепко сжатых
Я донесу только капли
Roof вне форума Ответить с цитированием
Старый 13.12.2009, 09:28   #14
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Поправил код на такой:
Код:
procedure TForm13.sBitBtn1Click(Sender: TObject);
var
 i:integer;
begin
 i:=1;
  if Form13.pFIBDataSet_spisok.Locate('FAMILIY;IMY;OTCHEST',VarArrayOf([Form1.SG1.Cells[1,i],
                                 Form1.SG1.Cells[2,i],Form1.SG1.Cells[3,i]]),
                                 [loCaseInsensitive,loPartialKey]) = False then
 begin
     Form13.pFIBDataSet_rezult.Insert;
     Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
     Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
     Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
     Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
     Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
     Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
     Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
     Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
     Form13.pFIBDataSet_rezult.Post;
     Form13.pFIBDataSet_rezult.Refresh;
     Form13.pFIBDataSet_rezult.Open;
  end;

  if Form18.sLabel7.Caption = '1' then
    begin
   Form13.pFIBDataSet_rezult.Insert;
   Form13.pFIBDataSet_rezult.FieldByName('IDCHETVERT').AsInteger:=StrToInt(Form18.sLabel7.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDPREDMET').AsInteger:=StrToInt(Form18.sLabel8.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('DVOEK').AsInteger:=StrToInt(Form1.SG2.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('TROEK').AsInteger:=StrToInt(Form1.SG2.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHETVEROK').AsInteger:=StrToInt(Form1.SG2.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PYTEROK').AsInteger:=StrToInt(Form1.SG2.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
   Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
     end;

  if Form18.sLabel7.Caption = '2' then
    begin
   Form13.pFIBDataSet_rezult.Insert;
   Form13.pFIBDataSet_rezult.FieldByName('IDCHETVERT').AsInteger:=StrToInt(Form18.sLabel7.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDPREDMET').AsInteger:=StrToInt(Form18.sLabel8.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('DVOEK').AsInteger:=StrToInt(Form1.SG2.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('TROEK').AsInteger:=StrToInt(Form1.SG2.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHETVEROK').AsInteger:=StrToInt(Form1.SG2.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PYTEROK').AsInteger:=StrToInt(Form1.SG2.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
   Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
     end;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.12.2009, 09:30   #15
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Продолжение:
Код:
  if Form18.sLabel7.Caption = '3' then
    begin
   Form13.pFIBDataSet_rezult.Insert;
   Form13.pFIBDataSet_rezult.FieldByName('IDCHETVERT').AsInteger:=StrToInt(Form18.sLabel7.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDPREDMET').AsInteger:=StrToInt(Form18.sLabel8.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('DVOEK').AsInteger:=StrToInt(Form1.SG2.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('TROEK').AsInteger:=StrToInt(Form1.SG2.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHETVEROK').AsInteger:=StrToInt(Form1.SG2.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PYTEROK').AsInteger:=StrToInt(Form1.SG2.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
   Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
     end;

  if Form18.sLabel7.Caption = '4' then
    begin
   Form13.pFIBDataSet_rezult.Insert;
   Form13.pFIBDataSet_rezult.FieldByName('IDCHETVERT').AsInteger:=StrToInt(Form18.sLabel7.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDPREDMET').AsInteger:=StrToInt(Form18.sLabel8.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('DVOEK').AsInteger:=StrToInt(Form1.SG2.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('TROEK').AsInteger:=StrToInt(Form1.SG2.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHETVEROK').AsInteger:=StrToInt(Form1.SG2.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PYTEROK').AsInteger:=StrToInt(Form1.SG2.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
   Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
     end;
  Inc(i);
 end;
Выдается сообщение, что "pFIBDataSet_rezult: Cannot modify a read-only dataset".
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.12.2009, 14:06   #16
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

еще немного по коду
а в чем отличия кода после строки
Код:
if Form18.sLabel7.Caption = '1' then
и после = 2, =3, =4 ??? и где код для =5?

имхо там никакой разницы, а просто куча лишних проверок
а даже если бы и была разница, то все равно достаточно было бы ее реализовать внутри одного такого блока кода

а по запросу - приведи тексты запросов в этом компоненте - будет видно
либо сними галку ReadOnly с датасета
soleil@mmc вне форума Ответить с цитированием
Старый 13.12.2009, 15:53   #17
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
то все равно достаточно было бы ее реализовать внутри одного такого блока кода
Как именно это можно реализовать? Согласен, что там много лишнего, но, по-другому пока не знаю как сделать..
Цитата:
либо сними галку ReadOnly с датасета
А где эта галка находится? Я не нашел в свойствах ее.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.12.2009, 17:55   #18
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

весь код можно свести к этому
Код:
procedure TForm13.sBitBtn1Click(Sender: TObject);
var
 i:integer;
begin
 i:=1;
  if Form13.pFIBDataSet_spisok.Locate('FAMILIY;IMY;OTCHEST',VarArrayOf([Form1.SG1.Cells[1,i],
                                 Form1.SG1.Cells[2,i],Form1.SG1.Cells[3,i]]),
                                 [loCaseInsensitive,loPartialKey]) = False then
 begin
     Form13.pFIBDataSet_rezult.Insert;
     Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
     Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
     Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
     Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
     Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
     Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
     Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
     Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
     Form13.pFIBDataSet_rezult.Post;
     Form13.pFIBDataSet_rezult.Refresh;
     Form13.pFIBDataSet_rezult.Open;
  end;

  if StrToInt(Form18.sLabel7.Caption) in (1, 2, 3, 4) then
    begin
   Form13.pFIBDataSet_rezult.Insert;
   Form13.pFIBDataSet_rezult.FieldByName('IDCHETVERT').AsInteger:=StrToInt(Form18.sLabel7.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDPREDMET').AsInteger:=StrToInt(Form18.sLabel8.Caption);
   Form13.pFIBDataSet_rezult.FieldByName('IDINFO').AsInteger:=StrToInt(Form1.SG1.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('DVOEK').AsInteger:=StrToInt(Form1.SG2.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('TROEK').AsInteger:=StrToInt(Form1.SG2.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHETVEROK').AsInteger:=StrToInt(Form1.SG2.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PYTEROK').AsInteger:=StrToInt(Form1.SG2.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('PROPUSKI').AsInteger:=StrToInt(Form1.SG2.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KO').AsInteger:=StrToInt(Form1.SG3.Cells[0,i]);
   Form13.pFIBDataSet_rezult.FieldByName('SB').AsInteger:=StrToInt(Form1.SG3.Cells[1,i]);
   Form13.pFIBDataSet_rezult.FieldByName('KY').AsInteger:=StrToInt(Form1.SG3.Cells[2,i]);
   Form13.pFIBDataSet_rezult.FieldByName('Y').AsInteger:=StrToInt(Form1.SG3.Cells[3,i]);
   Form13.pFIBDataSet_rezult.FieldByName('O').AsInteger:=StrToInt(Form1.SG3.Cells[4,i]);
   Form13.pFIBDataSet_rezult.FieldByName('CHO').AsInteger:=StrToInt(Form1.SG3.Cells[5,i]);
   Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
     end;
 Inc(i);
 end;
но вот непонятка
все-таки есть инкремент, а цикла уже нет...
в предыдущем твоем варианте был цикл, но он был криво реализован
короче, напиши по-русски что ты там вообще делаешь? может это можно как-то проще организовать
soleil@mmc вне форума Ответить с цитированием
Старый 13.12.2009, 18:03   #19
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
короче, напиши по-русски что ты там вообще делаешь? может это можно как-то проще организовать
Я должен заносить данные из трех StringGrid-ов в БД. В StringGrid-ах имеются данные. В первом StringGrid-e (SG1) записаны ФИО ученика и его ID. Во втором StringGrid-е (SG2) записаны количества оценок, в третьем (SG3) StringGrid-е расчитанные показатели. Каждая строка во второй и третьей таблице соответствует строке в первой. Код, который был сделан в BDE хорошо работал, хоть, как Вы и говорите был реализован коряво . сейчас попробую Ваш, soleil@mmc код.
................
P.S. Код попробовал. Выдается снова ошибка "pFIBDataSet_rezult: Cannot modify a read-only dataset". И, кстати, soleil@mmc, в строке
Код:
if StrToInt(Form18.sLabel7.Caption) in (1, 2, 3, 4) then
не хватае скобок [].
Должно быть так:
Код:
if StrToInt(Form18.sLabel7.Caption) in ([1, 2, 3, 4]) then
Правильно ли я понял смысл этой строки: значение полученное в Form18.sLabel7.Caption сравнивается из массива [1,2,3,4]??? Эт чтобы смысл понять
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

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

1) ну да, множества в паскале в квадратных скобках (путаю иногда с пиэлевым синтаксисом)
2) замечательно, листай свои стринггриды и вноси данные
только вот в обработчике у тебя нет листания
и если сравнивать со старым примером, то там у тебя был компонент ТТабле - через него редактировать/добавлять легко (если это данные одной таблицы)
а в ФИБах еще нужно правильно все написать в запросе, но стринггриды-то у тебя не ДБ-шные и тогда неясно зачем ты там постишь и рефреш/опен делаешь?!
3) дык каков текст запроса в Form13.pFIBDataSet_rezult?
имхо проще написать отдельным запросом
Код:
insert into ...
и подставить через параметры все данные
и тогда ни к чему там делать вот это
Код:
Form13.pFIBDataSet_rezult.Post;
   Form13.pFIBDataSet_rezult.Refresh;
   Form13.pFIBDataSet_rezult.Open;
достаточно будет сделать
Код:
Form13.pFIBDataSet_rezult.ExecSQL;
soleil@mmc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переделка программы по массиву IDakar Помощь студентам 0 26.11.2009 16:54
Переделка кода hen Общие вопросы C/C++ 6 24.10.2009 17:58
Переделка задачи на Record Impario Помощь студентам 14 16.02.2009 18:49
Двумерные маcсивы(переделка). Hostlman Помощь студентам 2 26.12.2007 19:14