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.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
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… nový
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… nový
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í… nový
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… nový
L-Core 11.07.2008 15:56
L-Core
aha, už chápu. Nicméně, stisk klávesy "home" je příliš redundantní? nový
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… nový
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,… nový
uri 11.07.2008 16:56
uri
já jsem předpokládal, že to je vždy na určitém poli formuláře. nový
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

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