Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno MS Access - specifický posun mezi větami databáze

Databáze MS Access (1997, popř. 2007). Jedna věta/řádek má 30 položek. Pro vkládání údajů do databáze je vytvořen formulář. Celé se to snažím koncipovat tak, aby se vůbec nepoužívala myš - výrazně zpomaluje práci...

Zadávání dat do formuláře (tedy jednoho řádku databáze) je řešeno tak, že po <enter> se kurzor posune na další položku dané věty. V jednom řádku se ovšem nevyplňují všechny položky; první čtyři vždycky a ze zbylých obvykle jen 3-5. Čili mezi prázdnými/nevyplňovanými položkami věty skáču mačkáním enteru.

Potřeboval bych dořešit jedinou věc, se kterou si nevím rady. Poslední vyplňovaná položka věty se pohybuje obvykle v druhé polovině databázové věty; někdy je to 16., jindy třeba 28. položka. Poslední položka to není skoro nikdy. Chtěl bych vytvořit klávesovou zkratku - ideálně by měla být modifikována klávesa PageDown - která by měla plnit následující: při jejím zmáčknutí by se měl kurzor (fokus) přesunout vždy na první položku následující věty. V defaultním nastavení Accessu je fokus posune na následující větu, ale na stejnou položku jako byl v minulé. Pro posun na první položku je potřeba následně mačkat Home. Mačkat v každé větě PageDown a hned poté Home je zdržující a otravné, takhle to nemůžu nechat, potřeboval bych to nějak sloučit do jedné klávesy. Databází je několik (se stejnou strukturou), roční objem zadávaných vět určitě přesahuje 100.000...

Tuším, že by mohla pomoci nějaké makro či spíše funkce VBA. Netuším ale jak na to...

Poradíte?

Příklad, abych to líp znázornil:
- databázová věta má položky A - Z
- jsem u šesté věty (A6 až Z6), fokus je na M6
- potřebuju se jedním stiskem klávesy (ideálně PageDown) dostat na A7.

Předmět Autor Datum
zbytečně si to komplikuješ. Accessovský formulář umožňuje definovat pořadí jednotlivých polí formulá…
touchwood 10.07.2008 20:39
touchwood
Budu potřebovat trochu nakopnout. Jsem právě v Accessu 2007, mám nadefinovanou testovací databázi a…
L-Core 10.07.2008 21:13
L-Core
předesílám že Access ve verzi 2007 neznám. Rajtoval jsem 95ku a 97ku, částečně pak 2000, XP a 2003.…
touchwood 10.07.2008 21:25
touchwood
Zatím se mi to podařilo vyřešit provizorně pomocí AutoKeys makra (spustit příkaz, přejít na nový záz…
L-Core 10.07.2008 22:53
L-Core
Zkus do formu události Current vložit proceduru If Me.OnKeyPress = "" Then DoCmd.GoToControl "Název…
uri 10.07.2008 23:52
uri
To je už pro mě vyšší dívčí, netuším, která bije :-x:-[ Nevím, jak na to...
L-Core 11.07.2008 14:20
L-Core
takto určitě ne, správně by to mělo být takto: 1. za poslední "editovací" objekt si dáš další objek…
touchwood 11.07.2008 14:50
touchwood
Problém vidím v tom, že se k posledním položkám věty obvykle vůbec nedostanu (často končí poslední e…
L-Core 11.07.2008 15:02
L-Core
znova: předpokladem je korektní nastavení pořadí ovládacích prvků. Nastavuje se to v kontextové nabí…
touchwood 11.07.2008 15:23
touchwood
Chápu, ale tohle je problém, "korektní nastavení pořadí"... Prostě netuším, nad kterou položkou ten…
L-Core 11.07.2008 15:56
L-Core
aha, už chápu. Nicméně, stisk klávesy "home" je příliš redundantní?
touchwood 11.07.2008 16:24
touchwood
Síla zvyku. Oba (s manželkou) máme za sebou určitě milión (možná několik...) dbf vět s "PgDown a nic…
L-Core 11.07.2008 16:35
L-Core
Nevím, jak na to... Tak znovu: Otevřeš si zadávací form v návrhovém zobrazení, dál vlastnosti formu,…
uri 11.07.2008 16:56
uri
já jsem předpokládal, že to je vždy na určitém poli formuláře.
touchwood 11.07.2008 17:11
touchwood
...až pojedeš někdy jižní Moravou nedaleko Rakouska a Slovenska, stav se na víno. Zatím posílám aspo… poslední
L-Core 11.07.2008 17:19
L-Core

zbytečně si to komplikuješ. Accessovský formulář umožňuje definovat pořadí jednotlivých polí formuláře, a tedy si můžeš nadefinovat vlastní "jízdní řád", s tím, že poslední editovací pole bude mít definovánu událost "při opuštění", kdy se přes VBA provede save záznamu a přechod na další záznam (ale to je "extra", protože PgDown ti automaticky "odskočí" na další záznam, první pole).

.. teda aspoň myslím, protože takto mi to vždy fungovalo.. ;-)

Budu potřebovat trochu nakopnout.
Jsem právě v Accessu 2007, mám nadefinovanou testovací databázi a formulář.

Posledním editovacím polem myslíš (viz původní zadání) pole "Z"? Vím, že můžu pořadí ve formuláři libovolně popřehazovat, ale nikdy nedokážu zabezpečit, aby se poslední kolonka formuláže vždycky editovala. Ani by to nebylo účelné, když se bude zapisovat např. pouze do prvních deseti polí; byla by otrava entrovat až na konec.

Přepl jsem tedy návrh formuláře. Co konkrétně myslíš onou událostí "při opuštění"? Vlastnosti poslední položky (tedy "Z"), "událostní", "při výstupu"? Problém ovšem je, že se na "Z" většinou fyzicky (tedy že bych tam něco zadával) nedostanu.

PgDown zmáčknuté někde uprostřed formuláře skočí na další větu, ale fokus zůstane na stejném poli. Na začátek věty neskočí...

předesílám že Access ve verzi 2007 neznám. Rajtoval jsem 95ku a 97ku, částečně pak 2000, XP a 2003.

Já bych to udělal tedy tak, že do událostní položky formuláře (nikoliv prvku) "změna záznamu" (neznám přesný termín) bych dal akci "změna fokusu" na první ovládací prvek (to se dá udělat pomocí VBA).

Bohužel teď nemám puštěný počítač na kterém mám office, tak se na to kdyžtak zítra kouknu.

takto určitě ne, správně by to mělo být takto:

1. za poslední "editovací" objekt si dáš další objekt (ať už viditelný (který je součástí dat formuláře), nebo neviditelný) a v jeho vlastnostech dáš do události "při získání fokusu" událostní proceduru ve VBA (tvůrce kódu) - vložíš do "Sub-u":

DoCmd.GoToRecord , , acNext
DoCmd.GoToControl "Název 1.položky"

název této položky získáš v jejích vlastnostech.

A fungovat to bude tak, že při běžné editaci, po odklepnutí poslední položky enterem, by se mělo "odrotovat" na další záznam a přepnout na první ovládací prvek.

samozřejmě můžeš použít taky příkaz sendkeys, musel bys poslat "pgDn" a následně "Home"

Problém vidím v tom, že se k posledním položkám věty obvykle vůbec nedostanu (často končí poslední editace třeba někde v polovině, u 15.-20. položky z 30). Entrovat až konec se mi nechce, to už je jednodušší PgDown a Home.

S příkazem SendKeys mám problém, vůbec netuším, jak jej použít. Ale tuším, že to by mi pomohlo.

S manželkou jsme probírali možnost, že bychom místo PgDown používali Insert (vyřešeno viz výše), jenže 15-ti letá rutina se nedá tak snadno zlomit... (reálie dBASE IV)

Chápu, ale tohle je problém, "korektní nastavení pořadí"... Prostě netuším, nad kterou položkou ten příkaz vytvořit. Popřehazování kolonek mi nepomůže, když bych měl jednoznačně určit "tu poslední", po jejímž odentrování skočí fokus na první pole dalšího/nového záznamu.

Věta má 30 položek. První čtyři se vyplňují vždy, ze zbylých jen pár - pokaždé jiné. Jednou je poslední vyplňovaná položka (míněno jako pořadí položky ve větě) č. 11, jindy 20, jindy 25, zcela libovolně. Dojdu třeba k 11. položce a už chci skočit na další/novou větu, na její začátek. Jindy se dostanu až 20.,25. položce. Vyplňování vědy prostě pokaždé skončí někde jinde.

Vím, mohl bych jako poslední dát třeba jednu z těch prvních čtyř, které se musí vyplňovat vždy, ale to mě donutí 29x entrovat/tabovat, než se k ní dostanu.

Dám-li výše uvedený VBA "sub" nad poslední položku a doentruju-li se až k ní, pak to samozřejmě funguje.

-------

Opravdu cítím, že se budu muset spíše zaměřit na SendKeys, pokud nějak přebindovat klávesa PgDown vůbec jde... :-|

Síla zvyku. Oba (s manželkou) máme za sebou určitě milión (možná několik...) dbf vět s "PgDown a nic víc". Ovládání máme tak zažráno pod kůži, že vlastně pomalu nekoukáme ani na monitor (pochopitelně ani na klávesnici).

Než mačkat dvě klávesy, to se raději naučíme ten Insert.

Předělat databáze z dBASE do Accesu jsem se odhodlával už několikrát, vždy to ale ztroskotalo na (ne)ergonomii výsledku. Myš je prostě vyloučena; v naší práci hrozně zdržuje.

-------
Ještě bych mohl vyloupnout klávesy PgDown a Insert a zaměnit je, třeba by to fungovalo ]:)]:)]:)

Nevím, jak na to... Tak znovu: Otevřeš si zadávací form v návrhovém zobrazení, dál vlastnosti formu, "Při události Current" vytvoříš událostní proceduru, otevřeš a vložíš mnou výše uvedený příkaz - celé to vypadá takto:
Private Sub Form_Current()
If Me.OnKeyPress = "" Then
DoCmd.GoToControl "Název 1.položky"
End If
End Sub
Je to funkční na kterémkoli poli při vyplňování záznamu na stisk PgDn (nastavení pořadí na to nemá vliv). Rovněž můžeš "entrovat" až nakonec.
To touchwood: tvoje navrhované řešení "DoCmd.GoToRecord , , acNext DoCmd.GoToControl "Název 1.položky" bude bez problému fungovat pod příkazovým tlačítkem, ale požadavek byl na PgDn bez myšky.

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