ODB Add

Guten Morgen,
wahrscheinlich mach ichs wieder zu kompliziert ;-} aber
Wie füge ich ein Layout in eine existierende ODB-Datei mit bereits darin gespeicherten Layouts hinzu ?
Klaus
per Avenue

oder

per TextEditor

oder

per "Ich lade das existierende ODB und speicher den Inhalt zusammen mit dem neuen Layout in ein Gesamt-ODB"

???
Hallo Maxilla,
per Avenue und etwa so: ich öffne die bestehende ODB-Datei, schiebe mein neues Layout hinein, mach sie wieder zu und speicher sie ab
Klaus
Guten Morgen Maxilla,
(weils mich auch interessiert und ich sowas auch brauche):
Ich habe die Memo-Tools durchstöbert aber keine Möglichkeit in den Scripten gefunden, die einer vorhandenen ODB ein zusätzlich Objekt hinzufügen. Soweit ich rausgefunden habe, wird die vorhandene ODB immer überschrieben und das will ja der Kollege Klaus genausowenig wie ich. Hast Du eine Lösung parat ?
NochnKlaus
Moin Kläuse (mein Bruder heißt übrigens auch so, aber das ist ja kein Vornamenforum hier)

Also, wahrscheinlich ist das ganz einfach. Man müsste das vorhandene ODB per

theODBFile = ODB.Open(aFileName)

öffnen, das neue Layout mittels

theODBFile.Add(av.FindDoc("Layout1"))

hinten dran packen und über

theODBFile.Commit

speichern... Hab' aber gerade keine Zeit, das auszuformulieren. Vielleicht nachher ;)

Schön wäre ja auch, wenn der Klaus Engelbert da gerade Lust zu hätte - dann wäre nebenbei auch die Konfrontationstherapie gegen Klaustrophobie in diesem Thread perfekt.
Danke Maxilla,
ich glaub mit diesen Angaben komme ich weiter ich habe auch in den Memos rumgefummelgebastelt und denke mit Deinen Angaben sollte es auch per mir klappen.
(Soll ich mich etwa umbenennen ? Klaustrophobie : Ich laufe schon seit Jahren mit dem Namen rum...)
NochnKlaus (grad drummm!
Hallo Maxilla,
was macht denn der (Klaus-)Fehler, der vorm Bildschirm sitzt,
da schon wieder verkehrt ??
ich habe aus den Memo-Tolls das ODB.Add abgekupfert und
es sieht bei mir so aus:
theLayout = av.getactivedoc
aName = theLayout . GetName
MsgBox. Info ( aName . AsString ,"")
If (aName <> "") then
aPrompt="Save"++aName++"to a New File"
else
aPrompt="Save Object to a New File"
end
theFile=aName+".odb"
myODBFile=filedialog.Put(theFile.AsFilename,"*.odb","Open File")
If (File.Exists(myODBFile)) then
aPrompt="Add Document"++aName++"to"++myODBFile.AsString++"?"
myAnswer = MsgBox.YesNo( aPrompt, "Add to Existing", true )
If (myAnswer) then
myOdb=ODB.Open(myOdbFile)
else
return Nil end
else
myOdb=Odb.Open(myODBFile)
end
myOdb.Add(theLayout)
myOdb.Commit

Das scheint auch zu klappen. Wenn ich mir
die ODB-Datei anschaue, erscheint das "geaddate"
Layout.
Will ich aber mit:
ODB_Datei = ODB.Open(FileDialog.Show("*.odb","ODB File","ODB Import komplett"))
If (ODB_Datei = Nil) then exit end
ODB_Liste = ODB_Datei.Get(0)
For each i in ODB_Liste
av.GetProject.AddDoc(i)
end

dieses neue Layout laden, dann erscheints nicht
in der Liste. WARUM ????

NochnKlaus
Wahrscheinlich hast du dein "Basis-ODB" mit der Memo Tools Funktion erzeugt, die das ODB über ein Dictonary macht. Das passt dann nachher nicht.

Wenn du hiermit dein "Basis-ODB" erzeugst...

' ODB_Create

theLayout1 = av.GetActiveDoc
aName = theLayout1.GetName
aPrompt="Save"++aName++"to a New File"
theFile=aName+".odb"
myODBFile = FileDialog.Put(theFile.AsFilename,"*.odb","Create File")
theODBFile = ODB.Make(myODBFile)
theODBFile.Add(theLayout1)
theODBFile.Commit

...und hiermit ein Dokument hinzufügst...

' ODB_Add

theLayout2 = av.GetActiveDoc
aName = theLayout2.GetName
aPrompt="Save"++aName++"to a New File"
theFile=aName+".odb"
myODBFile = FileDialog.ReturnFiles ({"*.odb"},{"ODB-Files"},"Select ODB",0).Get(0)
aPrompt="Add Document"++aName++"to"++myODBFile.AsString++"?"
myAnswer = MsgBox.YesNo( aPrompt, "Add to Existing", true )
If (myAnswer) then
myOdb=ODB.Open(myOdbFile)
myOdb.Add(theLayout2)
myOdb.Commit
end


...dann sollte das wohl funktionieren.

Ein für diesen Fall passendes "Basis-ODB" wird auch von der Memo-Tools ODB-Funktion erzeugt, auf die man vom Projektfenster aus zugreift (mit der man mehrere Dokumente in ein einzelnes ODB exportieren kann). Die andere Funktion - auf die man von einem aktiven Dockument aus zugreift - arbeitet dagegen mit Dictionaries.
OK; das scheint er ja nu kapiert zu haben. Ich habe verschiedene
Layouts in eine ODB-Datei mit dem Namen ;-) UpperJawBone ;-)
geladen. Früher konnt ich die einfach mit:

ODB_Datei = ODB.Open(FileDialog.Show("*.odb","ODB File","ODB Import komplett"))
If (ODB_Datei = Nil) then exit end
ODB_Liste = ODB_Datei.Get(0)
For each i in ODB_Liste
av.GetProject.AddDoc(i)
end

wieder rausholen. Wieso sagt er mir jetzt
"Objekt Layout kann die Anforderung DoWithEach nicht erkennen"
NochnKlaus
Hallo Maxilla und Hallo in die Runde,
um das ganze Hin und Her zu vereinfachen - man muß ja
nicht immer mit El Woms(m.H.) arbeiten - wenn ich nun
schlicht und ergreifend mit den Layout-Schablonen arbeiten
will: Kann ich beim laden von Schablonen vorgeben, Wo
die zugehörige Template.def steht ? Meine Anwender arbeiten
nicht nur auf C:\ und immer in anderen Verzeichnissen.
Genügt es dann, wenn ich die Template.def in
C:\ESRI ....\ETC überschreibe ????
(Das würde die ganze Geschichte vereinfachen und man
soll's den Anwendern ja nicht ZU einfach machen ;-)
NochnKlaus
ich mach mal das Lieschen und antworte mir selber:
Ich habe das Systemscript, das die Schablonen aufruft verändert und stelle das WorkDir auf den Pfad, der unverändert bleibt (!) zum neuen Template ein. Und jetzt klappts - man soll einfach bestimmte Sachen überschlafen ;-)
NochnKlaus
Hallo Maxilla,
(offTopic :
hope I didnt bother you)
NochnKlaus
Oh no, AnotherStealit, you didn't... I would have told you to load your documents with...

ODB_Datei = ODB.Open(FileDialog.Show("*.odb","ODB File",""))
If (ODB_Datei = Nil) then exit end

theCount = ODB_Datei.count

for each i in 0..(theCount - 1)
d = ODB_Datei.Get(i)
if (d.is(Doc)) then
av.GetProject.AddDoc(d)
end
end

but as you are so kind to find an acceptable solution by yourself, I consider it unnecessary to answer again, sorry. At least I should have asked what "El" ..what.. "El Woms" was supposed to be :)
Hallo NochnKlaus,
(offTopic :
hope I didnt bother you)
Maxilla
Hallo Maxilla,
NÖ und außerdem
never bother a bothering team
El Woms, naja son milder In-Joke hier: die "EierlegendeWollmilchsau" for short
jetzt ham wir allen bewiesen, daß wir englisch können und wenns nicht
bald wieder zurück zum Topic geht, bekomm wir noch Lokalverbot ;-)
NochnKlaus