Discussion:
Pierwszy wolny rekord, edycja
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Stan
2020-10-03 18:25:23 UTC
Permalink
Witam zacne grono ekspertów.
Mam Tabelę1, w której Pole1 (liczba) ma w kilku rekordach tą samą wartość (na przykład 13).

Formularz1 ma PoleKombi1 i pola niezwiązane "Data" i "Liczba"
Po wybraniu z PolaKombi1 wartości "13", wypełnieniu pól niezwiązanych i naciśnięciu Buttona marzy mi się coś w rodzaju:

CurrentDb.Execute "UPDATE Tabela1 SET (Pole2, Pole3) SELECT " ' & Me!Data & " ', ' " & Me!Liczba & " ' "
- i tu chciałbym dodać warunek, że aktualizowany ma być Pierwszy rekord z wartością Pola1="13", w którym Pola2 i Pole3 są puste.

Uprzejmie proszę o próbę pomocy :)
Stan
Zbigniew Bratko
2020-10-04 10:25:54 UTC
Permalink
Witam zacne grono ekspertĂłw.
Mam Tabelę1, w której Pole1 (liczba) ma w kilku rekordach tą samą wartość (na przykład 13).
Formularz1 ma PoleKombi1 i pola niezwiązane "Data" i "Liczba"
CurrentDb.Execute "UPDATE Tabela1 SET (Pole2, Pole3) SELECT " ' & Me!Data & " ', ' " & Me!Liczba & " ' "
- i tu chciałbym dodać warunek, że aktualizowany ma być Pierwszy rekord z wartością Pola1="13", w którym Pola2 i Pole3 są puste.
Uprzejmie proszę o próbę pomocy :)
Stan
Ale co Ty rozumiesz przez pojęcie pierwszy rekord. Tak naprawdę Access
nie rozróżnia pojęcia pierwszy rekord dla zestawu nieposortowanych
rekordĂłw.

Z pomocy MS Access:

You can use the DFirst function to return a RANDOM record from a
^^^^^^^^^^^^^^^^^^^^^^^^^^
particular field in a table or query when you simply need any value from
that field.

Note
If you want to return the first or last record in a set of records (a
domain (domain: A set of records that is defined by a table, a query, or
an SQL expression. Domain aggregate functions return statistical
information about a specific domain or set of records.)), you should
create a query sorted as either ascending or descending and set the
TopValues property to 1.
From Visual Basic, you can also create an ADO Recordset object and use
the MoveFirst or MoveLast method to return the first or last record in a
set of records.


Nie mniej jednak masz przykładowy kod, jak to zrobić:
'________________________________
Private Sub btnUpdate_Click()
Dim dbs As DAO.Database
Dim rst As DAO.Recordset
Dim sSQL As String

' czy wszystko wpisane
If Len(Nz(Me!PoleKombi1, "")) = 0 Or _
Len(Nz(Me!Data, "")) = 0 Or _
Len(Nz(Me!Liczba, "")) = 0 Then
MsgBox "Niepełne dane!"
Exit Sub
End If


sSQL = "SELECT Pole2, Pole3 FROM Tabela1 WHERE " & _
"(Pole2 Is Null) AND " & _
"(Pole3 Is Null) AND " & _
"Pole1=" & Me!PoleKombi1 & ";"

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(sSQL, dbOpenDynaset)

With rst
If .EOF Or .BOF Then
MsgBox "Brak rekordu!"
Else
.MoveFirst
.Edit
!Pole2 = Me!Data
!Pole3 = Me!Liczba
.Update
End If
End With

rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub
--
Pozdrawiam
Zbigniew Bratko
Stan
2020-10-04 16:32:20 UTC
Permalink
Bardzo dziękuję za przykładowy kod, spróbuję z nim powalczyć i zrozumieć :)

P.S.
W Tabeli jest też pole "ID" (Autonumeracja).
W 5-ciu rekordach "Pole1" ma wartość =13. Jako "Pierwszy" rozumiem jeden z tych 5-ciu rekordów: ten o najmniejszym numerze "ID".
Zbigniew Bratko
2020-10-04 17:06:33 UTC
Permalink
Bardzo dziękuję za przykładowy kod, spróbuję z nim powalczyć i zrozumieć :)
P.S.
W Tabeli jest teĹź pole "ID" (Autonumeracja).
W 5-ciu rekordach "Pole1" ma wartość =13. Jako "Pierwszy" rozumiem jeden z tych 5-ciu rekordów: ten o najmniejszym numerze "ID".
Dokładnie tak jak piszesz. Musisz posortować rosnąco zestaw rekordów w/m
pola ID, przejść do pierwszego rekordu i zapisać dane.


Tak na pierwszy rzut oka musisz zmienić zmienną sSQL na :

sSQL = "SELECT Pole2, Pole3 FROM Tabela1 WHERE " & _
"(Pole2 Is Null) AND " & _
"(Pole3 Is Null) AND " & _
"(Pole1=" & Me!PoleKombi1 & ")" & _
" ORDER BY ID;"

Klauzula ORDER BY nakazuje posortowanie (domyślnie rosnąco) rekordy
względem pola ID. No i chyba będzie to pierwszy rekord ;-)


Nie chcę być upierdliwy, ale przemyśl nazewnictwo pól w tabelach oraz
formantów na formularzu. Odwoływanie się do np. pola Pole2 w formularzu,
można zastąpić odwołaniem Me.txtNazwaPola (musisz nazwać tak formant
tekstowy formularz), dla pola kombi np. cboTwojaNazwa zamiast
PoleKombi1. Bonusem zapisu Me. jest korzystanie z podpowiedzi
IntelliSense oferowanych przez MS Access
--
Pozdrawiam
Zbigniew Bratko
Stan
2020-10-04 17:27:06 UTC
Permalink
Dzięki Panie Zbigniewie
Twoja pomoc jak zwykle super!
Kod już wstępnie przetestowałem, dodam ORDER BY i będzie działać jak chciałem.
Nazewnictwo mam w rzeczywistości inne, a Pole1, Pole2 to tylko tu na forum - myślałem że będzie czytelniej, wezmę poprawkę na przyszłość.
Pozdrawiam
Stan

Loading...