1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
procedure BuildSQLStatements(TableName: string; FBDataSet: TFBDataSet);
var
Query: TJvUIBQuery;
SQLSelect, SQLInsert, SQLEdit, SQLDelete, SQLRefresh, WhereEdit: string;
begin
// Instruction SELECT
SQLSelect := 'select * from ' + TableName + ' order by ';
// Instruction REFRESH
SQLRefresh := 'select * from ' + TableName + ' where ';
// Instruction DELETE
SQLDelete := 'delete from ' + TableName + ' where ';
// Clause WHERE de l'instruction UPDATE
WhereEdit := ' where ';
// Compléter les instructions SELECT, REFRESH et DELETE
// Collecte des noms de champs constituant la clé primaire
Query := TJvUIBQuery.Create(nil);
try
with Query do begin
DataBase := DM.UIB_DB;
Transaction := DM.trRead;
SQL.Text := 'select R.RDB$INDEX_NAME, R.RDB$RELATION_NAME, I.RDB$FIELD_NAME ' +
'from RDB$INDEX_SEGMENTS I ' +
'join RDB$RELATION_CONSTRAINTS R on I.RDB$INDEX_NAME = R.RDB$INDEX_NAME ' +
'where R.RDB$CONSTRAINT_TYPE = ''PRIMARY KEY'' and ' +
'R.RDB$RELATION_NAME = ' + QuotedStr(TableName) + ' ' +
'order by I.RDB$FIELD_POSITION;';
Open;
while not Eof do begin
SQLSelect := SQLSelect + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
SQLRefresh := SQLRefresh +
Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
SQLDelete := SQLDelete +
Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
WhereEdit := WhereEdit +
Trim(Fields.ByNameAsString['RDB$FIELD_NAME'])+
' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
Next;
if not Eof then begin
SQLSelect := SQLSelect + ', ';
SQLRefresh := SQLRefresh + ' AND ';
SQLDelete := SQLDelete + ' AND ';
WhereEdit := WhereEdit + ' AND ';
end;
end;
Close(etmCommitRetaining);
end;
finally
Query.Free;
end;
// Instruction INSERT
SQLInsert := 'INSERT INTO ' + TableName + ' VALUES(';
// Instruction UPDATE
SQLEdit := 'UPDATE ' + TableName + ' SET ';
// Collecte des noms et des types de champs de la table
Query := TJvUIBQuery.Create(nil);
try
with Query do begin
DataBase := DM.UIB_DB;
Transaction := DM.trRead;
SQL.Text := 'select RDB$FIELD_NAME ' +
'from RDB$RELATION_FIELDS ' +
'where RDB$RELATION_NAME = ' + QuotedStr(TableName) + ' ' +
'order by RDB$FIELD_POSITION;';
Open;
while not Eof do begin
SQLInsert := SQLInsert + ':' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
SQLEdit := SQLEdit +
Trim(Fields.ByNameAsString['RDB$FIELD_NAME']) +
' = :' + Trim(Fields.ByNameAsString['RDB$FIELD_NAME']);
Next;
if not Eof then begin
SQLInsert := SQLInsert + ', ';
SQLEdit := SQLEdit + ', ';
end;
end;
SQLInsert := SQLInsert + ')';
SQLEdit := SQLEdit + WhereEdit;
Close(etmCommitRetaining);
end;
finally
Query.Free;
end;
// Ecriture des instructions dans le DataSet
FBDataSet.SQLSelect.Text := SQLSelect;
FBDataSet.SQLEdit.Text := SQLEdit;
FBDataSet.SQLInsert.Text := SQLInsert;
FBDataSet.SQLDelete.Text := SQLDelete;
FBDataSet.SQLRefresh.Text := SQLRefresh;
// DEBUG
ShowMessage('SQLSelect' + #13#10 + SQLSelect);
ShowMessage('SQLInsert' + #13#10 + SQLInsert);
ShowMessage('SQLEdit' + #13#10 + SQLEdit);
ShowMessage('SQLDelete' + #13#10 + SQLDelete);
ShowMessage('SQLRefresh' + #13#10 + SQLRefresh);
end; |
Partager