Avatar billede mugs Novice
27. august 2002 - 15:41 Der er 20 kommentarer og
1 løsning

Loop

Jeg importerer ca 300 poster fra et Excel-ark, hvori der bl.a. er CPRNR. Posterne importeres til en Access db (XP), der ligger på et netværk.
Jeg er ikke interesseret i, at CPRNR spredes til brugere, der ikke har behov for de 4 sidste cifrer men udelukkende fødselsdata.
Feltet Fødselsdata skal tildeles de 6 første karakterer fra feltet CPRNR, og jeg bruger denne:
Streng = CPRNR
Fødselsdata = Left(String:=Streng, Length:=6)
Og det virker fortrinligt, men jeg vil have db til at Loope igennem alle poster, og her kniber det. Enten flytter markøren sig ikke, eller også opretter den hele tiden nye poster.
Jeg synes at have brugt alle kombinationer af Do Until Rst.EOF = True og Do while... og hva' har vi.

Hvad er koden?
Avatar billede proaccess Nybegynder
27. august 2002 - 15:58 #1
While Not Rst.EOF
  Fødselsdata=...
  Rst.MoveNext
Wend
Rst.Close
Set Rst=Nothing
Avatar billede proaccess Nybegynder
27. august 2002 - 16:10 #2
Men hvorfor laver du ikke en "normal" importering (af det fulde felt) efterfulgt af en UPDATE-query...

UPDATE tabelNavn SET CPRNR=Left(CPRNR, 6);
Avatar billede mugs Novice
27. august 2002 - 18:42 #3
Tak - Db er på mit arbejde. Tester imorgen tidlig.
Vedr. UPDATE-query. Tja - det ved jeg såmænd ikke. Jeg plejer at arbejde i ren VBA. Jeg importerer faktisk det fulde felt, idet nogle brugere skal se fuldt CPRNR.
Avatar billede sjap Praktikant
27. august 2002 - 18:53 #4
Mugs du kan jp eventuelt også bare lave en almindelig udvælgelsesforespørgsel, der indeholder alle felterne i din tabel, hvor du så introducere et nyt felt Fødselsdato (beregnes som foreslået af proaccess).

Afhængigt af brugeren kan du så vise/skjule CPRNR-feltet og Fødselsdato-feltet.
Avatar billede mugs Novice
28. august 2002 - 08:07 #5
Jeg har indsat proaccess kode, den fungerer kun på den post jeg står i, den kører ikke ned igennem posterne. Koden ser således ud:

Dim db As Database, Rst As Recordset
Streng = CPRNR
Set db = CurrentDb
Set Rst = db.OpenRecordset("Personregister",dbOpenDynaset)
While Not Rst.EOF
Fødselsdata = Left(String:=Streng,Length:=6)
Rst.MoveNext
Wend
Rst.Close
Set Rst = Nothing
Avatar billede nih Novice
28. august 2002 - 09:17 #6
....
Set Rst = db.OpenRecordset("Personregister",dbOpenDynaset)
rst.moveFirst
While Not Rst.EOF
......

prøv at sikre dig du står i det første recordset.
Avatar billede nih Novice
28. august 2002 - 09:23 #7
du skal vel også skrive din variabel til tabellen:

rst.update
rst.fields("Fødselsdata").value = Left(String:=Streng,Length:=6)
rst.update
Avatar billede mugs Novice
28. august 2002 - 09:49 #8
Hej Niels
Bruger jeg dir forslag får jeg Runtime error 3020:

Metoden Update eller CancelUpdate er brugt uden AddNew eller Edit.

Den kode jeg sidst har skitseret, tildeler Fødselsdata de første 6 cifrer af CPRNR, det er kun et spørgsmål om, at få den til at gennemløbe alle poster.

Mogens
Avatar billede nih Novice
28. august 2002 - 09:58 #9
Hej Mugs

den første update skulle være rst.edit - sorry

Jeg tænkte bare at det loop du bruger 28/08-2002 08:07:02 tildeler variablen fødseldata en værdi (det er OK), men i næste loop overskriver du variablen igen ???
Desuden skal din anden variabel streng vel også ændres i hvert gennemløb.

rst.edit
rst.fields("Fødselsdata").value = Left(String:=rst.fields("CprField").value ,Length:=6)
rst.update
rst.movenext
Avatar billede mugs Novice
28. august 2002 - 10:50 #10
Niels

Så er det ved at køre. Problemet er nu, at det tager ca 50 sek. at gennemløbe alle poster, og der sker absolut intet på skærmen, heller ikke et timeglas.
Jeg har forsøgt at indlede procedüren med en:
Docmd.Hourglass True
og slutter med False og en MsgBox der fortæller, at procedüren af afsluttet.
Når jeg trykker på kommandoknappen kommer MsgBox, og efter ca 50 sek er alle poster tildelt fødselsdata. Så langt så godt.

Db skal betjenes af personel, der absolut ingen forstand har på Access i almindelighed, og Access i særdeleshed. Derfor er jeg bange for, at de i ventetiden tænker, at lortet ikke virker ikke, og derfor begynder at fucke rundt i db.

Kan jeg gøre et eller andet der indekerer, at db arbejder?
Så vidt jeg ved, kan jeg forhøje pointene, og det gør jeg gerne.
Avatar billede mugs Novice
28. august 2002 - 11:11 #11
Der skulle blot afsluttes med en Me.Requery, så spiller det.

Tak for hjælpen
Avatar billede mugs Novice
28. august 2002 - 11:12 #12
Niels - Send lige et svar.
Avatar billede fynbohans Nybegynder
28. august 2002 - 12:28 #13
Har selv lavet utallige af den slags opdateringer og
foretrækker også VBA, og da jeg gerne vil vide helt præcis hvad
hvad der foregår, gør jeg altid følgende:

dim SidstePost as LONG

DoCmd.GoToRecord , , acLast
SidstePost = [ID]

DoCmd.GoToRecord , , acFirst

do
    [CPRNR] = left([CPRNR],6)
    if [ID] = SidstePost then exit do

    DoCmd.GoToRecord , , acNext
loop

Og det hele kan foregå i en skjult formular, så skærmbilledet ikke ændrer sig.
Koden kører i VedÅbning, og afsluttes med at formularen lukker sig selv.
Avatar billede mugs Novice
28. august 2002 - 14:38 #14
fynbohans > Er [ID] et felt i formularen?
De CPRNR jeg importerer fra Excel har ikke foranstillede 0. Derfor skal jeg have en kode, der sætter 0 foran, hvis LEN(CPR)<10. Kan du kombinere dette med din kode:

If LEN(CPRNR) < 10 then
noget kodeværk
End If

det nemmeste var, at formatere regnearket til foranstillede 0, men det kan ikke lade sig gøre, idet jeg modtager flere regneark, hvor kvaliteten er mildt sagt mangelfuldt, så jeg er nødt til at samle alle funktioner i Access.

Kommer du (eller an anden) med en brugbar kode, er jeg billig til salg m.h.t. point, da jeg er presset med tiden.
Avatar billede fynbohans Nybegynder
28. august 2002 - 15:28 #15
[ID]  hos mig er altid et autonummereringfelt i den underliggende tabel.
Har for ikke så længe siden haft et tilsvarende problem med manglende nuller.
Excel-arket skulle også bruges til andet formål, så problemet skulle løses både i
Excel og Access.
I den danske version af Excel skal bruges  funktionerne LÆNGDE,
HVIS og SAMMENKÆDNING. Det varede lidt inden jeg fandt ud af at cellen i Excel
ikke skal forfmateres til Tekst, som man måske skulle tro, men til Standard.
Hele udtrykket er =HVIS(LÆNGDE(A1)<10;SAMMENKÆDNING("0";A1);A1).

I Acces skulle [CPRNR] = IIF([CPRNR]<10,"0" & [CPRNR],[CPRNR]) virke.
Avatar billede fynbohans Nybegynder
28. august 2002 - 16:09 #16
Der mangler en vigtig detalje i den sidste linje, som skulle være:
[CPRNR] = IIF(Len([CPRNR])<10,"0" & [CPRNR],[CPRNR])
Avatar billede nih Novice
28. august 2002 - 16:57 #17
Svar :)

Jeg er desværre også presset, men hvis du stadig mangler en funktion til at barbere de sidste 4 cifre væk, kigger jeg på det i aften/nat

Nils
Avatar billede fynbohans Nybegynder
28. august 2002 - 17:06 #18
Ja!! - hele udtrykket skal naturligvis omsluttes af Left:
[CPRNR] = Left(IIF(Len([CPRNR])<10,"0" & [CPRNR],[CPRNR]),6).
Der er øjeblikke hvor man savner en maskine til at skrive det man tænker.
Avatar billede mugs Novice
28. august 2002 - 17:10 #19
Jeg ønsker at give 30 point til hver, men hvordan kan jeg forhøje det udlovede antal point. Fordeler jeg 30 til hver, får jeg fejl "Du har ikke udlovet nok point", og det er da rigtig nok, men det kan sgutte være meningen at skulle oprette et spørgsmål mere.
Avatar billede nih Novice
28. august 2002 - 18:14 #20
Hej Mugs

prøv at lege med syscmd

Dim db As Database, Rst As Recordset


Set db = CurrentDb
Set Rst = db.OpenRecordset("Tabel1", dbOpenDynaset)
Rst.MoveLast
Rst.MoveFirst
SysCmd acSysCmdInitMeter, "Der sker noget !!!!!", Rst.RecordCount

While Not Rst.EOF
    SysCmd acSysCmdUpdateMeter, Rst.AbsolutePosition
    rst.edit
    rst.fields("Fødselsdata").value = Left(String:=rst.fields("CprField").value ,Length:=6)
    rst.update
    rst.movenext
    Rst.MoveNext
Wend
Rst.Close
Set Rst = Nothing
syscmd acSysCmdRemoveMeter
Avatar billede mugs Novice
28. august 2002 - 18:22 #21
Tak Niels.
Jeg opretter et nyt spørgsmål til fynbohans.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester