Discussion:
Podformularz i operacje na jego danych spod VBA
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Soryt
2003-12-10 22:38:08 UTC
Permalink
Witam serdecznie,

Mam formularz z podformularzem - arkuszem danych, więc
nie bardzo mogę skorzystać ze stopki i umieścić tam dwa
przyciski - zapisywanie i kasowanie rekordów. Pozostaje więc
umieścić te przyciski na formularzu nadrzędnym i je oprogramować ;)
No i tutaj jako nowicjusz mam problemy. Jakie są możliwe metody
na osiągnięcie tego celu ? Myślałem nad makrem albo metodą
DoCmd (tylko jak ?) ... A może najlepiej będzie przez ADO ?

Bardzo proszę o pomoc.

Pozdrawiam i z góry dziękuję za odpowiedzi.
Leon
2003-12-11 08:12:48 UTC
Permalink
Post by Soryt
Witam serdecznie,
Mam formularz z podformularzem - arkuszem danych, więc
nie bardzo mogę skorzystać ze stopki i umieścić tam dwa
przyciski - zapisywanie i kasowanie rekordów. Pozostaje więc
umieścić te przyciski na formularzu nadrzędnym i je oprogramować ;)
No i tutaj jako nowicjusz mam problemy. Jakie są możliwe metody
na osiągnięcie tego celu ? Myślałem nad makrem albo metodą
DoCmd (tylko jak ?) ... A może najlepiej będzie przez ADO ?
Bardzo proszę o pomoc.
Pozdrawiam i z góry dziękuję za odpowiedzi.
Witam!

Me.Controls("nazwa kontrolki na formularzu na ktorej jest
podformularz").Form. <- i po KROPCE
korzystasz ze wszystkich dobrodziejstw podformularza jakbs programoal z jego
poziomu :)

Pozdrawiam Leon!
Soryt
2003-12-11 18:06:26 UTC
Permalink
Post by Leon
Me.Controls("nazwa kontrolki na formularzu na ktorej jest
podformularz").Form. <- i po KROPCE
korzystasz ze wszystkich dobrodziejstw podformularza jakbs programoal z jego
poziomu :)
Wielgachne dzięki, ale qcze niełapie - lama ze mnie i tyle ... :(
Mogę prosić o jakiś przykład ?

Podformularz mam umieszczony bezpośrednio na formularzu
nadrzędnym. Przycisk, który ma zapisywać aktualny rekord
w podformularzu również mam umieszczony na formularzu
nadrzędnym.

Serdecznie pozdrawiam !
Leon
2003-12-12 22:11:38 UTC
Permalink
Post by Soryt
Post by Leon
Me.Controls("nazwa kontrolki na formularzu na ktorej jest
podformularz").Form. <- i po KROPCE
korzystasz ze wszystkich dobrodziejstw podformularza jakbs programoal z
jego
Post by Leon
poziomu :)
Wielgachne dzięki, ale qcze niełapie - lama ze mnie i tyle ... :(
Mogę prosić o jakiś przykład ?
Podformularz mam umieszczony bezpośrednio na formularzu
nadrzędnym. Przycisk, który ma zapisywać aktualny rekord
w podformularzu również mam umieszczony na formularzu
nadrzędnym.
Serdecznie pozdrawiam !
Tworzac formularz A i dodajac do niego kontrolke podformularza
standardowo nazywa sie ona Podrzedny0 (w ang Child0)
Dopireo tej kontrolce przypisujesz obiekt zrodlowy, ktorym jest
wlasciwy formularz B.
Staje sie on (B) podformularzem tego tworzonego
formularza A!
Chyba jasno jak do tej pory ;)
Chcac odwolac sie np do jakiegos pola umieszczonego na formularzu B
(podrzednym Twojego formularza wlasciwego A) nie odwolujesz sie do niego
przez nazwe (formularza B, ktory jest podformularzem) ale przez nazwe
kontrolki, ktora jako obiekt zrodlowy posiada formularz B bedacy
podformularzem
nba formularzu A. ;)

czyli jak juz wcesniej pisalem:
On_Button1_Click
Me.Controls("nazwa kontrolki podformularza na formularzu
A").Form.NazwaEdita = wartosc
End sub

po kliknieciu przycisku, podstawi pod edit o nazwie NazwaEdita wartosc
'wartosc'

jak teraz??

Pozdrawiam, Leon!
Soryt
2003-12-13 17:42:55 UTC
Permalink
Post by Leon
Tworzac formularz A i dodajac do niego kontrolke podformularza
standardowo nazywa sie ona Podrzedny0 (w ang Child0)
Dopireo tej kontrolce przypisujesz obiekt zrodlowy, ktorym jest
wlasciwy formularz B.
Staje sie on (B) podformularzem tego tworzonego
formularza A!
Chyba jasno jak do tej pory ;)
Jak słońce ;)
Post by Leon
Chcac odwolac sie np do jakiegos pola umieszczonego na formularzu B
(podrzednym Twojego formularza wlasciwego A) nie odwolujesz sie do niego
przez nazwe (formularza B, ktory jest podformularzem) ale przez nazwe
kontrolki, ktora jako obiekt zrodlowy posiada formularz B bedacy
podformularzem
nba formularzu A. ;)
No tak .......
Post by Leon
On_Button1_Click
Me.Controls("nazwa kontrolki podformularza na formularzu
A").Form.NazwaEdita = wartosc
End sub
po kliknieciu przycisku, podstawi pod edit o nazwie NazwaEdita wartosc
'wartosc'
jak teraz??
Hmmmm - kilka pytań :D

1) Przykład z helpa:

"Each Form object has a Controls collection, which contains all controls on
the
form. You can refer to a control on a form either by implicitly or
explicitly referring
to the Controls collection. Your code will be faster if you refer to the
Controls
collection implicitly. The following examples show two of the ways you might
refer
to a control named NewData on the form called OrderForm:

' Implicit reference.
Forms!OrderForm!NewData

' Explicit reference.
Forms!OrderForm.Controls!NewData

The next two examples show how you might refer to a control named NewData on
a subform ctlSubForm contained in the form called OrderForm:

Forms!OrderForm.ctlSubForm.Form!Controls.NewData
Forms!OrderForm.ctlSubForm!NewData"

Dlaczego po nazwie formularza głównego jest kropka ? (to samo tyczy się
kropki
po właściwości "Controls") Przecież to nie jest żadna metoda ani właściwość.
Dodam jeszcze, że pod hasłem "Form, Report Properties" jest też przykład
(który
działa :) ) i ma on postać:

intOrderID = Forms!Orders!OrderDetails.Form!OrderID

No i właśnie - tutaj podformularz OrderDetails jest poprzedzony
wykrzyknikiem,
co jest dla mnie logiczne ... (dlaczego tam tak nie było ?)

2) Chyba wynika z tego, że wcale nie trzeba korzystać z właściwości
Controls,
żeby dostać się do kontrolki na podformularzu (chyba bardziej jest to
przydatne
do sprawdzania/przeszukiwania/modyfikowania wszystkich kontrolek na formie
...)

3) Nie rozumiem właściwości form - po co się odwoływać do siebie samego ?
Nie można by tak od razu, np.:

Forms!Orders!OrdersDetails!OrderID ???

4) W sumie to nie oto mi się rozchodziło - a przynajmniej nie w ten sposób
;) Fakt -
jeśli przepisze sobie wartość z kontrolki do ziennej (wartość klucza
głównego), to
potem mogę sobie uruchomić kwerendę, która usunie ten wiersz. Jednak ja
chciałem
to zrobić albo np za pomocą jakiejś metody - choćby DoCmd (wiem - lama
jestem,
ale po prostu nie znam jeszcze wszystkich obiektów i ich metod i
właściwości),
albo za pomocą np ADO ... (coś na wzór mój_recordset.delete )


Pozdrawiam gorąco i zachęcam do dalszej dyskusji ;)
Leon
2003-12-13 19:37:15 UTC
Permalink
Post by Soryt
Post by Leon
Tworzac formularz A i dodajac do niego kontrolke podformularza
standardowo nazywa sie ona Podrzedny0 (w ang Child0)
Dopireo tej kontrolce przypisujesz obiekt zrodlowy, ktorym jest
wlasciwy formularz B.
Staje sie on (B) podformularzem tego tworzonego
formularza A!
Chyba jasno jak do tej pory ;)
Jak słońce ;)
Post by Leon
Chcac odwolac sie np do jakiegos pola umieszczonego na formularzu B
(podrzednym Twojego formularza wlasciwego A) nie odwolujesz sie do niego
przez nazwe (formularza B, ktory jest podformularzem) ale przez nazwe
kontrolki, ktora jako obiekt zrodlowy posiada formularz B bedacy
podformularzem
nba formularzu A. ;)
No tak .......
Post by Leon
On_Button1_Click
Me.Controls("nazwa kontrolki podformularza na formularzu
A").Form.NazwaEdita = wartosc
End sub
po kliknieciu przycisku, podstawi pod edit o nazwie NazwaEdita wartosc
'wartosc'
jak teraz??
Hmmmm - kilka pytań :D
"Each Form object has a Controls collection, which contains all controls on
the
form. You can refer to a control on a form either by implicitly or
explicitly referring
to the Controls collection. Your code will be faster if you refer to the
Controls
collection implicitly. The following examples show two of the ways you might
refer
' Implicit reference.
Forms!OrderForm!NewData
' Explicit reference.
Forms!OrderForm.Controls!NewData
The next two examples show how you might refer to a control named NewData on
Forms!OrderForm.ctlSubForm.Form!Controls.NewData
Forms!OrderForm.ctlSubForm!NewData"
Dlaczego po nazwie formularza głównego jest kropka ? (to samo tyczy się
kropki
po właściwości "Controls") Przecież to nie jest żadna metoda ani właściwość.
Dodam jeszcze, że pod hasłem "Form, Report Properties" jest też przykład
(który
intOrderID = Forms!Orders!OrderDetails.Form!OrderID
No i właśnie - tutaj podformularz OrderDetails jest poprzedzony
wykrzyknikiem,
co jest dla mnie logiczne ... (dlaczego tam tak nie było ?)
AD 1 Pare postow wczesniej "starsi" grupowicze wyjasniali roznice miedzy
kropkami i wykrzyknikami; ja za speca od wykrzyknikow i kropek sie
nie uwazam ;) robie tak zeby mi wychodzilo :)
Post by Soryt
2) Chyba wynika z tego, że wcale nie trzeba korzystać z właściwości
Controls,
żeby dostać się do kontrolki na podformularzu (chyba bardziej jest to
przydatne
do sprawdzania/przeszukiwania/modyfikowania wszystkich kontrolek na formie
...)
AD 2 Dokladnie! Dzien wczesniej robilem wlasnie wyszukiwanie podformularza
na formularzu i uzylem podobnego kodu do odwolywania sie do
podformularza
z poziomu formularza. Dla tego podalem takie rozwiazanie. Przewaznie
mozna zrobic
cos na kilka sposobow ;) zalezy co kto lubi, czy chce osiagnac :)
Post by Soryt
3) Nie rozumiem właściwości form - po co się odwoływać do siebie samego ?
Forms!Orders!OrdersDetails!OrderID ???
AD3 Nooo... tak! - nie pomyslalem o tym :) (patrz wyzej :] )
Post by Soryt
4) W sumie to nie oto mi się rozchodziło - a przynajmniej nie w ten sposób
;) Fakt -
jeśli przepisze sobie wartość z kontrolki do ziennej (wartość klucza
głównego), to
potem mogę sobie uruchomić kwerendę, która usunie ten wiersz. Jednak ja
chciałem
to zrobić albo np za pomocą jakiejś metody - choćby DoCmd (wiem - lama
jestem,
ale po prostu nie znam jeszcze wszystkich obiektów i ich metod i
właściwości),
albo za pomocą np ADO ... (coś na wzór mój_recordset.delete )
No to moze tak:

Private Sub On_Buton1_Click()
Dim sSQL as String
...
sSQL = "DELETE * FROM (" + Me.NazwaPodrzednego.Form.Recordset + ") " & _
"WHERE ID = " + CStr(Me.NazwaPodrzednego!ID)
DoCmd.RunSQL sSQL

...
End Sub

recordsource w nawiasie, gdzyz moze to byc np jakies wyrazenie SQL a nie
tylko nazwa tabeli
czy kwerendy
i druga sprawa; zakladam ze pracujesz na pliku .mdb, poniewaz metoda RunSQL
jest
przeznaczona dla tego formatu plikow i moze nie dzialac z .adp :)
do adp raczej uzyc:

CurrentProject.Connection.Execute sSQL
Post by Soryt
Pozdrawiam gorąco i zachęcam do dalszej dyskusji ;)
Pozdrawiam! :)
Soryt
2003-12-14 22:29:47 UTC
Permalink
[...]
Post by Leon
Post by Soryt
3) Nie rozumiem właściwości form - po co się odwoływać do siebie samego ?
Forms!Orders!OrdersDetails!OrderID ???
AD3 Nooo... tak! - nie pomyslalem o tym :) (patrz wyzej :] )
Yyyyy - pytnąłem o tą rzecz na comp.databases.ms-access
no i okazuje się, że jednak poprawną formą wyrażenia jest:

Forms!Orders!OrdersDetails.Form!OrderID

ponieważ OredrDetails jest kontrolką, która zawiera formularz,
więc sama nie zawiera formantu OrderID .... Ciekawi mnie jednak,
dlaczego u mnie ten kod krótszy działa ... :P
Post by Leon
Private Sub On_Buton1_Click()
Dim sSQL as String
...
sSQL = "DELETE * FROM (" + Me.NazwaPodrzednego.Form.Recordset + ") " & _
"WHERE ID = " + CStr(Me.NazwaPodrzednego!ID)
DoCmd.RunSQL sSQL
Dzięki - przetestuje :)

Próbowałem coś takiego, ale nie działa :(
(wywala błąd na linijce z właściwością RecordsetClone - Error 13)

Private Sub Polecenie69_Click()

Dim dbConn As ADODB.Connection
Dim dane As ADODB.Recordset

Set dbConn = CurrentProject.Connection
Set dane = Forms!Pracownicy![Zamówienia podformularz].Form.RecordsetClone
dane.Bookmark = Me![Zamówienia podformularz].Form.Bookmark
dane.Delete
dbConn.Close

End Sub

,ale takie coś chyba i tak jak by "zadziałało", to było by bezużyteczne, bo
zdaje się,
że może i by usunął ten rekord, ale tylko z jego kopii (dane) - dobrze myśle
czy źle :]

Pozdrawiam serdecznie !
Krzysztof Naworyta
2003-12-16 17:49:55 UTC
Permalink
Juzer Soryt <***@wp.pl> napisał:

| Yyyyy - pytnąłem o tą rzecz na comp.databases.ms-access
| no i okazuje się, że jednak poprawną formą wyrażenia jest:
|
| Forms!Orders!OrdersDetails.Form!OrderID
|
| ponieważ OredrDetails jest kontrolką, która zawiera formularz,
| więc sama nie zawiera formantu OrderID .... Ciekawi mnie jednak,
| dlaczego u mnie ten kod krótszy działa ... :P

Podział na Kotrolka Subform i zawarty w niej formularz jest IMO podziałem
logicznym, choć początkującym może sprawiać problem.
Kontrolka ma np. właściwości .left, .Top, których nie posiada obiekt
formularz
Z kolei właściwość formularza: .Width nijak ma się do tej samej właściwości
kontrolki Subform.


Niemniej począwszy od A'2k nastąpiły pewne zmiany, m.in. ta, że domyślną
kolekcją _kontrolki_ jest kolekcja Controls zawartego w niej formularza.
Dlatego ten sktótowy zapis już działa, ale pamiętać należy, że w a'97 nie !

Niestety gdzieś po drodze gubiona jest kompatybilność wsteczna. Nie do końca
czaję kiedy, ale zdarza się, że odwołanie Forms("Ala")!Ola.Form.CośTam
wywala błędy kompilacji w kodzie a'2k (!!!)

| Próbowałem coś takiego, ale nie działa :(
| (wywala błąd na linijce z właściwością RecordsetClone - Error 13)
|
| Private Sub Polecenie69_Click()
|
| Dim dbConn As ADODB.Connection
| Dim dane As ADODB.Recordset
^^^^^^
|
| Set dbConn = CurrentProject.Connection
| Set dane = Forms!Pracownicy![Zamówienia podformularz].Form.RecordsetClone
| dane.Bookmark = Me![Zamówienia podformularz].Form.Bookmark
| dane.Delete
| dbConn.Close
|
| End Sub

Jak długo pracujesz w mdb/mde a nie w adp/ade, tak długo recordset
formularza jest obiektem bilbioteki DAO !
Bez względu czy DAO masz jawnie zaznaczone w referencjach czy nie.


| ,ale takie coś chyba i tak jak by "zadziałało", to było by bezużyteczne,
| bo zdaje się,
| że może i by usunął ten rekord, ale tylko z jego kopii (dane) - dobrze
| myśle czy źle :]

źle !
Koln tym się rózni od obiektu pierwotnego, że możesz na nim operować
niezależnie, np. poprzez założenie dodatkowych filtrów czy przeszukiwać bez
zmiany kursora pierwotnego recordsetu.
Dane ciagle są te same, co najwyżej aby wprowadzone zmiany były w pierwszym
obiekcie widoczne, musisz ten pierwszy odświeżyć.

--
KN

Loading...