Acces a on click událost

Programy pro práci s textem, tabulkami, prezentacemi

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Nnet 27. 2. 2015 07:36

Ahoj, nedaří se mi vytvořit on click událost v accessu

Mám formulář zobrazující data pojmenovaný Výměny obsahuje slupec nazvaný ZMĚNOU.
Pak mám formulář Změny kde mám také sloupec ZMĚNOU

Rád bych udělal funkce tak aby se mi při klknutí na obsah v [Výměny]![ZMĚNOU] otevřel formulář [Změny] ale s odfiltrovaným obsahem tak že bude obsahovat jen ty řádky které se zhodují v parametru [ZMĚNOU] na který jsem klikl. (Po přečtení vidím že neumím vysvětlovat)

Zkoušel jsem toto DoCmd.OpenForm "Změny", , , "[ZMENOU]=" & Me.[ZMENOU]

Ale moc to nejde :D

vyhodí chybu Nesoulad datových typů přitom mám datové tipy v tabulkách stejné.

Používá to někdo? prosím o radu

-- 27. 2. 2015 07:45 --

Jo datové typy jsou nastaveny na Text (7).
Teď přemýšlím zda je access schopen porovnávat Text, ale měl by.

-- 27. 2. 2015 07:59 --

Tak se mi podařilo dosáhnout toho že už nemám chybu v datovém typu ale otevře se mi formulář prázdný :( filtrování nefunguje.

DoCmd.OpenForm "Změny1", , , "[ZMENOU]=" = Me.ZMENOU

-- 27. 2. 2015 08:26 --

Problém je asi v tom že & platí pro číslo, existuje stejný operátor pro text?
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Kurimak 27. 2. 2015 12:17

Pro text by měl fungovat operátor Like.
Kurimak
Junior

Odeslat příspěvekod Miroslav Pragl 27. 2. 2015 12:56

podminka obsahuje porovnani retezcu, prava strana tedy musi byt v apostrofech (SQL styl) pripadne v uvozovkach (Access styl ... Access myslim umi oboje). Tedy podminka musi byt
... [ZMENOU]='NevimCoTamAsiTakMas';

DoCmd.OpenForm "Změny1", , , "[ZMENOU]='" & Me.ZMENOU & "'"

ampersand je operator "scitani" retezcu , tedy samozrejme ve VBA

MP

-- 27. 2. 2015 12:58 --

Kurimak píše:Pro text by měl fungovat operátor Like.

Pro text funguje operator like, ale zde je naprosto nevhodny.

MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 4. 3. 2015 14:51

Děkuji funguje skvěle :)

Ještě bych chtěl pomoc s opravou kodu

Kód: Vybrat vše
Private Sub Text28_Click()
If [VYMENITELNOST] = "A" Then
DoCmd.RunSQL "INSERT INTO VYMENY([VYMENITELNOST]) VALUES(N)"
Else
If [VYMENITELNOST] = "N" Then
DoCmd.RunSQL "INSERT INTO VYMENY([VYMENITELNOST]) VALUES(U)"
Else
If [VYMENITELNOST] = "N" Then
DoCmd.RunSQL "INSERT INTO VYMENY([VYMENITELNOST]) VALUES(A)"
End If
End If
End If

End Sub


Kod má vložit do pole na které jsem klikl hodnotu podle obsahu a točí se hodnoty A, N, U. Tento kod mi vloží nový řádek s požadovanou hodnotou ale já chci přepsat řádek stávající.

-- 4. 3. 2015 15:21 --

Edit. Nejspíš to půjde pomocí

If Forms![Změny]![VYMENY podformulář]!Text28 <> "A" Then

Forms![Změny]![VYMENY podformulář].Value = "N"

End If

Jen to s vložením mi nefunguje, nic to nevloží.
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 4. 3. 2015 19:44

menis si pres SQL data pod zadkem (a to bez podminky ... divne)? Resp. co je zac pole VYMENITELNOST, co je zac tabulka (?) VYMENY

ZKUS POPSAT, CO CHCES UDELAT, A NE JAKY MAS PROBLEM

MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 5. 3. 2015 07:32

Už jsem to zprovoznil :)
Popis pro případné zájemce co to najdou.
Kod mění písmena v podformuláři v textovém poli z A na N na U lkinkutím.

Kód: Vybrat vše
Private Sub Text28_Click()
If Forms![Změny]![VYMENY podformulář]!Text28 = "A" Then

Forms![Změny]![VYMENY podformulář]!Text28.Value = "N"

Else
If Forms![Změny]![VYMENY podformulář]!Text28 = "N" Then

Forms![Změny]![VYMENY podformulář]!Text28.Value = "U"
Else
If Forms![Změny]![VYMENY podformulář]!Text28 = "U" Then

Forms![Změny]![VYMENY podformulář]!Text28.Value = "A"
End If
End If
End If
End Sub
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 5. 3. 2015 10:07

No fuj. Nauc se pouzivat CASE (prehlednost) nebo si udelaj prekladove pole
ANU -> NUA a preloz pres nej.

A pouzivej relativni / nejmensi mozne adresovani poli.
Forms![Změny]![VYMENY podformulář]! je IMHo zbytecne, nech jen Text28

A uz vubec nechapu, proc mas udalost na on Click. Zkusil's formular ovladat bez mysi (ja mys pouzivam minimalne)

MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 5. 3. 2015 10:46

První pěkný funkční kousek kodu a dozvím se fuj :D to je dobrý...

A pokud použiji relativni adresování nefunguje mi odkaz na tlačítko (button)

If button = True Then

Navíc nechpu co je tom špatně, ani to vaše anu nua, podle googlu je to myslím nějaká sopka O.o
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 5. 3. 2015 10:54

Prvni kod je dycky osklivy :)
Minimalni adresovani pouzij tam, kde je relevantni. Samozrejme nejde pouzit vsude. Ale az prejmenujes formular a prestane ti chodit kod, vzpomenes si ..


ANU jsou hodnoty v Text28 , ktere prekladas na NUA. Tedy A->N, N->U, U->A. Aspon tak jsem to pochopil.

Tedy klasicky algoritmus je:
nachazi se znak v polickuText28 v "ANU"? Pokud ano, nahradim ho znakem na stejne pozici v "NUA". Nebo na to pouzij tabulku .... to je fuk

MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 5. 3. 2015 11:44

Takže nějak takto?

Dim s, n As Integer, m
s = "AUN"
m = "UNA"
n = Strings.InStr(s, [Text28])
MsgBox (m(n))


Mělo by to vypsat n tý znak ale hodí chybu. Jak mám teda ve VBA napsat aby vybral znak na pozici n ?
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 5. 3. 2015 11:53

KDE to hodi chybu? Pouzij Mid (hledas znak v retezci, ne?!), tedy neco jako


Kód: Vybrat vše
Const src = "AUN"
Const dst = "UNA"
Result = Mid(dst, InStr(src, "U"), 1) 'priklad


(chyby si snad osetris sam - napr. je zadano jine pismeno nez A U N ...)

MP
Naposledy upravil Miroslav Pragl dne 5. 3. 2015 12:57, celkově upraveno 1
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 5. 3. 2015 12:57

Děkuji to je elegantní řešení :)
Funguje výborně.
Nedokážu to sám vymslet protože neznám funkce :) Ještě jednou díky
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 5. 3. 2015 13:00

no nejsem (dobry) programator, ale vim, ze:

- kazdy program se da zoptimalizovat / zkratit
- kazdy program obsahuje aspon 1 chybu

zarid se dle toho. nicmene asi uz rozumis, proc jsem napsal "osklivy" ... vysledek se da napsat klidne takto na 1 radek (samozrejme je lepsi si nadefinovat konstanty atd.... ale jde o princip)

Kód: Vybrat vše
TextXX = Mid("UNA", InStr("AUN", TextXX), 1)


a jen jeste pres validation rule omezis mozne hodnoty v poli, napr.
Kód: Vybrat vše
Like "*[AUN]*"


A nastavis vstupni masku na jedno pismeno
Kód: Vybrat vše
L

MP
Miroslav Pragl
Expert
Uživatelský avatar

Odeslat příspěvekod Nnet 5. 3. 2015 14:32

Ještě jsem narazil na jeden problém, pokud v Text28 nic není tzn ani prázdný řetězec vyskočí chyba že není definované Null.

Do výchozí hodnoty Text28 jsem dal prázdný řetězec a s tím to funguje ale staré záznamy tento řetězen neobsahují. Dá se doplnit do všech prázdných záznámů prázsný řetězec "" aby kod fungoval ve všechn případech?

Děkuji

-- 5. 3. 2015 14:50 --

Zase jsem z toho kostrbatou příšeru :D Ale jinak to neumím...

Set f = Screen.ActiveForm.button
Const src = "ANU"
Const dst = "NUA"

If (f = True) Then
If IsNull(Text28) = True Then
Text28.Value = "N"
Else
Result = Mid(dst, InStr(src, [Text28]), 1)
Text28.Value = (Result)
End If
End If

Ale funguje jak si to předstvauji
Hádku s blbcem nevyhraješ!

Desktop: Intel Xeon E3-1245V3, DDR3 16GB ECC, 160GB Intel SSD, Nvidia Quadro K2000

NB: Intel Core i7 720QM, 8GB DDR3, 750GB HDD, ATI 5650
Nnet
Junior
Uživatelský avatar

Odeslat příspěvekod Miroslav Pragl 5. 3. 2015 15:16

No a SMI v tom poli byt NULL? Od toho je kombinace validation rule, input mask a default value. Pouzij tyto standardni nastoje a neres to kodem.

MP

P.S.:
Kód: Vybrat vše
If (f = True) Then
If IsNull(Text28) = True Then


jsou STRASLIVE zapisy. Vzdyt f je tybu boolean, takze se da pouzit primo v podmince. O zbytecnych zavorkach nemluve:

Kód: Vybrat vše
If f Then
If IsNull(Text28) Then


MP
Miroslav Pragl
Expert
Uživatelský avatar

Další stránka

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků