DBGrid+DBNavigator podmiana zapytań

0

Witam!

Mam nietypowy problem, może ktoś się z tym spotkał i przebrnął przez to, a więc sprawa wygląda nastepująco:

Mam działający DBGrid+DBNavigator, wszystko działa poprawnie,mogę się poruszać po wyświetlanych rekordach, modyfikować, usuwać i dodawać. Nie pokazuję wszystkich kolumn, aby nie uprzykrzać życia użytkownikom. W tej tabeli posiadam kolumnę: id_user zawierającą identyfikator użytkownika - niewidoczna w DBGrid. Chciałbym aby w momencie dodawania nowego rekordu-przy wykorzystaniu DBGrid+DbNavigator- móc dodać do wykonywanego zapytania identyfikator użytkownika który jest pamiętany przez program. Tak samo chciałbym robić przy zmianach.

Z góry dziękuję za odpowiedzi.

pozdrawiam

janusz

0

Identyfikator rekordu (u Ciebie id_user) jest po to, żeby jednoznacznie wskazywał jakiś rekord. Więc po co chcesz go ręcznie wstawiać do bazy (po co program ma pamietać wartość tego atrybutu)? Aby wstawić do bazy danych unikalną wartość tego atrybutu wykorzystaj dobrodziejstwa baz danych (sekwencje, generatory, odpowiednie typy). Nie wiem w jakiej bazie danych robisz ten program ale jeśli jest to Oracle to zastosuj sekwencje, w InterBae użyj generatorów, w Access, DB2, MySQL użyj atrybutu typu autoincrement, w Informix użyj atrybutu typu serial, a jeśli używasz SQL Server poczytaj o Identity.

0

nie o to chodziło, id_user nie jest unikalną kolumnę w tej tabeli.
jest tak:

tabela
id_rekord -unikalny identyfikator w tabeli
pole1 - dana1
pole2 - dana2
id_user - identyfikator użytkownika
czas_wpisu - timestamp dodania rekordu

w gridzie pokazuję tylko pole1 i pole2 (id_rekord - nadawany przez baze, czas_wpisu nadawany przez bazę)
id_user jest identyfikatorem pamiętam w programie po zalogowaniu użytkownika.

Chodzi mi o to aby przy wykorzystaniu tych komponentów (tzn. dbgrid+dbnavigator) móc dodać do zapytania identyfikator użytkownika pamiętany przez program tzn.
komponnety wstawią do bazy pole1, pole2 (id_user - wstawia baza, czas_wpisu - wstawia baza) zostaje id_user do wstawienia,

ze strony bazy myślałem o zastosowaniu trigera (w jednej z tabel odkładam użytkownika aktualnie zalogowanego w tej sesji) a triger przed wstawieniem podmienia id_user,
ale chciałbym to zrobić z programu (mam około 40 tabel słownikowych).

0

W takiej sytuacji ja bym zrezygnował w ogóle z dbnavigator (swoją drogą nie jest to najładniejszy komponent do tworzenia interfejsów użytkownika) i sam zaprojektował przyciski służące do dodawania modyfikowania u usuwania rekordów (zamiast edycji w dbgrid zrobiłbym to w editach i listach rozwijanych) - to by załatwiło sprawę. Jednak jeśli chcesz się bawić z dbgrid+dbnavigator to żeby zastąpić standardowe czynności wykonywane przez przyciski dbnavigator należy oprogramować zdarzenie BeforeAction:

procedure TForm1.DBNavigator1BeforeAction(Sender: TObject;
  Button: TNavigateBtn);
begin
    if Button=nbPost then //jeśli kliknięty zostanie przycisk z tickiem zatwierdzający zmiany w bazie
    begin
         //podmina zapytania na własne
    end;
end;
0

dziękuje

pozdrawiam

janusz

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