27. januar 2001 - 20:42Der er
10 kommentarer og 1 løsning
Egen import/export Wizard i access
Hej folks,
Er der nogle der har erfaring med at opbygge forms/moduler med \"Wizard\" lignende opførsel? Det jeg skal bruge er en funktionalitet der ligner de traditionelle install-wizards. Altså noget med at udfylde nogle informationer, trykke på en knap (den med >> )og komme til næste side, udfylde flere trykke \'>>\' osv. Så det er noget med et stribe forms der kan loades efter behov, og når man så til sidst trykke udfør skal man have alle informationer fra alle forms til sin rådighed...
Af tidsmæssige årsager er jeg nødt til at bede om konkrete eksempler, eller alternativt noget kode jeg selv kan modificere. Hvis der skal flere point til så skriv...
Oprette egne guider, generatorer og tilføjelsesprogrammer
Når du udvikler dine egne tilføjelsesprogrammer (guider, generatorer eller tilføjelsesmenuer), skal du angive adskillige databaseegenskaber og oprette en USysRegInfo-tabel i tilføjelsesdatabasen (*.mda), så den kan installeres ved hjælp af Tilføjelsesstyring. Oplysninger om, hvilke databaseegenskaber der skal defineres, og hvordan du kan importere en eksempelkopi af USysRegInfo-tabellen, finder du i kapitel 17, \"Oprettelse af guider, generatorer og tilføjelsesmenuer\", i Applikationsudvikling med Microsoft Access 97.
Det har gennem længere tid irriteret mig at jeg ikke har en kopi af den bog liggende, så jeg er villig til en trade-off. Hvis du sender mig en kopi af bogen, laver jeg din guide for dig. Afhængigt af kompleksiteten af import/eksporten (Jeg vil se en beskrivelse før vi aftaler noget som helst ;o)) vil jeg tro der ligger en 3-5 timers arbejde i det.
For en kopi af bogen kan du få op til de første 5 timer gratis. Men alt derudover holder jeg mig en lidt pebret timeløn ;o) og jeg er forbi det punkt hvor jeg arbejder flere uger for ingenting og derefter supporterer installationen gratis...
Mail mig hvis du er interesseret.....
Alternativt kan du opbygge din egen guide vha. formularer og en masse VBA kode. Du kan med fordel kigge på den indbyggede import/eksport funktionalitet og definere dine egne \"Specifikationer\" som du så kalder fra VBA, f.eks. med DoCmd.....
Her er et eksempel på import fra en tekstfil, som jeg sidder og bakser med for øjeblikket (til inspiration):
\' For mere udførlige noter om importen se under formularen F_ImportSelect!!!!!
\' Denne function gennemsøger biblioteket <path> for txt-filer og gemmer resultatet i tabellen Import Filer
Public Function FSearch(Path As Variant) As String Dim fs As Variant, i As Integer, rs As Recordset
If Not Nz(Path, \"\") > \"\" Then MsgBox \"Du skal indtaste en gyldig sti i boksen!\" Exit Function End If
Set rs = CurrentDb.OpenRecordset(\"Import Filer\", dbOpenTable)
If .Execute(SortBy:=msoSortByFileName, SortOrder:=msoSortOrderAscending) > 0 And Path = fs.LookIn Then If .FoundFiles.Count > 0 Then
Do While Not rs.EOF rs.Delete rs.MoveNext Loop
For i = 1 To .FoundFiles.Count rs.AddNew rs!Antal = .FoundFiles.Count rs!Navn = .FoundFiles(i) rs!Path = Path rs.Update Next i
Else
MsgBox \"Der blev ikke fundet nogen filer!\"
End If
Else
MsgBox \"Mappen kunne ikke findes! Kontroller at du har indtastet en gyldig sti i boksen.\"
End If
End With
FSearch = fs.LookIn Set fs = Nothing rs.Close DoCmd.SetWarnings True
Exit Function
Fejl: MsgBox \"Der opstod en fejl ved søgningen!\" rs.Close DoCmd.SetWarnings True End Function
\' Selve importen fra filen
Public Function InStreamTxt(Filnavn As Variant) As Boolean
On Error GoTo Fejl:
InStreamTxt = False
Dim rs As Recordset Set rs = CurrentDb.OpenRecordset(\"ImportResBasic\", dbOpenTable) Do While Not rs.EOF rs.Delete rs.MoveNext Loop rs.Close Set rs = Nothing
If Nz(Filnavn, \"\") = \"\" Then Exit Function DoCmd.TransferText acImportFixed, \"Ordretilgang importspecifikation1\", \"ImportResBasic\", Filnavn InStreamTxt = True
Fejl: End Function
Søg i hjælp under \"Transfer...\", \"Import\", \"Specifikationer\" og \"Filer\"
Uden at have nærlæst din besvarelse, vil jeg gerne kommentere... pkt. 1. det er ikke programmeringsdelen der er problemet, men af tidsmæssige hensyn ville jeg gerne have et eksempel på et modul med flere forms. Disse loades når man trykker >> og << knapperne. Jeg kan pga. datadesign og relationer ikke bruge en almindelig dataimport.
Giver det mening?
PS: Det kan da godt være vi kunne lave et split på den bog du beskriver..
Ikke helt - jeg kan stadig ikke se hvorfor det ikke skulle kunne løses (lidt primitivt) med almindelige formularer.
Hvis det haster så meget så lad os droppe det med bogen, for det tager vist lidt tid at få fat i den. Hvis du allerede har den er jeg selvfølgelig meget forhandlingsvillig (Men lad os løse problemet først)
Hvis kommer med en uddybende beskrivelse af hvad der skal ske (Hvilke oplysninger skal gemmes - hvordan skal man gå videre fra form til form - skal den form man går videre til afhænge af brugerens valg), prøver jeg at se på det.
Send mig evt. en zip af db.
Selve guiden er ikke noget problem, men jeg er lidt betænkelig ved det der import/eksport noget????
Det bliver nok noget lidt grimt noget med en masse public variable og så\'n hvis det skal gå stærkt.
Det er som sagt ikke selve importen jeg har/får problemer med. Det er \"bare\" noget med at kode...
Problemet, hvis det altså er et problem, er at få en form under access til at ligne en \"wizard\".
Du kender dem fra diverse install-/setupprogrammer til WinXX.
En form, delt på midten, med info, grafik e.lign. i den ene del og dataopsamling i form af dialoger, comboboxe, edit felter etc. i den anden del. I bunden er der de sædvanelige:
[<<][>>][Cancel][Install]
knapper.
Det eneste jeg gerne ville se var et eksempel der kan håndtere navigationen mellem diverse forms.
fx.
dim f(xx) as en masse forms initializeForms(f)
curForm = 1
while not fini showForm(curForm) select case DenTastDerAfsluttedeFormen case cancel: fini = true case >>: curForm = curForm +1 .... case <<: curForm = curForm -1 .... case udfør: if validateAllData = OK then DoTheImport fini = true end if end select wend
Pfff, så er jeg mere rolig. Ok, jeg bikser noget sammen til dig med noget collections snavs, der kan transportere oplysninger fra form til form i løbet af weekenden, hvis det er ok med dig.
Iøvrigt jeg laver det herhjemme, så det bliver nok i 97 (Men der skulle ikke komme noget kode ind der ikke kan konverteres). Er det OK med dig?
Ok jeg har set lidt på det. Jeg kan lave en relativt simpel model, men jeg bliver nok nød til minimum at bruge recordsets, dvs. den bliver ikke 100% versionsuafhængig.
Jeg laver den som udgangspunkt i 97 (DAO). Bruger du 97 eller 2000??? Og har du rodet med recordsets før???
Jeg har rodet med det meste, og har kigge på din løsning. Det var ikke lige det jeg havde i tankerne jf. ovenstående, men det får lov at stå sin prøve, i det der ikke er kommet andre forslag og jeg har jo ikke selv evnet at komme op med noget bedre.
Du skal have super mange tak for din indsats og interesse.
Indrømmet jeg skød den lidt lavt (Jeg havde ikke set dit svar 1/2-00) og så fik jeg lige pludselig så #¤%#¤# travlt med at overarbejde på en deadline, der ikke kan nås...
Hvis verden var et rart og venligt sted, hvor man altid havde tid til at skrive god kode ville jeg nok vælge en af følgende løsningsmetoder:
1) En kæmpe generisk form der \"designer\" sig selv ud fra en Case Formtilstand (Hvor Tilstand er = Hvilket Trin du er nået til). Den er lidt grim, men hurtig og effektiv hvis der ikke er så mange trin, fordi du har priviligeret adgang til alle oplysninger der er valgt hele tiden.
2) Hvis der mange værdier der skal gemmes fra Trin til Trin, kunne det måske betale sig at binde dine subforms op på en tabel, således at man ændrer direkte i tabellen når man skriver i dem. Men det bliver besværligt i en multibrugeropsætning.
3) En lidt mere spændende afpudsning af det jeg har sendt dig eller noget af ovenstående kunne være at binde SubForm-navnene op i en collection (Eller Array) vha. Containers!Forms og referere til dem med indeks. Det ville kunne flytte næsten al kode op i Hovedformularen samt fjerne nødvendigheden af den bundne tabel med Formsnavne. Eksempel på container:
Sub FormsIDatabase()
Dim dbs As Database Dim docLoop As Document
Set dbs = CurrentDb
Debug.Print \"Forms i objektbeholderen\" & dbs.Containers!Forms.Name For Each docLoop In dbs.Containers!Forms.Documents Debug.Print docLoop.Name Next docLoop
End Sub
,etc.
Løsningen jeg sendte dig er banal og klodset men god til skarpe deadlines (Medmindre du får den retur og selv skal debugge den ;o)))
Jeg har ikke fået kigget så meget på det siden, men har dog ændret den således at main-formen \"ejer\" alle sub forms. Disse kontrolleres i et array af structs, hvori navn og index (placering) lagres.
Den eneste kode der således skal ud i dine subforms er: 1: Registrer dig (læs: subform) når den kaldes 2: Meddel main-formen hvilke valg brugeren foretog - ved exit af subform
Ikke super elegant, men rimelig overskueling og ikke sværere end nødvendigt.
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.