Ardonaiel
08.08.12,16:53
Ahojte/Dobrý deň,

mám vnorený formulár v ktorom filtrujem záznamy. Tieto filtrované záznamy by som chcel po kliknutí na tlačítko, uložiť v tabuľke. No doposiaľ som neprišiel na to, ako to urobiť.
Mohli by ste mi prosím pomôcť?

Ďakujem.

Ps:
v prílohe som pripravil Access v ktorom je formulár s vnoreným formulárom, ktorý čerpá údaje s tabulky1. filtrované údaje by sa mali ukladať do tabulky2.
pepo_p
16.08.12,08:11
Nechápem, prečo sa chceš škriabať ľavou rukou za pravým uchom? V Accesse máš jednu tabuľku a nad ňou spracovávaš formuláre a dotazy. Nadefinuj dotaz a máš to to isté ako keby si tie dáta ukladal do tabuľky.
Dáta v tabuľkách udržuj vždy len minimálne, ostatné rieš dotazmi nad nimi.
Ardonaiel
16.08.12,13:29
pepo_p >> Tu som priložil len podklad pre predstavu a aby ste si nemuseli vytvárať access s tabuľkami a formulármi. V skutočnosti je tabuliek, dotazov, formulárov a makier v Acesse oveľa viac - ale ako príklad tu predsa nebudem vkladať 500MB databázu a ešte zvlášť aplikáciu a vysvetľovať, ako funguje a prečo a ako čo riešim predsa :-).

Tvoja/Vaša odpoveď mi môj problém žiaľ nevyrieši, keby som situáciu vedel vyriešiť nejakým dotazom, tak to už dávno urobím. Ide o to dostať filtrované údaje z vnoreného formulára do tabuľky. Formulár bude slúžiť ako užívateľské prostredie, keďže je práca a filtrovanie v ňom podobná excelu. Nebudem predsa užívateľovi, ktorý nevie robiť v Accesse hovoriť: ,,urob si SQL dotaz na tabuľku" :-)

... pomocou recordsetu viem filtrovaným záznamom vo vnorenom formulári meniť hodnoty, ale čo neviem, je tieto filtrované záznamy, uložiť potom do extra tabuľky - a extra tabuľka je v mojom prípade potrebná - prečo je potrebná tu určite nebudem riešiť. :-) Vyriešiť potrebujem ukladanie filtrovaných záznamov.

Ak to nie je možné OK, ale ak áno, prosím o pomoc/radu.
Ďakujem.
PaloPa
27.08.12,08:19
Riešiť sa dá mnohými spôsobmi, najčastejšie cez VBA, kde sa na prvky subformulára odkazuje napr. cez
Me!Subform1.Form!ControlName (podrobne popísané tu: Forms: Refer to Form and Subform properties and controls (http://access.mvps.org/access/forms/frm0031.htm) ), ale nie je treba vždy isť "s bubnom na zajace".

Stačí zavolať z formulára Append Query, kde je väzba na prvky formulára, ktorých hodnota deklaruje výsledok filtra, napr. cez makro (dá sa skovertovať na VBA a ďalej upravovať). Viď príklad - form Zóny.

Palo
Ardonaiel
27.08.12,14:26
PaloPa > ďakujem veľmi pekne za snahu mi pomôcť, toto riešenie poznám a ospravedlňujem sa, ak som problém zle vysvetlil/popísal, no myslel som filtrovanie záznamov priamo v subformulári (cez dátové zobrazenie, viď obrázok), a nie odkazom na hodnotu v ovládacom prvku combo ako je to vo Vašom/tvojom prípade.

V dátovom zobrazení je možné zadať niekoľko filtrov naraz (podobne ako v exceli), čo mi vyhovuje, pretože vopred neviem v ktorých poliach sa bude filtrovať a čo. S tohto dôvodu ani nemôžem odkazovať SQL dotazom na combo alebo iný prvok, keďže vopred nepoznám tie polia a podmienky.

Čiže, potrebujem len filtrované dáta zo sub formulára a filtrované cez dátové zobrazenie. :-)
PaloPa
27.08.12,16:10
V tom prípade sa dá cez VBA, napr. cez RecordsetClone:
!! Pre seriózne použitie to chce ošetriť výnimky (v príklade som odblokoval Autonumber a OLE typ poľa).


Option Compare Database

Function FillFilteredRecords(F As Form, xTbl As String)

Dim RS As DAO.Recordset, C As Control
Dim FillFields As String, FillAllFields As Integer

On Error GoTo xExit

' Goto the last record of the form recordset
Set RS = F.RecordsetClone
RS.MoveLast
' Exit if you cannot move to the last record (no records).
If Err <> 0 Then GoTo xExit

RS.MoveFirst

For Each fld In RS.Fields
If fld.Name <> "ID" Then 'autonumber
xFldNames = xFldNames & IIf(xFldNames = "", "", ", ") & fld.Name
End If
Next fld

Do Until RS.EOF
xFldValue = ""
For Each fld In RS.Fields
If fld.Name <> "ID" Then 'autonumber
If fld.Type = dbText Then
x = "'" & Nz(fld.Value, "") & "'"
ElseIf fld.Type = dbLongBinary Then 'treba riesit inak
x = "''"
Else
x = Nz(fld.Value)
End If
xFldValue = xFldValue & IIf(xFldValue = "", "", ", ") & x
End If
Next fld

xSQL = "INSERT INTO " & xTbl & " ( " & xFldNames & " ) " & " Values( " & xFldValue & ")"
CurrentDb.Execute xSQL
RS.MoveNext
Loop
RS.Close

xExit:
Set RS = Nothing

End Function

TIP: Pri veľkom počte položiek môže byť prechádzanie cez recordset a insertovanie po jednom riadku pomalé. Vtedy by som to riešil "vycucnutím filtra" pre daný subform (vlastnosti F.filter, F.FilterOn)
a vygeneroval by som si append query , kde where by bol daný filter napr: Filter : "([Krajiny].[Krajina] In ("Afghanistan","Arménsko","Azerbájdžán"))"
Ardonaiel
28.08.12,05:32
ĎAKUJEM!!! Presne takéto riešenie som potreboval. Konečne sa môžem posunúť ďalej. :-)