» »

Kako do podatka v queryu iz VisualBasicScripta (VBA) v accessu?

Kako do podatka v queryu iz VisualBasicScripta (VBA) v accessu?

matic ::

V accessu imam neko formo.
V tej formi nek GUMB.
Ob pritisku na ta gumb bi rad da se mi v TEXT BOX (na tej formi) izpise en podatek iz nekega drugega querya.

Bolj specificno primer:
Ime gumba je "Obracunaj"! In potem imam v VBA nekako takole funkcijo, ki zafila dolocena polja na trenutni formi:
Private Sub Obracunaj_Click()
datum_obracuna.Value = Date
obracun.Value = True
obracunan_strosek.Value = 'tukaj bi rad nek podatek iz nekega querya
End Sub

Oz. se najraje bi podatek kar sam potegnil z SQL stavkom, ki je priblizno takle:
SELECT Sum(postavke.znesek) AS SkupniZnesek
FROM postavke
WHERE postavke.id_naloga=42;

Oz. tisto stevilko bom potem zamenjal kar za neko spremenljivko!

PROSIM NUJNO ZA POMOC!!!! :O
-----------------------------------------
podpis: _____________

Fim ::

Poskusiš lahko na več načinov:
- Uporabi funkcijo DLookup(polje, query, ključ) kjer je polje ime polja iz query-ja v katerem je tvoj podatek, query je tvoj query, ki vrne neke podatke, lahko je tudi tabela, ključ lahko izpustiš, če že v query-ju določiš WHERE ..... V Help-u si oglej pomoč za Dlookup funkcijo (DSum, DMax, DMin)
(npr: obracunan_strosek.Value = DLookup("Vrednost","tvojQuery"))

- Lahko uporabiš tudi ADO ali DAO za dostop do podatkov: QueryDef, OpenRecordSet......

matic ::

Hmm.. Za tale DAO moram imeti potem ze ODBC povezavo...

Morda sem pozabil omenit, to pisem kot accesov macro, ki ga bom potem dodelil gumbu. Macroji so pa pisani v VBA-ju. Ce je macro v sami accesovi bazi, je mozna kaka notranja direktna povezava - da v tem macroju, lahko izvajam kar sql stavke nad to bazo?

Vecinoma sem vse super resil s temle DLookUp-om! Superca! Samo zaustavi se pri update in inert querjih! Ko bi rad se nekaj podatkov, kar preko query vstavil/popravil pa z Accesovim query nacinoma prakticno sploh ne gre.

Edina varianta da nardim potem je da se avtoamtsko odpre forma za dodajanje vnosov ze z potrebnimi izpolnjenimi polji, tako da bo uporabnik tega potem pritisnil samo OK!?
-----------------------------------------
podpis: _____________

Zgodovina sprememb…

  • spremenilo: matic ()

Fim ::

Kar se tiče DAO, ODBC-ja načeloma ne potrebuješ. Iz kateregakoli sourca si linkaš tabele potem pa naprej delaš kot bi imel tabele v accessu. Paziti moraš samo na določene operacije, ki na določenih sourcih ne delujejo - recimo SEEK ne gre na tabelah linkanih iz SQL Strežnika.....Link tabel sicer lahko izvedeš še drugače a naj za tukaj ta primer zadostuje.

Primer:
"Ime Tabele" je tabela katero linkaš iz sourca, "PotDoPodatkov" je pot do npr. access mdb C:\MojiPodatki\Baza.mdb. Lahko linkaš tudi kaj drugega, poglej si v help-u.

Dim MyTable As TableDef, Db as Database
Set Db0 = DBEngine(0)(0) 'ali func. CurrentDb()
Set MyTable = Db.CreateTableDef([Ime Tabele])
MyTable.SourceTableName = [Ime Tabele]
StrConnectionString = ";DATABASE=" & PotDoPodatkov
MyTable.Connect = StrConnectionString
Db.TableDefs.Append MyTable

Pa še primer za ADO, kjer znanje lahko uporabiš tudi za gradnjo ASP strani. Za dostop do podatkov pa uporabi .udl datoteko (kreiraj si prazno txt datoteko, preimenuj jo v nekaj.udl in nanjo 2x klikni...)
Primer:
.....
strConnect = "File Name=" & server.MapPath("DoPodatkov.udl")
Set Dataconn = Server.CreateObject("ADODB.Connection")
Dataconn.open strConnect
sql = "SELECT Naziv FROM Tbl_Nazivi;"
Set rsDr = Server.CreateObject("ADODB.Recordset")
rsDr.Open sql, Dataconn, 3, 1
......
Načinov dostopa do podatkov je ogromno, odločiti se moraš kaj potrebuješ in ne nazadnje kaj je zate lažje.... Na spletni strani MSDN preštudiraj dostop do podatkov....

Omenjaš, da programiraš Makro-je? To mi ni čisto jasno, ker v Accessu obstajajo Makroji in VBA Moduli. Tvoj primer - klik na gumb, je najenostavnejše, da v VBA napišeš proceduro (Event OnClick). Določene stvari lahko zajameš v funkcijah katere nato lahko večkrat uporabiš. Shraniš jih v Modul kot Public.
Primer:
Public Function InsertPodatkov(myQuery as string) as Boolean
On Error Resume Next
Docmd.RunSQL myQuery
InsertPodatkov = iif(Err > 0,False,True)
End Function

Access uporabljam že od verzije 2.0 naprej pa nisem še imel posebnih potreb po makrojih. Lahko rečem, da kar sem jih uporabil sem imel kasneje probleme ..... Najbolj se še izkaže "Autoexec" in pa "AutoKeys".


Tudi UPDATE podatkov ali INSERT novih podatkov lahko elegantno rešiš z Accessovim query-jem.

Primer: V tabelo MojaTabela, vstavljaš podatke v polja MojePolje1 (Number) in MojePolje2 (String). V VBA sestaviš string po vseh SQL predpisih, če polje ni numerično obvezno uporabiš narekovaje. Za vrednosti lahko uporabiš variable kot v primeru, lahko pa vneseš kar konstanto.

Dim SQLString as String
SQLString = "INSERT INTO [MojaTabela] (MojePolje1, MojePolje2) VALUES (" & Polje1Value, & "'" & Polje2Value & "');"
Docmd.RunSQL SQLString

Za generiranje kompliciranega SQLstringa uporabim kar gradnik query-jev v Accessu. Sestavim Query kot je potrebno (SELECT, INSERT, UPDATE, ...), spremenim pogled na SQL View in SQL stavek prekopiram v VBA ter ga dopolnim z variablami......

Upam, da bo kaj pomagala vsa ta pisarija.

matic ::

Superca! Res hvala za tako dobro pomoc! Zelooooo pomaga! Jaz prakticno prvic delam tole v Acessu. Prej sem delal nekaj stvari z VBA v Excelu (macroje), sicer se pa vecinoma ukvarjam z PHPjem in mySQLom. Nekoc sem tudi gledal malce ASP a mi je PHP precej bolj vsec. In se a dva jezika kar precj razlikujeta! Imam pa vseeno predstave kako to resiti - tako da nism popolnoma zacetnik v takih zadevah - samo v tem VBA se nic ne znajdem! :8) Sicer sem tut ze ogledoval tale MSDN samo.... mi je precej nepregleden s premalo primerov.

Tam sem res zamocil.. ne delam z Acessovimi macroji, ampak z VBAjevimi moduli. Macroje imam v glavi se zaradi Excela - tam delas macroj prav tako v VBA. Ko kliknem na gumb izberem build event in potem dalje... ali ALT+F11 da prides direktno do vseh modulov. :)

Tale tvoj zadnji nasvet mi je precej zanimiv...
Tudi UPDATE podatkov ali INSERT novih podatkov lahko elegantno rešiš z Accessovim query-jem. Primer: ...

Bom to malce pogledal, potem bom imel pa sigurno se kako vprasanje (ze sedaj vidim) :D
-----------------------------------------
podpis: _____________

matic ::

S temle "DoCmd.RunSQL "INSERT...;" lahko postorim prav vse, brez povezave na tabelo.. edino ce bi rad uporabil "DoCmd.RunSQL "SELECT... FROM...WHERE...;" potem mi ni jasno kako lahko pridemo do podatkov querya - parsam podatke!?
V Micorsoft Visal Basic Helpu sploh ne omenja SELECT FROM poizvedb za RunSQL Method oz. Action. Tam navaja, kot da je mozno s tem delat samo akcijske poizvedbe, ki ne vracajo rezultatov. Je res mozno samo to!? :\ :O

Sicer bom lahko resil vse sedaj z DLookUp funkcijo in DoCmd.RunSQL, samo se vedno nisem povsem potesen... :D
-----------------------------------------
podpis: _____________

Zgodovina sprememb…

  • spremenilo: matic ()

matic ::

Pa se 2 stvari:D :
- ce je insert akcijska poizvedba in vstavljas v tabelo, ki ima autoincrement polje, kako ji dolocis da se sama doloci vrednost!? Npr. pri PHPju in mySQL vem da ce je recimo prvi stolpec tak, potem "INSERT INTO Tabela VALUES NULL, 'string';"

- ko se zadeva vnese oz. predno se dejansko vnese access opozori "You are about to appened 1 row(s)..." Se da kako to skenslat ali kaj ucinkovat na to?

Sory in hvala za pomoc, ker sem tolk nadlezen :D Ampak v tej microsoftovi pomoci ne uspem najti prav nic tistega, kar jaz rabim. Naletavam na same napacne stvari. Se mi zdi precej neuporaben ta microsoftov help in da rabis kar nekaj casa da se spoznas z njegovim nacinom - se mi zdi cisti microsoft style - izumlja neka nov a neuporaben nacin.
-----------------------------------------
podpis: _____________

Zgodovina sprememb…

  • spremenilo: matic ()

Fim ::

Ja tako je to z RunSQL, nič ne vrne. Če želiš izvajati SQL stavke, da ti vrnejo samo neko vrednost uporabi Domain funkcije (DLookup,DSum,...). Kot parameter uporabiš lahko tabelo ali query.

Če pa želiš vrnjeni recordset moraš seveda podatke nekam shraniti in po mojem je DAO kar dober (enostaven), ni pa vzor hitrosti, a za mnogo stvari zadošča. Vrnjene podatke spraviš v objekt "recordset" z imenom Tbl, v spodnjem primeru imaš v Tbl kot nekakšno sliko tabele MojaTabela po kateri se lahko premikaš naprej (MoveNext) in nazaj (MovePrevious). Za vse metode in kontrole konca ter začetka recordseta si oglej help. Namesto tabele "MojaTabela" lahko uporabiš tudi query oz. SQL stavek vendar je potrebno potem pravilno navesti še drugi parameter (Type=DB_OPEN_DYNASET) za "OpenRecordset".
Primer:
Dim Db as database, Tbl as recordset
Set Db = CurrentDb()
Set Tbl = Db.OpenRecordset("MojaTabela",db_OpenTable)
Tbl.Index = "Ime_IndexaNaTabeli"
Do While Not Tbl.EOF
'tukaj pa nekaj počneš s podatki iz tabele
MsgBox Tbl!Naziv 'na ekran izpišeš podatke iz polja Naziv
Tbl.MoveNext
loop
Tbl.close
Set Db = Nothing

Pa še prva od 2 stvari: V accessovi tabeli določiš polje AutoNumber in ga pustiš pri miru, saj tako ali tako vanj ni mogoče nič pisati. Vsebina tega polja se avtomatsko poveča za 1 ko insertaš ostale podatke tako, da ti za to ni treba nič skrbeti. Enako je na SQL strežniku le da imaš tam več možnosti. Kako je s tem v mySQL pa ne vem. Če delaš z Accessom določi tip polja AutoNumber in problem je rešen.
Pa še nekaj, access šteje dokler časa ne Compact-aš baze (mdb datoteke). Če npr. autonumber pride do 100, zbrišeš vse recorde in nato dodaš novega je prvi number 101, šele compact ti število resetira in začne šteti od 1 naprej.

Druga od 2 stvari: Rešitev je naslednja, v glavnem menuju izberi
Tools nato Options. Izberi zavihek Edit/Find. Tam malo poglej in našel boš Confirm opcije:
- Record changes
- Document Deletions
- Actions Queries
Odstrani kljukice pa boš imel mir, vendar te opozarjam, da potem lahko kaj hitro pobrišeš tudi kaj kar nočeš - previdno. Za začetek odstrani samo prvo in tretjo, če boš pa iz VBA tudi brisal kakšne začasne tabele ali queryje odstrani tudi drugo kljukico. Mimogrede, na te stvari lahko vplivaš tudi iz VBA (application property).

Kar se tiče MS pomoči se čisto strinjam s tabo. Potrebno je veliko privajanja, ko pa si enkrat 'notri' potem kar gre. MSDN je kar uporaben in ima ogromno informacij, marsikaj se najde tudi v access-ovem Help-u samo prave ključne besede moraš iskati pa seveda polno 'solate' pregledati. Pa naj ti nikar ne bo žal za to solato. Iz lastnih izkušenj ti povem, da se iz tega lahko samo kaj naučiš. Ko iščeš rešitev za problem A, naletiš na polno informacij za rešitev problema B,.....:) Če ne drugače se čez nekaj časa spomniš, da si to nekje že videl pa hitreje najdeš - čez nekaj časa si pa že pravi profi.

matic ::

Hvala za vse tole! Zeloooo pomaga! :D
Se eno vprasanje (uapm da zandej), je pa malce druga tematika v bistvu in bo zate macji kaselj.

Imam text box in nevem kako naj pogledam ce je prazen... probal sem ze vse zivo, pa nic ne deluje. Rabim pa nekako takole:

datum_obracuna = Text Box

If datum_obracuna.Value = Empty Then
MsgBox ("Vnosno polje datum obračuna ne more biti prazno!")
End If

Probbal pa sem se:
If datum_obracuna.Value = "" Then
If Not datum_obracuna.Value Then
If datum_obracuna.Value < 1 Then

Text Box je prazen, pogoj pa ni nikoli izpolnjen!! :( Kot da bi dejansko v njem nekaj bilo.
-----------------------------------------
podpis: _____________

Fim ::

Poskusi s funkcijo Isnull(). Se pravi

If IsNull(datum_obracuna.Value) = True Then
MsgBox ("Vnosno polje datum obračuna ne more biti prazno!")
End If

V polju je po defaultu, dokler nekaj ne vneseš Null vrednost, ki je nekaj drugega kot Empty. V Helpu si oglej funkcijo IsNull in jo primerjaj s funkcijo IsEmpty(). Če se hočeš znebiti Null vrednosti pa uporabi funkcijo Nz().
myVar = nz(myVar,"") 'če je myVar Null se napolni z ""

Pa še nekaj sem opazil. Vedno pišeš npr. datum_obracuna.Value, ta Value na koncu lahko izpustiš, ker je to tako in tako že po defaultu, imaš manj tipkanja. Raje uporabljaj "Me" in s tem compilerju točno povej, da je to variabla oz. polje s forme.
Namesto datum_obracuna.Value napišeš Me!datum_obračuna, Value pa lahko izpustiš. Če funkcijo uporabljaš v Modulu pa obvezno namesto Me pišeš ime forme , se pravi Forms!MojaForma!datum_obračuna. Me uporabiš samo na Formi ali Reportu, če se sklicuješ na drugo odprto formo ali report uporabi Forms!....

Če so v imenu blenki daj ime v oglate oklepaje Me![datum obracuna].

Tvoja kontrola bi tako izgledala nekako takole:
If IsNull(Me!datum_obracuna) Then _
MsgBox "Vnosno polje datum obračuna ne more biti prazno!",vbOKOnly+vbExclamation, "Opozorilo"

S podčrtico na koncu lahko pišeš naprej v novi vrsti, da if stavek ni predolg, a le če imaš samo eno vrstico. Če imaš zbnotraj if stavka dve ali več vrstic moraš uporabiti End If.
Pa v MsgBox obvezno uporabljaj zadnji parameter (tekst v glavi okna). Včasih imaš lahko, če tega ne uporabljaš tam čačke (acc. bug)!

matic ::

Tnx very mcuh!!! :D Gres na pir?! Za tole si si ga posteno zasluzil... pa ne samo enga! :D
-----------------------------------------
podpis: _____________

Zgodovina sprememb…

  • spremenilo: matic ()

Fim ::

Je že OK, zato mamo pa forum.
Alkohola pa ne pijem, vseeno hvala.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

If stavki

Oddelek: Programiranje
51069 (785) AndrejS
»

[Access 2007]

Oddelek: Programiranje
132580 (2180) urosz
»

access -> word ali excel

Oddelek: Programska oprema
51178 (1119) zavajon
»

asp+access problem

Oddelek: Izdelava spletišč
81007 (938) appz
»

PHP help!

Oddelek: Programiranje
251667 (1505) rc-car

Več podobnih tem