Implement rfe #792: Copy grid data as SQL

This commit is contained in:
Ansgar Becker
2008-12-25 10:26:16 +00:00
parent 719f905575
commit 5a09fac960
6 changed files with 143 additions and 0 deletions

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 879 B

View File

@@ -1623,6 +1623,9 @@ object MDIChild: TMDIChild
object CopyasXMLdata1: TMenuItem
Action = MainForm.actCopyAsXML
end
object CopygriddataasSQL2: TMenuItem
Action = MainForm.actCopyAsSQL
end
end
object Exportdata2: TMenuItem
Action = MainForm.actExportData
@@ -1709,6 +1712,9 @@ object MDIChild: TMDIChild
object CopyasXMLdata2: TMenuItem
Action = MainForm.actCopyAsXML
end
object CopygriddataasSQL1: TMenuItem
Action = MainForm.actCopyAsSQL
end
object Exportdata1: TMenuItem
Action = MainForm.actExportData
end

View File

@@ -262,6 +262,8 @@ type
menuViewSave: TMenuItem;
N25: TMenuItem;
menuViewDefault: TMenuItem;
CopygriddataasSQL1: TMenuItem;
CopygriddataasSQL2: TMenuItem;
procedure menuRenameColumnClick(Sender: TObject);
procedure ListColumnsNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; NewText: WideString);
@@ -2180,6 +2182,7 @@ begin
MainForm.actCopyAsCSV.Enabled := inDataOrQueryTabNotEmpty;
MainForm.actCopyAsHTML.Enabled := inDataOrQueryTabNotEmpty;
MainForm.actCopyAsXML.Enabled := inDataOrQueryTabNotEmpty;
MainForm.actCopyAsSQL.Enabled := inDataOrQueryTabNotEmpty;
MainForm.actExportData.Enabled := inDataOrQueryTabNotEmpty;
MainForm.actHTMLView.Enabled := inDataOrQueryTabNotEmpty;
setNull1.Enabled := inDataTab and Assigned(DataGrid.FocusedNode);

View File

@@ -113,6 +113,7 @@ type
procedure GridToHtml(Grid: TVirtualStringTree; GridData: PGridResult; Title: WideString; S: TStream);
procedure GridToCsv(Grid: TVirtualStringTree; GridData: PGridResult; Separator, Encloser, Terminator: String; S: TStream);
procedure GridToXml(Grid: TVirtualStringTree; GridData: PGridResult; root: WideString; S: TStream);
procedure GridToSql(Grid: TVirtualStringTree; GridData: PGridResult; Tablename: WideString; S: TStream);
function esc2ascii(str: String): String;
function StrCmpBegin(Str1, Str2: string): Boolean;
function Max(A, B: Integer): Integer; assembler;
@@ -1013,6 +1014,69 @@ begin
end;
{***
Converts a TDataSet to XML.
@param Grid Object which holds data to export
@param string Text used as tablename in INSERTs
}
procedure GridToSql(Grid: TVirtualStringTree; GridData: PGridResult; Tablename: WideString; S: TStream);
var
i: Integer;
tmp, Data: WideString;
Node: PVirtualNode;
begin
// Avoid reloading discarded data before the end.
Grid.Visible := false;
Node := Grid.GetFirst;
while Assigned(Node) do begin
if (Node.Index+1) mod 100 = 0 then
ExportStatusMsg(Node, Grid.RootNodeCount, S.Size);
tmp := 'INSERT INTO '+Mainform.Mask(Tablename)+' (';
for i:=0 to Grid.Header.Columns.Count-1 do begin
// Skip hidden key columns
if not (coVisible in Grid.Header.Columns[i].Options) then
Continue;
tmp := tmp + Mainform.mask(Grid.Header.Columns[i].Text)+', ';
end;
Delete(tmp, Length(tmp)-1, 2);
tmp := tmp + ') VALUES (';
// Data:
for i:=0 to Grid.Header.Columns.Count-1 do begin
// Skip hidden key columns
if not (coVisible in Grid.Header.Columns[i].Options) then
Continue;
// Ensure basic data is loaded.
Mainform.Childwin.EnsureChunkLoaded(Grid, Node);
if GridData.Rows[Node.Index].Cells[i].IsNull then
tmp := tmp + 'NULL'
else begin
// Load remainder of large fields.
Mainform.Childwin.EnsureFullWidth(Grid, i, Node);
Data := Grid.Text[Node, i];
// Remove 0x.
if GridData.Columns[i].IsBinary then Delete(Data, 1, 2);
// Unformat float values
if GridData.Columns[i].IsFloat then Data := FloatStr(Data);
// Add data and cell end tag.
tmp := tmp + esc(Data);
end;
tmp := tmp + ', ';
end;
Delete(tmp, Length(tmp)-1, 2);
tmp := tmp + ');' + CRLF;
StreamWrite(S, tmp);
// Release some memory.
Mainform.Childwin.DiscardNodeData(Grid, Node);
Node := Grid.GetNext(Node);
end;
// footer:
tmp := CRLF;
StreamWrite(S, tmp);
Grid.Visible := true;
Mainform.showstatus(STATUS_MSG_READY);
end;
{***
Return ASCII-Values from MySQL-Escape-Sequences

View File

@@ -605,6 +605,14 @@ object MainForm: TMainForm
Hint = 'Copy|Copy to Clipboard'
ImageIndex = 3
end
object actCopyAsSQL: TAction
Category = 'Export/Import'
Caption = 'Copy grid data as SQL'
Enabled = False
Hint = 'Copy grid data as SQL'
ImageIndex = 114
OnExecute = actCopyAsSQLExecute
end
object actPaste: TEditPaste
Tag = 58
Category = 'Various'
@@ -4429,6 +4437,42 @@ object MainForm: TMainForm
0049454E44AE426082}
Name = 'PngImage113'
Background = clWindow
end
item
PngImage.Data = {
89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
610000001974455874536F6674776172650041646F626520496D616765526561
647971C9653C0000036F4944415478DA4D930D6C535514C7FFF7BDBE7EAD5D5B
F6B6E0D6D05A3E034160BAC918B2A9894641D785652E3295405408601A64C684
84440209A08B9B128711020435C628C8571650E26640D9DCC2E23473800EB7D0
8CAD5DD78EF5E37D7ADE0B106EF27BE7E6BEDCFF3DE77FEE65BAAEC3186F7C37
524EA125E4B557A4650D06B2A621A368495A9F2262844A2488387182B8C8EE0B
BCF6CDD0B625335D9FECA82EC4C3635A223122915521C9402AA7E256EC2EDA6F
4E4FD0EFC80381755FDED85315F2ED7C6B85889149150263B03080B7103C60E5
28721C049A67151D5787D2F8A22B3AFE40A0F5CCE15361FFCF61B7A0234727EA
2AA118918E451ED88266522942898747E4D87F38D01840F34FB7600AC4FB9EE6
AFC5170D2C0FD9E7F2422174593151A50C32137F2329AE872EAE06CF38840A79
BC7BA41FE1A7FC38D8311C350562BD55C19C6CB92906C3BC92EC01675F06251D
4726F617465D0DC889B5A0CCCD52163F22A0B1A50759414FD1521D1BEF5965A5
7477D9BC8FEDB4E52F82347A1A9CFB19C4AF9F424CDC82A98206B3441E3A040B
87C7FD16ACFBAC0B19492E38B37DE504BBD355F9A42E6BE7BCA17A515755C889
7E70C21C8CFDD38E29D78BC63640C942636E28C56BB174EE2C34B474222B2BDE
F3EF3F9B64A3972BBAEDE21365BA2C4123D3ACCE59609A056A769A4AB80195D6
53D13EA4667F002E5083852579A8DD7751A1A4AC1776BDA0B36847F98EC9B463
DED5B1D2375F2E2B4672E8340AFCD5503293488F0D20CE2DC6DDE016E8CE0066
3819F2AD12D637FF78FBD2DE1ABF519A696275D3B70B8A7CEE81AF9B5662F8EC
2A385C41241377902ADE864CC95AE81AA30E007E6A612299C0F643977EEFF8B0
BEDC14A87CE78448B12D5C555A57E739004B7604A3CA7C8C3FBA1B56879B8C03
2C3C071B7520E8E3D13B781BBB8F759EBBDCDAF89229B07CD39157281E7D6EFE
84A3B6E80774E6366250A9404E6690C813852E944659CEF078B0F9F999E81BF8
176D27AF1CFDAD6DC30653A06CE3A1FD35D54BDE6B5AE323C7196CDE7966DB54
BAA0327D24C32E9A1F6C8FA2BEB208177EFD13C7CF777FD47DF8ED2653A0F4F5
4F37AD5836A7AD7C61005E97035E8F1DBE3C1B3C84DB69858D1E818DFA3F1C57
28029F7F7F05677FE98FF41EDFDA6A0A2C7DF563C3830811200AEEE1BB87C76E
1504BB5D407E1E89E73BF1C7E0C875E3ED5DFB2AD26308FC0FDF3573A18B3D62
A30000000049454E44AE426082}
Name = 'PngImage114'
Background = clWindow
end>
PngOptions = [pngBlendOnDisabled, pngGrayscaleOnDisabled]
Left = 8

View File

@@ -214,6 +214,7 @@ type
actDataCancelChanges: TAction;
ToolButton1: TToolButton;
actRemoveFilter: TAction;
actCopyAsSQL: TAction;
procedure refreshMonitorConfig;
procedure loadWindowConfig;
procedure saveWindowConfig;
@@ -296,6 +297,7 @@ type
procedure HandleWMRefill(var msg: TMessage); message WM_REFILL_SPAREBUF;
procedure ReplaceDialogQueryFind(Sender: TObject);
procedure ReplaceDialogQueryReplace(Sender: TObject);
procedure actCopyAsSQLExecute(Sender: TObject);
private
FDelimiter: String;
function GetChildwin: TMDIChild;
@@ -1195,6 +1197,30 @@ begin
end;
procedure TMainForm.actCopyAsSQLExecute(Sender: TObject);
var
S: TMemoryStream;
Tablename: WideString;
GridData: PGridResult;
begin
// Copy data in focused grid as SQL
Screen.Cursor := crHourglass;
S := TMemoryStream.Create;
if ChildWin.ActiveGrid = Childwin.DataGrid then Tablename := Childwin.SelectedTable
else Tablename := 'unknown';
try
GridData := ChildWin.ActiveData;
GridToSql(ChildWin.ActiveGrid, GridData, Tablename, S);
StreamToClipboard(S);
finally
ShowStatus('Freeing data...');
S.Free;
ShowStatus(STATUS_MSG_READY);
Screen.Cursor := crDefault;
end;
end;
procedure TMainForm.actExportDataExecute(Sender: TObject);
var
Grid: TVirtualStringTree;