Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Ms Access XP - aktualizace dat ve formuláři

Zdravím,
potřebuji poradit s MS Access XP.
Mám formulář se sadou záznamů z tabulky (Projekty) a v něm podformulář se stejnou sadou záznamů.
Při změně věty v nadřazeném formuláři se změní věta v podřazeném formuláři.

V podformuláři mám ovladač karta na kterém je umístěn ovladač seznam.
Seznam má jako zdroj záznamů dotaz který vybere podle ID Projektu všechny objednávky z tabulky (Objednavky).
Při změně věty v nadřazeném formuláři se změní sice věta v podřazeném formuláři ale už ne data v seznamu.

Nevím si rady jak s automatickou aktualizací dat v tom seznamu, zatím to řeším tak že mám v podformuláři na té kartě vedle seznamu tlačítko "aktualizovat"
které provede tohle : DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

To se mi ale nelíbí. Samozřejmě že by pomohlo seznam přemístit na nadřazený formulář ale to z ergonomického hlediska prostě nemůžu.

Potřeboval bych z nadřazeného formuláře sputit nějaké makro které by mi aktualizovalo data přímo v tom seznamu v podformuláři, ale to se mi prostě nedaří.
Pokud je část toho kódu co jsem psal jinde než na té kartě s tím seznamem tak se to prostě neaktualizuje.
Nevíte jak na to ?

**********************************
Nikdo nic ? Přiložil jsem i soubor kde je to vidět. U projektu č2 by se měla zobrazit objednávka, ale zobrazí se jen při stisku tlačítka "aktualizovat".

Předmět Autor Datum
Skus sem dat nejake hlavne kusky zdrojaku, z toho co si pisal asi moc nikto mudry nebude. Vseobecne…
MM.. 31.05.2010 16:04
MM..
Však jsem přiložil celej MDB soubor kde je jasně vidět můj problém, je v tom formulář, podformulář,…
Palevel 31.05.2010 16:07
Palevel
Také jsem nějak nepochopil, co vlastně chceš (otevřel jsem si ten přiložený soubor). Oba formuláře m…
uri 31.05.2010 16:20
uri
Ok, i když vytvořím relaci mezi tabulkou objednavky a projekty tak se v podformuláři v tom seznamu s…
Palevel 31.05.2010 16:40
Palevel
Vím že to vypadá divně mít podformulář se stejným zdrojem záznamů jako nadřazený formulář, ale věřte…
Palevel 31.05.2010 16:48
Palevel
většinou se to řeší tak, že na ovládací prvek (nebo rovnou jedno pole formuláře) měnící aktuální vět…
touchwood 31.05.2010 17:32
touchwood
Jojo, přesně takhle jsem se to snažil řešit, ale problém je že tenhle kód (je-li spuštěn z nadřazené…
Palevel 31.05.2010 20:15
Palevel
no jo, ale to se na ten formulář musíš odkázat. ten acForm je proměnná pro jméno formuláře, nemůže t…
touchwood 31.05.2010 22:05
touchwood
Vyzkouším, díky za radu. Zítra dám vědět :)
Palevel 31.05.2010 22:44
Palevel
Stejně nechápu účel (zadávací nebo zobrazovací formy ?, karty ?), určitě by to šlo řešit jednoduše.…
uri 31.05.2010 21:54
uri
To zní zajímavě, teď tu nemám access, zítra to vyzkouším, díky za radu. Jo jinak jsou to jen zobrazo…
Palevel 31.05.2010 22:43
Palevel
ááá funguje, děkuju moc, vyřešeno.
Palevel 01.06.2010 14:51
Palevel
je to zbytečně složité (tak by to zaznamenal nahrávač maker:-)), ale když to funguje.. :-)
touchwood 01.06.2010 17:49
touchwood
Já bych provedl propojení formů v db úplně jinak. Ale protože tazatel pouze chtěl u svého db-výtvoru…
uri 01.06.2010 19:29
uri
mně to připadne složité, protože refresh se dá volat rovnou na ten daný ovládací prvek, stačí jít př…
touchwood 01.06.2010 21:14
touchwood
Vážený Touchwoode, píšu trošku opožděně, zase jsem se dostal ke svému starému problému s aktualizac…
Palevel 27.11.2012 12:53
Palevel
Podle mě řešíš problém na špatném místě. Refresh podformuláře musíš spouštět na ovládacím prvku (po…
touchwood 27.11.2012 13:11
touchwood
Dík za bleskovou odpověď. Jdu se v tom povrtat :) poslední
Palevel 27.11.2012 13:27
Palevel

Skus sem dat nejake hlavne kusky zdrojaku, z toho co si pisal asi moc nikto mudry nebude.

Vseobecne si treba pozret MSDN ze jake su tam moznosti ovplyvnovania formularov (volanie metod ineho objektu, alebo pouzivania nejakeho globalneho flag-u, alebo eventy, apod)

Také jsem nějak nepochopil, co vlastně chceš (otevřel jsem si ten přiložený soubor). Oba formuláře mají stejný zdroj dat a nikde není určeno propojení tabulek (relace). Doporučuji prostudovat vzorovou databázi Northwind.mdb (tam je krom jiného také propojení objednávka - rozpis objednávek) a to asi chceš docílit.

Ok, i když vytvořím relaci mezi tabulkou objednavky a projekty tak se v podformuláři v tom seznamu stejně data po změně dat v hlavním formuláři neakutalizujou.
Prostě pokud projíždím věty v hlavním formuláři tak by se měl aktualizovat i podformulář a to taky dělá ale ne ten seznam co na něm je.
Když v hlavním formuláři najedu na 2. větu tak by se měl seznam vyplnit a to neudělá do doby než zmáčknu tlačítko aktualizovat.

Vím že to vypadá divně mít podformulář se stejným zdrojem záznamů jako nadřazený formulář, ale věřte mi, neni to úplná blbost (asi) :)
Mám to kvůli tomu že dost používám ovladač "karta" a bohužel do jedné karty nejde dát další ovladač karta, takže to řeším tak že dám do karty podformulář a do něj kartu.

většinou se to řeší tak, že na ovládací prvek (nebo rovnou jedno pole formuláře) měnící aktuální větu v nadřazeném formuláři přidá ten tvůj kód pro vynucený refresh podřízeného formuláře, a to na buď akci "po stisku" nebo "po změně" (pokud si pamatuju dobře to názvosloví - přece jen v Accessu jsem něco naposledy prasil tak 2 roky zpět)

Jojo, přesně takhle jsem se to snažil řešit, ale problém je že tenhle kód (je-li spuštěn z nadřazeného formuláře) refreshne jen ten nadřazenej formulář, respektive refreshne všechny ovládací prvky na nadřazenym formuláři včetně podformuláře, ale ten jeden pitomej ovladač na tom podformuláři - konkrétně SEZNAM - ten ne. Ten jde refreshnout jen z toho formuláře na kterém je umístěnej. Jak tu psal kolega před tebou ať se podívám na northwind tak tam sice tenhle problém je ale bez ovladače seznam - v podformuláři je rovnou formulář v zobrazení tabulky a to nechci, já potřebuju použít seznam.

Stejně nechápu účel (zadávací nebo zobrazovací formy ?, karty ?), určitě by to šlo řešit jednoduše. Takže, aby ti to tvoje fungovalo bez tlačítka "Aktualizovat", musíš u formuláře "formular" pro událost Current vytvořit událostní proceduru a do ní vložit následující příkazy: DoCmd.GoToControl "podfrm"
DoCmd.GoToControl "Seznam3"
DoCmd.RunCommand acCmdRefresh
DoCmd.GoToControl "Projekt"
Názvy (podfrm, Seznam3 atd.) jsou podle tvé přiložené databáze a pokud jsi je měnil, tak si názvy uprav.

To zní zajímavě, teď tu nemám access, zítra to vyzkouším, díky za radu.
Jo jinak jsou to jen zobrazovací formy s kartama.
Ten seznam není v podstatě s ničím propojený, jen má jako zdroj řádků vybrat záznam z tabulky objednavky se stejným IDprojektu jako je aktuální ID v nadřazeném formuláři.

Já bych provedl propojení formů v db úplně jinak. Ale protože tazatel pouze chtěl u svého db-výtvoru refresh u seznamu v podřízeném formu a to z nadřízeného formu, uvedl jsem událost Current v nadřízeném formu (tazatel neuvedl, po jaké události se má zobrazit) a příkazy (neznám nahrávač maker). První příkaz aktivuje podform, další aktivuje okno seznam, další provede refresh a poslední aktivuje zpět prvek formu (složité ?). Toť vše.

mně to připadne složité, protože refresh se dá volat rovnou na ten daný ovládací prvek, stačí jít přes celou kolekci. Defaultně se aplikuje na aktuálně zvolený prvek (proto ty napřed přejdeš, pak refreshneš a vracíš se zpět), dá se to ale řešit elegantněji jedním příkazem, který refreshne prvek, který mu zadáš a nikoli ten aktivní.

P.S.: možná už nepoužívám tu pravou terminologii, doby kdy jsem psal aplikace v Accessu jsou už dost dlouho pryč :-)

Vážený Touchwoode,

píšu trošku opožděně, zase jsem se dostal ke svému starému problému s aktualizací seznamu na podformuláři a znova využiju tento thread.
Ptám se tedy zpětně na to elegantnější řešení refreshnutí prvku na jiném formuláři než na tom na kterém se aktuálně nachází fokus.

Ještě se tu pokusím popsat proč vůbec používám takovou kravinu jako je vložený podformulář ve formuláři se stejným datovým základem :
Po spuštění mé aplikace v MS Access se mi veškerý pracovní prostor Accesu minimalizuje a uživatel vidí jen formulář se kterým pracuje a pod ním plochu Windows.
(vypadá to pak jako normální aplikace a nikoho neděsí lišty MS Access apod.)
Tento formulář pak obsahuje hlavní menu které přepíná ve vloženém rámci podformuláře. Nechce se mi to řešit otevíráním dalších oken což by zhoršilo přehlednost.

Aktualizovat seznam na daném podformuláři chci hned po otevření, což se mi nedaří protože asi po otevření se formuář teprve nastaví na záznam nadřazeného formuláře.
Takže podud do podformuláře napíšu :

Private Sub Form_Open(Cancel As Integer)
DoCmd.RunCommand acCmdRefresh
End Sub

tak se mi sice aktualizuje ale myslím že ještě před nastavením na správný záznam.

Takže jaké je to elegantnější řešení ?
Ještě by mě zajímalo na jaký program přejít z MS Access pro tvorbu ještě lepších aplikací, ale s takovou jednoduchostí jako to právě Access umí ?

Podle mě řešíš problém na špatném místě.

Refresh podformuláře musíš spouštět na ovládacím prvku (poli, podle kterého se selectují data do podformuláře), a to jako akci "po aktualizaci" nebo "při změně" (jestli se dobře pamatuju).

Principiálně:

1. změníš nadřazený záznam na hlavičce
2. přepíše se obsah pole --> buď metoda afterUpdate (změna záznamu) nebo onchange (při editaci záznamu) spustí refresh podformuláře.

Nemůžeš refreshovat při zavedení apod., protože to nereflektuje změny v nadřazeném formuláři, který je ten "řídící" formulář --> změny v hlavičce definují refresh podformuláře.

Pokud jsem nepochopil, tak se omlouvám ;-)

P.S.: podobný SW je Filemaker (původně tuším z Maca), ale Access je IMHO lepší. Další alternativa je stará dobrá Visual FoxPro (už se ale nevyvíjí, MS ji po zakoupení "zařízl")

edit: ještě k těm refreshům jiných formulářů:
http://bytes.com/topic/access/answers/876599-refre sh-another-form

a hlavně to čem jsem psal:
http://www.techonthenet.com/access/subforms/refres h.php

Zpět do poradny Odpovědět na původní otázku Nahoru