27. august 2002 - 15:41Der 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.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.
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.
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
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.
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.
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.
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.
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.
[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.
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.
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.
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
Tak Niels. Jeg opretter et nyt spørgsmål til fynbohans.
Synes godt om
Ny brugerNybegynder
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.