/ Forside/ Teknologi / Administrative / MS-Office / Spørgsmål
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
MS-Office
#NavnPoint
sion 18709
refi 14474
Klaudi 9389
Rosco40 5695
berpox 5456
dk 5398
webnoob 4919
Benjamin... 4870
o.v.n. 4637
10  EXTERMINA.. 4373
Import af .txt fil med variabelt filnavn~
Fra : Terran
Vist : 729 gange
500 point
Dato : 30-11-03 19:47

Følgende er problemstillingen.

Jeg har opbygget en formular i Access, hvorfra man skal kunne importere en flad kommasepareret .txt datafil ind i en tabel. Indholdet af data i datafilen danner grundlag for en række rapporter, der kan vises og udskrives direkte via tryk på en knap i formularen. For at importere data på rette vis er der lavet en importspecifikation, der anvendes hver gang datafilen indlæses i systemet. Importen fungerer ganske glimrende, hvis man bruger den manuelle fremgangsmåde, men jeg knne godt tænke mig at automatisere denne procedure en smule.

Datafilen har følgende filnavnsstruktur (eksempel): Købstat_000110_JBH.txt

Ordet "Købstat" er en konstant tekst, der påbegynder alle datafiler.
Tallet "000110" er en variabel og unik tæller - dvs. enhvert filnavn får sit eget unikke nummer i midten.
JBH (brugerinitialer) er en variabel tekst, der dog vil forekomme i flere filnavne i mappen.

Fra formularen skal man nu kunne indtaste det unikke nummer i et felt (her 000110) og systemet skal så kunne importere den korrekte .txt-fil efter et tryk på en kommandoknap "Hent købsstatistik".

Jeg har lavet langt det meste af arbejdet med formularen, men jeg mangler viden til at kunne skrive den bagvedliggende kommandostreng, der sætter mit system i stand til, at man kan indtaste det unikke nummer (000110) i et felt, hvorefter Access importerer den rigtige .txt fil fra en mappe på disken. Og dette uanset hvilket brugerinitial, der anvendes i slutningen af filnavnet.

Jeg takker på forhånd for hjælpen. Jeg ville gerne give nogle flere point for svaret, men jeg har desværre kun 40 til at starte med.


 
 
Kommentar
Fra : randomchoise


Dato : 03-12-03 19:50

Jeg har lavet følgende forslag som jeg håber du kan bruge. I det følgende er der brugt :

"ImportData" er navnet på din kommandoknap
"InputNo" er navnet på den tekstboks på formularen hvori brugeren indtaster filnavnet (eller en del heraf).
{PATH} er stien til biblioteket hvor filen lagres

Og så lige et godt råd inden du begynder - generelt vil jeg altid fraråde at bruge æ, ø eller å i et filnavn, derfor er der i dette eksempel brugt "Test_" hvor du angiver "Købstat_"!

Kode
Private Sub ImportData_Click()
Dim fileInput As String
Dim filestr As String
Dim volume As Long

If IsNull(Me.InputNo.Value) Then
MsgBox "No input", vbOKCancel, "Internal Error"
GoTo closeout
End If

fileInput = Me.InputNo.Value
filestr = "{PATH}\Test_"
filestr = filestr & Trim(CStr(fileInput))
filestr = filestr & "*.txt"
volume = Len(Dir(filestr))

If volume > 0 Then
DoCmd.TransferText acImportDelim, "Test_ImpSpec", "ImportedData", Dir(filestr), 0
MsgBox "Done", vbOKOnly, "File imported"
Else: MsgBox "No such file exists", vbOKCancel, "Internal Error"
End If

closeout:
End Sub


Det skal bemærkes at hvis der forekommer duplikatter i filnavnet excl. de efterstillede initialer (KøbsStat_000001) så vil denne kodestump gribe den første fil den finder !

Håber det kan bruges.

Randomchoise

Kommentar
Fra : randomchoise


Dato : 03-12-03 19:53

Er lige nødt til at smuksere denne lidt !! Den trækker linierne op efter [End If] kommandoerne ^%&##^%

Kode
Private Sub ImportData_Click()
Dim fileInput As String
Dim filestr As String
Dim volume As Long

If IsNull(Me.InputNo.Value) Then
MsgBox "No input", vbOKCancel, "Internal Error"
GoTo closeout
End If

fileInput = Me.InputNo.Value
filestr = "{PATH}\Test_"
filestr = filestr & Trim(CStr(fileInput))
filestr = filestr & "*.txt"
volume = Len(Dir(filestr))

If volume > 0 Then
DoCmd.TransferText acImportDelim, "Test_ImpSpec", "ImportedData", Dir(filestr), 0
MsgBox "Done", vbOKOnly, "File imported"
Else: MsgBox "No such file exists", vbOKCancel, "Internal Error"
End If

closeout:
End Sub


Randomchoise

Kommentar
Fra : randomchoise


Dato : 03-12-03 19:55

@%&@%&@&%&@$%&@$%&%&####%#Q$#@^

Obs : Du skal have linieskift efter {End If] kommandoerne.

Randomchoise

Kommentar
Fra : Terran


Dato : 06-12-03 22:16

Hej Randomchoise

Mange tak for dit svar. Jeg har ikke den store forstand på Visual Basic, men jeg tror alligevel godt, at jeg kan få koden ind det rigtige sted.
Er det korrekt, at hændelsesproceduren skal placeres under "Ved klik" under "Hændelser" for den givne knap?

Kommentar
Fra : Terran


Dato : 06-12-03 22:18

Hej Randomchoise

Mange tak for dit svar. Jeg har ikke den store forstand på Visual Basic, men jeg tror alligevel godt, at jeg kan få koden ind det rigtige sted.
Er det korrekt, at hændelsesproceduren skal placeres under "Ved klik" under "Hændelser" for den givne knap?

Kommentar
Fra : Terran


Dato : 07-12-03 23:27

Lige et tillægsspørgsmål til dig, Randomchoise.

Hvordan kan jeg med koden sikre mig, at databasetabellen får navnet "Data" hver eneste gang frem for at få navnet på den aktuelt importerede .txt-fil?

Jeg vil løbende fylde ekstra point på, hvis din løsning fungerer. Du kan godt se frem til over 200 point.

Kommentar
Fra : randomchoise


Dato : 08-12-03 15:24

Yep, koden skal ind under hændelser på knappen - om du vælger "klik" eller "dobbeltklik" er jo en smagssag.

Den linie i koden som starter med "DoCmd.Transfertext ......" er der hvor det hele sker

I denne linie er :

"Test_ImpSpec" navnet på den import specifikation som du allerede nu har gemt.
"ImportedData" navnet på den tabel hvor data bliver/skal lagres.

Du skal iøvrigt lige være opmærksom på, at data bliver importeret som en append dvs. du har tidligere dages data i tabellen indtil du vælger (manuelt) at slette dem. Hvis du ønsker at starte i en tom tabel hver gang må du lige sige til så smider vi en kommando ind der sletter alle data i tabellen lige før importen sker.

Mvh
Randomchoise

Kommentar
Fra : Terran


Dato : 09-12-03 22:12

Hej Randomchoise.

Det hele ser ud til at fungere glimrende, men der mangler den facilitet, som du selv påpeger. Nemlig faciliteten, der sletter dataindhold hver gang man trykker på knappen.

Hvordan gør jeg dette? Jeg tilføjer lige nogle flere point.

Kommentar
Fra : randomchoise


Dato : 10-12-03 15:40

Okay, her er så en lille kodestump som du skal erstatte IF..THEN stumpen med i det jeg har sendt tidligere. Du kan se at jeg har indsat 4 linier før det DoCmd statement som var i den originale kode :

Først fjerner jeg skærmkommandoerne så brugeren ikke skal bekymre sig om meddelelser ifbm. sletning/kopiering af data (hvis du vil have brugerne aktivt skal forholde sig til om det er ok at slette x antal rækker fra tabellen kan du naturligvis fjerne SetWarnings argumenterne).
Dernæst flytter jeg tabellen over i en back-up tabel, kaldet "Data_backup". Det er naturligvis også dit eget valg, men jeg er bare lidt forsigtig af natur - især hvis man har med ikke-teknisk kyndige brugere at gøre !!
Så kommer argumentet som sletter ALLE data i tabellen.
Til sidst slår jeg skærmkommandoerne til igen.

Kode
If volume > 0 Then
DoCmd.SetWarnings False
DoCmd.CopyObject , "Data_BackUp", acTable, "ImportedData"
DoCmd.RunSQL "DELETE from ImportedData", 0
DoCmd.SetWarnings True
DoCmd.TransferText acImportDelim, "Test_ImpSpec", "ImportedData", Dir(filestr), 0
MsgBox "Done", vbOKOnly, "File imported"
Else: MsgBox "No such file exists", vbOKCancel, "Internal Error"
End If


Lad mig nu vide om det er det !!

Mvh.
Randomchoise

Kommentar
Fra : randomchoise


Dato : 10-12-03 15:45

Jeg ved egentlig ikke hvilken af disse der passer bedst
men jeg har lidt problemer med de der kode brackets !!!!!!

Der skal - selvfølgelig - ikke være noget [/code] efter "End If" argumentet #$%@#$%@#$^%#$@$#^

Mvh.
Randomchoise

Kommentar
Fra : randomchoise


Dato : 11-12-03 18:41

Hej Terran

Jeg smutter på ferie nu (først tilbage efter nytår), så hvis du stiller et spm. og ikke får svar et det simpelthen fordi jeg ikke ser det )

Randomchoise

Kommentar
Fra : randomchoise


Dato : 01-03-04 21:54

Du sgu' tage at lukke denne her snart

Kommentar
Fra : Terran


Dato : 18-03-04 22:43

Det må du meget undskylde, Randomchoise, men jeg kunne ikke få det til at virke korrekt og glemte alt om det igen.

Nå, men hvis du stadigvæk vil hjælpe mig, så er problemstillingen således:

Umiddelbart virkede det, men et eller andet gør, at det ikke fungerer helt optimalt. Når man har lukket Access ned og senere åbner igen for at bruge indtastningsformularen, så kommer der en fejlmeddelelse: Runtime Error "3011" Microsoft Jet-databasemotoren kan ikke finde objektet...... og DEBUG fokuserer på denne sætning: DoCmd.TransferText acImportDelim, "Test_ImpSpec", "ImportedData", Dir(filestr), 0.

Nå, men hvis jeg til gengæld laver en enkelt manuel import af flettefilen og derefter bruger formularen, så virker det igen. Og jeg kan prøve mange gange uden at det fejler, men lukker jeg helt ned for Access og op igen, så skal jeg igen lave en manuel import før systemet fungerer.
I øvrigt kan jeg herefter dog kun importere flettefiler fra den mappe, som jeg manuelt hentede fra. Og dette uanset om PATH er en anden i koden.

Forstår du, hvad der foregår, for jeg gør ikke. Måske har jeg lagt koden ind forkert, men underligt at det så virker, når jeg har importerer den første manuelt.

Jeg forøger lige med 200 point og flere er på vej.

Håber du kan hjælpe.

mvh. Henrik

Kommentar
Fra : randomchoise


Dato : 31-03-04 15:07

Hej Terran

Har været på ferie så derfor dette lidt sene svar.

Jeg tror problemet ligger i, at du skal gemme specifikationen af din import (Test_ImpSpec) for at Access kan genbruge denne. Dette gøres som det sidste step i den guide der hjælper dig igennem importen. Dér skulle der gerne være en knap der hedder "Avanceret" eller noget lignende og hvis du bruger den får du mulighed for at gemme specifikationen - husk navnet skal stemme overens med det som er skrevet i koden.

Lad mig lige vid eom det så virker ??

Mvh.
Randomchoise

Kommentar
Fra : Terran


Dato : 31-03-04 19:05

Hej Randomchoise

Importspecifikationen er gemt i Access filen under det navn, der bliver brugt i koden. Det mærkelige er jo også, at det virker, når jeg manuelt importerer den første fil og herefter bruger formularen til at hente de næste filer. Men det virker dog kun, når jeg så med koden henter filer i den mappe, som jeg hentede i manuelt. Altså uanset den PATH, der står i koden.

Selv med mit begrænsede tekniske kendskab synes jeg, at det virker meget mærkeligt, men det er sikkert en simpel ting, der gør forskellen.

Har du andre ideer til, hvad der kan være galt?

Kommentar
Fra : randomchoise


Dato : 02-04-04 15:49

Det fatter jeg simpelthen ikke

Jeg har lavet en "test-database" som jeg har brugt til at teste den kode jeg har givet dig og den kan jeg lukke op og ned, og logge af og på, uden at der er de fjerneste problemer med at importere data. Jeg prøver lige at give dig den fulde kode jeg har på knappen på formen, måske er der et eller andet du mangler. Ellers har jeg ikke rigtig nogen idé til hvad der kan være galt. Måske en netværksopsætning eller lign.

#Kode start#

Private Sub ImportData_Click()
Dim fileInput As String
Dim filestr As String
Dim volume As Long

If IsNull(Me.InputNo.Value) Then
MsgBox "No input", vbOKCancel, "Internal Error"
GoTo closeout
End If

fileInput = Me.InputNo.Value
filestr = "{PATH}\Test_"
filestr = filestr & Trim(CStr(fileInput))
filestr = filestr & "*.txt"
volume = Len(Dir(filestr))

If volume > 0 Then
DoCmd.SetWarnings False
DoCmd.CopyObject , "Data_BackUp", acTable, "ImportedData"
DoCmd.RunSQL "DELETE from ImportedData", 0
DoCmd.SetWarnings True
DoCmd.TransferText acImportDelim, "Test_ImpSpec", "ImportedData", Dir(filestr), 0
MsgBox "Done", vbOKOnly, "File imported"
Else: MsgBox "No such file exists", vbOKCancel, "Internal Error"
End If

closeout:
End Sub

#Kode slut#

Håber du kan bruge det til noget, ellers må du jo se om du kan løse det på anden vis.

Mvh.
Randomchoise

Kommentar
Fra : randomchoise


Dato : 02-04-04 15:54

PS : Husk at der efter {End If} argumenterne skal være dobbelt linieskift. Desværre kan Kandu.dk ikke omgå at basiskoden trækker teksten op efter disse argumenter.

Mvh.
Randomchoise

Kommentar
Fra : Terran


Dato : 13-04-04 22:11

Jeg kan simpelthen ikke få det til at virke. Programmet vil kun importere, hvis jeg kører en manuel import igennem først.....underligt. Jeg har dog et forslag til ændring af koden.

Kan man få programmet til at slette den gamle ImportedData tabel helt og herefter importere en ny Importeddata. Alternativt skal den gamle ImportedData overskrive den gamle ImportedData. Altså ikke noget med at fylde en eksisterende tabel op med nye data, men import af en helt ny tabel.
Denne fremgangsmåde svarer præcist til den manuelle metode, som tilsyneladende virker.

Håber du kan hjælpe. Jeg forøger lige point med 200.

Mvh. Terran


Kommentar
Fra : Terran


Dato : 13-04-04 22:13

Nå, jeg nåede vist max på point. Jeg vil dog sørge for, at du få masser af point i en anden opgave.

Accepteret svar
Fra : randomchoise

Modtaget 500 point
Dato : 14-04-04 13:50

Det eneste du behøver at gøre er at udskifte linien :

## DoCmd.RunSQL "DELETE from ImportedData", 0 ##

med linien

## DoCmd.DeleteObject acTable, "ImportedData" ##

i if-argumentet.

Du skal dog være opmærksom på, at når du sletter tabellen sletter du også evt. index og kan dermed ødelægge hele performance i db såfremt vi taler lidt større mængder af data.

Mvh.
Randomchoise

PS : Glem det der med pointene - jeg kan ikke bruge dem til noget alligevel
Giv dem til een som har brug for det.

Godkendelse af svar
Fra : Terran


Dato : 06-08-04 15:18

Tak for svaret, randomchoise.
                        

Du har følgende muligheder
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.

Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste