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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2010, 21:41   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
Смущение Извлечение значения из ячейки DBGrideh

Есть таблица:
| 1 | Иван | сантехник
| 2 | Саня | рабочий
| 3 | Петя | электрик
| 4 | Вова | водопроводчик
Если я выделю любую строку, то мне надо узнать значение первого столбца, перевести это значение в integer и потом из него вычесть кое-что, - всё это находится в одном цикле... Так вот, меня интересует, с помощью чего можно узнать значение первого столбца в этой таблице? Я использую компонент DBGrideh из библиотеки EhLib, он соединен с БД, всё работает хорошо. Я буду очень признателен, если вы напишите мне код для того чтобы вытащить значение из выделенной ячейки 1-го столбца. Больше ничего не надо! Я сам знаю, что код на пол строки, но методом тыка не могу подобрать ничего!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 03.01.2010, 21:47   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Table.Fields[0].Value
mihali4 вне форума Ответить с цитированием
Старый 03.01.2010, 21:54   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Только у меня вот так будет: Form1.DBGridEh2.Fields[0].Value, но почему-то программа виснет.
Table у меня нет.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 03.01.2010, 22:05   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от ImmortalAlexSan Посмотреть сообщение
Только у меня вот так будет: Form1.DBGridEh2.Fields[0].Value, но почему-то программа виснет.
Table у меня нет.
Тэйбла нет???
А чьи же данные грид отображает?
mihali4 вне форума Ответить с цитированием
Старый 03.01.2010, 22:13   #5
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Код:
//Вычитаем из номера строки единицу
  Form1.DBGridEh2.DataSource.DataSet.DisableControls; // отключаем мигание
  cnt := 0; //счетчик
  bmk2:=Form1.DBGridEh2.SelectedRows.DataSet.GetBookmark; //Ставим метку
  try
    Form1.DBGridEh2.SelectedRows.DataSet; // Начинаем с выделенной строки
    while not Form1.DBGridEh2.DataSource.DataSet.Eof do begin; // до конца файла
      Inc(cnt);
      // Меняем номера
      ZQuery2.SQL.Text:='Update detals set str_id='''+IntToStr(StrToInt(Form1.DBGridEh2.Fields[0].Value)-cnt)+''', izdel_id=izdel_id, 
detal_id=detal_id, detal_name=detal_name, detal_kol_izd=detal_kol_izd, pokr_name=pokr_name, detal_info=detal_info where str_id='+ 
Form1.DBGrideh2.Columns[0].Field.AsString;
      ZQuery2.ExecSQL;
      Form1.ZQuery2.Refresh;
      // Êîíåö ñìåíû
      Form1.DBGridEh2.DataSource.DataSet.Next; //на следующую запись
    end;
      //Form1.DBGridEh2.DataSource.DataSet.GotoBookmark(bmk2); //возвращаемся к метке
  finally
    Form1.DBGridEh2.DataSource.DataSet.FreeBookmark(bmk2); //освобождаем
    Form1.DBGridEh2.DataSource.DataSet.EnableControls;  //включаем мигание
    end;     
    //закончили переименование индексов
У меня программа виснет, а когда запускаю заново её, то во второй строке почемуто в значении № строки вижу разное число каждый раз переваливающее за 100 тысяч. Весь остальной код я не выкладываю, он правильный, проблема только когда подключаю вот эти строки:
Код:
ZQuery2.SQL.Text:='Update detals set str_id='''+IntToStr(StrToInt(Form1.DBGridEh2.Fields[0].Value)-cnt)+''', izdel_id=izdel_id, detal_id=detal_id, 
detal_name=detal_name, detal_kol_izd=detal_kol_izd, pokr_name=pokr_name, detal_info=detal_info where str_id='+Form1.DBGrideh2.Columns[0].Field.AsString;
      ZQuery2.ExecSQL;
      Form1.ZQuery2.Refresh;
Помогите пожалуйста.

22:15

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Тэйбла нет???
А чьи же данные грид отображает?
Грид отображает данные, хранящиеся в таблице, созданной в erwin 4 и отредактированной в MSSQLServer 2000
Это последнее, с чем прошу помочь, если это сделать, то программа полностью готова...

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Модератор
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось mihali4; 03.01.2010 в 23:19.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 03.01.2010, 22:29   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Еще раз.
Есть компоненты-датасеты - TTable, TQuery и т.д.
Есть компоненты, способные отображать данные - DBEdit, DBGrid и т.д.
Есть связующее звено между ними - TDataSourse.
Так вот - "из воздуха" данные в гриде никак появиться не могут.
Грид должен быть подключен через TDataSourse к какому-то датасету, как источнику данных.
Вот у этого датасета (TTable, TQuery и т.д.) и нужно смотреть значение первого поля.
mihali4 вне форума Ответить с цитированием
Старый 03.01.2010, 22:37   #7
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Я использу связь DBGrideh -> DataSource -> ZQuery -> Zconnection а уже zconnection подключен к серверу моему, к базе данных и к определенной таблице. Больше я не использую компонентов кроме вышеперечисленных. Я сейчас попробую вместо table... Query написать... Поправьте пожалуйста выделенную в тэге строчку... как правильно будет?
Сделал так: Form1.ZQuery2.Fields[0].Value-cnt - всё равно прога виснет, а потом выдает дикое число во второй строке.
Это всё действительно так!!! Но тем не менее Нижние строки смещаются и индексы меняются как и надо, но вот виснет гадость, и число заоблачное во второй строке 1-го столбца выдаёт!
Что мне делать-то?
Я ещё заметил что цикл выполняет только первый шаг и больше не работает и виснет!!! Т.е. меняется только строка, стоящая под удаляемой, а остальные как были так и остаются.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 03.01.2010 в 22:45.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 03.01.2010, 23:16   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну понятно.
Вы сначала получили некую выборку в ZQuery2.
Эта выборка у вас отображается в DBGridEh2.
Теперь вы ничтоже сумняшеся задаете ZQuery2.SQL.Text:='Update detals set ..." и удивляетесь, что у вас все работает не так, как надо...
Выборка-то пропала, нет ее больше...
Киньте на форму еще один Query и через него делайте апдейт. Вот и все.
mihali4 вне форума Ответить с цитированием
Старый 03.01.2010, 23:28   #9
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Такс... Я сделал без дополнительного ZQuery... Вопрос снят с повестки дня! Спасибо огромное за помощь!
Возник новый вопрос!!!
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 03.01.2010 в 23:50.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 04.01.2010, 00:31   #10
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
Злость

Код:
procedure TForm2.Button1Click(Sender: TObject);
var
cnt: integer;
bmk, bmk2:Tbookmark;
begin
ZQuery2.SQL.Text:='Update detals set str_id='''+IntToStr(-1)+''', izdel_id=izdel_id, detal_id=detal_id,detal_name=detal_name,detal_kol_izd=detal_kol_izd, pokr_name=pokr_name,
detal_info=detal_info where str_id='+Form1.DBGridEh2.Columns[0].Field.AsString;
ZQuery2.ExecSQL;
Form1.DBGridEh2.DataSource.DataSet.next;
If Form1.DBGridEh2.DataSource.DataSet.Eof=true then
begin
ZQuery2.SQL.Text:='Delete from detals where str_id='+inttostr(-1);
ZQuery2.ExecSQL;
Form1.ZQuery2.Refresh;
end
else
begin
ZQuery2.SQL.Text:='Delete from detals where str_id='+inttostr(-1);
ZQuery2.ExecSQL;
Form1.ZQuery2.Refresh;
  Form1.DBGridEh2.DataSource.DataSet.DisableControls;
  bmk:=Form1.DBGridEh2.DataSource.DataSet.GetBookmark;
  cnt := 0;
  try
    Form1.DBGridEh2.SelectedRows.DataSet;
    while not Form1.DBGridEh2.DataSource.DataSet.Eof do begin;
      Inc(cnt);
      ZQuery2.SQL.Text:='Update detals set str_id='''+IntToStr(Form1.DBGridEh2.Fields[0].Value-1)+''', izdel_id=izdel_id, detal_id=detal_id, 
detal_name=detal_name, detal_kol_izd=detal_kol_izd, pokr_name=pokr_name, detal_info=detal_info where str_id='+Form1.DBGrideh2.Columns[0].Field.AsString;
      ZQuery2.ExecSQL;
      Form1.DBGridEh2.DataSource.DataSet.Next;
    end;
      Form1.DBGridEh2.DataSource.DataSet.GotoBookmark(bmk);
      Form1.ZQuery2.Refresh;
  finally
    Form1.DBGridEh2.DataSource.DataSet.FreeBookmark(bmk);
    Form1.DBGridEh2.DataSource.DataSet.EnableControls;
    end;
end;
close();
end;
Вышенаписанный код удаляет из таблицы записи, и меняет их нумерацию, если удалена запись не в конце таблицы, т.е. всё равно строки будут следовать в порядке возрастания.
Код:
procedure TForm4.Button2Click(Sender: TObject);
var cnt: integer;
    bmk:Tbookmark;
begin
if (Edit1.Text='') and (Edit2.Text='') then showmessage('Íîìåð èçäåëèÿ è äåòàëè îáÿçàòåëåí!') else
begin
if Button2.Caption='Äîáàâèòü' then
 begin
 Form1.DBGridEh2.DataSource.DataSet.DisableControls; 
  cnt:=0;
  bmk:=Form1.DBGridEh2.DataSource.DataSet.GetBookmark; 
  try
    Form1.DBGridEh2.DataSource.DataSet.First; 
    while not Form1.DBGridEh2.DataSource.DataSet.Eof do begin;
      Inc(cnt);
      Form1.DBGridEh2.DataSource.DataSet.Next;
    end;
    Form1.DBGridEh2.DataSource.DataSet.GotoBookmark(bmk);
  finally
    Form1.DBGridEh2.DataSource.DataSet.FreeBookmark(bmk);
    Form1.DBGridEh2.DataSource.DataSet.EnableControls;
    end;
 ZQuery1.SQL.Text:='Insert into detals (str_id, izdel_id, detal_id, detal_name, detal_kol_izd, pokr_name, detal_info) values ('''+IntToStr(cnt+1)+''','''+
Edit1.Text+''','''+edit2.Text+''','''+edit3.Text+''','''+edit4.Text+''','''+edit5.Text+''','''+edit6.Text+''')';
 ZQuery1.ExecSQL;
 Form1.ZQuery2.Refresh;
 end else
 begin
 ZQuery1.SQL.Text:='Update detals set izdel_id='''+Edit1.Text+''', detal_id='''+edit2.text+''',detal_name='''+edit3.text+''',detal_kol_izd='''+
edit4.text+''',pokr_name='''+edit5.text+''',detal_info='''+edit6.text+''' where str_id='+Form1.DBGrideh2.Columns[0].Field.AsString;
 ZQuery1.ExecSQL;
 Form1.ZQuery2.Refresh;
 end;
close();
end;
Этот код добаляет в таблицу записи с номером=количество строк+1, только проблема вот в чем... Первая, добавляемая мной запись встает на место удаленной, а дальше как и положено записи добавляются вниз таблицы. Прошу помочь с этим разобраться. Очень прошу! Пожалуйста.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось mihali4; 04.01.2010 в 01:15.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Окраска ячейки в зависимости от значения Апчхи Microsoft Office Excel 6 16.08.2009 19:31
сохранение изменений в DBGrid/DBGridEh, при изменении фокуса ячейки dalien БД в Delphi 6 30.07.2009 15:36
Очистить значения после определённой ячейки Sorro Microsoft Office Excel 1 08.05.2009 12:03
Извлечение значения ячейки с использованием функции Сцепить Юрийpirs2008 Microsoft Office Excel 2 03.03.2009 11:13
проблема с выбором значения ячейки ssh Общие вопросы .NET 0 17.01.2009 00:17