🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych.msaccess
5 messages
5 total messages Started by Stan Sat, 03 Oct 2020 11:25
Pierwszy wolny rekord, edycja
#134044
Author: Stan
Date: Sat, 03 Oct 2020 11:25
16 lines
736 bytes
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
Re: Pierwszy wolny rekord, edycja
#134046
Author: Stan
Date: Sun, 04 Oct 2020 09:32
8 lines
321 bytes
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".

Re: Pierwszy wolny rekord, edycja
#134048
Author: Stan
Date: Sun, 04 Oct 2020 10:27
8 lines
385 bytes
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
Re: Pierwszy wolny rekord, edycja
#134045
Author: Zbigniew Bratko
Date: Sun, 04 Oct 2020 12:25
107 lines
3282 bytes
This is a multi-part message in MIME format.
--------------01F04F444E90179187954434
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

W dniu 03.10.2020 o 20:25, Stan pisze:
> 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
>

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

--------------01F04F444E90179187954434
Content-Type: text/x-vcard; charset=utf-8;
 name="adminBEZTEGO.vcf"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="adminBEZTEGO.vcf"

begin:vcard
fn:Zbigniew Bratko
n:Bratko;Zbigniew
note;quoted-printable:-- 	
	Pozdrowienia BraZby
	 www.faq.accdb.pl
	 www.accdb.pl
version:2.1
end:vcard


--------------01F04F444E90179187954434--
Re: Pierwszy wolny rekord, edycja
#134047
Author: Zbigniew Bratko
Date: Sun, 04 Oct 2020 19:06
61 lines
1892 bytes
This is a multi-part message in MIME format.
--------------FC23B71EEF20E68D57AB722E
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

W dniu 04.10.2020 o 18:32, Stan pisze:
> 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ść . 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

--------------FC23B71EEF20E68D57AB722E
Content-Type: text/x-vcard; charset=utf-8;
 name="adminBEZTEGO.vcf"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="adminBEZTEGO.vcf"

begin:vcard
fn:Zbigniew Bratko
n:Bratko;Zbigniew
note;quoted-printable:-- 	
	Pozdrowienia BraZby
	 www.faq.accdb.pl
	 www.accdb.pl
version:2.1
end:vcard


--------------FC23B71EEF20E68D57AB722E--
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads