Komenda "UPDATE" lub "INSERT INTO" zależne od warunku

0

Witam
Chce w jednej tablicy bazy danych sprawdzić czy rekord istnieje i go update'ować ( jedno pole z tej tablicy) , lub dopisać jeśli rekord nie istnieje.
Całość dzieje się w ACCESS
A że nie daję redy z tym proszę o pomoc.

zapisałem w kwerendzie coś takiego :

UPDATE Dane SET Dane.odczyt = 'OK'
WHERE (((Dane.indeks)=[Formularze]![DateRange]![KODK]))
If Not Exists 
insert into Dane ('indeks') values ((Dane.indeks)=[Formularze]![DateRange]![KODK]))

No ale to nie działa. Nie wiem jak napisać prawidłową składnie , aby :
Wczytując kod czytnikiem kodów kreskowych odnajdywało rekord o wczytanym kodzie i w znalezionym rekordzie w polu Odczyt zapisywało 'OK' , jeśli jednak nie znalazłoby rekordu na podstawie wczytywanego kodu kreskowego , żeby dopisało do bazy nowy rekord z kodem jaki był czytany czytnikiem.

Dziękuję z góry za pomoc.

1

Może zrób zwyczajnie

INSERT INTO Dane (indeks)
VALUES ([Formularze]![DateRange]![KODK]))
ON DUPLICATE KEY UPDATE odczyt = 'OK'

Zapytanie doda ci rekord jeśli klucz nie istnieje, lub zaktualizuje jeśli taki rekord znajdzie

0

MSAccess nie ma składni dla upserta, więc muszisz sprawdzić czy istnieje, jeśli tak to zaktualizować jeśli nie to dodać.

0
Panczo napisał(a):

MSAccess nie ma składni dla upserta, więc muszisz sprawdzić czy istnieje, jeśli tak to zaktualizować jeśli nie to dodać.

No tak to było ( jest w moich założeniach) a jak to by mogło ( powinno ) wyglądać w kodzie sql ?

2

No nie zrobisz tego w samym sql, zostaje makro/vba:

If DCount("*", "Dane", "Indeks = '" & [Formularze]![DateRange]![KODK] & "'") = 0 Then
   currentDB.Execute "INSERT"
Else
    currentDB.Execute "UPDATE"
End If

Możesz też pobrać dane do recordset'a i jak recordset będzie pusty to dodać rekord, a jak nie to zaktualizować rekord

0

[Formularze]![DateRange]![KODK]

W formularzu w polu KODK będzie wczytywany kod kreskowy (znakowo-liczbowy o długości 10 znaków)
Jak sprawdzić lub jak zapisać warunek żeby po wczytaniu innego kodu wyświetlił monit że zeskanowany kod jest niezgodny ( różny od 10 znakowego kodu)

2

Zdarzenie po aktualizacji dla pola tekstowego

0
Panczo napisał(a):

Zdarzenie po aktualizacji dla pola tekstowego

No , sztuką jest podpowiedzieć bez konkretnych podpowiedzi. To takie uczenie za pomocą "własnych" (determinacji i możliwości)
No i znalazłem . Ale dzięki za dobre chęci.

1

Myslałem, że wskazówka jest precyzyjna. Gratuluje determinacji. Następnym razem wystarczy dopytać.

0
Panczo napisał(a):

Myslałem, że wskazówka jest precyzyjna. Gratuluje determinacji. Następnym razem wystarczy dopytać.

Oczywiście jeśli chodzi o miejsce ( gdzie szukać, nie o funkcje jakiej użyć)
Ale tak czy inaczej liczy się efekt końcowy...a ten jest pozytywny . Dzięki

0

Witam ponownie
Jednak coś "zmaściłem"
Chodzi o to, że niby to makro ustawione w Zdarzenie po aktualizacji dla pola tekstowego >>>
[Formularze]![DateRange]![KODK]
działa
2022-12-21_10h03_04.png

Ale kiedy zostanie wczytany nast-y kod wyskakuje coś takiego>>>
2022-12-21_10h00_59.png
Rozumiem , że to jakieś systemowe accessa zabezpieczenie, ale da się to jakoś zneutralizować , aby nie było takiego monitu ?

0

To zabezpieczenie, aby macro nie wpadło w nieskończoną pętle, a nie limit na ilość uruchomień.

Dlaczego w tym makrze zamykasz i otwierasz DateRange?
Na mój gust to to powinno wygladać jakoś tak:
screenshot-20221221124211.png

0

Próbowałem też w VBA

Private Sub KODK_AfterUpdate()
If Len(KODK) <> 10 Then
        MsgBox "Został wczytany niewłaściwy kod . Zeskanuj prawidłowy kod !", vbInformation
        
Me.KODK = Null

Exit Sub
    End If

DoCmd.OpenQuery "K_insert", , acReadOnly

   Me.KODK = Null
 MsgBox "Poszło OK!", vbInformation

   
    Exit Sub
    
End Sub

Ale nie wiem jak uczynić aktywnym pole formularza (KODK)
Po przeczytaniu kodu dopisuje do bazy , formularz z polem KODK staje się pusty , ale nie aktywny.
Dopiero po kliknięciu na niego pole KODK jest gotowe to wczytanie kodu.

2

Problem że nie działa u mnie Dcount /bład składni DCount("*", "Dane_N", "Kod_weza" = '''&"[KODK]"&''")

Powinno być tak:

DCount("*", "Dane_N", "Kod_weza = """ & [KODK] & """")

Aby przenieść focus w vba na kontrolkę trzeba użyć metody setfocus

If Len(KODK) <> 10 Then
    MsgBox "Został wczytany niewłaściwy kod . Zeskanuj prawidłowy kod !", vbInformation
Else
    DoCmd.OpenQuery "K_insert", , acReadOnly
    MsgBox "Poszło OK!", vbInformation
End if
Me.KODK = Null
Me.kodk.SetFocus 
0

Dzięki Panczo
co prawda nie obyło się bez "metody prób i błędów" z naciskiem na błędy z mojej strony,
ale finalnie jest OK -Działa.
Dzięki WIELKIE

0

A czy tutaj merge by nie dał rady ?

0

W msaccess merge?

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