Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha (https://www.delphipraxis.net/171396-mysql-zeos-6-6-delphi-posterror-can-not-update-complex-query-more-tha.html)

bdg 5. Nov 2012 15:50

Datenbank: MySql • Version: 3 • Zugriff über: Zeos6.6

MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more tha
 
Hallo,
Ich habe Programme mit Delphi5 MySql3 und Zeos5.3 erstellt und möchte nun auf Zeos 6.6 umstellen.

ich habe ein Edit/Post-Problem.


Beispiel :
Query.Sql.Text := 'Select ' +
' firma.FirmenNr, firma.Name1, Firma.Name2, ' +
' Ansprechpartner.Vorname,Ansprechpartner.Nachname ' +
' from firma ' +
' left join Ansprechpartner on firma.FirmenNr=Ansprechpartner.FirmenNr '
....
Query.Edit
Query.FieldByName('Name1').AsString := 'Test';
Query.Post;


Es kommt die Meldung :
'Can not update a complex query with more than one table'
Das passiert auch bei Append/Insert / Post.

Sobald ein LeftJoin / mehr als 1 Tabelle im Sql enthalten ist, geht das Schief mit Zeos6.6

Es ist mir klar dass ein Edit/Post auf LeftJoinFelder nicht geht.
Das geht weder bei Zeos5.3 noch bei Zeos6.6

Bei Zeos5.3 geht Edit/Append bei Felder, die auf die "FROM"-Tabelle verweisen.
Bei Zeos6.6 geht das nicht :-(((

Ich hab mal die Zeoskomponenten durchdebugged.
Es gibt da eine Stelle wo von allen Feldern des Sql, die Tabellen-Namen ermittelt werden.
Sobald dort ein 2. (Left-Join-)Tabellename auftaucht, wird mit der obigen Fehlermeldung abgebrochen!
( Also es wird nicht mal versucht, den Post durchzuführen !

Hat da jemand Abhilfe ???

EgonHugeist 5. Nov 2012 23:38

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Meine Güte 6.6.6 ist schon veraltet. Nimm die 7er.

Also das Problem (Buggy verhalten), welches du hier ansprichst, wurde aus gutem Grund unterbunden. Diverse Felder wurden falsch parameterisiert und updates mit joins führen wahrlich nur zu Problemen, da keine eindeutigen MetaDaten gelesen werden können. Somit können default/autoinc-values, primary-keys usw. nicht eindeutig identifiziert werden.

Um den Problem in alter Gewohnheit abzuschaffen, soltest du einfach noch die TZSQLUpdate Komponente einbeziehen. Lege da die nötigen Parameter an und du kannst jede X:N:R Relation updaten...

Gruß, Michael

Frage MySQL 3? Seh ich das richtig? Und welchen Compiler nimmst du? Zeos7 unterstütz nur noch D7-XE3/FPC2.4-2.7

bdg 6. Nov 2012 08:25

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Hallo,
das bringt mir nicht viel.

Sqls absetzen das geht auch so,das wäre nicht das Problem.

Das Problem ist dass bei diesen Querys auch TDBedit-Objekte oder Grids gebunden sind, und somit keine Änderung mehr möglich wäre !

Somit müsste ich alles umschreiben und per Sql-Befehle updaten !
Bei einem Projekt mit mehreren 100.000 Zeilen ist das sehr aufwendig !

Oder hab ich da was falsch verstanden mit der TZSqlUpdate-Komponente ???

Die gab es in der Zeos5.3 nicht.
So wie ich weiss, setzt die einfach nur Sqls ab .


Ich will ja keine Jeft-Join-Felder updaten sondern nur die "FROM"-Felder, so wie es eben jetzt schon ist (Zeos5.3)

Geht das denn mit dem Zeos7 komponenten ??
Ich hab Delphi5 , so wie ich oben sehen gehen die Zeos7-Komponenten erst ab D7 :-(


Also: Meine Aufgabe ist es ein Projekt in ( Delphi5 / MySql3 /Zeos5.3 ) umzustellen
zuerst auf Mysql5 ( dafür brauch ich die Zeos6.6 Komponenten, da die 7er erst ab Delphi7 gehen)
Wenn das dann soweit ist, dann von Delph5 auf Delphi XE

Sir Rufo 6. Nov 2012 08:52

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Dann lass doch die JOINs raus und erstelle dir LookupFelder, das sieht dann genauso aus und du kannst trotzdem updaten wie gewohnt.

EgonHugeist 7. Nov 2012 01:14

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Zitat:

Zitat von Sir Rufo (Beitrag 1189909)
Dann lass doch die JOINs raus und erstelle dir LookupFelder, das sieht dann genauso aus und du kannst trotzdem updaten wie gewohnt.

Wäre auch eine Möglichkeit. Jedoch sind die Lookups je nach Datenmenge eeeettttwwaasss lllaaannngsam. :lol:

Zitat:

Zitat von bdg (Beitrag 1189906)
Oder hab ich da was falsch verstanden mit der TZSqlUpdate-Komponente ???

Jap hatte jedoch den falschen Namen: TZUpdateSQL heist die Komponente und diese sollte auch schon mit 6.6.x verfügbar gewesen sein.

Zitat:

Zitat von bdg (Beitrag 1189906)
Die gab es in der Zeos5.3 nicht.
So wie ich weiss, setzt die einfach nur Sqls ab .

Keine Ahnung was es unter 5.3 gab oder nicht...
Jedoch Setzt die Komponente keine "eigenen" Sql's ab. Dort kannst du, wenn verlinkt mit TZQuery, die Parameter und deren Typ definieren. Du könntest die Datenbank quasi mit TZConnection.UseMetadata = False öffnen (ohne Meta-> rasend schnell) jedoch kann Zeos dann nicht wissen, welche Felder beschreibbar sind. Dafür gibt es diese Komponente.

"insert into Foo values(:Bar);" sollten den Parameter 'Bar' in der Kompo hervorrufen, welcher dann je nach Typ die Daten intern zusammenbastelt. Und so wie ich das sehe, unterstützt MySQL 3.x keine Prepared-Statements. Von daher verstehe ich deinen Einwand gerade nicht. Bin mir relativ sicher, das alles mit Strings gesendet wird.

Teste as einfach mal. Kann die jedoch nicht sagen, ob das alles mit dieser UraltDB+Zeos7 hinhaut.

bdg 9. Nov 2012 10:11

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Also :
Zu : "UraltDB" ecc ecc
ja richtig, das ist ja meine Aufgabe, das ganze auf einen neueren Stand zu bringen. Das dies eine Uraltdb ist weiss ich auch :-)

Zeos 7 kann ich leider nicht verwenden, da die für Delphi NUR AB VERSION 7 gehen und das Programm in Delphi 5 geschrieben ist.

ZUpdate habe ich nachgeschaut, gibt es auch in Zeos5.3, habe ich aber noch nie gebraucht :-)
SqlStatements in die ZSqlUpdate-Componente zu hinterlegen und diese dann mit den Querys zu verbinden
ist aufwendiger als überall "Query.Edit" mit Sql-Anweisungen zu ersetzten.
Ferner ist es für Fehlersuche ecc besser wenn eine Sql-Anweisung in der PAS drin steht als in der komponente(dfm)

Ich werde es dann wohl so machen

Um nochmal auf das Problem zu kommen :
http://www.lazarusforum.de/viewtopic...=6132&start=15

Dort ist der Code der das ganze blockt notiert :-)

{**
Defines a table name from the select statement.
}
function TZGenericCachedResolver.DefineTableName: string;
var
I: Integer;
Temp: string;
begin
Result := '';
for I := 1 to Metadata.GetColumnCount do
begin
Temp := ComposeFullTableName(Metadata.GetCatalogName(I),
Metadata.GetSchemaName(I), Metadata.GetTableName(I));
if (Result = '') and (Temp <> '') then
Result := Temp
else if (Result <> '') and (Temp <> '') and (Temp <> Result) then
raise EZSQLException.Create(SCanNotUpdateComplexQuery);
end;
if Result = '' then
raise EZSQLException.Create(SCanNotUpdateThisQueryType);
end;

was passiert hier ?!?!?!?

Hier mein Besipiel-SQL

Query.Sql.Text := 'Select ' +
' firma.FirmenNr, firma.Name1, Firma.Name2, ' +
' Ansprechpartner.Vorname,Ansprechpartner.Nachname ' +
' from firma ' +
' left join Ansprechpartner on firma.FirmenNr=Ansprechpartner.FirmenNr '

Es wird jedes Feld mit den Tabellennamen versehen ( bei mir ist er schon drin ).
Beim durchlaufen der Felder , ' firma.FirmenNr, firma.Name1, Firma.Name2, ' passiert noch nichts
erst dann wenn " Ansprechpartner.Vorname" kommt merkt er das ist ein 2.Tabellenname
und nun brech ich ab mit "Can not update a complex query with more than 1 table"


Eine Lösung gibt es wohl nicht,
man könnte versuchen, an dieser Stelle die Function so umzuschreiben, das die schleife nicht durchläuft, aber eine bestehende komponente zu überarbeiten, ohne zu wissen, was denn an anderen stellen noch passieren kann ist nicht ratsam :-((((

Deswegen :
Ich stell mal alle Query.Edits/Append/Insert/Delete um auf Sql-Anweisungen

Medium 9. Nov 2012 10:54

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Mit Delphi 5 auf einen neuen Stand bringen? :gruebel:

bdg 9. Nov 2012 12:08

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Hallo,
ja
1.) delphi5 Mysql3 Zeos5.3 auf Delphi5 / Mysql3 / Zeos6.6
2.) delphi5 Mysql3 Zeos6.6 auf Delphi5 / Mysql5 / Zeos6.6
3.) delphi5 Mysql5 Zeos6.6 auf DelphiXE / Mysql5 / Zeos6.6 oder sogar 7

Oder wie würdest du ca. 1,5 Mio Zeilen Sourcecode umstellen ???

Medium 9. Nov 2012 13:55

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Genau so wie 1500 Zeilen Code: Auf Delphi nicht unter 2009, aktuellstes Zeos (oder besser gleich UniDAC), und die aktuelle MySQL. Wenn die Codebasis nicht völlig ungeschickt (ums nett zu sagen) gebaut ist, sollte die Menge an Stellen an denen man drehen muss ziemlich gering ausfallen. Für das Gros an Arbeiten vielleicht 2, maximal 3 Manntage, dann noch gründlich durchtesten und Kleinigkeiten bereinigen - in einer Woche (gerechnet in reiner Arbeit am Code) hast du das Ding spätestens entstaubt und bist zumindest wieder ein wenig zukunftsfähig.

bdg 9. Nov 2012 14:49

AW: MySql / Zeos 6.6 / Delphi / PostError // Can not update a complex query with more
 
Hallo,
ne ne das geht nicht so einfach wie du dir das vorstellst. letzenendes hab ich noch ein paar hundert Kunden, bei denen das installiert ist und mal auf die schnelle eine DB umstellen geht nicht so einfach
ABER :
Unidac scheint ein guter Tip zu sein .
Hab mal ein bisschen nachgeschaut.
Mal davon abgesehen, dass UniDAC ab Delph5 geht und ab MySql3 geht, scheint mir das neuer und kompatibler zu sein als Zeos, da so wie ich weiss Zeos 7 ja auch schon seit langem nicht mehr gepflegt wird !
d.h. auf mich zugeschnitten :
Delphi5 / MySql3 / Zeos53 auf Delphi5/MySql3/UniDac scheint mir sinnvoller zu sein, da UniDac auch noch
mit DelphiXE funktioniert!
Danach kann ich dann mit den gleichen Komponenten auf MySql5 umstellen und danach alles nehmen und mit DelphiXE compilieren ( einfach gesagt :-) )

Kann mir jemand etwas mehr Info geben bzg. UniDac ???
So wie ich verstanden habe ( gesehen habe) arbeitet es genaus so wie Zeos. es verlangt nach einer LibMySql.dll

Weiss zufällig jemand ob auch eine LibMySql5.dll geht ???

Es ist so, mein Projekt hat mehrere EXE-Dateien.
Zeos5.3 greift auf einer LIBMYSQL.DLL zu ( das geht nicht anders) .
Zeos6.6 kann auf mehrere LibMysqlxx.DLL zugreifen ( libmysql.dll, libmysql40.dll, libmysql50.dll libmysql51.dll)
Ich habe eine LIBMYSQL.DLL von der MySql5.5 genommen und in libmysql51.dll umbenannt.
ALLE MEINE EXE-Dateien liegen in einem Ordner. inkl. libmysql.dll ( für Zeos5.3-Exe) und libmysql51.dll für Zeos66-Exe)


Denn ob ich nun Zeos5.3 komponenten austausche durch Zeos6.6-komponenten oder UniDac-Komponenten, die Arbeit ist die gleiche !!!

Und zu aller Letzt noch ein Wort : Danke für all eure bisherigen Antworten und Tips :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz