Programmabsturz bei Tabellenbearbeitung

Hallo!

Ich habe ein Script erstellt, mit dem ich Felder einer Tabelle einer anderen hinzufügen will.
Dazu frage ich die Felder der Ursprungstabelle ab, clone sie und füge sie dann der Zieltabelle hinzu.
Das klappt auch eigentlich, aber danach kann ich nicht mehr auf die Ursprungstabelle zugreifen und ArcView stürzt ab.
Hat irgendwer eine Ahnung woran es liegen kann?

Gruß und Danke
André
Hallo André,

so ganz ohne Code schwer zu sagen. Ich denke du könntest mal mit dem Flush oder Refresh Befehl (auf die Vtab angewendet) versuchen. Typische Ursache für dein problem ist eigentlich, wenn man nicht sauber klont. Aber das hast du ja getan.

Ist die Quelldatei im Bearbeitungsmodus? Wenn ja klone die Felder ohne Bearbeitung dann dürfte eingentlich gar nichts passieren.

Beste Grüße
Heiko
Hallo Heiko,

Ich poste hier mal den Code, vielleicht siehst Du oder irgendwer anders ja irgendwo nen Fehler. ´
-------------------------------------------
if (av.GetActiveGUI.GetType "View")
Then Return NIL end
theView = AV.getActiveDoc
theThemes = List.Make
theThemes = theView.GetThemes
Addfields = List.Make
Overfields = List.Make
dellist = List.Make
newfields = List.Make

'QuellThema
InTheme = MsgBox.Choice(theThemes, "Bitte das Thema mit den Feldern wählen, die kopiert werden sollen","Quellthema wählen")
if (InTheme = NIL) Then Return NIL end
InVtab = InTheme.GetFtab
Fields = InVtab.GetFields
InFields = Fields.DeepClone

'QuellThema aus Themenliste entfernen
theInputThemeIndex = theThemes.Find(InTheme)
if(theInputThemeIndex > -1) then
theThemes.Remove(theInputThemeIndex)
end

'AusgabeThema
OutTheme = MsgBox.Choice(theThemes, "Bitte das Zielthema wählen","Zielthema wählen")
if (OutTheme = NIL) Then Return NIL end
OutVtab = OutTheme.GetFtab
OutFields = OutVtab.GetFields

copyFields = MsgBox.MultiList (InFields, "Wählen Sie die zu kopierenden Felder", "Felder wählen")

for each fl in Copyfields
flname = fl.GetName
i = 0
for each fo in Outfields
if (fo.GetName = flname) Then
Overfields.Add(fl)
i = 1
end
end
if (i=0) Then
Addfields.Add(fl)
else
delfields = MsgBox.MultiList (Overfields, "Folgende Felder sind in der Outputtabelle vorhanden, beim überschreiben wird der Inhalt gelöscht." + nl + "Wählen Sie die zu überschreibenden Felder aus!", "Felder wählen")
end
end

OutVtab.SetEditable(True)
for each del in delfields
delname = del.GetName
delfield = OutVtab.FindField(delname)
dellist.Add(delfield)
end
OutVtab.RemoveFields(dellist)
For each ad in Addfields
new = ad.clone
newfields.Add(new)
end
For each del in delfields
new = del.clone
newfields.Add(new)
end

OutVtab.AddFields(newfields)
InVtab.Refresh
System.beep
---------------------------------
Ich weiß
Ich hoffe, irgenwer weis Rat.
Hallo Andre,

Ganz schönes Kamikaze Script!
Der größte Fehler scheint mir hier zu liegen
theThemes.Remove(theInputThemeIndex)

TheThemes ist die Originalliste der Themen im View!
Clone diese vorher (DieThemen=TheThemes.clone)
und arbeite damit weiter.
Biete nicht das Shapefeld zur Kopie an!
Ich würde auch nicht deepclone verwenden sonder nur clone, um lediglich die Feldeigenschaften zu kopieren.
Die erste Zeile ist nicht nachvollziebar.

Gruß aus Lübz
Einen schönen Gruß nach LBZ

Das mit der Themenliste habe ich auch grad gemerkt. Zu dumm, wenn man die eigenen irgendwann geschrirebenen Scripte nur teilweise kopiert und nicht genau nachschaut....

: Ganz schönes Kamikaze Script!
jaja, ich weiß, ich arbeite noch dran..... :-)

: Biete nicht das Shapefeld zur Kopie an!
Den Codeteil habe ich rausgeschnitten, damit es nicht zuviel wird.

: Die erste Zeile ist nicht nachvollziebar.
Die erste Zeile ist drinne, damit ich nicht immer Fehlermeldungen kriege, wenn ich beim testen das Script ausführe so ala "das Objekt NIL kann die Anforderung....." Damit passiert dann nichts und ich muss die Fehlermeldung nicht wegklicken.

Auf jeden Fall aber danke. Werde das mit dem DeepClone ändern und das ganze Ding nochmal durchfeilen.

Viele Grüße aus Bützow
André
Hallo André,

ich denke der Fehler hat nichts mit dem Ursprungsthema zu tun. Das Problem liegt eher am löschen der Felder und dem anschließenden wieder hinzufügen mit gleichem Namen. Da würde ich mal ein Flush nach dem Felder entfernen einfügen oder sogar die Bearbeitung auf false und anschließend wieder auf true setzen.

Beste Grüße
Heiko
Hi nochmal,

hab den Fehler gefunden durch nacheinander auskommentieren alles Teile. Es lag an dem Entfernen des InputThemas aus dem Themenindex am Anfang. Da ich die Themenliste nicht geklont habe, wurde das Thema immer aus dem View-Index gelöscht und damit auch nicht mehr erkannt. Das hat AV scheinbar etwas durcheinandergebracht. Ich habre nun die Liste geklont und noch ein paar andere Sachen geändert und nun läuft es.

trotzdem Herzlichen Dank Heiko.
P.S. Falls gewünscht, kann ich den neuen Code hier auch nochmal posten.

Gruß
André
Hallo!

Auch auf die Gefahr hin, dass ich für dieses Script gesteinigt werde (...keine Angst, ich kann mit Kritik umgehen) - Hier ist das Übel. Aber es funktioniert, wenn auch erst nach der Hilfe dieses Forums, und ich denke das ist wichtig.

Das ganze hat sicher auch noch Potential und nicht alle möglichen Fehler sind ausprogrammiert. Wer Lust hat, dies zu tun, der sei nicht gehindert.

Gruß, André
---------------------------------------------
'*************************************************
'Script zum kopieren von Tabellenfeldern in eine andere Tabelle
'André Steinhäuser, www.institut-biota.de
'*************************************************

if (av.GetActiveGUI.GetType "View")
Then Return NIL end
theView = AV.getActiveDoc
Thms = theView.GetThemes
theThemes = thms.Clone
Copyfields = List.Make
Addfields = List.Make
InFields = List.Make
OutFields = List.Make
Overfields = List.Make
delfields = List.Make
dellist = List.Make
newfields = List.Make

'QuellThema
InTheme = MsgBox.Choice(theThemes, "Bitte das Thema mit den Feldern wählen, die kopiert werden sollen","Quellthema wählen")
if (InTheme = NIL) Then Return NIL end
InVtab = InTheme.GetFtab
Fields = InVtab.GetFields
InFields = Fields.Clone

'QuellThema aus Themenliste entfernen
theInputThemeIndex = theThemes.Find(InTheme)
if(theInputThemeIndex > -1) then
theThemes.Remove(theInputThemeIndex)
end

'AusgabeThema
OutTheme = MsgBox.Choice(theThemes, "Bitte das Zielthema wählen","Zielthema wählen")
if (OutTheme = NIL) Then Return NIL end
OutVtab = OutTheme.GetFtab
OutFields = OutVtab.GetFields

'Shape- und ID-Feld ausschließen
inShape = InVtab.FindField("Shape")
ShapeIndex = Infields.Find(inShape)
if(ShapeIndex > -1) then
Infields.Remove(ShapeIndex)
end
inID = InVtab.FindField("ID")
ShapeIndex2 = Infields.Find(inID)
if(ShapeIndex2 > -1) then
Infields.Remove(ShapeIndex2)
end

copyFields = MsgBox.MultiList (InFields, "Wählen Sie die zu kopierenden Felder", "Felder wählen")

for each fl in Copyfields
flname = fl.GetName
i = 0
for each fo in Outfields
if (fo.GetName = flname) Then
Overfields.Add(fl)
i = 1
Continue
end
end
if (i=0) Then
Addfields.Add(fl)
end
end
If (Overfields.Count > 0) Then
delfields = MsgBox.MultiList (Overfields, "Folgende Felder sind in der Outputtabelle vorhanden, beim überschreiben wird der Inhalt gelöscht." + nl + "Wählen Sie die zu überschreibenden Felder aus!", "Felder wählen")
if (Delfields = NIL) Then Return NIL End
end
OutVtab.SetEditable(True)
for each del in delfields
delname = del.GetName
delfield = OutVtab.FindField(delname)
dellist.Add(delfield)
end
OutVtab.RemoveFields(dellist)
For each ad in Addfields
new = ad.clone
newfields.Add(new)
end
For each del in delfields
new = del.clone
newfields.Add(new)
end

OutVtab.AddFields(newfields)
OutVtab.Flush
System.beep
OutVtab.SetEditable(False)
'-------------------------------------------------