Hallo,
ich habe ein json File in Access importiert. Das wird in verschachtelten Dictionarys gespeichert.
Das geht auch gut, ich kann sämliche Daten bearbeiten und auch wieder ein json File mit geänderten Daten erzeugen.
Nun möchte ich gerne noch Datensätze in das json File ergo die dictionarys einfügen. Habe da schon einiges probiert, ich bekomme das nicht hin.
Vielen Dank für eure hilfe.
Das ist einer meiner Versuche:
x2 = 0
For Each Dslots In JSON("slots") ' <- Karten durchlaufen
KaNr = Dslots("index")
azKarten = Dslots("index")
For Each Dcircuits In Dslots("circuits")
SKnr = Dcircuits("index")
For Each Dluminaires In Dcircuits("luminaires")
Lec1 = Dluminaires("index")
Dluminaires.item(Index) = "3"
Dluminaires.item(id) = "12222"
x2 = x2 + 1
Lec1 = Dluminaires("index") ' aktuelle Adresse der Leuchte
Debug.Print x2 & " - " & Lec1 & " id: " & Dluminaires("id")
' Dslots(1).Dcircuits(1).Dluminaires.item(Index) = "3"
' Dslots("1").Dcircuits("1").Dluminaires.item(id) = "12222"
Next Dluminaires ' nächste Leuchte
Next Dcircuits ' nächster Stromkreis
Next Dslots ' nächste Karte
Hallo!
Wo ist die Stelle in deinem Code, bei der du versuchst, etwas hinzuzufügen?
Ich sehe kein Add.
Übrigens: vielleicht ist es später auch hilfreich, zu wissen, as JSON ist. Du wirst vermutlich eine Klasse dafür verwenden. (Ist diese selbst erstellt oder irgendwo öffentlich in GitHub & Co. verfügbar?)
Gruß
Josef
Hallo,
danke für Deine Hilfe.
diesen Code verwende ich:
https://github.com/VBA-tools/VBA-JSON/issues/112
VBA-JSON v2.3.1
' (c) Tim Hall - https://github.com/VBA-tools/VBA-JSON
'
' JSON Converter for VBA
'
' Errors:
' 10001 - JSON parse error
'
' @class JsonConverter
' @author tim.hall.engr@gmail.com
' @license MIT (http://www.opensource.org/licenses/mit-license.php)
'' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ '
'
' Based originally on vba-json (with extensive changes)
' BSD license included below
'
' JSONLib, http://code.google.com/p/vba-json/
'
' Copyright (c) 2013, Ryo Yokoyama
' All rights reserved.
Ich dachte, wenn man ein item angibt, das es noch nicht gibt, dass es dann angelegt wird. Habe aber auch mit add. einige Versuche unternommen
Müsste ja möglich sein, auf einfache weise die Dictionarys zu erweitern. Das zurückschreiben in ein json funktioniert ja gut.
Der Haken ist die verschachtelung. Weil sich das im Grunde wiedholt muss klar sein, in welcher Kiste bei der Kategorie Äpfel eine Sorte dazu kommt.
Beispiel:
Kiste 01 -
Äpfel -
Sorte 01 - 5 Stück
Sorte 02 - 3 Stück
Sorte 03 - 9 Stück
Kiste 02 -
Äpfel -
Sorte 01 - 4 Stück
Sorte 02 - 8 Stück
Sorte 03 - 3 Stück
Ich will Sorte 04 - 5 Stück in Kiste 2 zufügen.
Ich hole mir ein json rein, kann da auch Daten ändern, dann wieder ein json schreiben, das die geänderten Daten enthält. Aber keinen neuen Datensatz hinzufügen.
https://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas verwendet ein Dictionary für JSON-Objekte (alles in {}) und eine Collection für Arrays (alles in []).
ZitatIch dachte, wenn man ein item angibt, das es noch nicht gibt, dass es dann angelegt wird.
Ja, beim Dictionary sollte das so sein. Bei der Collection ist es nicht so.
Willst du einem JSON-Objekt eine Eigenschaft ergänzen oder in einer Collection ein JSON-Objekt anfügen?
Ein einfaches Beispiel, wie man in einem Dictionary einen neuen Eintrag ergänzt:
Dim dict As Scripting.Dictionary
Dim k As Variant
Set dict = New Scripting.Dictionary
dict.Add "NeuerKey", 123 ' <-- Eintrag ergänzen
'oder auch
dict.Item("NochEinKey") = "abc"
For Each k In dict.Keys
Debug.Print k, dict.Item(k)
NextEintrag in Collection:
Dim col As Collection
Dim i As Variant
Set col = New Collection
col.Add 123, "NeuerKey" ' <-- Eintrag ergänzen
'funktioniert nicht:
'col.Item("NochEinKey") = "abc"
'=> nur Add
col.Add "abc", "NochEinKey"
For i = 1 To col.Count ' Keys können nicht durchlaufen werden
Debug.Print col.Item(i)
Next
' oder auch
Debug.Print col("NeuerKey")
Zitat von: kleiner Wichtel am Februar 19, 2023, 13:48:26Müsste ja möglich sein, auf einfache weise die Dictionarys zu erweitern.
Bei solchen Aussagen kommt einem schon das Lachen.
Hier mal einigen unterschiedliche Vorgänge.
Sowohl mit Add als auch mit direkter Zuweisung.
Ich hoffe du kannst dann doch etwas mehr als nur Kopieren.
Sub testdic()
Dim a As Scripting.Dictionary
Dim b As Scripting.Dictionary
Set a = New Dictionary
Set b = New Dictionary
a.Add "m", 1
b("c") = 1
Set a("a") = b
a("a")("b") = 95
a("a").Add "d", 5
End SubUnd bitte den Code debuggen, damit du die Veränderung in den Objekten auch Schritt für Schritt sehen kannst.
@markusxy Bitte mir nicht mehr "helfen". Da verzichte drauf. Ich habe ja nix mit dir zu tun, deine Arbeitskollegen tun mir leid, auch deine Familie, sofern sie noch Kontakt zu dir haben.
Ne kleine Besserung ist ja da, statt zu schreiben "lies mal Handbücher" hast du hier ja immerhin was an Code gepostet. Deine menschliche Art zu Kommunizieren ist für mich nicht akzeptabel, deshalb verzichte ich auf deine Hilfe.
Wenn du dich in der vba Sektion schon so äusserst, was schreibst du denn dann in den Sektionen, wo es nur um einfache Fragen und Hilfen geht ?
Erspare dir eine Antwort, die fällt so aus wie im anderen Forum, auch da änderst du dich nicht. kannst du also gleich lassen.
@Josef P. danke für deine Hilfe
Zitathttps://github.com/VBA-tools/VBA-JSON/blob/master/JsonConverter.bas verwendet ein Dictionary für JSON-Objekte (alles in {}) und eine Collection für Arrays (alles in []).
Ich habe ja alles als dictionarys angelegt. Funzt ja auch mit einlesen, ändern und wieder abspeichern. So wie es aussieht, sind da aber auch Collections genommen worden zum abspeichern der Werte des json files. vielleicht sollte ich das ändern und es mit Collections versuchen.
ich habe zu meinem Verständnis mal code nachgebaut, ich kann schon verschachtelt Daten eingeben. Das aber in meinem fall zu kurz greift, weil es sich ja wiederholt.
Set dict_A("dict-b") = dict_B ' <- hier wird Dict b direkt dict a zu- bzw. untergeordnet
Set dict_B("dict-e") = dict_E ' <- hier wird Dict e direkt dict b zu- bzw. untergeordnet
dict_A("dict-b")("dict-e")("b") = 444 ' <- hier werden neue Werte in dict e geschrieben
dict_A("dict-b")("dict-e")("s") = "test-666"Wenn ich die 3 for each Schleifen durchlaufen lasse, dann wird in sich immer wiederholende Bereiche gegangen. Da kann ich ja die Werte abfragen und auch Werte verändern. Dort müsste ich dann auch neue Werte anlegen, denn es verzweigt ja abhängig von den Werten in den Dictionarys
For Each Dslots In JSON("slots") ' <- Karten durchlaufen
For Each Dcircuits In Dslots("circuits") ' <- Stromkreise durchlaufen
For Each Dluminaires In Dcircuits("luminaires") Die Holzhammer Methode wäre, dass ich das json file direkt als Textfile durchsuche. Und an der Stelle wo ich das benötige, den Text einfüge, also den json Code. Dann kann ich code ergo Parameter dazu nehmen. Vielleicht gehts aber auch ordentlich. das ganze hat auch keine Priorität, die aktuelle Programmierung mache ich aus Interesse, was da möglich ist. Da kann ich mir also Zeit lassen und wenn nur 90 Prozent umzusetzen gehen ist auch gut.
Zitat von: Josef P. am Februar 19, 2023, 14:08:35Willst du einem JSON-Objekt eine Eigenschaft ergänzen oder in einer Collection ein JSON-Objekt anfügen?
gute Frage. Am ende will ich im json file mehr Eigenschaften/Einträge/Parameter (wie auch immer) an bestimmter Stelle haben. Das ganze File wird ja schön in Access eingelesen und ich kann das auch zurück speichern als neues json-File. Die Collection bzw. dictionary sind ja nur Hilsmittel, um das, was im json File steht, gut in Access zu speichern und ändern zu können.
Ich bin nicht der VBA-Crack, programmieren ist bei mir hobby, wenn man das so nennen will. Wenn ich in vba was mache, bringe ich Access dazu, was zu machen, was nicht in der normalen Benutzerebene zu realisieren ist. Bisher habe ich durch hilfe in den Foren alles hin bekommen, auch wenn ich mal mit falschen Begriffen etc um mich werfe.
ZitatFor Each Dslots In JSON("slots") ' <- Karten durchlaufen
For Each Dcircuits In Dslots("circuits") ' <- Stromkreise durchlaufen
For Each Dluminaires In Dcircuits("luminaires")
JSON("slots"), Dslots("circuits") und Dcircuits("luminaires") sind Collections, die durchlaufen werden.
Der Aufbau sieht für mich so aus:
JSON("slots") => Collection
Ein Eintrag davon (oben als DSlots) ist ein Dictionary (also JSON-Objekt). Im Objekt gibt es eine Eigenschaft "circuits", die wiederum eine Collection ist.
usw.
Luftcode (nur Prinzip, bitte selbst richtig befüllen):
dim NewSlot as Dictionary
set NewSlot = new Dictionary
JSON("slots").Add NewSlot, "NewSlotKey" ' <-- in Collection einfügen
set NewSlot.Item("circuits") = new Collection ' <-- Collection an Eigenschaft zuweisen
dim NewCircuit as Dictionary
set NewCircuit = new Dictionary
NewSlot.Item("circuits").Add NewCircuit, "NewCircuitKey"
usw.Aber: Vielleicht ist es einfacher, gleich den JSON-String per VBA zusammenzusetzen.
Du wirst in der Access-Anwendung eher mit Tabellen arbeiten, oder?
Und die Werte aus den Tabellen sollen vermutlich für eine Ausgabe/Übertrag in einen JSON-String kommen.
[etwas OT, oder vielleicht auch nicht]
Die Transformation eines JSON-String in eine Tabellenstruktur könnte für Access interessanter sein.
JSON-Array .. Datensätze einer Tabelle
JSON-Objekt .. Felder + Werte eines Datensatzes.
Gruß Josef
Hallo Josef,
vielen Dank für Deine Hilfe. Ich habe das jetzt fertig, es funktioniert so, wie ich das haben wollte.
Zitat von: kleiner Wichtel am Februar 19, 2023, 20:39:53@markusxy
Bitte mir nicht mehr "helfen". Da verzichte drauf. Ich habe ja nix mit dir zu tun, deine Arbeitskollegen tun mir leid, auch deine Familie, sofern sie noch Kontakt zu dir haben.
wow, wow.
Also ehrlich, hast du solche Rundumschläge nötig?
Das macht doch etwas sprachlos, aber keine sorge ich habe es nicht nötig ins gleiche Horn zu stoßen. ;)