Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Мультиудаление записей таблицы   Найти похожие ветки 

 
Hadroran   (2011-10-20 16:00) [0]

Привет всем мастерам.
Помогите с кодом, что не правильно написано?

while i_tmp<(FindComponent(format("%s",[GridName])) as  TcxGridDBTableView).Controller.SelectedRowCount do
  begin
     DM.Q_All.GotoBookmark(TBookmark((FindComponent(format("%s",[GridName])) as TcxGridDBTableView).Controller.SelectedRows[i_tmp]));
     DM.FIBSQLExe("DELETE FROM "+TableName+" WHERE ID_CODE = "+DM.Q_All.FieldByName("ID_CODE").asString,false);
     inc(i_tmp);
  end;
DM.FIBTransaction.CommitRetaining;

При выполнении кода на GotoBookmark появляется ошибка. Спасибо.


 
Медвежонок Пятачок ©   (2011-10-20 16:12) [1]

TDataSet.BookmarkValid(BookMark: Pointer) : boolean


 
Ega23 ©   (2011-10-20 16:12) [2]

http://delphimaster.net/view/2-1318218903/


 
Inovet ©   (2011-10-20 16:18) [3]

> [0] Hadroran   (20.10.11 16:00)
> При выполнении кода на GotoBookmark появляется ошибка.

Текст сообщения об ошибке, конечно же, зашифрован, ключ не выдан.


 
Ega23 ©   (2011-10-20 16:20) [4]

А в целом я бы так сделал:

var
 grid: TcxGridDBTableView;
 i: Integer;
 s: string;
begin
 grid := FindComponent(format("%s",[GridName])) as  TcxGridDBTableView;
 s := "delete from xxx where ID_CODE in (-1";
 DM.Q_All.DisableControls;
 try
   for i:= 0 to grid.Controller.SelectedRowCount - 1 do
   begin
     DM.Q_All.GotoBookmark(grid.DelectedRows[i]);
     s := s + "," + DM.Q_All.FieldByName("ID_CODE").asString;
   end;
   s := s + ");";
   DM.FIBSQLExe(s); // Не знаю, что это такое
   
   // переоткрыть запрос
   DM.Q_All.Close;
   DM.Q_All.Open;
 finally
   DM.Q_All.EnableControls;
 end;
end;


 
Медвежонок Пятачок ©   (2011-10-20 16:24) [5]

если в этот код приходит имя грида, то почему в него не может прийти ссылка на сам грид?
На кой леший здесь findcomponet?

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


 
Медвежонок Пятачок ©   (2011-10-20 16:44) [6]

... и быть прикрученными к одному и тому же датасету DM.Q_All.

Причем датасет один, а удаление идет "DELETE FROM "+TableName+"

что не правильно написано?

Все.


 
Hadroran   (2011-10-21 08:43) [7]


> что не правильно написано?
>
> Все.

Исчерпывающий ответ. Я бы тоже так смог всем проблемы решать.


 
Медвежонок Пятачок ©   (2011-10-21 09:07) [8]

для начала попробуй не создавать проблем на пустом месте.


 
Hadroran   (2011-10-21 09:12) [9]


> Ega23 ©   (20.10.11 16:20) [4]


var
grid: TcxGridDBTableView;
i: Integer;
s: string;
begin
grid := FindComponent(format("%s",[GridName])) as  TcxGridDBTableView;
s := "delete from xxx where ID_CODE in (-1";
DM.Q_All.DisableControls;
try
  for i:= 0 to grid.Controller.SelectedRowCount - 1 do
  begin
    DM.Q_All.GotoBookmark(TBookmark(grid.DelectedRows[i]));
    s := s + "," + DM.Q_All.FieldByName("ID_CODE").asString;
  end;
  s := s + ");";
  DM.FIBSQLExe(s); // Не знаю, что это такое
 
  // переоткрыть запрос
  DM.Q_All.Close;
  DM.Q_All.Open;
finally
  DM.Q_All.EnableControls;
end;
end;

Код немного я изменил, потому-что при коде
DM.Q_All.GotoBookmark(TBookmark(grid.DelectedRows[i])); без TBookmark код не компилится.
Но все равно проблема осталась. На первом проходе, при i=0 все нормально, при i=1 (т.е. на следующем) опять ошибка "Access violation at adress ..."


 
Ega23 ©   (2011-10-21 09:23) [10]


> Исчерпывающий ответ.


+ стопицот к Поросёнку Винни


 
Медвежонок Пятачок ©   (2011-10-21 09:56) [11]

>grid.Controller.SelectedRowCount - 1
>TBookmark(grid.SelectedRows[i])

wtf ?


 
Hadroran   (2011-10-21 10:03) [12]


> wtf ?

Да, именно так и написано, иначе была бы другая ошибка. Простите за опечатку )


 
Hadroran   (2011-10-21 10:05) [13]

var
grid: TcxGridDBTableView;
i: Integer;
s: string;
begin
grid := FindComponent(format("%s",[GridName])) as  TcxGridDBTableView;
s := "delete from Table where ID_CODE in (-1";
DM.Q_All.DisableControls;
try
 for i:= 0 to grid.Controller.SelectedRowCount - 1 do
 begin
   DM.Q_All.GotoBookmark(TBookmark(grid.Controller.SelectedRows[i]));
   s := s + "," + DM.Q_All.FieldByName("ID_CODE").asString;
 end;
 s := s + ");";
 //Выполняем запрос
 // переоткрыть запрос
 DM.Q_All.Close;
 DM.Q_All.Open;
finally
 DM.Q_All.EnableControls;
end;
end;


 
Anatoly Podgoretsky ©   (2011-10-21 10:14) [14]


> Исчерпывающий ответ. Я бы тоже так смог всем проблемы решать.

Но ты то не решаешь.


 
Hadroran   (2011-10-21 10:34) [15]


> Anatoly Podgoretsky

Преклоняю голову.
Но, походу проблема так нерешенная и останется.


 
Медвежонок Пятачок ©   (2011-10-21 10:35) [16]

Да, именно так и написано, иначе была бы другая ошибка. Простите за опечатку )


То есть в программе код один, а на форуме другой.
И все в нём ищут ошибку.


 
Hadroran   (2011-10-21 10:55) [17]

Вот придираетесь к орфографии. Я же обозначил место появления ошибки.
Второй проход в цикле
DM.Q_All.GotoBookmark(TBookmark(grid.Controller.DelectedRows[i]));
Пробовал и с
> TDataSet.BookmarkValid(BookMark: Pointer) : boolean

Не сложилось. Ошибок не выдает, только по DataSet-у  в количестве SelectedRowCount не двигается. Стоит на последней выделенной записи.


 
Anatoly Podgoretsky ©   (2011-10-21 11:03) [18]

Какие к черту еще букмарки, особенно на удаленые записи, что там кроме AV можно получить.
Ты выкинть код и перепиши все нафиг и тебе будет счастье.


 
Медвежонок Пятачок ©   (2011-10-21 11:08) [19]

Вот придираетесь к орфографии.

К какой нафик орфографии?

У тебя длина букмарков читается из grid.Controller
а сами букмарки вынимаются прямо из grid.SelectedRows


 
Anatoly Podgoretsky ©   (2011-10-21 11:29) [20]


> Но, походу проблема так нерешенная и останется.

Если приложишь усилия к решению, то возможно будет решена.


 
Hadroran   (2011-10-21 11:48) [21]

Так в TcxGridDBTableView только через Controller можно обратиться к SelectedRows.
Во многих примерах в сети используют такой код
DBGrid1.Datasource.Dataset.Bookmark := DBgrid1.SelectedRows.Items[x]; Но ведь это же разные типы. Решения нет, и я продолжаю тупить. От этого только клаве больнее становится.


 
Hadroran   (2011-10-21 12:00) [22]

Решил без букмарков, но как-то не эротично что-ли, по-детски.

s_tmp:="DELETE FROM "+TableName+" WHERE ID_CODE IN (-1";
DM.Q_All.DisableControls;
try
  i_tmp:=0;
  while i_tmp<DBGrid.Controller.SelectedRowCount do
      begin
         DM.Q_All.Locate("ID_CODE",strtoint(DBGrid.Controller.SelectedRows[i_tmp].Display Texts[0]),[loCaseInsensitive, loPartialKey]);
         s_tmp:=s_tmp+","+DM.Q_All.FieldByName("ID_CODE").asString;
         inc(i_tmp);
      end;
  s_tmp:=s_tmp+")";
  // выполняем запрос
  // обновляем запрос
finally
  DM.Q_All.EnableControls;
end;


 
Медвежонок Пятачок ©   (2011-10-21 12:02) [23]

эротичнее будет тогда, когда будешь анализировать результат локейта. он булевый.


 
Anatoly Podgoretsky ©   (2011-10-21 12:12) [24]

> Hadroran  (21.10.2011 12:00:22)  [22]

Так бы сразу и сказал, что этотики хочешь.
А по детски так

Кроха сын к отцу пришел
И сказала кроха
Пися в писю хорошо
Пися в попу плохо



Страницы: 1 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.01 c
2-1319204159
Alez
2011-10-21 17:35
2012.01.29
Не правильно работает код после перехода на Delphi XE2


15-1318365002
Юрий
2011-10-12 00:30
2012.01.29
С днем рождения ! 12 октября 2011 среда


15-1317960201
Smile
2011-10-07 08:03
2012.01.29
Anatoly Podgoretsky - с Юбилеем!


4-1253608495
QAZ
2009-09-22 12:34
2012.01.29
Меню


1-1282384267
MSV
2010-08-21 13:51
2012.01.29
Двустрорнняя печать