![]() |
Datenbank: Excel • Version: 2003 • Zugriff über: ADO
ADO | Edit | Post - aktualisierbare Abfrage
Hej DP!
kann eigentlich nicht so schwer sein, funktioniert aber trotzdem nicht: edit in einer Excel-Datei, die via ADO angesprochen wird. Was vorhanden ist: Datasource, ADOConnection, ADODataset (cmdTable) und dann folgende simple zeilen.
Delphi-Quellcode:
=> Operation muss eine aktualisierbare Abfrage verwenden.
with dataset_xyz do
begin Edit; FieldValues['feldname'] := 99; Post; end; Danke für Tipps! gruß tom |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Wie sieht die Abfrage aus?
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
öhm, keine Query, sondern Table (dataset.commandtype := cmdTable).
Geht edit/post nur auf einer Query? |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Es geht nur bei einem updateable View. Dies hängt von der Abfrage und der Datenbank ab. eine Abfrage, die sich auf eine Tabelle bezieht (was bei einer Table der Fall ist ; select * from Tabelle) ist das der Fall, also scheint es, ob eine ADO-Verknüpfung mit Excel nicht updateable ist.
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
ob es hier scheitert?
Zitat:
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
Dann versuch es doch mal mit einem TADOQuery, ob es da funktioniert.
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
Guten Morgen.
Ein ADO Dataset verliert seine Update-Fähigkeit, wenn der OLE DB Provider für Excel bei der Analyse der Daten feststellt, dass in einer Spalte verschiedene Datentypen gemischt auftreten. Nachtrag: Es gibt einen KB Artikel zu diesem Thema: ![]() Grüße vom marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
hej!
danke für den Hinweis. Reicht es da schon, wenn der Spaltentitel in der ersten Zeile steht? Dann kann ich ja nicht mehr darauf zugreifen?! Und gibt es eine Möglichkeit drumherum? Wie es halt immer so ist, dass es eine Excel-Tabelle sein soll und keine richtige Datenbank steht fest und dass User möglicherweise Datentypen vermischen kann auch passieren. gruß tom |
Re: ADO | Edit | Post - aktualisierbare Abfrage
ok, ein Stückchen schlauer weiss ich nun, was HDR=Yes heisst ...
Mittlerweile ist auch ReadOnly=False drin, was die ursprüngliche Fehlermeldung elminiert hat, stattdessen erhalten ich jetzt: "Installierbares ISAM nicht gefunden" Microsoft.Jet.OLEDB.4.0 ist aber im ConnectionString drin, was ist nun verkehrt? danke |
Re: ADO | Edit | Post - aktualisierbare Abfrage
ach ja und via Query kriege ich das gleiche. "Installierbares ISAM nicht gefunden"
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
Leider kann ich das mangels Excel auf meiner Maschine nicht überprüfen. Wenn die Treiber auf dem aktuellen Stand sind, dann vermute ich einen Fehler im ConnectionString. Kannst du den mal einstellen?
marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Ich habe es mittlerweile auf einem zweiten Rechner probiert, dito. Hier einfach der betreffende Teil:
Delphi-Quellcode:
Danke für Hilfe!
Datasource1.DataSet := ADODataset1;
ADODataset1.CommandType := cmdTable; ADODataset1.CommandText := tablename; ADODataset1.Connection := ADOConnection1; ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+filename+';ReadOnly=False;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";Persist Security Info=False'; ADOConnection1.LoginPrompt := False; ADODataset1.Active := True; with ADODataset1 do begin Locate('xyz', 'abc',[]); Edit; FieldValues['lnm'] := 99; Post; end; |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Guten Morgen,
bei mir geht es so:
Delphi-Quellcode:
Da sind schon ein paar Unterschiede - kannst du sie sehen?
begin
with TADODataset.Create(self) do begin CommandType := cmdTableDirect; CursorType := ctStatic; LockType := ltPessimistic; ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' + 'Data Source=.\Mappe1.xls;' + 'Mode=ReadWrite;' + 'Extended Properties="Excel 8.0;HDR=Yes";' + 'Persist Security Info=False'; CommandText := 'SELECT * FROM [Tabelle1$A1:C5]'; Open; Locate('a', '3', []); Edit; FieldValues['c'] := 123; Post; Close; Free; end; end; Grüße vom marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Umfasse mal den Dateinamen mit ", wenn ein Leerzeichen im Dateinamen vorkommt (z.B. \Eigene Dateien\...) bringt das ADO mächtig durcheinander...
Grüße Mikhal |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Liste der Anhänge anzeigen (Anzahl: 1)
Hej!
Danke für die Antworten. Irgendwie funktioniert es trotzdem nicht. Mit ReadOnly=False; im Connection String kommt immer: 'Installierbares ISAM nicht gefunden', unabhängig ob ich cmdTable oder cmdTableDirect nehme. Mit Mode=ReadWrite im Connection String kommt: 'Tabellenname nicht gefunden' bei cmdTableDirect und 'Operation muss eine aktualisierbare Abfrage enthalten' bei cmdTable; Keinen Unterschied macht es, wenn ich den Dateinamen in Anführungszeichen setze. Habe mal auch testweise eine Access-Tabelle gemacht, mit der funktioniert es auf Anhieb. Lese-Zugriff auf diese Excel-Tabelle geht auch tadellos. Hab keine Idee, woran das liegt. Habe mal ein simples Testprojekt angehängt, vielleicht hat jemand Zeit, zu schauen, ob es bei ihm geht. danke im Voraus, ligrü tom |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Ahoi Tom,
nimm den Parameter ReadOnly aus dem ConnectionString, er ist verantwortlich für den ISAM-Fehler - und weg mit IMEX=1 aus den Extended Properties, dadurch verliert der RecordSet seine Update-Fähigkeit. Grüße vom marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
jooo!!
Gott sei's gedankt, getrommelt und gepfiffen. Es funktioniert. Danke!! |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Zusatzfrage:
wenn ich eine auf diese Weise veränderte Excel-Datei hinterher wieder auslese erhalte ich noch die Werte vor der Änderung. Erst wenn ich die Datei im Excel öffne und speichere, stimmt's. Die Änderung ist aber nach dem Post da - was spielt's hier? |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Die Methode Post() macht deine Änderungen persistent - das ist völlig in Ordnung so. Vorher solltest du garnicht mit Excel auf die Daten zugreifen können, da der Provider nicht multi-user-fähig ist.
marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
hmm, ok. Wie erreiche ich dann, dass die Änderungen übernommen werden?
Hintergrund: anhand des via Edit und Post geschriebenen Wertes soll innerhalb Excel etwas berechnet werden und das Ergebnis sofort wieder ausgelesen. |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Du musst den Dataset schließen (Close) - erst dann kann Excel die Tabelle laden und die Berechnung durchführen. Dann muss Excel die Tabelle schließen und du kannst wieder auf die Daten zugreifen. Keine gute Lösung finde ich.
Du solltest vielleicht mal über OLE-Automation nachdenken ... marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Nun, das Dataset wird geschlossen.
Zitat:
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
Zitat:
|
Re: ADO | Edit | Post - aktualisierbare Abfrage
ok, das schaue ich mir mal an.
Vielen Dank erst mal!! |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Nochmals aufwärm, ich bleib aber beim Thema:
Also die Datei mit einer ExcelApplication hinterher öffnen, speichern und wieder schließen funktioniert zwar, ist aber ziemlich unbefriedigend. a) weil unhübsch b) weil langsam. Gibt es echt keinen Weg, das mit ADO zu lösen? Wenn nicht sehe ich den Sinn eines ADO-Edit-Posts nicht so ganz. Wie soll man das sinnvoll einsetzen, wenn man die Datei irgendwo extra noch speichern muss? Danke im voraus für weitere Hilfe! gruß tom |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Hallo Tom,
soweit ich dein Problem verstehe suchst du nach einer Möglichkeit Excel als Taschenrechner zu missbrauchen. Offensichtlich sind die Formeln in Excel so komplex geraten, dass du sie nicht direkt in Delphi implementieren kannst. Also benötigst du eine Art der Programm-Programm-Kommunikation. Ich habe dir gezeigt, wie du ein Spreadsheet lesen und verändern kannst, aber da wusste ich noch nicht, was du wirklich vorhast. Wenn möglich implementiere die Formeln direkt in Delphi, wenn nicht benutze die Automationsschnittstellen von Excel. Der Jet OLEDB Provider für Excel hilft dir hier nicht so recht. Er ist einfach vom Design her ungeeignet für deine Zwecke. Benutze ihn, wenn du Daten importieren oder exportieren möchtest. Zitat:
Grüße vom marabu |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Hallo marabu,
Zitat:
Zitat:
Welcher Provider greift dann noch auf die Datei zu? Die OLE Automatisation hat mir eigentlich recht wenig gefallen, weil dann Excel immer aufgemacht werden muss. Das ist a) zeitintensiver und b) erlaubt es (soweit ich durchblicke) nicht so elegante Queries etc. gruß tom |
Re: ADO | Edit | Post - aktualisierbare Abfrage
Hallo Tom,
Zitat:
MS KB Artikel 195951 ![]() Zitat:
Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz