Delphi7 i DBGrid

0

Witam
Problemy dotyczą Delphi7 w połączeniu z MSSQ2000.
Mam dwa pytania:

  1. W jaki sposób ,korzystająć z komponentu DBGrid zaznaczyć jakiś rekord i klikając na przycisk usunąć ten rekord. Obsługe kliknięcia przycisku można zrobić za pomocą SQL np.:
    Delete From jakaś_tabela Where id=3
    TYlko właśnie w jaki sposób pobrać np id z zaznaczonego rekordu na DBGrid.

  2. Jak zrobić automatyczną numerację wyświtlaną w DBGrid. Chodzi mi o to w jaki sposób do DBGrid dodać kolumne lp. gdzie po dopisaniu lub usunięciu będzie wyświetlany przy każdym wpisie numer

0

Usuwanie rekordu wybranego po ID.

begin
   with ibquery1, sql do
    begin
     Close;
      Clear;
       Add('DELETE FROM Tabela where id=:ID');
       ParamByName('ID').AsInteger := ibquery1.FieldByName('id').AsInteger;
       ExecSQL;
      IBTransaction1.Commit;
    end;
end;

Autoinkrementację można zrobić tak:
Pisane z głowy.

var
    l:integer;
begin
   l:=0;
    Table1.First;
      while not Table1.Eof do
      begin
      inc(l);
      Table1.Edit;
    // Table1.FieldByName('LP.').Clear;
     Table1.FieldByName('LP.').asString:=IntToStr(l);
     Table1.Next;
     end;
end;

Lub FieldKind danego pola dajesz na fkCalculated, wcześniej wchodząc do Fields Editor komponentu TQuery (IBQuery). W tym samym komponencie w zdarzeniu OnCalcFields wklep:

DataSet.FieldByName('LP').AsInteger:= DataSet.RecNo;
0
B-A-D napisał(a)
begin
   with ibquery1, sql do
    begin
     Close; // 1
      Clear;
       Add('DELETE FROM Tabela where id=:ID');
       ParamByName('ID').AsInteger := ibquery1.FieldByName('id').AsInteger; // 2
       ExecSQL;
      IBTransaction1.Commit;
    end;
end;

ale to nie przejdzie bo najpierw (1) zamykasz dataset a potem (2) próbujesz pobrać z niego wartość aktualnego rekordu. To trzeba zrobić na dwóch RÓŻNYCH zapytaniach

var
    l:integer;
begin
   l:=0;
    Table1.First;
      while not Table1.Eof do
      begin
      inc(l);
      Table1.Edit;
    // Table1.FieldByName('LP.').Clear;
     Table1.FieldByName('LP.').asString:=IntToStr(l);
     Table1.Next;
     end;
end;

a fe, co za brzydki sposób

0

ale to nie przejdzie bo najpierw (1) zamykasz dataset a potem (2) próbujesz pobrać z niego wartość aktualnego rekordu. To trzeba zrobić na dwóch RÓŻNYCH zapytaniach

A czy ja zrobiłem całe usuwanie? Niech się pomęczą trochę, niech nie leserują przed tym kompem i ruszą mózgami, bo po to im je matka dała :)

Co do autoinkrementacji to faktycznie fee, ale może te fee się komuś przyda jakiemuś początkującemu do analizy. Ja natomiast preferuję tamten drugi sposób.

To trzeba zrobić na dwóch RÓŻNYCH zapytaniach

Przecież to działa bez zarzutu te usuwanie. Jeśli masz lepszą koncepcję to chętnie popatrzę na nią.

0

Ale ja używam komponentów ADO a w ADOQuery raczej nie da się tego zrobić tak jak w IBQuery. ADOQuery nie posiade metody ParamByName.
Jak ktoś wie to prosze o jakiś przykład z ADOQuery. Nie da się tego zrobić odczytując wartość zaznaczonego pola z DBGrid??

1 użytkowników online, w tym zalogowanych: 0, gości: 1