Avatar billede Hejren Nybegynder
23. februar 2016 - 14:27 Der er 20 kommentarer og
1 løsning

Listbox data fornyes vha. batch - hvordan?

Jeg skal forsøge at fatte mig i korthed, uden at der går noget tabt i forklaringen:

Jeg har i min DB (Access 2007) en tabel som er skabt ved import fra en tekstfil. Denne tekstfil er skabt ved en batch-kørsel, og rummer en liste over medarbejdere i en virksomhed.

Denne tekstfil/tabel har jeg anvendt i en liste på en formular, som man kan vælge den pågældende medarbejder fra, i forbindelse med oprettelse af udlån af div. udstyr.

Mit issue opstår, når jeg gerne vil kunne forny denne tabel. Da der gerne skal kunne være flere brugere af DB'en, er det ikke muligt blot at oprette tabellen med link til txt-filen. (Første bruger låser txt-filen).

Min tanke var derfor, at det måtte være muligt at slette tabellen, køre batchen, og importere tabellen igen. Men det er ikke muligt at slette tabellen, når min form jo "har fat i den", når den samtidig er datakilde til min listbox.

Jeg kan selvfølgelig oprette en ny form, hvor brugen ved klik på en knap kan slette / køre batchen / oprette tabellen inden hovedformen startes op, men det virker ikke særlig brugervenligt. Findes der andre muligheder?
Avatar billede terry Ekspert
23. februar 2016 - 14:54 #1
If you have your data (tables) in a backend database you can import the data into that  without affecting other users.

The backend tables are linked to the front-end DB users have with forms etc.
Avatar billede terry Ekspert
23. februar 2016 - 14:56 #3
if the users doesn't close the form then the new data will probably not be visible in list so it will be necessary to refresh the list at intervals.
Avatar billede terry Ekspert
23. februar 2016 - 15:18 #4
to requery list you can use something like this in lists GotFocus event


Me.NameOfListGoesHere.Requery
Avatar billede Hejren Nybegynder
23. februar 2016 - 15:24 #5
Terry - tak for svaret, men det var ikke helt det, jeg mente. Kilden til de relevante data kan KUN fornyes via kørsel af bat-filen, så det er altså et krav, at brugeren kan køre batfilen fra brugerfladen. Og da jeg ikke kan linke direkte til en txt-fil, når der er flere brugere, er import så vidt jeg kan se, den eneste mulighed for at få fat i de opdaterede data. Det er derfor ikke - i den sammenhæng - relevant, om tabellen ligger i en backend database, eller direkte i frontend.

Men du har selvfølgelig ret - tabellen BØR ligge i backend'en, så det ikke er nødvendigt for brugeren at refresh'e, hvis en kollega lige har gjort det...
Avatar billede Hejren Nybegynder
23. februar 2016 - 15:37 #6
Her er min kode til kørsel af batch og oprettelse af tabellen:

(WshShell-delen har jeg fundet her: http://stackoverflow.com/questions/8902022/wait-for-shell-to-finish-then-format-cells)
   
[code]
Private Sub btnRunBatch_Click()
    Dim wsh As Object
    Set wsh = VBA.CreateObject("WScript.Shell")
    Dim strBatch As String: strBatch = "Q:\...\genererusers.bat"
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1

    Dim strPath As String: strPath = "Q:\...\udlaansusers.txt"
    Dim strTbl As String
    Dim strSpec As String   

    strTbl = "Medarbejder"
    strSpec = "Udlaansusers Importspecifikation"   

    wsh.Run strBatch, windowStyle, waitOnReturn

   
    DoCmd.TransferText acImportFixed, strSpec, strTbl, strPath, False

    Me.MAList.Requery

End Sub [/code]
Avatar billede terry Ekspert
23. februar 2016 - 15:37 #7
Are you saying that each user has their own data?


You can make an import specification and then use some code to run the import specification.

You could have a button on a form to run the code.
Avatar billede Hejren Nybegynder
23. februar 2016 - 15:41 #8
Beklager &quot'erne...

Ovenstående virker fint. Det er slet-før-opret, der volder problemer.
Avatar billede terry Ekspert
23. februar 2016 - 15:45 #9
SLET contents of table?


DoCmd.RunSQL "DELETE * FROM Medarbejder"
Avatar billede terry Ekspert
23. februar 2016 - 15:55 #10
and you should be able to do that when form is open.
Avatar billede Hejren Nybegynder
23. februar 2016 - 15:57 #11
Hmmmm - but I can't import into an existing table...

Jeg tror, en mere lavpraktisk tilgang er nødvendig. Jeg har fået en idé... jeg vender tilbage, når jeg har testet den... :o)
Avatar billede terry Ekspert
23. februar 2016 - 16:10 #12
You can empty the table using the code I gave, then import and afterwards requery list.
Avatar billede terry Ekspert
23. februar 2016 - 16:11 #13
lavpraktisk tilgang!

If you have to run the batch job I dont see it can be more "lavpraktisk tilgang" :-)
Avatar billede terry Ekspert
26. februar 2016 - 09:25 #14
Hows it going Hejren?
Avatar billede Hejren Nybegynder
29. februar 2016 - 11:13 #15
It's going, it's going :-)

Den ULTRAlavpraktiske (Man må jo bruge de forhåndenværende søm.
) løsning blev:

1: luk formularen
2: slet tabellen (fra backend'en (BE))
3: drop linket til BE-tabellen
4: kør batchen
5: importer tabellen fra txt filen (lokalt)
6: eksporter tabellen til BE
7: drop den lokale tabel
8: opret link til BE-tabellen

Jeg fandt inspiration til funktionerne her:
http://www.micronetservices.com/manage_remote_backend_access_database.htm

[code]
Private Sub btnDelRunBatchImport_Click()
    Dim wsh As Object

    Set wsh = VBA.CreateObject("WScript.Shell")

    Dim strBatch As String: strBatch = "Q:\...\genererusers.bat"
    Dim waitOnReturn As Boolean: waitOnReturn = True
    Dim windowStyle As Integer: windowStyle = 1


    Dim strPath As String: strPath = "Q:\...\udlaansusers.txt"
    Dim strDest As String: strDest = "Q:\...\Udlaan_be.accdb"
    Dim strTbl As String: strTbl = "Medarbejder"
    Dim strSpec As String: strSpec = "Udlaansusers Importspecifikation"
   
    Call DeleteTableFromBackEnd(strDest, strTbl)
    DoCmd.DeleteObject acTable, strTbl   

    wsh.Run strBatch, windowStyle, waitOnReturn 'wait for batch to finish
   

    DoCmd.TransferText acImportFixed, strSpec, strTbl, strPath, False

    Call PutTableOnBackEnd(strDest, strTbl)   

    DoCmd.OpenForm "Udlaan", acNormal
    DoCmd.Close acForm, "OpdaterMedarbejdere"
End Sub


Function DeleteTableFromBackEnd(DbPath As String, TblName As String)

'Data still exists in txt-file. Backup is not mandatory.
    Dim Db As Database   

    'test back end
        On Error Resume Next
        Set Db = OpenDatabase(DbPath)
        If Err <> 0 Then
            'failed to open back end database
            Exit Function
        End If

        Db.Execute "DROP TABLE [" & TblName & "]"
        If Not Db Is Nothing Then Db.Close   

        DeleteTableFromBackEnd = True 'defaults to false if it fails to get here
       
End Function


Function PutTableOnBackEnd(DBName As String, TblName As String) As Boolean

    Dim Db As Database
    'test back end
        On Error Resume Next
        Set Db = OpenDatabase(DBName)
        If Err <> 0 Then
            'failed to open back end database
            Exit Function
        End If
        If Not Db Is Nothing Then Db.Close   

    'test if table is local
        If IsNull(DLookup("Type", "MSysObjects", "Name='" & TblName & "' AND Type=1")) Then
          'table is not local
            Exit Function
        End If   

    'put table on back end
        DoCmd.TransferDatabase acExport, "Microsoft Access", DBName, acTable, TblName, TblName
        If Err <> 0 Then GoTo Done       

    'link to the back end table
        DoCmd.DeleteObject acTable, TblName
        DoCmd.TransferDatabase acLink, "Microsoft Access", DBName, acTable, TblName, TblName
       

        PutTableOnBackEnd = True 'defaults to false if it fails to get here
[/code]

Ja ja - jeg har stadig meget at lære. Så vidt jeg kan læse mig frem til, kan man ikke importere til en allerede eksisterende tabel, men det har måske ikke noget på sig?
Avatar billede Hejren Nybegynder
29. februar 2016 - 12:52 #16
Uanset hvad, Tak for hjælpen Terry. Hvis du skriver et svar herunder, kan jeg tildele dig dine points
Avatar billede terry Ekspert
29. februar 2016 - 13:18 #17
Ja ja - jeg har stadig meget at lære. Så vidt jeg kan læse mig frem til, kan man ikke importere til en allerede eksisterende tabel, men det har måske ikke noget på sig?

Yes you can.
https://msdn.microsoft.com/en-us/library/office/ff835958.aspx

the third parameter (tablename) is used for this purpose. And your actually using it in your solution (strTbl).

Anyway good you found a solution :-)
Avatar billede terry Ekspert
15. marts 2016 - 15:12 #18
?
Avatar billede terry Ekspert
03. april 2016 - 18:40 #19
answer given :-)
Avatar billede Hejren Nybegynder
05. april 2016 - 13:23 #20
Undskyld Terry - jeg troede jeg havde accepteret svaret!! Bedre sent end aldrig, håber jeg...
Avatar billede terry Ekspert
05. april 2016 - 15:00 #21
No problem, we got there in the end :-)
And thanks for the points
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