|
| Import af .txt fil med variabelt filnavn~ Fra : Terran | Vist : 715 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.
| |
|
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
| |
|
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
| |
|
@%&@%&@&%&@$%&@$%&%&####%#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.
| |
|
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.
| |
|
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
| |
|
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
| |
|
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
| |
|
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
| |
|
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?
| |
|
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
| |
|
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.
| |
|
|