[vb6] MSHFLEXGRID, przenoszenie między tabelami


(Grzeniux) #1

Witam,

 

Wyświetlam dane w kontrolce MSHFLEXGRID(połączenie poprzez adodb z plikiem mdb, plik ten posiada dwie tabele:tabela1 i tabela2, taka sama ilość kolumn i takie same nazwy w obu tabelach. MSHFLEXGRID wyświetla tabele1)  za pomocą buttona command1 chciałbym żeby dane które aktualnie są zaznaczone(pojedyncza komórka)zostały przeniesione do tabeli2 z równoczesnym usunięciem z tabeli1, czy można wykonać coś takiego??Mam nadzieję że opisałem ten problem dosyć zrozumiale.

 

 


(dr.boczek) #2

można.


(floyd) #3

Widzę że za poważniejsze rzeczy się bierzesz czyli za bazę danych. :slight_smile:


(Grzeniux) #4

 No i odezwał się ten diabeł :wink: czyli szczegóły...

 

Swoją bazę chciałem trochę zmienić a przy okazji nauczyć się czegoś nowego.

W bazie mam już buttony odpowiedzialne za dodawanie i usuwanie.

Usuwam za pomocą :

With Adodc1.Recordset
        .Move (MSHFlexGrid1.Row - 1)
        .Delete
        .Requery
    End With
    Adodc1.Refresh
    Set MSHFlexGrid1.DataSource = Adodc1

a dodaje

Set rs = New ADODB.Recordset
rs.Open "select* from tabela1", cn, adOpenKeyset, adLockOptimistic
rs.AddNew

rs!kolumna1 = Text1.text
rs!kolumna2 = Text2.text
rs!kolumna3 = Label1
rs!kolumna4 = Text4.text
rs!kolumna5 = Text5.text
rs!kolumna6 = Text6.text
rs!kolumna7 = Text7.text

rs.Update
rs.Close
Set rs = Nothing

Analizując twój kod nie za bardzo wiem co z czym ugryź,

 

baza-czy to ma być nazwa pliku mdb? "identyfikator" czyli któraś z kolumn w tabeli?

baza.RecordSource = "select * from tabela1 order by identyfikator" baza-czy to ma być nazwa pliku mdb? identyfikator czyli któraś z kolumn w tabeli? 
baza.Refresh
baza.Recordset.MoveFirst
baza.Recordset.Move (numer wiersza w tabeli MSHFLEXGRID)
idList1 =baza.Recordset.Fields(0) 
'========='
baza.RecordSource = "select * from tabela1 where tabela1.Identyfikator=" & idList1
baza.Refresh
baza.Recordset.Delete
baza.Recordset.MoveFirst
' dodawanie elementu do tabeli drugiej gdzie Nowytekst to zawartość wiersza z tabeli MSHFLEXGRID, a nazwa1 to nazwa kolumny w tabeli drugiej'
baza.RecordSource = "select * from tabela2 order by identyfikator"
baza.Refresh
        With baza.Recordset
        .AddNew
        !nazwa1 = NowyTekst
        .Update
        End With
baza.Recordset.MoveFirst

(floyd) #5

oczywiście, że baza to nazwa bazy Access czyli u Ciebie jeśli nie zmieniłeś tej nazwy to będzie:Adodc1

Nazwa pliku jest inna i wskazujesz ją przy otwieraniu bazy w Form_Load

Identyfikator  jest to numer w tabeli bazy Access i znajduje się w pierwszej kolumnie przy każdym wierszu tabeli. Identyfikator jest przydzielany automatycznie. Samą nazwę identyfikator ustalamy sami i u każdego może wyglądać inaczej, podobnie jak i nazwy innych pól tabeli.

Identyfikator nie musi być tą samą liczbą co numer wiersza w tabeli MSHFLEXGRID o czym warto pamiętać.

Jeżeli usuniemy jakiś rekord z bazy, a następnie dodamy nowy rekord, to będzie on już miał całkiem inny identyfikator czyli większy o jeden od największego dotychczasowego identyfikatora w tabeli.

Obsługa bazy danych może wyglądać różnie i nie musi wyglądać tak jak u mnie, jeśli tylko Ci działa poprawnie, to OK.

Jak się po raz pierwszy tworzy bazę danych, to wydaje się, ze numery wierszy w tabeli bazy danych i numery wierszy w tabeli MSHFLEXGRID są takie same, ale później  przy operacjach na rekordach, to się wszystko zmienia.

W tabeli MSHFLEXGRID będzie zawsze :1,2,3,4, a w tabeli Access te same rekordy mogą mieć numery (ja nazywam je identyfikatorami) np: 101,102,105, 106

Ja usuwam rekordy w tabeli Access po identyfikatorach i dlatego zawsze musi być on najpierw znaleziony.

Jeżeli u Ciebie robione jest to inaczej i działa, to nie musisz nic zmieniać.

U mnie po prostu inaczej wygląda baza danych i trzy tabele są od siebie uzależnione na kształt drzewa.

Jeżeli usuwam rekord z pierwszej tabeli(pień), to muszę usunąć wszystkie gałązki przywiązane do tego pnia w drugiej tabeli, a w trzeciej tabeli usuwam wszystkie listki z każdej usuniętej gałązki. :slight_smile:


#6

grzeniux, proszę zapoznaj się z tą stroną oraz tym tematem, a następnie, używając opcji EDYTUJ , później Użyj pełnego edytora , popraw tytuł tematu, tak aby mówił konkretnie o problemie. W przypadku zignorowania prośby temat poleci do śmietnika.


(Grzeniux) #7
Adodc1.RecordSource = "select * from zwrot order by LP" Czy w zapytaniu powinna być wstawiona ta pierwsza kolumna z tabeli zwrot??   
Adodc1.Refresh
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Move (MSHFlexGrid - 1) Wyżej pisałeś (numer wiersza w tabeli MSHFLEXGRID) tak to ma wyglądać jak z boku w kodzie??
idList1 = Adodc1.Recordset.Fields(0) idList1 tą wartość zostawiamczy też powinienem zmienić? 
'========='
Adodc1.RecordSource = "select * from zwrot where zwrot.LP=" & idList1   
Adodc1.Refresh
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveFirst
' dodawanie elementu do tabeli drugiej gdzie Nowytekst to zawartość wiersza z tabeli MSHFLEXGRID, a nazwa1 to nazwa kolumny w tabeli drugiej'
Adodc1.RecordSource = "select * from histor order by LP"
Adodc1.Refresh
        With Adodc1.Recordset
        .AddNew
        !nazwa1 = NowyTekst Czy tutaj nie powinienem mieć odnosników do pozostałych kolumn w tabeli??
        .Update
        End With
Adodc1.Recordset.MoveFirst

W taki sposób zmieniłem kod ,ale nadal jest coś nie tak no i rzecz jasna mam pytania.

Tak jak wcześniej wspomniałem posiadam dwie tabele dokładnie o nazwach zwrot i histor. Kolumny w tych tabelach wyglądają następująco:

  zwrot                                                               histor

LP                                                                    LP                     

DOSTAWCA                                                    DOSTAWCA

ZAMOWIENIE                                                 ZAMOWIENIE

DATA                                                               DATA

ARTYKUL                                                        ARTYKUL

ILOSC                                                              ILOSC

NUMER                                                            NUMER

PRZYDATNOSC                                              PRZYDATNOSC

 

W MSHFLEXGRID1 wyświetlane są wszystkie kolumny z tabeli zwrot oprócz kolumny LP, podobna sytuacja wygląda w tabeli histor również kolumna LP jest ukryta podczas wyświetlania w MSHFLEXGRID1 w innej form1.


(floyd) #8

!nazwa1 = NowyTekst Czy tutaj nie powinienem mieć odnośników do pozostałych kolumn w tabeli??

Oczywiście, że trzeba wpisać wartości dla wszystkich kolumn. Ja podałem przykład tylko z jedną kolumną bo przecież nie wiedziałem ile jest ich u Ciebie i jak się nazywają.

Czyli: !dostawca="ble ble"

         !zamówienie="tik tak"

         ...................

         ...................

         itd

idList1 to zmienna zwracająca numer przypisany danemu rekordowi w tabeli1(zwrot) czyli w twoim przypadku zmienną oznaczoną jako LP.

Zmienna ta powinna być zadeklarowana jako liczba długa:

dim idList1 as long

oczywiście nazwę tej zmiennej można sobie zmienić na dowolnie inną.

Jeżeli wartość tej zmiennej wyznaczamy po kliknięciu na dany rekord w tabeli MSHFLEXGRID

to powinna być zadeklarowana w general czyli tam gdzie:

Option Explicit

dim idList1 as long

Tak powinno zostać: Adodc1.RecordSource = "select * from zwrot order by LP"

To też poprawnie: Adodc1.Recordset.Move (MSHFlexGrid.row - 1)

ale zawsze można sobie sprawdzić czy przenosi do właściwego rekordu który ma być usunięty.


(Grzeniux) #9

Czyli tak, dobrze rozumiem??

Adodc1.RecordSource = "select * from histor order by LP"
Adodc1.Refresh
        With Adodc1.Recordset
        .AddNew
       
        !LP = LP
        !DOSTAWCA = DOSTAWCA
        !ZAMOWIENIE = ZAMOWIENIE
        !Data = Data
        !ARTYKUL = ARTYKUL
        !ILOSC = ILOSC
        !NUMER = NUMER
        !PRZYDATNOSC = PRZYDATNOSC
        .Update
        End With
Adodc1.Recordset.MoveFirst

 


(floyd) #10

Przecież Dostawca to tylko nazwa kolumny. LP nic nie wpisujesz, wpisze się samo. :slight_smile:

!DOSTAWCA= masz wpisać jaki jest ten dostawca w tabeli MSHFLEXGRID w zaznaczonym wierszu.

jeżeli tabela nosi nazwę MSHFLEXGRID to (przed usunięciem rekordu z tabeli MSHFLEXGRID) :

dim numerwiersza as integer: numerwiersza= MSHFlexGrid.Row
Adodc1.RecordSource = "select * from histor order by LP"
Adodc1.Refresh
With Adodc1.Recordset
.AddNew
!DOSTAWCA=MSHFLEXGRID.TextMatrix(numerwiersza,1)
!ZAMOWIENIE=MSHFLEXGRID.TextMatrix(numerwiersza,2)
!Data = MSHFLEXGRID.TextMatrix(numerwiersza,3)
!ARTYKUL = MSHFLEXGRID.TextMatrix(numerwiersza,4)
!ILOSC = MSHFLEXGRID.TextMatrix(numerwiersza,5)
!NUMER = MSHFLEXGRID.TextMatrix(numerwiersza,6)
!PRZYDATNOSC = MSHFLEXGRID.TextMatrix(numerwiersza,7)
.Update
End With
Adodc1.Recordset.MoveFirst

(Grzeniux) #11
Private Sub Command5_Click()

Dim idList1 As Long
Dim numerwiersza As Integer

Adodc1.RecordSource = "select * from zwrot order by LP"
Adodc1.Refresh
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Move (MSHFlexGrid - 1)
idList1 = Adodc1.Recordset.Fields(0)
'========='
Adodc1.RecordSource = "select * from zwrot where zwrot.LP=" & idList1
Adodc1.Refresh
Adodc1.Recordset.Delete
Adodc1.Recordset.MoveFirst

 
 numerwiersza = MSHFlexGrid.Row
 
Adodc1.RecordSource = "select * from histor order by LP"
Adodc1.Refresh
With Adodc1.Recordset
.AddNew
!DOSTAWCA = MSHFlexGrid.TextMatrix(numerwiersza, 1)
!ZAMOWIENIE = MSHFlexGrid.TextMatrix(numerwiersza, 2)
!Data = MSHFlexGrid.TextMatrix(numerwiersza, 3)
!ARTYKUL = MSHFlexGrid.TextMatrix(numerwiersza, 4)
!ILOSC = MSHFlexGrid.TextMatrix(numerwiersza, 5)
!NUMER = MSHFlexGrid.TextMatrix(numerwiersza, 6)
!PRZYDATNOSC = MSHFlexGrid.TextMatrix(numerwiersza, 7)
.Update
End With
Adodc1.Recordset.MoveFirst
End Sub

Czy powinienem coś jeszcze zadeklarować?? przy próbie przerzucenia danych z tabeli do tabeli pokazuje się komunikat "variable not defined" i zaznacza się 6 linia czyli Adodc1.Recordset.Move (MSHFlexGrid - 1)


(floyd) #12

Czy powinienem coś jeszcze zadeklarować ?? przy próbie przerzucenia danych z tabeli do tabeli pokazuje się komunikat "variable not defined" i zaznacza się 6 linia czyli Adodc1.Recordset.Move (MSHFlexGrid - 1)

 

MSHFlexGrid to jest przecież tylko nazwa tabeli, a musi to być numer wiersza czyli

Adodc1.Recordset.Move (MSHFlexGrid.row - 1)

Trzeba bardzo uważać przy pisaniu takich wyrażeń bo już w innym miejscu zdarzało ci się takie opuszczenie ważnego fragmentu. MSHFlexGrid.row jest liczbą oznaczającą numer zaznaczonego wiersza tabeli.

Komputer to bezlitosne bydle i nie wybacza takich pomyłek. :slight_smile:


(Grzeniux) #13
Adodc1.Recordset.Move (MSHFlexGrid.row - 1)

Dopatrzyłem się że brakuje jeszcze przy mshflexgrid "1" ale jest kolejny błąd przy Adodc1.Recordset.Delete


(floyd) #14

Nie widzę innego wyjścia jak:

Spakuj cały katalog z tym programem i prześlij mi jako załącznik na adres: loden@o2.pl

Zobaczę w czym są błędy, bo w ciemno to można długo szukać.

 

 


(Grzeniux) #15

Oki , wysłałem na skrzynkę


(Grzeniux) #16

Hej, udało Ci się coś spojrzeć ??


(floyd) #17

Coś tam się udało.


(Grzeniux) #18

Dzięki wielkie za pomoc, od wczoraj analizuje to co pozmieniałeś na swoim pliku (Twój oczywiście działa wzorowo), część rzeczy rozjaśniła mi sporo spraw ale są też takie co stały się dla mnie zagwostką i mam nadzieję że poświęcisz mi jeszcze trochę swojego czasu ,między innymi w moim pliku base.mdb w obydwu tabelach usunąłem kolumnę LP czyli zostały ID(jako tabela ukryta) i reszta bez zmian a mimo to button przenieś nie działa i na moim pliku project.vbp(po zmianie kodu na Twój) oraz Twoim project.vbp (przy podmianie pliku mdb) , plik base.mdb sprawdziłem i wydają się być takie same, więc w czym może być problem kolumna LP zostałą przecież usunięta ? Błąd zaznacza się w !DOSTAWCA = MSHFlexGrid1.TextMatrix(Numerwiersza, 1),  tak jakby nie mógł znaleźć takiej kolumny??


(floyd) #19

Pozmieniałeś w programie tam gdzie występowało LP na ID? Jeżeli tak, to musiał byś znowu przesłać tę bazę danych do przeglądu.

Ja przecież też usuwałem tę kolumnę LP i wszystko działa. Podobno jak się ma pecha, to i w kościele się dostanie.

Mam inny problem tym razem z datami i z korowaniem rekordów według daty. W tej chwili to korowanie działa całkiem źle, ale tego pewnie nie testowałeś.

Jak wiadomo standardowo w Windowsie format daty ustawiony jest: rok-miesiąc-dzień 9 iest to bardzo wygodne przy sortowaniu danych według daty.

Kiedyś, gdy nie było komputerów nie sortowało się danych automatycznie i daty można było sobie pisać dowolnie, najczęściej tak: dzień-miesiąc-rok.

Z przyzwyczajenia taki zapis najbardziej nam odpowiada.

Nawet pozmieniałem wszystkie zapisy tak aby była widoczna data w formacie :dzień-miesiąc-rok, a w tabeli bazy.mdb na format: rok-miesiąc-dzień.

Okazuje się jednak, że niezależnie jak ustawione są rekordy w bazie mdb, czyli jak je posortujemy, to w tabeli MSHFlexGrid1są też posortowane, ale według pierwszej kolumny (DOSTAWCA) i nie potrafię tego zmienić. Przy takim posortowaniu wygląda to nie elegancko jeżeli daty nie występują w kolejności.

Doszedłem do wniosku, że jest tylko jedno rozwiązanie.

1)Kolumnę 'DATA ZWROTU' należy ustawić jako pierwszą zarówno w tabeli MSHFlexGrid1  w bazie bazy.mdb i w pliku ZWROT.XLS.

2) Daty prezentować wszędzie w formacie rok-miesiąc-dzień.

Przy takim rozwiązaniu rekordy będą się prezentowały elegancko w szczególności, że są kolorowane według daty.

Czy odpowiada Ci takie rozwiązanie?


(Grzeniux) #20

Tak, Kolumna "LP" została usunięta z jednej i drugiej tabeli, i "ID" jest ukryta.

*rar wysłałem na pocztę.

Pozdrawiam