![]() |
AW: MySQL Query Update funktioniert nicht
Zitat:
Da hab ich also in der Tat was durcheinandergebracht, nehme alles zurück und behaupte das Gegenteil :stupid: |
AW: MySQL Query Update funktioniert nicht
Zitat:
Beispiel: Steht " das " in der Spalte, wird char_length korrekt mit 5 ermittelt, in der Grid-Anzeige fehlt aber das letzte Leerzeichen. Hänge ich nun weitere Leerzeichen per IBExpert-Grid ran, dann bleibt das so bei den 5. Ändere ich das per Update SQL, wird der Text so abgespeichert wie ich will und nicht wie IBExpert meint dass es sein müsste... und es ändert sich auch die String-Länge (Hinweis IBExpert 2015.1.11.1) |
AW: MySQL Query Update funktioniert nicht
Hallo,
wenn mich nicht alles täuscht, ist das Trim eine Konfigurations-Option von IB-Expert. Heiko |
AW: MySQL Query Update funktioniert nicht
Zitat:
Die Funktionen berücksichtigen auch, dass in den Komponenten enthaltenen NULL-Wert des Feldes, welcher dann wahlweise als NULL oder als Leerstring übergeben werden kann.
Delphi-Quellcode:
Der Aufruf und das Generieren der Statements erfolgt dann in der Update-Komponente in den jeweiligen Events OnBeforeDelete, OnBeforeInsert und OnBeforeModify:
unit uDataModuleDB;
interface uses SysUtils, Classes, Forms, Dialogs, Variants, DB, ZConnection, ZAbstractTable, ZDataset, ZAbstractRODataset, ZAbstractDataset, ZSqlProcessor, ZSqlMonitor; type TDMDb = class(TDataModule) public function GenerateZUpdateSQLInsert(ATable: TZTable): String; overload; function GenerateZUpdateSQLInsert(ATable: TZTable; ANullAsString: Boolean): String; overload; function GenerateZUpdateSQLModify(ATable: TZTable): String; overload; function GenerateZUpdateSQLModify(ATable: TZTable; ANullAsString: Boolean): String; overload; function GenerateZUpdateSQLDelete(ATable: TZTable): String; overload; function GenerateZUpdateSQLDelete(ATable: TZTable; ANullAsString: Boolean): String; overload; function GenerateZTableSQLSelectOldValues(ATable: TZTable): String; function GenerateZTableSQLSelectCountOldValues(ATable: TZTable): String; function GenerateZTableSQLWhereOldValues(ATable: TZTable): String; end; var DMDb: TDMDb; implementation function TDMDb.GenerateZTableSQLWhereOldValues(ATable: TZTable): string; var liZ1: integer; lSQLWhere: String; begin lSQLWhere := ''; for liZ1 := 0 to ATable.FieldCount - 1 do begin if (liZ1 > 0) then begin lSQLWhere := lSQLWhere + ' AND '; end; lSQLWhere := lSQLWhere + '('; if(VarIsNull(ATable.Fields[liZ1].OldValue)) then begin lSQLWhere := lSQLWhere + '('; end; lSQLWhere := lSQLWhere + ATable.Fields[liZ1].FieldName + ' = ' + ':OLD_' + ATable.Fields[liZ1].FieldName; if(VarIsNull(ATable.Fields[liZ1].OldValue)) then begin lSQLWhere := lSQLWhere + ')'; lSQLWhere := lSQLWhere + ' OR (' + ATable.Fields[liZ1].FieldName + ' IS NULL )'; lSQLWhere := lSQLWhere + ' OR (' + ATable.Fields[liZ1].FieldName + ' = 0 )'; end; lSQLWhere := lSQLWhere + ')'; end; if (lSQLWhere <> '') then begin lSQLWhere := ' WHERE ' + lSQLWhere; end; Result := lSQLWhere; end; function TDMDb.GenerateZUpdateSQLInsert(ATable: TZTable): string; begin Result := GenerateZUpdateSQLInsert(ATable,true); end; function TDMDb.GenerateZUpdateSQLInsert(ATable: TZTable; ANullAsString: boolean): string; var liZ1: integer; lSQL: String; lSQLFields: String; lSQLValues: String; begin lSQLFields := ''; lSQLValues := ''; lSQL := 'INSERT INTO ' + ATable.TableName; for liZ1 := 0 to ATable.FieldCount - 1 do begin if (liZ1 > 0) then begin lSQLFields := lSQLFields + ' , '; lSQLValues := lSQLValues + ' , '; end; lSQLFields := lSQLFields + ATable.Fields[liZ1].FieldName; if ( (ANullAsString) and (ATable.Fields[liZ1].DataType in [ftString,ftMemo,ftFmtMemo,ftFixedChar,ftWideString,ftFixedWideChar,ftWideMemo]) and (VarToStr(ATable.Fields[liZ1].Value) = '') ) then begin lSQLValues := lSQLValues + '''' + ''''; end else begin lSQLValues := lSQLValues + ':' + ATable.Fields[liZ1].FieldName; end; end; lSQL := lSQL + ' (' + lSQLFields + ') VALUES (' + lSQLValues + ')'; Result := lSQL + ';'; end; function TDMDb.GenerateZUpdateSQLModify(ATable: TZTable): string; begin Result := GenerateZUpdateSQLModify(ATable,true); end; function TDMDb.GenerateZUpdateSQLModify(ATable: TZTable; ANullAsString: boolean): string; var liZ1: integer; lSQL: String; lSQLWhere: String; begin lSQL := 'UPDATE ' + ATable.TableName + ' SET '; for liZ1 := 0 to ATable.FieldCount - 1 do begin if (liZ1 > 0) then begin lSQL := lSQL + ' , '; end; lSQL := lSQL + ATable.Fields[liZ1].FieldName + ' = '; if ( (ANullAsString) and (ATable.Fields[liZ1].DataType in [ftString,ftMemo,ftFmtMemo,ftFixedChar,ftWideString,ftFixedWideChar,ftWideMemo]) and (VarToStr(ATable.Fields[liZ1].Value) = '') ) then begin lSQL := lSQL + '''' + ''''; end else begin lSQL := lSQL + ':' + ATable.Fields[liZ1].FieldName; end; end; lSQLWhere := GenerateZTableSQLWhereOldValues(ATable); Result := lSQL + lSQLWhere + ';'; end; function TDMDb.GenerateZUpdateSQLDelete(ATable: TZTable): string; begin Result := GenerateZUpdateSQLDelete(ATable,true); end; function TDMDb.GenerateZUpdateSQLDelete(ATable: TZTable; ANullAsString: boolean): string; var lSQL: String; lSQLWhere: String; begin lSQL := 'DELETE FROM ' + ATable.TableName; lSQLWhere := GenerateZTableSQLWhereOldValues(ATable); Result := lSQL + lSQLWhere + ';'; end; end;
Delphi-Quellcode:
Ich hoffe das hilft Dir weiter.
procedure TF_Data.ZUPS_TableBeforeDeleteSQL(Sender: TObject);
begin ZUPS_Table.DeleteSQL.Text := DMDb.GenerateZUpdateSQLDelete(ZT_Table); end; procedure TF_Data.ZUPS_TableBeforeInsertSQL(Sender: TObject); begin ZUPS_Table.InsertSQL.Text := DMDb.GenerateZUpdateSQLInsert(ZT_Table); end; procedure TF_Data.ZUPS_TableBeforeModifySQL(Sender: TObject); begin ZUPS_Table.ModifySQL.Text := DMDb.GenerateZUpdateSQLModify(ZT_Table); end; |
AW: MySQL Query Update funktioniert nicht
Sehr schön, das Du die 'hässliche' Generierung der SQL-Befehle so versteckst. Das schafft Übersicht.
Zwei Anmerkungen: 1. Wieso deklarierst du nicht einfach ein Feld als 'PK', dann kannst Du dir das 'WhereOldValues' sparen? 2. Deine NULL-Behandlung sieht (auf den ersten Blick beim Frühstück) etwas wackelig aus. Du behandelst '0' als NULL-Äquivalent, aber den leeren String nicht? :gruebel: |
AW: MySQL Query Update funktioniert nicht
Zitat:
Das sind Grundfunktionen und für jede Tabelle ausführbar und gehören daher zur Übersichtlichkeit des Quellcodes in separate Funktionen. Zitat:
Durch das SQL-Statement ist gewährleistet, dass der Datensatz nur geändert wird, wenn zwischenzeitlich keine Änderungen des Datensatzes durch z.B einen anderen User durchgeführt wurden. Der PK "erkennt" dies ja nicht. Zitat:
|
AW: MySQL Query Update funktioniert nicht
Um Concurrent Conflicts zu erkennen würde auch ein Feld mit der RowVersion reichen. :stupid:
|
AW: MySQL Query Update funktioniert nicht
Zitat:
Weitere Vorraussetzung wäre dann auch noch, dass nur Deine Software auf die Datenbank zugreift, oder dass auch alle anderen Entwicklungen, welche auf die Tabelle zugreifen, dieses Feld beschreiben. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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 by Thomas Breitkreuz