tabelle im mxd Projekt?

Hallo zusammen,

weiß zufällig jemand, ob es möglich ist, eine Tabelle oder meinetwegen auch ein Textdokument direkt in einem mxd-Projekt abzuspeichern? das Problem ist folgendes: Für ein selbstgeschreibenes Programm brauche ich diverse Pfadangaben, die der benutzer bei bedarf ändern kann. da sich nur wenige mit VBA auskennen, muss das über eine eingabemaske geschehen und kann nicht direkt im Quellcode erfolgen. Folglich brauche ich einen Ort, an dem ich diese Pfade abspeichere. Da würde sich eine tabelle oder auch wenn das nicht geht, ein Txt-Dokument anbieten. Bisher habe ich eine Tabelle in der SDE verwendet, da aber das Projekt als Kopie von mehreren Leuten gleichzeitig bedient wird, können diese leute ja schlecht alle auf die gleiche SDE Tabelle zugreifen, denn wenn einer etwas ändert, ändert sich ja der Pfad bei allen.

Irgendeine Idee, wie ich das in den Griff bekomme? Bin für jede Hilfe dankbar.
Viele Grüße, Imke Dörge
Hallo Imke,

ich würde schon alles in der SDE belassen.
Speicher einfach zusätzlich noch den Nutzernamen ab, dann hast Du eine individuelle Zuordnung.

Viele Grüße
Jörg Ostendorp
Muss ich dann für jeden irgendwie in Frage kommenden Benutzer eine neue tabellenspalte einrichten? die tabelle hinterher zu ändern oder zu erweitern ist ja nicht so einfach.
Klingt zielich umständlich.
oder hab ich das irgendwas noch nicht richtig verstanden, was machen nutzer, die nochnicht "registriert" sind in dieser SDE Tabelle?

und eine tabelle erstellen, die nur zum Projekt gehört und deshalb auch niht durch mehrere benutzer gleichzeitig geändert werden kann, geht nicht?

Viele grüße Imke
Hallo Imke,

> Muss ich dann für jeden irgendwie in Frage kommenden Benutzer eine neue tabellenspalte einrichten?

Nein, bloß nicht! :-)
Ich bin davon ausgegangen, daß Du eine Art Optionstabelle hast, in der Du verschiedene Pfade ablegst. So etwa nach dem Schema:

Dokument | Pfad
Document1 | C:\irgendwo\irgendwas.doc
Document2 | C:\irgendwo\irgendwasanderes.xls
...

Mit einem zusätzlichen Feld "Nutzer" kann jeder seine eigenen
Einstellungen anlegen:

Document | Pfad | Nutzer
Document1 | C:\irgendwas.doc | Peter
Document1 | D:\woanders\irgendwas.doc | Susanne
Document1 | E:\ganzwoanders\irgendwas.doc |KarlHeinz
Document2 |......

Je nach angemeldeten Nutzer liest Du nun einfach den zugehörigen Datensatz aus der SDE Tabelle aus.

> was machen nutzer, die noch nicht "registriert" sind in dieser SDE Tabelle?

Nun, Du prüfst halt ob es einen Datensatz für diese Nutzer gibt. Wenn es keinen gibt, könntest Du zB einen FileDialog öffnen, in dem die User dann eben ihr Dokument auswählen müssen. Den ausgewählten Pfad samt Nutzer speicherst Du dann im Hintergrund als neuen Datensatz. Fürs nächste Mal steht er dann sofort griffbereit in der Tabelle.

Wenn ich Dich jetzt absolut mißverstanden habe sollte, erklär mir das mit den Pfaden nochmal :-)


Viele Grüße
Jörg Ostendorp


PS: Ich hoffe, ich liege zumindest damit richtig, daß die SDE auf einem Server liegt und Deine
Nutzer mit Kopien der mxd als Clients auf die gleiche SDE zurückgreifen?
Hallo Jörg,

es greifen alle auf die gleiche SDE zu.
Meine Tabelle sieht bisher so aus:
Pfad_Quellordner | Pfad_Zielordner | Pfad_Datenbank | ...
c:\irgendwo\jpg\ | d:\woanders\Ziel\ | h:\Datenbanken\XYZ.mdb |...

ich meinte mit neuer Tabellenspalte anlegen, eigentlich eine Zeile. also eine Spalte Nutzer und dann zeile für zeile einen anderen Nutzer. das entspricht ja so ungefähr deiner version nur um 90° gedreht.

Wie erfahre ich denn über VBA aus ArcMap wer gerade benutzer ist?
Bin mir noch nicht so ganz im Klaren darüber, wie ich neue Zeilen zu einer SDE tabelle hinzufügen kann. diese habe ich von Hand vorher erstellt. Hast du dafür vielleicht auch noch einen (schon programmierten) Tipp?

Viele Grüße, Imke
Hallo Imke,

> Wie erfahre ich denn über VBA aus ArcMap wer gerade benutzer ist?

da erwischst Du mich natürlich wieder total auf dem falschen Fuß weil ich hier kein SDE habe :-( Ich dachte, Nutzer und Passwort wären Dir durch die Anmeldung bereits bekannt, weil Du sie ja im Connection-string übergeben müßtest, um den Datensatz aus Deiner Tabelle auslesen zu können. Offensichtlich liege ich mal wieder völlig daneben. Arbeitest Du überhaupt mit einem Nutzer-System? Wie liest Du Deine Pfade aus der Tabelle denn bisher aus?
(Im Zweifelsfall ginge es natürlich, indem man den User nochmal per inputbox/Form danach fragt, wäre aber für den ziemlich nervig).

(Kurz nochmal eine Antwort auf Deine erste Frage, hab ganz vergessen, meinen Senf dazu abzulassen:
Nein, Tabellen kannst Du in der mxd imho nicht direkt speichern (eben nur verknüpfen). Ich kenne auch keine brauchbaren Property-Collections, Tags o.ä., die speicherresistent irgendwelche Informationen aufnehmen könnten, so daß Du ohne weitere Arbeit eine mxd einfach weitergeben resp. verschieben könntest.
Insofern bliebe entweder nur eine separate Tabelle/Textdatei oder die Registry.
Da ich die Registry ungern zumülle und man ggf mit den Sicherheitseinstellungen übereifriger Adminstratoren zu kämpfen hat, würde ich nach wie vor die Tabelle favorisieren.
Und bei der Frage wohin damit finde ich eine zentrale Tabelle in der SDE eben besser als viele lokale bei den mxds, nicht zuletzt wegen der einfacheren Wartung.)


Als Alternative zum SDE-Usernamen könntest Du unter Umständen auch mit dem von Windows arbeiten.
Den ermittelst Du zB per:

Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
"GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

Public Function fctGetUserName() As String
Dim lngLen As Long
Dim lngX As Long
Dim strUserName As String
strUserName = String$(254, 0)
lngLen = 255
lngX = apiGetUserName(strUserName, lngLen)
If (lngX > 0) Then
fctGetUserName = Left$(strUserName, lngLen - 1)
Else
fctGetUserName = vbNullString
End If
End Function



> Bin mir noch nicht so ganz im Klaren darüber, wie ich neue Zeilen zu einer SDE tabelle hinzufügen kann.

Am einfachsten über ein ADO-Recordset per "addnew". Schau mal unterm Stichwort "Recordset" in die DeveloperHelp, meine, da gibt es relativ ausführliche Beispiele. Hier im Forum müßte eigentlich auch was zu finden sein.
Schema:

With adoRS
.addnew
!DeinFeld = "DeinWert"
.update
end with


Viele Grüße
Jörg Ostendorp
hallo Jörg,

Vielen Dank für deine vielen Antworten.

ich habe mich für den Windows Usernamen entschieden, da ich die verbindung zu SDE einmal fest eingegeben habe (User + Passwort) und somit darüber nicht erfahren kann, wer gerade Benutzer ist.

Bei dem ADO-Recordset muss ich ja eine neue verbindung zur SDE herstellen, geht das nicht irgendwie über die sowieso schon vorhandene? hab in der developerHelp den RowBuffer mit pCursor.InsertRow pRowBuffer gefunden, meinst du, damit geht es auch? noch klappt es bei mir nämlich nicht.

-----
Set pRowBuffer = pTable.CreateRowBuffer
With pRowBuffer
.Value(.Fields.FindField("BENUTZER")) = "Imke"
.Value(.Fields.FindField("ACCESS_DB")) = "C:\Georef_BDB\SaLVeBK2002_doerge.mdb"
.Value(.Fields.FindField("REFBILD")) = "c:\tmp\test\"
.Value(.Fields.FindField("UEBERSICHTSBILD")) = "c:\tmp\test2\"
End With

Set pCursor = pTable.Insert(True)
pCursor.InsertRow pRowBuffer

------

Gruß Imke
Des Rätsels Lösung:

---------
[...]
' Verweis auf die IWorkspace-Schnittstelle --> Verbindung herstellen
Set pSDEFeatWsp = pSDEFact.Open(pPropSet, hWnd)

'Editier-Modus starten
Set pSDEWspEdit = pSDEFeatWsp
pSDEWspEdit.StartEditing (False)
pSDEWspEdit.StartEditOperation


'auf Tabelle zugreifen
Set pTable = pSDEFeatWsp.openTable("SDE_NUTZER1.PFADE_GEOREF_2")


' Insert Row
Set pNewRow = pTable.CreateRow
i = pTable.FindField("BENUTZER")
pNewRow.Value(i) = "Aaaa"
i = pTable.FindField("UEBERSICHTSBILD")
pNewRow.Value(i) = "Bbbb"
i = pTable.FindField("REFBILD")
pNewRow.Value(i) = "Cccc"
i = pTable.FindField("ACCESS_DB")
pNewRow.Value(i) = "Dddd"
pNewRow.Store


'Editier-Modus beenden
pSDEWspEdit.StopEditOperation
pSDEWspEdit.StopEditing (True)

-------------

Viele Grüße,
Imke Dörge
Hallo Imke,

Danke für die Rückmeldung. Blöde Frage, aber woher nimmst Dein PropertySet (pPropSet)?

Viele Grüße
Jörg Ostendorp
Hallo Jörg,

keine blöde Frage.
Hier ist meine komplette Function.

Viele Grüße, Imke

-------------------------
Public Function neueZeile()


Dim pTable As ITable
Dim pNewRow As IRow
Dim pSDEFeatWsp As IFeatureWorkspace
Dim pSDEFact As IWorkspaceFactory
Dim pPropSet As IPropertySet
Dim pSDEWspEdit As IWorkspaceEdit
Dim i As Long


' SDEWorkspaceFactory erzeugen
Set pSDEFact = New SdeWorkspaceFactory
Set pPropSet = New PropertySet

With pPropSet
.SetProperty "SERVER", "server1"
.SetProperty "INSTANCE", "port:5151" 'im ArcCatalog auch Service genannt
'nachfolgende Zeilen auskommentiert --> der User wird nach den Angaben gefragt
.SetProperty "USER", "sde_Nutzer1"
.SetProperty "PASSWORD", "sde_nutzer1"
.SetProperty "DATABASE", "" '"db" for SQL Server and Informix only
.SetProperty "VERSION", "SDE.DEFAULT"
End With


' Verweis auf die IWorkspace-Schnittstelle --> Verbindung herstellen
Set pSDEFeatWsp = pSDEFact.Open(pPropSet, hWnd)

'Editier-Modus starten
Set pSDEWspEdit = pSDEFeatWsp
pSDEWspEdit.StartEditing (False)
pSDEWspEdit.StartEditOperation


'auf Tabelle zugreifen
Set pTable = pSDEFeatWsp.openTable("SDE_NUTZER1.PFADE_GEOREF_2")


' Insert Row
Set pNewRow = pTable.CreateRow
i = pTable.FindField("BENUTZER")
pNewRow.Value(i) = "Aaaa"
i = pTable.FindField("UEBERSICHTSBILD")
pNewRow.Value(i) = "Bbbb"
i = pTable.FindField("REFBILD")
pNewRow.Value(i) = "Cccc"
i = pTable.FindField("ACCESS_DB")
pNewRow.Value(i) = "Dddd"
pNewRow.Store


'Editier-Modus beenden
pSDEWspEdit.StopEditOperation
pSDEWspEdit.StopEditing (True)


End Function
Hallo Imke,

> With pPropSet...

Ah, hardcodiert, aber dann sind Dir Nutzer und Passwort-Angaben doch bekannt. Dachte genaue darin liegt Dein Problem?!
Könntest Du mir noch einen Gefallen tun und ausprobieren, ob das Workspace des Editors Dir die gleichen Properties wieder zurückgibt, die Du oben eingegeben hast? (würde mich mal interessieren, ob man darüber an den aktuellen Nutzer samt Passwort der Connection kommt). Kanns in Ermangelung der SDE leider nicht selbst testen.

(Editiersitzung starten und Prozedur über'n Button aufrufen..)

Public Sub ListWorkspaceProp()
Dim pID As New UID
Dim mEditor As IEditor
Dim pWorkspace As IWorkspace
Dim Msg As String
Dim Response As Long
Dim i As Long
Dim sPropNames As Variant
Dim vPropValues As Variant
pID = "esriCore.Editor"
Set mEditor = Application.FindExtensionByCLSID(pID)
Set pWorkspace = mEditor.EditWorkspace
pWorkspace.ConnectionProperties.GetAllProperties sPropNames, vPropValues
Msg = ""
For i = LBound(sPropNames) To (UBound(sPropNames) - 1)
Msg = Msg + LCase(sPropNames(i)) + ": " + vPropValues(i) + Chr(13)
Next i
Response = MsgBox(Msg)
End Sub

Danke!

Viele Grüße
Jörg Ostendorp
Kann ich machen, wenn du mir noch mal genau beschreiben kannst, was ich machen muss.
was meinst du mit Editiersitzung starten?
wenn ich bei mir auf einen Button klicke, dann startet eine lange reihe von Functionen nacheinander und irgendwo mittendrin brauche ich dann eine verbindung zur SDE. die erstelle ich mir und weiter geht's.
wo soll denn jetzt noch ein buttonaufruf hin?
Kapier ich nicht. Bitte nochmal ganz langsam für mich zum verstehen.

Gruß Imke
Hallo Imke,

> Bitte nochmal ganz langsam für mich zum verstehen.

Ich probier's ;-)
Also:

1. Eine Deiner komischen mxds öffnen
2. Einen neuen UIButtonControl erstellen.
3. In dessen Click-Ereignis die oben angegebene Prozedur eintragen.
4. mxd-Datei beliebige Male schließen und öffnen oder es lassen
5. Ggf. mxd neu öffnen und wie gewohnt eine Verbindung zur SDE herstellen (mit Deinem anderen Button oder wie auch immer Du das machst)
6. Wenn noch nicht gestartet, die Bearbeitung starten (= Editor -> Bearbeitung starten = Editiersitzung starten).
7. Auf den neuen Button klicken, Messageboxen auswendig lernen und mit den von Dir oben angegebenen Properties (pPropSet) vergleichen.
8. Button samt Code wieder löschen.


Viele Grüße
Jörg Ostendorp
Guten Morgen Jörg,

Hab deine Erklärung verstanden und es ausprobiert. nachdem ich in Folgender Zeile die + durch & ersetzt hatte, hat es geklappt.
Msg = Msg & LCase(sPropNames(i)) & ": " & vPropValues(i) & Chr(13)

Also, Server, Instance und User werden korrekt wiedergegeben, als Password wird in der Msgbox ein weißes Rechteck (nicht lesbares zeichen) ausgespuckt, was aber nicht dem Original entspricht.

beantwortet das deine Frage?

Viele Grüße, Imke
Hallo Imke,

ja, tut es. Danke für's Testen!

Viele Grüße
Jörg Ostendorp