Print side | Luk vindue

Makro

Udskrevet fra: Dansk Access Forum
Kategori: Hjælp til Access
Forum navn: VBA / Makro
Forum beskrivelse: Spørgsmål vedr. den programmeringsmæssige del af Access
Web-adresse: https://www.accessforum.dk/forum_posts.asp?TID=74
Udskrevet den: 21-11-2024 kl. 13:17


Emne: Makro
Besked fra: Lieberkind
Emne: Makro
Posteringsdato: 05-11-2015 kl. 11:41
Hej,
 
Jeg er ny udi Access programmering....
 
Men jeg er ved at lave en database til at holde styr på pakker på et lager.
 
Og nu er jeg kommet til de dele der er en udfordring for mig. :-)
 
Jeg skal lave en "knap" som skal starte en makro som løber gennem min tabel og finde track & trace numre(som jeg har indtastet) og indsætter et ordrenummer i samme række, men anden kolonne. disse data kommer fra et Excel ark som bliver opdateret hver dag og importeret til access.
 
Min anden opgave er at, når jeg tager en pakke ud fra lageret, skal en form indsætte en dato/tid, i en kolonne til formålet. Her er det så muligt at der er flere pakker til samme ordre, som alle skal markeres som fjernet fra lageret.
 
Jeg håber at I kan hjælpe mig med disse udfordringer. :-)
 
/Jan 



Svar:
Besked fra: hkh
Posteringsdato: 05-11-2015 kl. 12:12
Hej Jan

For rigtigt at kunne hjælpe, skal vi nok have lidt oplysninger omkring din tabel og hvordan din form ser ud.

Du skal ikke bruge en makro men hændelsesprocedure til din knap.

I hændelsesproceduren skal du have en kode som løber gennem din tabel.


private sub DinKnap_Click()
dim data as recordset
set data=currentdb.openrecordset("SELECT Din_Tabel.* FROM Din_Tabel WHERE (((Din_Tabel.track)=" & søgtrack & ") AND (Din_Tabel.trace)=" & søgtrace & "));")
if data.eof=true then
msgbox"Din søgning på " & søgtrack & " og " & søgtrace & " gav intet resultat!"
goto afslut
endif
while data.eof=false
data.edit
data!ordrenr=dit_ordrenr
data.update
data.mowenext
wend Afslut:

set data=nothing
end sub



set data=currentdb.openrecordset finder de data i din tabel hvor søgtrack og søgtrace passer.
if data.eof=true then hvis der ingen data er der passer på din indtastning vises en besked og der afbrydes.
while data.eof=false er et loop der gentager kode mellem while og wend hvis betingelsen passer.(der skal være poster)
data.edit gør klar til at rette i posten.
data.update gemmer dine rettelser.
data.mowenext flytter til næste post, hvis der er nogen
set data=nothing lukker din tabel


-------------
Hans


Besked fra: Lieberkind
Posteringsdato: 06-11-2015 kl. 14:06
Super, tak for hjælpen...
 
Men nu er jeg rendt ind i et nyt problem, og det er at når jeg lukker et vindue med en formular som laver en forespørgsel, opretter den en ny post med de data der står i søgefeltet.
 
hvordan kan det være?
 
Tak.


Besked fra: hkh
Posteringsdato: 06-11-2015 kl. 15:59
Hvis du vil have en formular, der skal kunne oprette en forespørgsel, må du ikke have forbundet felterne til et datasæt(tabel eller forespørgsel), det vil sige felterne skal være ubundet.

Du kan starte søgningen med en knap eller benytte søgefelternes hændelsesprocedure ved ændret til at finde posterne.
Hvis du har flere felter, er det letteste at oprette en sub eller procedure i et modul hvor du tester om der er indhold i felterne, f.eks:

Sub FindFelter()
dim SqlTekst as string
dim søg as boolean
dim data as recordset

'her tester du dine søgefelter
søg=false
SqlTekst = "SELECT Produkter.* FROM Produkter"
if nz(søgefelt1)="" then
Sqltekst=sqltekst & " where (((Produkter.Produktnavn)='" & søgefelt1 &"')"
søg=true
endif
if nz(søgefelt2)="" then
if søg=true then
Sqltekst=sqltekst & " AND ((Produkter.Genbestillingsniveau)<" & søgefelt2 & ")"
else
Sqltekst=sqltekst & " where (((Produkter.Genbestillingsniveau)=" & søgefelt2 &")"
endif
søg=true
endif
if søg=true then Sqltekst=sqltekst & ")"
Sqltekst=sqltekst & ";"
set data=currentdb.opendataset(Sqltekst)
if data.eof=true then
msgbox"inden data!"
goto afslut
endif

forms!dinform.recordsource=sqltekst

Afslut:
set data=nothing

endsub
i felternes vedændret skriver du =FindFelter()

For at se om felterne er tomme, kan du benytte if nz(søgefelt)="" then
nz(søgefelt) henter værdien i søgefelt, hvis det er et tekstfelt vil et tomt resultat blive "" eller null hvilket ikke er det samme, men det sørger nz(søgefelt)for så du ikke skal teste for flere former af ingenting.

hvis resultatet skal vises i en form skal du oprette en forespørgsel i kode og indsætte søgekriterierne i den.
Det kunne være noget i retning af:

Til at hjælpe med den rigtige formatering af Sqlteksten, kan du oprette en forespørgsel, indtaste nogle søgekritereier, køre den og vise den i sqlform. Der skal rettes lidt i den feks. skal der sættes & tegn ind og ' (enkelte anførselstegn) ved tekstfelter.
Du skal udskifte søgefelt1 med forms!frm_navnpåformularhvorsøgefelternefindes!søgefelt1 osv.




-------------
Hans


Besked fra: Lieberkind
Posteringsdato: 09-11-2015 kl. 15:52
1000 tak for hjælpen.
 
det er noget avanceret, det du har lavet der. jeg lavede mine søgefelter ubundet, og så virkede det.
 
nu har jeg skaffet en scanner, og til min overraskelse kommer der ¨C1 foran alle track & trace koderne.
 
det er så et problem i forhold til at kunne søge en anden tabel og overføre data til et andet felt. hvordan kan man søge hvor den ignorer "¨C1" eller kan man fjerne det?
 
Tak. 


Besked fra: hkh
Posteringsdato: 10-11-2015 kl. 02:19
Se nu ved jeg jo ikke hvad du foretager dig, andet end at det må indvolvere en scanner.

Men hvis det er noget med data der importeres til en tabel kan det godt fjernes.

set data=currentdb.openrecordset("SELECT Din_Tabel.* FROM Din_Tabel;")



while data.eof=false

if left(data!ditfelt),2)="c1" then
data.edit
data!ditfelt=right(data!ditfelt),len(data!ditfelt)-2)
data.update
end if



-------------
Hans


Besked fra: Lieberkind
Posteringsdato: 11-11-2015 kl. 09:41
Jeg takker mange gange for hjælpen, jeg det er vidst ud over min fatteevne at lave det her.
 
Tak


Besked fra: hkh
Posteringsdato: 11-11-2015 kl. 10:38
Citat: hkh hkh skrev:



[COLOR=blue]
'åben den tabel hvor dine data er
set data=currentdb.openrecordset("SELECT Din_Tabel.* FROM Din_Tabel;")
'Gentag til alle data er løbet igennem
while data.eof=false
'Hvis indhold i feltet begynder med c1 skal det fjernes, det bruger vi venstrefunktionen til
hvor vi henter de to første tegn fra venstre

if left(data!ditfelt),2)="c1" then
'Klargør data til rettelse
data.edit
'Da det er i begyndelsen af feltet du har C1 skal vi have fjernet de to første karakterer
det gør vi med højrefunktinonen der henter et antal tegn fra højre, len er den totale længde af indholdet
i feltet, derfra trækkes de to tegn der skulle fjernes og resultatet gemmes igen

data!ditfelt=right(data!ditfelt),len(data!ditfelt)-2)
data.update
end if

[/COLOR]

'data!ditfelt=right(data!ditfelt),len(data!ditfelt)-2) kan også gøres på denne måde.
Feltindhold=data!ditfelt
Feltlængde=len(data!ditfelt)

nytfeltindhold=antallet af tegn fra højre-2
data!ditfelt=right(feltindhold),feltlængde-2)


Det hele afvikles i en subprocedure

-------------
Hans



Print side | Luk vindue