Avatar billede fogh Nybegynder
18. august 2010 - 15:21 Der er 14 kommentarer og
1 løsning

Efterbehandling af data i Access efter import fra .txt fil

Hej eksperter!

Jeg har importeret en txt fil til en tabel i Access for at kunne arbejde videre med data. Jeg har dog den udfordring at de oplysninger jeg skal bruge for at kunne identificere de enkelte detaljerecords i tabellen, ikke findes på den samme linie i txt-filen, men kun i headeren.

Så når jeg har importeret filen til en tabel har jeg følgende situation (nedenstående er en forenklet udgave):

Række 1: Er en header  [Firma.nr.]
Række 2: Er en header  [Afd.nr.]
Række 3: Er en detalje [Produktnr], [Solgte enheder]
Række 4: Er en detalje [Produktnr], [Solgte enheder]

Det jeg har brug for, er en VBA-funktion der kan give mig detalje-linierne inkl. headerinfo. sådan her:

Række 3: [Firma.nr.], [Afd.nr.], [Produktnr], [Solgte enheder]
Række 4: [Firma.nr.], [Afd.nr.], [Produktnr], [Solgte enheder]

Det skal nævnes at firmanumre og afdelingsnumrene kommer løbende, så der skal altså brydes på dem:

Firma 1
Afdeling A
Detalje 1
Detalje 2
Firma 1
Afdeling B
Detalje 3
Detalje 4
Firma 2
Afdeling C
Detalje 5
Detalje 6

Jeg forestiller mig en funktion der først sætter [Firma.nr.] på og herefter [Afd.nr.], således at jeg opnår dette resultat:

Firma 1, Afdeling A, Detalje 1
Firma 1, Afdeling A, Detalje 2
Firma 1, Afdeling B, Detalje 3
Firma 1, Afdeling B, Detalje 4
Firma 2, Afdeling C, Detalje 5
Firma 2, Afdeling C, Detalje 6

Hvordan gør jeg det?

På forhånd tak for hjælpen!!
Avatar billede fogh Nybegynder
18. august 2010 - 15:55 #1
Jeg har forsøgt at illustrere det mere grafisk på dette link:

http://www.bank-fogh.dk/AccessHelp.htm

...For det er vist lidt snørklet beskrevet ovenfor...
Avatar billede sifuentes Nybegynder
19. august 2010 - 07:59 #2
Hvordan er txt filen dannet? Der må et eller andet sted findes en kilde, eller er den skrevet i hånden?

Er den skrevet i hånden, så er det sådan et job man sætter en programmør til at løse, der findes ikke en enkelt fiks funktion der løser denne opgave i et snuptag, der skal kodes her.
Avatar billede fogh Nybegynder
19. august 2010 - 10:02 #3
Hej, selve txt-filen er ikke issuet her. Den har jeg allerede indlæst så den ligger i en tabel på samme vis som jeg har illustreret i linket ovenfor.

Du har ganske ret, det er ikke enkelt (ikke for mig i hvert fald) - som jeg også skriver har jeg brug for en VBA-funktion som kan håndtere den logik. Dvs. at kopiere oplysningerne fra Række 1 og Række 2 ned på de efterfølgende rækker, indtil den når til en række hvor der sker skift i Firma / Afdeling igen.
Avatar billede sifuentes Nybegynder
19. august 2010 - 10:55 #4
Mener du VBA-funktion eller VBA funktionalitet(programkode)?

Skal jeg forstå det sådan at når tabellen er en gang er rettet til, så skal tilretningen aldrig foretages igen? For så kan arbejdet nemt udføres i et regneark, og derefter eksporteres over i en tabel.

Men hvis det forholder sig sådan at data med jævne mellemrum modtages i form af den såkaldte tekstfil og derfor igen og igen skal modificeres, så kræver det f.eks. vba-programmering., eller et elegant regnark med diverse opslagsfunktioner.

Nummer to eksempel du viser indeholder radundente data, og er et godt eksempel på fejl begået af nybegyndere, i stedet sørger man for at oprette diverse relevante tabeller som man så senere beder forespørgler om at sammensætte.
Avatar billede fogh Nybegynder
19. august 2010 - 12:55 #5
Funktion/funktionalitet - jeg er ligeglad om det bliver det ene eller det andet, bare det løser problemet -> men jeg vil tro det er VBA-programkode det skal laves i.

Tekstfilen kommer en gang om måneden og bliver læst ind i en  tabel i Access. Data i den tabel vil jeg så gerne have omdannet som jeg har beskrevet det. Jeg er klar over, at der er redundante data, men basen bliver ikke større end at det nok går an.

Jeg har forsøgt mig med Excel (manuelt, ikke med makroer) - og det fungerer også fint, blot er der en stor fejlrisiko og et kæmpe arbejde, da antallet af detaljelinier varierer og det er mange hundrede sider der skal behandles.

Håber det gav lidt større klarhed ? ;O)
Avatar billede sifuentes Nybegynder
19. august 2010 - 14:45 #6
Jeg har formået og lave en løsning i regneark, der generere flg:

Http://www.BjornGinsborg.Dk/Loesninger/LoesningFirmaAfdRegnearkII.png

Men løsningen er afhængig af at alle data i txt dokumentet er konsistente, f.eks. firmanavn må ikke pludselig fylde to linier, der må ikke optræde firmanavne for hvem der ikke optræder afd. m.m.
Avatar billede fogh Nybegynder
20. august 2010 - 10:46 #7
Hej igen, det ser slet ikke så tosset ud!

Kan det håndtere et skiftende antal detalje-linier?

1 Firmalinie
1 Afdelingslinie
3 detaljelinier
1 Firmalinie
1 Afdelingslinie
20 detaljelinier

etc?

- og er det noget jeg kan få lov at prøve af?
Avatar billede sifuentes Nybegynder
20. august 2010 - 14:19 #8
Den duer ikke hvis et firma ikke har en afd.

Hvad betyder etc.?
Avatar billede fogh Nybegynder
20. august 2010 - 14:47 #9
OK, ingen problemer.

Der vil altid være en Firmalinie og en Afdelingslinie.
Rækkerne i txt-filer kommer altid således:

1 stk Firmalinie
1 stk Afdelingslinie
x stk detaljelinier
1 stk Firmalinie
1 stk Afdelingslinie
x stk detaljelinier

"etc." betyder osv. osv.
Avatar billede sifuentes Nybegynder
20. august 2010 - 14:54 #10
Avatar billede fogh Nybegynder
20. august 2010 - 23:29 #11
Hej, tak for det - jeg prøver at se på det ... ved ikke om det lige bliver her i weekenden dog... God weekend!
Avatar billede fogh Nybegynder
21. august 2010 - 02:10 #12
Hej igen, tak for indsatsen men jeg har endelig fundet det jeg ledte efter:

LKP havde svaret på den i dette spørgsmål: http://www.eksperten.dk/spm/34859

Så nu kan jeg helt slippe for manuelt arbejde i Excel, og så kan jeg normalisere data bagefter ;O)

Koden fra LKP er her:
*****************************************************************
Public Sub FillEmptyCells()

    Dim rst As ADODB.Recordset
    Dim strBuffer As Variant
   
    Set rst = New ADODB.Recordset
           
    rst.Open "Tabel1", CurrentProject.Connection, adOpenForwardOnly, adLockOptimistic
   
    strBuffer = rst(1)
    rst.MoveNext
    Do While Not rst.EOF
        If VarType(rst(1)) = vbNull Then
            rst(1) = strBuffer
            rst.Update
        Else
            strBuffer = rst(1)
        End If
        rst.MoveNext
    Loop
   
End Sub
*****************************************************************

Koden kigger på den kolonne du angiver i "rst", i dette eksempel = rst(1).
Så fylder den de blanke felter ud nedenfor indtil den når en række der ikke er NULL.
Herefter fortsættes med at udfylde med den nye værdi.

Smukt og enkelt.

Beklager at det ikke lykkedes mig at finde det spørgsmål i mine første søgninger. jeg kan se at andre har spurgt om lign. problemer hvor selv "terry" har opgivet ;O)

Tak for indsatsen ;O)
Avatar billede terry Ekspert
21. august 2010 - 10:02 #13
"problemer hvor selv "terry" har opgivet"

Yes even I have my limitations :o(

although I'm sure I could have solved yours and LKP's. I actually had seen this question and concidered making a solution in pure SQL but other interests got the better of me.

Good you find a solution though.
Avatar billede fogh Nybegynder
21. august 2010 - 12:50 #14
Hej terry.
Ja, du er jo lidt af en guru på området, og en super hjælp ;O)
/ Thomas
Avatar billede terry Ekspert
21. august 2010 - 18:35 #15
Thanks Thomas, have a nice wwekend
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