2015-05-28 15 views
5

Şirketim, MS Access veritabanımıza her iki saatte bir yüklemem gereken bir JSON veri akışı sağlayan bir satıcıya sahiptir. JSON otomatik olarak MS Access'e besleme ayrılıyor

  • Erişim için kullanılabilir bir biçime JSON ayrıştırmak feed'den

    1. yük verileri, ve sonra
    2. veritabanına ekleyin: Ben gerek.

    Benzer bir sorunu tartışarak this question numaralı telefona rastladım, ancak MS Access'te bunun nasıl uygulanacağı konusunda iyi bir açıklama yok. Herhangi bir yardım minnetle takdir!

    +0

    Ayrıca buradan JSON modüllerini göz olabilir: https://github.com/CactusData/VBA.CVRAPI ... verileri tutmak için koleksiyonları kullanılarak. Biraz zaman alıyor ama VBA ve JSON birbirleri için yapılmıyor - basit veya akıllı çözümler yok. – Gustav

    +0

    Eğer var gibi bazı örnek JSON paylaşabilir ve DB tablo (ler) sonucu almak istiyorum sonuçlanan olabilir mi? [Bu yöntem] (http://stackoverflow.com/a/30494373/2165759) da düşünün. – omegastripes

    +0

    Sorunuz, VBA ile rahat olmadığınızı ima ediyor, ben de yanılıyor muyum? –

    cevap

    6

    VBA JSON kitaplığını kullanarak, MS Access biçiminde JSON biçimli dosyaları alabilirsiniz. Fikir, JSON verilerini bir sözlük koleksiyonu olarak düşünmek ve Visual Basic, collection ve dictionary veri yapıları olarak sağlar.

    1. (yukarıdaki linkten)JsonConverter.bas içe beklenen JSON veri MS Access VBA IDE tarafında
    2. yapısını eşleştirmek için bir tablo oluşturun: Aşağıda

      adımlardır
    3. J okur aşağıdaki kodu ekleyin Microsoft Scripting çalışma zamanı: yeni modül Araçlar/Başvurular altında IDE Hala
    4. , VBA Referansı işaretini içine SON metin dosyası, onu sözlükler koleksiyonu olarak (anahtarlar ve valeus ile) ayrıştırır ve yinelemeli olarak Access tablosuna ekler. MS'te gerçekleştirilirken bir Access formu veya modül arkasında yer kodu (örneğin bir tek iç içe düzey JSON dosyası kullanır)

    JSON

    [ 
        { 
        "col1": somenumber, 
        "col2": "somestring", 
        "col3": "somestring", 
        "col4": "somestring", 
        "col5": "somestring" 
        } 
    ] 
    

    VBA Code

    Private Function JSONImport() 
        Dim db As Database, qdef As Querydef 
        Dim FileNum As Integer 
        Dim DataLine As String, jsonStr As String, strSQL As String 
        Dim p As Object, element As Variant   
    
        Set db = CurrentDb 
    
        ' READ FROM EXTERNAL FILE 
        FileNum = FreeFile() 
        Open "C:\Path\To\JsonFile.json" For Input As #FileNum 
    
        ' PARSE FILE STRING 
        jsonStr = "" 
        While Not EOF(FileNum) 
         Line Input #FileNum, DataLine 
    
         jsonStr = jsonStr & DataLine & vbNewLine 
        Wend 
        Close #FileNum 
        Set p = ParseJson(jsonStr) 
    
        ' ITERATE THROUGH DATA ROWS, APPENDING TO TABLE 
        For Each element In p 
         strSQL = "PARAMETERS [col1] Long, [col2] Text(255), [col3] Text(255), " _ 
              & "[col4] Text(255), [col5] Text(255); " _ 
            & "INSERT INTO TableName (col1, col2, col3, col4, col5) " _ 
              & "VALUES([col1], [col2], [col3], [col4], [col5]);" 
    
         Set qdef = db.CreateQueryDef("", strSQL) 
    
         qdef!col1 = element("col1") 
         qdef!col2 = element("col2") 
         qdef!col3 = element("col3") 
         qdef!col4 = element("col4") 
         qdef!col5 = element("col5") 
    
         qdef.Execute 
        Next element 
    
        Set element = Nothing 
        Set p = Nothing 
    End Function 
    
    +0

    Aptal soru ... Bu kütüphaneyi nasıl kullanıyorsunuz? – Hill

    +1

    "Benioku" gibi: Projenize JsonConverter.bas dosyasını içe aktarın (Open VBA Editor, Alt + F11; Dosya> Dosya İçe Aktar); Sözlük ekle referans/sınıf ("Microsoft Scripting Runtime" için bir referans ekleyin) –

    -2

    Json dosya Erişim kolaydır. Sadece .txt ve (ayarlı sınırlayıcı :) ve ("metin sınırlayıcı) ile metin ithalat işlevini kullanmak için .json uzantısını yeniden adlandırın. Kod One hattı ... Mutlu kodlama!

    +1

    Yığın Taşmaya Hoş Geldiniz! Bu sorunu çözmek için değerli bir ipucu olsa da, iyi bir cevap da çözümü gösterir. Ne demek istediğini göstermek için örnek kod sağlamak için lütfen [düzenle]. Alternatif olarak, bunun yerine bir yorum olarak yazmayı düşünün. –

    +0

    Bu yanıt, verilerin düz bir dosya olduğunu ve bu nedenle ayrıştırmanın gerekmediğini varsayar. JSON'un noktası yapılandırılmış veridir. Yani bu cevap yararsızdır. – Smandoli

    0

    I yorum yapma yetkisine sahip değilim, ancak bu, Parfait'in çözümüne yönelik küçük bir öneridir.Jsonconverter eksik olduğu için kodu yürütme konusunda sorun yaşadım Parfait'ten gelen adımları izlerseniz, JsonConverter'i Access VBA'da bir Modül olarak dahil ettiğinizden emin olun. Sen VBA-JSON sağlanan Excel dosyasındaki bu Modülü bulabilirsiniz

    Erişimi altında VBA-JSON yüklemek için şu adımları izleyin:.

    • Modüller olarak Yükleme Türleri (İçe Aktar ..)
    • Açık Excel, + F11 Alt vurmak, açık Modül JSONConverter, bütün (STRG + A, STRG + C)
    • OpenAccess kopyalayın adlandırın JsonConverter, bütün Kodu (ctrl Yapıştır, Alt + F11, yeni modülü oluştur vurmak + V)
    • Referans Microsoft Scripting çalışma zamanı kodunuzda

    , parseJSON bulunmazsa, bu başvuruyu kullanın:

    Dim p As Object 
    Set p = JSonConverter.ParseJson(jsonStr) 
    

    Bu benim tam kodu:

    Public Sub import() 
        ''''CREATE TABLE START'''' 
        Dim myTable As TableDef 
        Set myTable = CurrentDb.CreateTableDef(tablename) 
        myTable.Fields.Append myTable.CreateField("col1", dbText) 
        myTable.Fields.Append myTable.CreateField("col2", dbText) 
        myTable.Fields.Append myTable.CreateField("col3", dbText) 
        myTable.Fields.Append myTable.CreateField("col4", dbDate) 
        myTable.Fields.Append myTable.CreateField("col5", dbText) 
        CurrentDb.TableDefs.Append myTable 
        Application.RefreshDatabaseWindow 
        ''''CREATE TABLE END'''' 
    
        JSONImport path + myfile, tablename 
    End Sub 
    
    Public Sub JSONImport(ByVal path_file As String, ByVal tablename As String) 
        Dim db As Database, qdef As QueryDef 
        Dim FileNum As Integer 
        Dim DataLine As String, jsonStr As String, strSQL As String 
        Dim element As Variant 
        Set db = CurrentDb 
        ' READ FROM EXTERNAL FILE 
        FileNum = FreeFile() 
        Open path_file For Input As #FileNum 
        ' PARSE FILE STRING 
        jsonStr = "" 
        While Not EOF(FileNum) 
         Line Input #FileNum, DataLine 
         jsonStr = jsonStr & DataLine & vbNewLine 
        Wend 
        Close #FileNum 
        Dim p As Object 
        Set p = JSonConverter.ParseJson(jsonStr) 
        ' ITERATE THROUGH DATA ROWS, APPENDING TO TABLE 
        For Each element In p 
         strSQL = "PARAMETERS [col1] Text(255), [col2] Text(255), [col3] Text(255), [col4] Date, [col5] Text(255); " _ 
           & "INSERT INTO " & tablename & "(col1, col2, col3, col4, col5) VALUES ([col1], [col2], [col3], [col4], [col5]);" 
    
         Set qdef = db.CreateQueryDef("", strSQL) 
         qdef!col1 = element("fullname") 
         qdef!col2 = element("id") 
         qdef!col3 = element("text") 
         qdef!col4 = CDate(Replace(element("timestamp"), "T", " ")) 
         qdef!col5 = element("user") 
         qdef.Execute 
        Next element 
    
        'Rename Fields 
        Dim fld As DAO.Field 
        Dim tdf As DAO.TableDef 
        Set tdf = db.TableDefs(tablename) 
        Set fld = tdf.Fields("col1") 
        fld.Name = "fullname" 
        Set fld = tdf.Fields("col2") 
        fld.Name = "id" 
        Set fld = tdf.Fields("col3") 
        fld.Name = "text" 
        Set fld = tdf.Fields("col4") 
        fld.Name = "timestamp" 
        Set fld = tdf.Fields("col5") 
        fld.Name = "user" 
        db.Close  
        Set db = Nothing 
        Set fld = Nothing 
        Set tdf = Nothing 
        Set element = Nothing 
        Set p = Nothing 
        Set qdf = Nothing 
    End Sub 
    

    Benim JSON yapısı:

    { 
         "fullname": "Henry Timor", 
         "id": "141217245735560741", 
         "text": "How must it feel to know you have lost.", 
         "timestamp": "2015-07-22T05:45:06", 
         "user": "henry_t" 
        } 
    
    İlgili konular