From a4e8637bdc014716a34f1864f5ce045d3b47cdbe Mon Sep 17 00:00:00 2001 From: Ansgar Becker Date: Sat, 5 Dec 2009 17:46:40 +0000 Subject: [PATCH] Implement snippet generator for INSERT, UPDATE and DELETE statement using selected table. Clickable via query helpers columns tab, which then only involves selected column names. Fixes issue #1288. --- source/main.dfm | 18 ++++++++++ source/main.pas | 88 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 101 insertions(+), 5 deletions(-) diff --git a/source/main.dfm b/source/main.dfm index 75f27dfc..31a4d476 100644 --- a/source/main.dfm +++ b/source/main.dfm @@ -6676,6 +6676,24 @@ object MainForm: TMainForm object menuHelp: TMenuItem Action = actSQLhelp end + object menuQueryHelpersGenerateInsert: TMenuItem + Caption = 'Generate INSERT ...' + Enabled = False + ImageIndex = 114 + OnClick = menuQueryHelpersGenerateStatementClick + end + object menuQueryHelpersGenerateUpdate: TMenuItem + Caption = 'Generate UPDATE ...' + Enabled = False + ImageIndex = 114 + OnClick = menuQueryHelpersGenerateStatementClick + end + object menuQueryHelpersGenerateDelete: TMenuItem + Caption = 'Generate DELETE ...' + Enabled = False + ImageIndex = 114 + OnClick = menuQueryHelpersGenerateStatementClick + end end object popupFilter: TPopupMenu Images = PngImageListMain diff --git a/source/main.pas b/source/main.pas index 6b3c729c..682672ac 100644 --- a/source/main.pas +++ b/source/main.pas @@ -441,6 +441,9 @@ type Findtextonserver1: TMenuItem; actBulkTableEdit: TAction; menuBulkTableEdit: TMenuItem; + menuQueryHelpersGenerateInsert: TMenuItem; + menuQueryHelpersGenerateUpdate: TMenuItem; + menuQueryHelpersGenerateDelete: TMenuItem; procedure refreshMonitorConfig; procedure loadWindowConfig; procedure saveWindowConfig; @@ -699,6 +702,7 @@ type procedure actFilterPanelExecute(Sender: TObject); procedure TimerFilterVTTimer(Sender: TObject); procedure PageControlMainContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean); + procedure menuQueryHelpersGenerateStatementClick(Sender: TObject); private ReachedEOT : Boolean; FDelimiter: String; @@ -4973,6 +4977,9 @@ begin // By default sorted alpabetically ActiveQueryHelpers.Sorted := True; // By default disable all items in popupmenu, enable them when needed + menuQueryHelpersGenerateInsert.Enabled := False; + menuQueryHelpersGenerateUpdate.Enabled := False; + menuQueryHelpersGenerateDelete.Enabled := False; menuInsertSnippetAtCursor.Enabled := False; menuLoadSnippet.Enabled := False; menuDeleteSnippet.Enabled := False; @@ -4985,11 +4992,12 @@ begin begin // Keep native order of columns ActiveQueryHelpers.Sorted := False; - if (SelectedTable.Text <> '') and Assigned(SelectedTableColumns) then begin - for i:=0 to SelectedTableColumns.Count-1 do begin - Col := TTableColumn(SelectedTableColumns[i]); - ActiveQueryHelpers.Items.Add(Col.Name); - end; + menuQueryHelpersGenerateInsert.Enabled := True; + menuQueryHelpersGenerateUpdate.Enabled := True; + menuQueryHelpersGenerateDelete.Enabled := True; + for i:=0 to SelectedTableColumns.Count-1 do begin + Col := TTableColumn(SelectedTableColumns[i]); + ActiveQueryHelpers.Items.Add(Col.Name); end; end; @@ -8843,5 +8851,75 @@ begin end; +procedure TMainForm.menuQueryHelpersGenerateStatementClick(Sender: TObject); +var + MenuItem: TMenuItem; + sql, Val, WhereClause: WideString; + i, idx: Integer; + ColumnNames, DefaultValues, KeyColumns: TWideStringlist; + Column: TTableColumn; +begin + // Generate INSERT, UPDATE or DELETE query using selected columns + MenuItem := (Sender as TMenuItem); + ColumnNames := TWideStringlist.Create; + DefaultValues := TWideStringlist.Create; + for i:=0 to ActiveQueryHelpers.Items.Count-1 do begin + if ActiveQueryHelpers.Selected[i] then begin + ColumnNames.Add(mask(ActiveQueryHelpers.Items[i])); + Column := SelectedTableColumns[i] as TTableColumn; + case Column.DataType.Category of + dtcInteger, dtcReal: Val := '0'; + dtcText, dtcIntegerNamed, dtcSetNamed: begin + Val := esc(Column.DefaultText); + if Column.DefaultType in [cdtNull, cdtNullUpdateTS] then + Val := esc('') + else + Val := esc(Column.DefaultText); + end; + dtcTemporal: Val := 'NOW()'; + else Val := 'NULL'; + end; + if Column.DefaultType = cdtAutoInc then + Val := 'NULL'; + DefaultValues.Add(Val); + end; + end; + KeyColumns := GetKeyColumns; + if KeyColumns.Count > 0 then begin + WhereClause := ''; + for i:=0 to KeyColumns.Count-1 do begin + idx := ColumnNames.IndexOf(mask(KeyColumns[i])); + if idx > -1 then + WhereClause := WhereClause + mask(KeyColumns[i])+'='+DefaultValues[idx] + ' AND '; + end; + Delete(WhereClause, Length(sql)-3, 4); + end else + WhereClause := '??? # No primary or unique key available!'; + + if MenuItem = menuQueryHelpersGenerateInsert then begin + sql := 'INSERT INTO '+mask(SelectedTable.Text)+CRLF+ + #9'('+ImplodeStr(', ', ColumnNames)+')'+CRLF+ + #9'VALUES ('+ImplodeStr(', ', DefaultValues)+')'; + + end else if MenuItem = menuQueryHelpersGenerateUpdate then begin + sql := 'UPDATE '+mask(SelectedTable.Text)+CRLF+#9'SET'+CRLF; + if ColumnNames.Count > 0 then begin + for i:=0 to ColumnNames.Count-1 do begin + sql := sql + #9#9 + ColumnNames[i] + '=' + DefaultValues[i] + ',' + CRLF; + end; + Delete(sql, Length(sql)-2, 1); + end else + sql := sql + #9#9'??? # No column names selected!'+CRLF; + sql := sql + #9'WHERE ' + WhereClause; + + end else if MenuItem = menuQueryHelpersGenerateDelete then begin + sql := 'DELETE FROM '+mask(SelectedTable.Text)+' WHERE ' + WhereClause; + + end; + ActiveQueryMemo.UndoList.AddGroupBreak; + ActiveQueryMemo.SelText := sql; +end; + + end.