Avatar billede privaten Nybegynder
27. januar 2001 - 20:42 Der 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...
Avatar billede kru Nybegynder
28. januar 2001 - 13:03 #1
Her er et udsnit fra hjælpen omkring guides:

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

On Error GoTo Fejl:

DoCmd.SetWarnings False

Set fs = Application.FileSearch
With fs

    fs.NewSearch
    fs.LookIn = Path
    fs.FileName = \".txt\"
    fs.SearchSubFolders = False
    fs.MatchTextExactly = False
    fs.FileType = msoFileTypeAllFiles
   
    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\"


Håber det hjælper :o)
Avatar billede privaten Nybegynder
28. januar 2001 - 17:58 #2
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..

Avatar billede kru Nybegynder
28. januar 2001 - 21:03 #3
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.
Avatar billede privaten Nybegynder
01. februar 2001 - 11:25 #4
Hej igen, har lige været ude og tisse...

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

Noget i den stil?
Avatar billede kru Nybegynder
02. februar 2001 - 00:05 #5
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?
Avatar billede privaten Nybegynder
02. februar 2001 - 11:12 #6
Det lyder super,
Avatar billede kru Nybegynder
03. februar 2001 - 10:57 #7
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???
Avatar billede privaten Nybegynder
04. februar 2001 - 14:46 #8
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.
Avatar billede kru Nybegynder
06. februar 2001 - 08:24 #9
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)))

Held og Lykke
Avatar billede kru Nybegynder
06. februar 2001 - 08:33 #10
og iøvrigt mht. en Collection af Forms er det lidt en sport at få lov til at oprette den:

Dim colForms As New Collection
Dim frm As Form
Set frm = New Form_Formular1
colForms.Add frm, \"Første\"
colForms.Item(1).Visible = True
, etc.

Og du får så meget ballade med at bruge den bagefter at du tror det er løgn (Men det er en glimrende løsning - i teorien)
Avatar billede privaten Nybegynder
09. februar 2001 - 13:17 #11
Hej igen, og tak for dine kommentarer.

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.
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