Brauche Hilfe mit Access

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sasphyria
User
Beiträge: 5
Registriert: Montag 29. Oktober 2007, 12:23
Wohnort: Ronneburg

Hallo erstmal an alle :)

ich bin absoluter Neuling in Sachen Python. Ich hab bereits vorher mit AML programmiert was mir allerdings mit Python grad irgendwie zum Verhängnis wird... :roll:

Aaaalsooo ich hab vor in ner Access Datenbank mehrere Tabellen mit der gleichen Endung nacheinander zu selektieren um dann für jeder Tabelle einzeln (aber immer wieder mit dem selben Rechenweg) was zu berechnen und in nen Textdokument zu schreiben.
Wenn ich nur eine Tabelle hätte wär das ja kein Problem, da siehts der Zugriff so bei mir aus:

Code: Alles auswählen

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);DBQ=Pfad\\atkis_sn.mdb')
cur_siedl = myconn.cursor()
cur_siedl.execute('SELECT Shape_area, Shape_Length FROM ana_suv2')
data_siedl = cur_siedl.fetchall()
print data_siedl[0][0] # Testausgabe 
print data_siedl[0][1]
cur_siedl.close()
Leider krieg ich keine Schleife drumgebastalt damit alle Tabellen von allein durchlaufen werden. So muss ich ja jetzt das "ana" un die weiteren Tabellen immer wieder selber hintipseln. Da ich auch mit dem Geoprocessing arbeite hab ich mir dann folgendes überlegt:

Code: Alles auswählen

gp = arcgisscripting.create()
gp.workspace = "G:/ai_daten/225_oeko_x/da_geier/pyton_script/atkis_sn.mdb/sn_krs"
Datasets = gp.ListFeatureClasses("*_suv2")
dataset = Datasets.next()
print "dataset = " + dataset
Hab mich ja scho wie ein Schneekönig gefreut als ich gemerkt hab, dass ich so die einzelnen Tabellen aufrufen kann. Problem dabei ist nur meine Variable "dataset" mit dem odbc cursor zu verbinden.
Wenn ich nämlich jetzt

cur_siedl.execute ('Select Shape_area, Shape_Length FROM ' + dataset)

eingeb, krieg ich den fehler:
TypeError: cannot concatenate 'str' and 'odbccur' objects

Nunja.. un genau an der Stelle häng ich jetzt schon ne ganze Weile. Ich geh mal stark davon aus das ich mir alles viel komplizierter mach als es is... Drum hoff ich das mir jemand helfen kann.

Thx scho ma im voraus ;)
BlackJack

Ganz offensichtlich ist `dataset` keine Zeichenkette sondern etwas anderes, wahrscheinlich ein Datenbank-Cursor-Objekt. Da wir nicht wissen wie das Objekt zustande kommt, kann man da nichts sagen.
Sasphyria
User
Beiträge: 5
Registriert: Montag 29. Oktober 2007, 12:23
Wohnort: Ronneburg

Öhm also ich steh grad irgendwie auf der Leitung... Wie das Objekt zustande kommt? Was meinst du damit, dachte ich hab das oben scho geschrieben gehabt... :oops:
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

Code: Alles auswählen

cur_siedl.execute ('Select Shape_area, Shape_Length FROM ' + dataset) 
du erwartest in dataset also einen tabellennamen, richtig?

keine ahnung was arcgisscripting.create().ListFeatureClasses tut, evtl hast du da ja wirklich eine lsite mit tabellen drin.
aber in welcher form? als string jedenfalls nicht, daher der fehler, an dem ist nicht besonderes:

Code: Alles auswählen

>>> print "hallo" + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
>>>
informier dich also erstmal darüber wie diese daten repräsentiert sind und schau wie du an den tabellennamen als string rankommst.

probiere zb mal

Code: Alles auswählen

print dataset
dir(dataset)
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Code: Alles auswählen

cur_siedl.execute ('Select Shape_area, Shape_Length FROM ' + str(dataset))
Schmeiß ich mal als Idee rein...

(Arcgisscripting ist übrigens die neue Schnittstelle von ArcGis 9.2, früher wurde alles über COM verwaltet, ESRI hat aber einen ... bisschen pythonischeren Wrapper geschrieben, der wenigstens vernünftige Tracebacks wirft und kein PyWin32 mehr benötigt.)
Sasphyria
User
Beiträge: 5
Registriert: Montag 29. Oktober 2007, 12:23
Wohnort: Ronneburg

@ Jona:
ja ich erwarte bei "dataset" nen Tabellenname... Wenn ich mir den vorher ausgeben lass is der auch so wie er sein soll ;)

gp.ListFeatureClasses() ruft mir alle Tabellen in ner DB auf die die entsprechende Endung haben. In meiner Datenbank gibt es insgesamt 3 verschiedene Endungen "suv", "suv1" und "suv2". Nicht besonders einfallsreich - ich weiß - aber von mir stamm se ja auch nich...

Naja un mit gp.ListFeatureClasses("*_suv2") ruf ich eben alle tabellen mit der Endung auf. In dem Fall sind es insgesamt 29 Tabellen über die ich mit
dataset = Datasets.next()
wechseln kann...
das "dataset" müsste dabei schon nen String sein, denn die Variante von Blackvivi hatte ich auch scho versucht aber der Fehler bleibt der selbe...
Mal ganz davon abgesehn dacht ich bisher dass das Problem nich bei dem "string" sondern dem "obdccur" liegt...

Ich bin mir allerdings auch nich sicher ob ich die ArcGis spezifischen tools un die "normalen" SQL Abfragen einfach so verbinden kann. Ne einheitliche Variante wär mir ja am liebsten, aber ohne den gp-Befehl weiß ich net wie man mehrere Tabellen gleicher Endung aufruft...
BlackJack

Sasphyria hat geschrieben:Öhm also ich steh grad irgendwie auf der Leitung... Wie das Objekt zustande kommt? Was meinst du damit, dachte ich hab das oben scho geschrieben gehabt... :oops:
Nicht wirklich. Du hast das zwar schon etwas beschrieben, aber da scheint das mit dem ``print 'zeichenkette' + dataset`` ja zu funktionieren, also kann es einfach nicht sein, dass Du das im fehlerhaften Programm genauso machst. Irgend etwas machst Du anders und das ist der Grund für das Problem.
Sasphyria
User
Beiträge: 5
Registriert: Montag 29. Oktober 2007, 12:23
Wohnort: Ronneburg

@ BlackJack hier mal mein gesamter Code bis zu der Fehlermeldung... Also meiner Meinung nach hab ich da och nix anderes dastehn aber vielleicht fällt dir ja was auf...

Code: Alles auswählen

import dbi, odbc, math, arcgisscripting
gp = arcgisscripting.create()
gp.workspace = "G:/ai_daten/225_oeko_x/da_geier/pyton_script/atkis_sn.mdb/sn_krs"
Datasets = gp.ListFeatureClasses("*_suv2")
dataset = Datasets.next()
print "dataset = " + dataset

myconn = odbc.odbc('DRIVER=Microsoft Access-Treiber (*.mdb);DBQ=G:\\ai_daten\\225_oeko_x\\da_geier\\pyton_script\\atkis_sn.mdb')
cur_siedl = myconn.cursor()

cur_siedl.execute ('Select Shape_area, Shape_Length FROM ' + dataset)
print "cur_siedl = " + cur_siedl #zum testen
dataset = Datasets.next()
...

Sasphyria
User
Beiträge: 5
Registriert: Montag 29. Oktober 2007, 12:23
Wohnort: Ronneburg

Wollt nur mitteilen das sich mein Prob grad in Luft aufgelöst hat....

So dumm wie ich nunma bin hab ich den Fehler an ner falschen Stelle gesucht und mich dort so verbissen das ich den restlichen Code nimmer beachtet hab... nun jut... Fehler gefunden... Berechnungen funktionieren *freu*

Danke nochma für die Leute die sich meiner angenomm ham :)
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

... hey mir ist gerade was eingefallen:
An den Namen des Datasets müsstest du mit

Code: Alles auswählen

gp.describe(dataset).name
kommen. Das ist dann nen String.
Antworten