Usuwanie wiersza w MshFlexGrid i bazie access


(Grzeniux) #1

Witam,,

Po raz kolejny proszę Was o pomoc w VB6.0

Tym razem mam problem z usunięciem wiersza w *.mdb

Mam kod który usuwa dane z MSHFLEXGRID ale po odświeżeniu wcześniej usunięty wiersz cały czas jest widoczny.

Private Sub Command7_Click()

With MSHFlexGrid1

   If (.Rows > .FixedRows + 1) Then

        .RemoveItem .Row

    Else

       .Rows = .FixedRows

    End If

End With

Domyślam się że muszę do wyżej podanego kodu dopisać linijkę kodu który będzie odpowiedzialny za usunięcie wybranego wiersza również w bazie w accessie. Próbowałem rozwiązać porblem kodem takim jak zastosowałem w DATAGRID ale usuwa się tylko wiersz pierwszy z góry

Adodc1.Recordset.Delete

Na formularzu mam umieszczony MSHFLEXGRID oraz ADODC1., połączenie działa poprawnie.

Pozdrawiam


(floyd) #2

Bardzo dobrze się domyślasz.

Jeżeli tabela w bazie acces będzie miała nazwę np. tabela1 a kolumna w tej tabeli nosi nazwę: nazwa i w kolumnie tej tabeli są umieszczane teksty z MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2)

to procedura usuwania znaczonego wiersza może wyglądać tak:

Private Sub Command7_Click()

dim tekst as string

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 1)

Adodc1.RecordSource = "select *from tabela1 Where tabela1.nazwa='" + tekst + "'"

Adodc1.Refresh

If (Adodc1.Recordset.RecordCount > 0) Then

Adodc1.Recordset.Delete

With MSHFlexGrid1

   If (.Rows > .FixedRows + 1) Then

        .RemoveItem .Row

    Else

       .Rows = .FixedRows

    End If

End With

End If

End sub

Ważne jest aby w kolumnie którą wybieramy były tylko wartości które się nie powtarzają.


(Dimatheus) #3

grzeniux , zapoznaj się, proszę, z tym tematem, a następnie - korzystając z przycisku zmien.gif

Pozdrawiam,

Dimatheus


(Grzeniux) #4

Hej,,

tak analizuje twój kod którymi mi podałeś no i coś mi nie działa za bardzo,

tabela o której mówiłeś nazywa się mserwis i zawiera 16 kolumn( z czego wszystkie mają wartość tekst a jedna kolumna jest ustawiona jako data), żeby usunąć cały wiersz z bazy accessa wystarczy że podam tylko jeden wiersz??

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2)

notka.RecordSource = "select *from tabela1 Where tabela1.nazwa='" + tekst + "'"

no i za bardzo nie wiem co oznacza "notka" przed RecordSource

notka.RecordSource = "select *from tabela1 Where tabela1.nazwa='" + tekst + "'"

If (notka.Recordset.RecordCount > 0) Then

(floyd) #5

To moja pomyłka. Powinno oczywiście być:

Adodc1.RecordSource = "select *from tabela1 Where tabela1.nazwa='" + tekst + "'"

If (Adodc1.Recordset.RecordCount > 0) Then

Poprawiłem.

Jeżeli tabela ma nazwę :mserwis , to taką nazwę wpisujesz w miejsce tabela1.nazwa czyli

mserwis.nazwa gdzie słowo nazwa oznacza nazwę kolumny (na szarym tle są nazwy kolumn w tabeli czyli w wierszu o numerze 0. Nie znam nazw kolumn w Twojej tabeli bo nie podałeś więc nie mogę takiej nazwy użyć jaka występuje u Ciebie.


(Grzeniux) #6

usunięcie "notka" nic nie pomogła, przy próbie uruchomienia pojawia się komunikat

"compile error

user-defined type not defined"

coś chyba poplątałem, tylko co??


(floyd) #7

Nie o usunięcie chodzi, ale zmianę słowa 'notka' na słowo :'Adodc1'


(Grzeniux) #8

Zmieniłem na Adodc1 i w dalszym ciągu pojawia się ten komunikat co wyżej,

Czy wystarczy że podam tylko jedną nazwę kolumny z tabeli żeby usunąć wiersz( w tabeli mam ich 16)??

Adodc1.RecordSource = "select *from tabela1 Where tabela1.nazwa='" + tekst + "'"

If (Adodc1.Recordset.RecordCount > 0) Then

Private Sub Command7_Click()


Dim tekst As text

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2)

Adodc1.RecordSource = "select *from mserwis 'Where mserwis.zlecenie_numer='" + tekst + "'"

If (Adodc1.Recordset.RecordCount > 0) Then

Adodc1.Refresh

Adodc1.Recordset.Delete

With MSHFlexGrid1

   If (.Rows > .FixedRows + 1) Then

        .RemoveItem .Row

    Else

       .Rows = .FixedRows

    End If

End With

End If

End Sub

(floyd) #9

Wystarczy podać tylko element z jednej kolumny.

Ja znowu wskazałem tylko przykładowo, że to w kolumnie 2 znajdują się wartości zmiennej o nazwie: zlecenie_numer

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2)

a, jak jest u Ciebie, to musisz sprawdzić i wpisać właściwy numer.

(Wszystkie nazwy występujące w procedurze muszą się zgadzać z rzeczywistymi, żeby program działał prawidłowo.)


(Grzeniux) #10

Zrobiłem tak jak pisałeś,

wstawiłem nazwę kolumny tak jak jest w bazie access "numer_zlecenia" kolumna ta jest jako pierwsza na liscie czyli w tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 2) podaje 0 ( próbowałem również 1)

Private Sub Command7_Click()


Dim tekst As text

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 1)

Adodc1.RecordSource = "select *from mserwis 'Where mserwis.numer_zlecenia='" + tekst + "'"

If (Adodc1.Recordset.RecordCount > 0) Then

Adodc1.Refresh

Adodc1.Recordset.Delete

With MSHFlexGrid1

   If (.Rows > .FixedRows + 1) Then

        .RemoveItem .Row

    Else

       .Rows = .FixedRows

    End If

End With

End If

End Sub

(floyd) #11

z tego wynika że wartości zmiennej numer_zlecenia w tabeli MSHFlexGrid1 są w kolumnie 1. Jeżeli tak, to OK.


(Grzeniux) #12

W takim razie gdzie może tkwić problem że to nie działa??

Jeszcze podczas wyskakiwania błedu w codzie podświetla się Private Sub Command7_Click() i Dim tekst As text

moze coś tutaj jest nie tak??


(floyd) #13

Oczywiście, że błąd. Chyba wczoraj było za gorąco (38°) i stąd takie zaczadzenie umysłu.

Jeśli już deklarujemy zmienną tekst to tak : Dim tekst As string

Uwaga:

jeżeli w naszej bazie nie ma kolumny w której elementy by się nie powtarzały, to można użyć kolumny 0 z bazy Accessa o nazwie Identyfikator. Należy jednak pamiętać aby elementy tej kolumny były też wczytywane do tabeli MSHFlexGrid1 np. w kolumnie 0 (lub innej). Jeżeli kolumnie tej przypiszemy szerokość 0 instrukcją: MSHFlexGrid1.ColWidth(0) = 0, to nie będzie widoczna czyli nie będzie przeszkadzać w ogólnym widoku.

Usuwanie wiersza z bazy będzie miało wówczas postać:

dim tekst as string

tekst = MSHFlexGrid1.TextMatrix(MSHFlexGrid1.Row, 0)

Adodc1.RecordSource = "select *from mserwis Where mserwis.Identyfikator=" & tekst

Adodc1.Refresh

 Adodc1.Recordset.Delete

With MSHFlexGrid1

   If (.Rows > .FixedRows + 1) Then

        .RemoveItem .Row

    Else

       .Rows = .FixedRows

    End If

End With

(Grzeniux) #14

Trochę mi się zeszło ale już zrobiłem, dzięki za pomoc

Pozdrawiam!