Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[Access 2010] Operacje na Recordset, uaktualnienie tabeli

Idź do strony Poprzedni  1, 2, 3, 4, 5  Następny

 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Nie Mar 29, 2015 4:27 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Cytat:
data_error.png
bo zmieniłem txtUDokument_Data, a nie txtMDokument_Data :) Nic, widzę, nie umknie Twojej uwadze :)
Cytat:
patrz: Eval
jakoś mi nie wychodzi, ale znalazłem inne rozwiązanie, zaproponowane mi zresztą już kiedyś przez Ciebie i to w dodatku, aż wstyd się przyznać, w podobnym problemie. W załączeniu nowy kod, według mnie działający jak trzeba, ale z pewnością nie wolny od błędów (cmdEwidencjaUSummary_Click + CheckUzytkownikSummary + InsertIntoUzytkownikSummary). Oczywiście nie jestem do końca jego autorem, bo to za wysoki level dla mnie, ale gdybyś znalazla jakieś błędy, albo ktokolwiek chętny, to bardzo proszę :) Korzystając równiez z okazji, szukam rozwiązania dla FormantKarta_Ewidencja_Change, na zasadzie: jezeli przechodzę ze strony 0 na 1, to komunikat:
Kod:
If MsgBox("Zresetować wprowadzone dane?", vbOKCancel, "Pytanie") = vbOK
jeżeli OK, to wyczyść wybrane pola, jeżeli Anuluj, to nic nie rób i pozostań na stronie 0. No i właśnie to "pozostań na stronie" stanowi największy problem.
Pozdrawiam.



HQH_Test_Ewidencja.rar
 Opis:

Pobierz
 Nazwa pliku:  HQH_Test_Ewidencja.rar
 Wielkość pliku:  118.4 KB
 Pobierano:  57 raz(y)


_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Sro Lis 21, 2018 9:26 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dzień dobry, odświeżam temat, bo szukam błędu w poniższym kodzie...
Przy pomocy tabeli T_Osoby_temp (zasilanej z importu pliku Excel) chciałbym uaktualnić tabelę T_Osoby (tabele połaczone są wspólnym polem: Pesel), tzn.:
1. Jeżeli w T_Osoby_temp znajdują się zmienione rekordy dla tego samego pola Pesel w T_Osoby, to zedytować tabele T_Osoby i zmienić wartości.
2. Jeżeli w T_Osoby_temp znajdują się nowe rekordy, które nie istnieją w T_Osoby, to dodac je do tabeli T_Osoby.
Niby sprawa prosta, ale znajduje mi tylko ostatni rekord z tabeli T_Osoby_temp i aktualizuje pierwszy rekord w T_Osoby.

Kod:

Private Sub cmdOsobyUpdate_Click()
On Error GoTo cmdOsobyUpdate_Error
    
    If Me.Dirty Then Me.Dirty = False
    
    '------------------------->
    Call CheckOsobyUpdate
    '------------------------->
'--------------------------------------------------------------->
cmdOsobyUpdate_Exit:
    Exit Sub
cmdOsobyUpdate_Error:
    MsgBox "B??d numer: " & Err.Number & vbNewLine & _
           "Opis b??du: " & Err.Description & vbNewLine & _
           "Procedura: cmdOsobyUpdate", vbExclamation
    Resume cmdOsobyUpdate_Exit
End Sub

Sub CheckOsobyUpdate()
On Error GoTo CheckOsobyUpdate_Error
    
    Dim db                  As DAO.Database
    Set db = CurrentDb()
    Dim rstTbl              As DAO.Recordset
    Dim rstQry              As DAO.Recordset
    Dim rstQryEdit          As DAO.Recordset
    Dim rstQryAdd           As DAO.Recordset
    Dim strQry              As String
    Dim strQryEditFiltr     As String
    Dim strQryAddFiltr      As String
    Dim qdfQry              As QueryDef
    Dim qdfQryEdit          As QueryDef
    Dim qdfQryAdd           As QueryDef
    Dim lEdit               As Long
    Dim lAdd                As Long
    Dim lInsert             As Long
    Dim bJestRekord         As Boolean
    
    strQry = "SELECT " & _
        "T_Osoby_temp.ID_Osoby , " & _
        "T_Osoby_temp.Pesel, " & _
        "T_Osoby_temp.stopien, T_Osoby_temp.Imie, T_Osoby_temp.Nazwisko, " & _
        "T_Osoby_temp.Data_Urodzenia, " & _
        "T_Osoby_temp.Imie_Ojca, " & _
        "T_Osoby_temp.Wysluga_Data, " & _
        "T_Osoby_temp.Wysluga_Zawodowa_Data, " & _
        "T_Osoby_temp.Wys?uga, " & _
        "T_Osoby_temp.Stanowisko_NIS, " & _
        "T_Osoby_temp.Stanowisko_Nazwa, " & _
        "T_Osoby_temp.SZwSO_Nadanie_Data, T_Osoby_temp.ZZdOK_Nadanie_Data, " & _
        "T_Osoby.ID_Osoby, " & _
        "T_Osoby.Osoby_Pesel, " & _
        "T_Osoby.Osoby_stopien, T_Osoby.Osoby_Imie, T_Osoby.Osoby_Nazwisko, " & _
        "T_Osoby.Osoby_Data_Urodzenia, " & _
        "T_Osoby.Osoby_Imie_Ojca, " & _
        "T_Osoby.Osoby_Wysluga_Data, " & _
        "T_Osoby.Osoby_Wysluga_Zawodowa_Data, " & _
        "T_Osoby.Osoby_Wys?uga, " & _
        "T_Osoby.Osoby_Stanowisko_NIS, " & _
        "T_Osoby.Osoby_Stanowisko_Nazwa, " & _
        "T_Osoby.Osoby_SZwSO_Nadanie_Data, T_Osoby.Osoby_ZZdOK_Nadanie_Data " & _
        "FROM T_Osoby RIGHT JOIN T_Osoby_temp ON T_Osoby.Osoby_Pesel = T_Osoby_temp.Pesel "
  
    'strQryEditFiltr = "WHERE (T_Osoby.Osoby_Pesel Is Not Null)"
    'strQryAddFiltr = "WHERE (T_Osoby.Osoby_Pesel Is Null)"
    
    'Set qdfQryEdit = db.CreateQueryDef("", strQry & strQryEditFiltr)
    'Set rstQryEdit = qdfQryEdit.OpenRecordset(dbOpenDynaset)
    
    'Set qdfQryAdd = db.CreateQueryDef("", strQry & strQryAddFiltr)
    'Set rstQryAdd = qdfQryAdd.OpenRecordset(dbOpenDynaset)
        
    Set rstTbl = db.OpenRecordset("T_Osoby", dbOpenDynaset)

    Set qdfQry = db.CreateQueryDef("", strQry)
    Set rstQry = qdfQry.OpenRecordset(dbOpenDynaset)

    Do While Not rstQry.EOF
        bJestRekord = False
            Do While Not rstTbl.EOF
                With rstTbl
                    .Edit
                        !Osoby_Nazwisko = rstQry!Nazwisko
                        !Osoby_Imie = rstQry!Imie
                        !Osoby_Imie_Ojca = rstQry!Imie_Ojca
                    .Update
                End With
                bJestRekord = True
            Exit Do
            rstTbl.MoveNext
            Loop
            If Not bJestRekord Then
                With rstTbl
                    .AddNew
                        !Osoby_Pesel = rstQry!Pesel
                        !Osoby_Nazwisko = rstQry!Nazwisko
                        !Osoby_Imie = rstQry!Imie
                        !Osoby_Imie_Ojca = rstQry!Imie_Ojca
                    .Update
                End With
                bJestRekord = False
            End If
        rstTbl.MoveFirst
        rstQry.MoveNext
    Loop
    
    rstTbl.Close
    rstQry.Close
    'rstQryEdit.Close
    'rstQryAdd.Close

    Set db = Nothing
    Set rstTbl = Nothing
    Set rstQry = Nothing
    'Set rstQryEdit = Nothing
    'Set rstQryAdd = Nothing
    
    Me.Requery
'--------------------------------------------------------------->
CheckOsobyUpdate_Exit:
    On Error Resume Next
    If Not (rstTbl Is Nothing) Then
        rstTbl.Close
        Set rstTbl = Nothing
    End If
    If Not (rstQry Is Nothing) Then
        rstQry.Close
        Set rstQry = Nothing
    End If
    'If Not (rstQryEdit Is Nothing) Then
    '    rstQryEdit.Close
    '    Set rstQryEdit = Nothing
    'End If
    'If Not (rstQryAdd Is Nothing) Then
    '    rstQryAdd.Close
    '    Set rstQryAdd = Nothing
    'End If
    Set db = Nothing
    Exit Sub
CheckOsobyUpdate_Error:
    MsgBox "B??d numer: " & Err.Number & vbNewLine & _
           "Opis b??du: " & Err.Description & vbNewLine & _
           "Procedura: CheckOsobyUpdate", vbExclamation
    Resume CheckOsobyUpdate_Exit
End Sub


Kod jest uruchamiany za pomocą przycisku w formularzu.
Pozdrawiam i z góry dziękuję za pomoc.



Test20181121.7z
 Opis:

Pobierz
 Nazwa pliku:  Test20181121.7z
 Wielkość pliku:  27.69 KB
 Pobierano:  11 raz(y)


_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Czw Lis 22, 2018 8:14 pm      Temat postu: Odpowiedz z cytatem Pisownia

Grzesiu
Nie wiem czy dobrze zrozumiałam, ale dlaczego nie korzystasz z kwerend:
- aktualizującej
Kod:
UPDATE T_Osoby
INNER JOIN T_Osoby_temp
ON T_Osoby.Osoby_Pesel = T_Osoby_temp.Pesel
SET
T_Osoby.Osoby_Nazwisko = [T_Osoby_temp]![Nazwisko],
T_Osoby.Osoby_Imie = [T_Osoby_temp]![Imie],
T_Osoby.Osoby_Imie_Ojca = [T_Osoby_temp]![Imie_Ojca];
i
- dołączającej
Kod:
INSERT INTO T_Osoby ( Osoby_Imie, Osoby_Nazwisko, Osoby_Pesel, Osoby_Imie_Ojca )
SELECT
T_Osoby_temp.Imie,
T_Osoby_temp.Nazwisko,
T_Osoby_temp.Pesel,
T_Osoby_temp.Imie_Ojca
FROM T_Osoby
RIGHT JOIN T_Osoby_temp ON T_Osoby.Osoby_Pesel = T_Osoby_temp.Pesel
WHERE (((T_Osoby.Osoby_Pesel) Is Null));


oraz metody Execute+dbFailOnError.
Dlaczego CreateQueryDef, a nie zapisana kwerenda (one są kompilowane).
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Czw Lis 22, 2018 10:35 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Oczywiście mógłbym :) Nawet, że tak powiem, "aż się prosi" i zapewne ten sposób wykorzystam, jeśli nie ogarnę tego kodu. Powód jest być może niektórych banalny, ale mam problem ze zrozumieniem pętli + recordset - co kiedy jest otwierane, jak, gdzie, co i kiedy porusza się po zestawach rekordów (move, eof, bof), jak wyciągnąć interesujący mnie rekord (zestaw). I niby czytam helpy lub już działający kod, i niby rozumiem, ale jak przychodzi do praktyki to wychodzi takie "rzemiosło". Druga sprawa, to jakoś mi z CreateQueryDef wygodniej, bo wszystko mam w jednym miejscu kodu, niż tworzenie i zapisywanie nowych kwerend, bo z czasem ich przecież przybywa. To względy czysto estetyczne, chociaż zakładam, że nie do końca praktyczne z punktu widzenia profesjonalnego programowania. Muszę się też przyznać, że jako miłośnik msgbox, typu:
Kod:
    If (rstQry.RecordCount > 0) Then
        rstQry.MoveLast
        rstQry.MoveFirst
    End If
    lInsert = rstQry.RecordCount
    
    If MsgBox("Rozpocząć aktualizację tabeli: T_Osoby? " & vbNewLine & _
            " " & vbNewLine & _
            "Razem pozycji: " & lInsert & " rekord/-y/-?w.", vbOKCancel, "Informacja") = vbCancel Then
        Exit Sub
    End If

najłatwiej mi było to zrobić w ten sposób :) Tak więc ślęczę na tą pętlą, chociaż odnoszę wrażenie, że już sam się zapętliłem ;)
_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Sob Lis 24, 2018 8:16 pm      Temat postu: Odpowiedz z cytatem Pisownia

Grzesiu
Proszę wytłumacz mi krok po kroku co, że tak powiem ma robić procedura CheckOsobyUpdate pomiędzy linijkami:
Cytat:
Do While Not rstQry.EOF
'.....
Loop ' (ostatnie loop)

albo co chciałbyś żeby robiła....
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Sob Lis 24, 2018 9:38 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Oczywiście. Działanie kodu powinno dać wynik jak w przypadku użycia kwerendy dołączającej i aktualizującej. W moim rozumowaniu, chciałbym żeby działało to w następujący sposób:
1. Otwórz zestaw rekordów w rstQry (stad pobieram dane)
2. Otwórz zestaw rekordów w rstTbl (to chcę zaktualizować lub dodać rekordy)
3. Pobieraj każdy rekord z kwerendy i porównaj go z każdym rekordem w tabeli ( w pętli). Jeżeli (i tu się zorientowałem, że nie mam chyba pola łącznego dla tabeli i kwerendy - Pesel) pole Pesel w kwerendzie = pole Osoby_Pesel w tabeli, to aktualizuj pola w tabeli (edit rstTbl), jeżeli nie, to dodaj wskazane pola z kwerendy do tabeli (addnew rstTbl), czyli utwórz nowy rekord, a w konsekwencji pętli, nowe rekordy.
... i tak chciałem napisać ten kod.

Pozdrawiam :)

_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Sob Lis 24, 2018 10:53 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

... lub co mi się wydaje, że napisałem - o ile to coś pomoże:
Kod:
Do While Not rstQry.EOF ' dla każdego rekordu w kwerendzie
        bJestRekord = False ' jeżeli rekord z kwerendy odpowiada rekordowi w tabeli
            Do While Not rstTbl.EOF ' sprawdzaj każdy rekord w tabeli
                With rstTbl ' jeżeli rekord jest znaleziony to edytuj i aktualizuj pola
                    .Edit
                        !Osoby_Nazwisko = rstQry!Nazwisko
                        !Osoby_Imie = rstQry!Imie
                        !Osoby_Imie_Ojca = rstQry!Imie_Ojca
                    .Update
                End With
                bJestRekord = True
            Exit Do
            rstTbl.MoveNext ' przeglądaj kolejno każdy rekord w tabeli i aktualizuj jeżeli jest zgodny z rekordem w kwerendzie
            Loop
            If Not bJestRekord Then ' jeżeli rekord nie został znaleziony (brak pesel w tabeli, który znajduje się w kwerendzie)
                With rstTbl ' to dodaj nowy rekord do tabeli
                    .AddNew
                        !Osoby_Pesel = rstQry!Pesel
                        !Osoby_Nazwisko = rstQry!Nazwisko
                        !Osoby_Imie = rstQry!Imie
                        !Osoby_Imie_Ojca = rstQry!Imie_Ojca
                    .Update
                End With
                bJestRekord = False
            End If
        rstTbl.MoveFirst ' zacznij od pierwszego rekordu w tabeli
        rstQry.MoveNext ' porównuj każdy kolejny rekord z kwerendy z kolejnym w tabeli
    Loop

_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Nie Lis 25, 2018 8:20 pm      Temat postu: Odpowiedz z cytatem Pisownia

Napisałeś:
Kod:
        Do While Not rstTbl.EOF        ' sprawdzaj każdy rekord w tabeli
            With rstTbl                ' jeżeli rekord jest znaleziony to edytuj i aktualizuj pola
                .Edit
                !Osoby_Nazwisko = rstQry!Nazwisko
                !Osoby_Imie = rstQry!Imie
                !Osoby_Imie_Ojca = rstQry!Imie_Ojca
                .Update
            End With
            bJestRekord = True
            Exit Do
            rstTbl.MoveNext            ' przeglądaj kolejno każdy rekord w tabeli i aktualizuj jeżeli jest zgodny z rekordem w kwerendzie
        Loop
Tu nie ma żadnego sprawdzenia!
Nigdy nie dochodzi do rstTbl.MoveNext !!!!!
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
elfface



Dołączył: 31 Paź 2012
Posty: 176

PostWysłany: Nie Lis 25, 2018 9:29 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

No właśnie... To tłumaczy, dlaczego aktualizuje mi tylko jeden rekord. Ok, temat odpuszczam, bo mnie jak widzę przerasta. Kompletnie nie wiem jak to ogarnąć, jeszcze trochę poczytam. Na szczęście kwerenda aktualizująca i dołączająca spełnia swoje zadanie :) Czasami chyba nie ma co kombinować :)
_________________
=8-T
Grzegorz Z.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
karolinavb
Site Admin


Dołączył: 25 Maj 2005
Posty: 7905

PostWysłany: Pon Lis 26, 2018 8:13 pm      Temat postu: Odpowiedz z cytatem Pisownia

Grzegorz jeśli dalej chcesz poćwiczyć na "Rekorsetach"...
Weź kartkę papieru, może być Word ;-) i napisz sobie krok po kroku co i jak należy zrobić.
Zobacz też FindFirst , NoMatch, być może też RecordsetClone...
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> Bazy danych Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2, 3, 4, 5  Następny
Strona 3 z 5

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.14394 sekund, zapytan = 13
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |