Você está na página 1de 21

Saudações, pessoal!

Este artigo vai mostrar como criar e implementar algumas classes que vão formar
um framework que poderá ser implementado em softwares orientados a eventos quanto a objetos.
Primeiro temos que entender o que significa framework.
“Framework é um conjunto de classes que colaboram para realizar uma responsabilidade para um
domínio de um subsistema da aplicação.”
— Fayad e Schmidt,

Bom partindo desse princípio, teremos que criar algumas classes em nosso pequeno FrameWork, neste
artigo iremos criar somente duas classes que poderemos fazer muita coisa com elas, claro que elas serão
a ponta do IceBerg de algo bem maior que podemos implementar, vamos Criar essas classes:

Figura 1. Modelagem das Classes ClassSql e ClassList


Descritivo:
ClassSql: Vamos implementar as regras de negócio para comunicação com o banco de dados(neste
caso Firebird) essa classe realizará: Select, Insert, Update entre outros procedimentos.
ClassList: Essa classe criará Listas encadeadas(leia mais neste link) que carregarão na memória os
dados pesquisados na ClassSql.
Vamos implementar conforme mostra abaixo:
Menu Delphi: File->New->Unit
Será aberta uma Unit limpa, desta forma:
1Unit Unit2;
2 interface
3 implementation
end.
4
Re-escreva assim:
Listagem: Head da classe com declarações de variáveis e métodos construtores
1 unit ClassSQL;
2 interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
3 Dialogs, StdCtrls, ExtCtrls,SqlExpr, DBClient, Provider, DBXpress,ClassList,
4 Mask, ToolEdit, jpeg, DB, DBTables, RlReport, ClassUtilitarios;
5
6
7 type TClassSQL = class
8 private
FQuery: TSQLQuery;
9 IsFQueryOpen: Boolean;
10 FClientDataSet:TClientDataSet;
11 FDataSetProvider:TDataSetProvider;
12// function VerifyListObject_(ComboBoxList: TUtilComboList): string;Overload;
public
13
14
FUtilList:TclassList;
15 TTableName: string;
16 TIdPkFieldName,TIdFkFieldName: string; TIdPk: Integer;
17 TIDPK_FK:string;
18 TIdFieldValue:string;
TDataBase:TSQLConnection;
19 Q: TSqlQuery;
20
21 FTd: TTransactionDesc;
22 DataModule:TDataModule;
23
24 constructor CreateSQL(TableName:string; Id:integer;
25 IdFieldName:string;Base:TSqlConnection);
public constructor CreateOpenQuery(custom_sql: string);
26
27
28
29
30
Listagem: Declarações de procedimentos para ADICIONAR valores na LISTA que será executada no
SQL,adiciona-se valores conforme o tipo de registro.
1
public procedure AddIntegerField(field_name: string; field_value: Integer);
2public procedure AddIntegerFkField(field_name: string; field_value: Integer);
3public procedure AddStringField(field_name: string; field_value: string);
4public procedure AddDateField(field_name: string; field_value: TDate);
5public procedure AddTimeField(field_name: string; field_value: TTime);
6public procedure AddDoubleField(field_name: string; field_value: Double);
public procedure AddBooleanField(field_name: string; field_value: Boolean);
7public procedure AddOptionField(field_name: string; field_value: string);
8
Listagem: Metódos que chamam as montagens e execuções dos scritps SQL[Insert, UpDate]
1
Public function ExecuteInsert:integer;
2 Public function ExecuteSimpleInsert:integer;
3 Public function ExecuteUpdate:boolean;Virtual;
4 Public Function ExecuteUpdateNoWhere:Boolean;
5 Public function ExecuteDelete:boolean;
6 Public function ExecuteBeforeDelete:Boolean;
public Function ExecuteBeforeDeleteTwoFields(IndexField1,
7IndexField2:string;IndexValue1, indexValue2:Integer):boolean;
8
Listagem: Procedimentos para Abrir pesquisas através de scripts SQL, e métodos para varrer a tabela
aberta.
1procedure OpenTable;
2procedure OpenTableSimple;
3Function OpenSetValue(FieldMaster:string;IdMaster, IdIndex:integer):string;
4Public procedure Next;
5Public procedure First;
public function EofTable:Boolean;
6
Listagem: Metódos de Get, para buscar na tabela valores para campos específicos, funcionam como
fieldbyname.
1 public function GetRecordCount:integer;
2 public function GetIsNotEmpty:Boolean;
3 public function GetId(Field:string):integer;
4 public function GetId2(Field:string):integer;
5 public function GetList:TClassList;
6 public function GetSelectId(FieldIdFk, FieldIdFk2, FieldValue:string;IdFk,
7 IdFk2, Value:integer): integer;
8
9 public function GetField(Field:string):TField;
public function GetField2(Field:string):TField;
10 public function GetQry:TClientDataSet;
11
Listagem: Selects para pesquisas, também fechamento e abertura de transações no banco de dados
atrás de Commit e Start
1
2 Public Function SelectOpenStringValue(Value, FieldSearch,
3 FieldResult:string):integer;
Public procedure SelectOpenSetValue(Cb:TComboBox;Data:TDateEdit;FieldSearch,
4 FieldSearch2, FieldId:string; IDPK:integer);
5 Public procedure SelectOpen(Value:string);Overload;
6 Public procedure SelectOpenSql(Sql:string);
7 Public procedure SelectOpenReturnString;
8 function SelectOpenStringReturnInteger(Value,
9 FieldResult,FieldSearch:string):integer;
10
Public Procedure StartTransaction;
11 Public Procedure CommitTransaction;
12
13 public function RecordCount: Integer;
14 public procedure ReturnGenerator(Gen:string;Value:Integer);
15 public procedure LoadListObject_(Img:TImage;Field:string);Overload;
16 public procedure LoadListObject_(Img:TRlImage;Field:string);Overload;
17
Listagem: Implementação completa da Classe
1 implementation
2
uses database;
3
4 { TClassSql }
5
6
7 var FUtilSql:TclassSql;
8
9
10 function TClassSQL.ExecuteDelete: Boolean;
11 begin
// ExecuteBeforeDelete;
12 Result:=True;
13 q := TSqlQuery.Create(nil);
14 q.SQLConnection := TDataBase;
15 q.SQL.Text:='DELETE FROM ' + TTableName + ' WHERE (' +
16 TTableName + '.' + TIdPkFieldName + ' = ' + IntToStr(TIdPk) + ')';
try
17 StartTransaction;
18 q.ExecSQL;
19 CommitTransaction;
20 except
21 Result := False;
end;
22 q.Free;
23
24 end;
25
26 procedure TClassSQL.SelectOpen(Value: string);
begin
27
q := TSqlQuery.Create(nil);
28 q.SQLConnection := TDataBase;
29 q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' +
30 TTableName + '.' + TIdFieldValue + ' = ' + IntToStr(TIdPk) + ')';
31 try
q.Open;
32 TIdPk:=q.fieldbyname(TIdFieldValue).AsInteger;
33 except
34 q.Free
35 end;
36
37
38 end;
39
procedure TClassSQL.SelectOpenReturnString;
40 begin
41 q := TSqlQuery.Create(nil);
42 q.SQLConnection := TDataBase;
43 q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' +
TTableName + '.' + TIdPkFieldName + ' = ' + IntToStr(TIdPk) + ')';
44 try
45 q.Open;
46 TIdFieldValue:=q.fieldbyname(TIDPK_FK).ASString;
47 q.Free;
48 except
q.Free
49 end;
50 end;
51
52 procedure TClassSQL.OpenTable;
53
54 begin
q := TSqlQuery.Create(nil);
55 q.SQLConnection := TDataBase;
56 q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' + TTableName + '.'
57 + TIdPkFieldName + ' = ' + IntToStr(TIdPk) + ')';
58 try
59 q.Open;
FClientDataSet:=TClientDataSet.Create(nil);
60 FDataSetProvider:=TDataSetProvider.Create(nil);
61 FDataSetProvider.DataSet:=q;
62 FClientDataSet.SetProvider(FDataSetProvider);
63 except
64 q.Free
end;
65 end;
66
67 procedure TClassSQL.DestroyTable;
68 begin
69 if q<>nil then
Q.Free;
70 if FQuery<>nil then
71 FQuery.Free;
72 end;
73
74 function TClassSQL.ListTableReturnField(Field: String): string;
begin
75 Result:=Q.fieldbyname(Field).AsString;
end;
76
77
procedure TClassSQL.OpenTableSimple;
78 begin
79 FClientDataSet:=TClientDataSet.Create(nil);
80 FDataSetProvider:=TDataSetProvider.Create(nil);
81 q := TSqlQuery.Create(nil);
82
q.SQLConnection := TDataBase;
83 q.SQL.Text:='Select * from ' + TTableName;
84 try
85 q.Open;
86 FClientDataSet.SetProvider(FDataSetProvider);
87 FDataSetProvider.DataSet:=q;
FClientDataSet.Active:=True;
88 except
89 q.Free
90 end;
91 end;
92
93 function TClassSQL.GetRecordCount: integer;
var Count:integer;
94 begin
95 //
96 end;
97
98 function TClassSQL.GetId(Field: string): integer;
begin
99 Result:=Q.fieldbyname(field).AsInteger;
100end;
101
102function TClassSQL.SelectOpenStringValue(Value,
103FieldSearch, FieldResult: string): integer;
104begin
q := TSqlQuery.Create(nil);
105 q.SQLConnection := TDataBase;
106 q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' + TTableName + '.'
107 + FieldSearch + ' = ''' + Value + ''')';
108 try
q.Open;
109 Result:=q.fieldbyname(FieldResult).asinteger;
110 except
111 q.Free
112 end;
113end;
114
procedure TClassSQL.SelectOpenSetValue(Cb:TComboBox;Data:TDateEdit;
115FieldSearch,FieldSearch2, FieldId:string; IDPK:integer);
116begin
117 OpenSetValue(FieldId, IdPk,1 );
118 if (Cb<>nil) and (FieldSearch<>'') then
Cb.ItemIndex:=Cb.Items.IndexOf(q.fieldbyname(FieldSearch).asstring);
119 if (Data<>Nil) and ( FieldSearch2<>'') then
120 Data.date:=Q.fieldbyname(FieldSearch2).asdatetime;
121end;
122
123Function TClassSQL.OpenSetValue(FieldMaster:string;IdMaster,
124IdIndex:integer):string;
begin
125 q := TSqlQuery.Create(nil);
126 q.SQLConnection := TDataBase;
q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' + TTableName + '.'
127 + TIdFieldValue + ' = ' + IntToStr(TIdPk) + ') and ('+ TTableName
128 + FieldMaster + ' = ' + IntToStr(IdMaster) + ')';
129 try
130 q.Open;
Result:=q.FieldList.Fields[IdIndex].ASstring;
131 except
132 q.Free
133 end;
134
135end;
136
137
138function TClassSQL.GetSelectId(FieldIdFk,
FieldIdFk2, FieldValue:string;IdFk, IdFk2,
139Value:integer): integer;
140var
141 i, r: Integer;
142 sql: string;
143 TableName:string;
Base:TSQLConnection;
144begin
145 q := TSqlQuery.Create(nil);
146 q.SQLConnection := TDataBase;
147 q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' + TTableName + '.'
+ FieldIdFk + ' = ' + IntToStr(IdFk) + ') and ('+ TTableName + '.'
148 + FieldIdFk2 + ' = ' + IntToStr(IdFk2) + ') and ('+ TTableName + '
149 + FieldValue + ' = ' + IntToStr(Value) + ')';
150
151 q.Open;
152 Result:=q.FieldList.Fields[0].AsInteger;
q.Free;
153
end;
154
155procedure TClassSQL.CommitTransaction;
156begin
157 try
158 TDataBase.Commit(FTd);
except
159 TDataBase.Rollback(FTd);
160 end;
161
162end;
163
164procedure TClassSQL.StartTransaction;
165begin
try
166 FTd.TransactionID := 1;
167 FTd.IsolationLevel := xilREADCOMMITTED;
168 //Inicia a transação
169 TDataBase.StartTransaction(FTd);
except
170 TDataBase.Rollback(FTd);
171 end;
172end;
173
174function TClassSQL.ExecuteBeforeDelete: Boolean;
begin
175 Result:=True;
176 q := TSqlQuery.Create(nil);
q.SQLConnection := TDataBase;
177 q.SQL.Text:='DELETE FROM ' + TTableName + ' WHERE (' + TTableName + '.'
178 + TIdPkFieldName + ' = ' + IntToStr(TIdPk) + ')';
179 try
180 StartTransaction;
q.ExecSQL;
181 CommitTransaction
182 except
183 Result := False;
184 end;
185 q.Free;
186
end;
187
188
189
190constructor TClassSQL.CreateOpenQuery(custom_sql: string);
191begin
192 if FQuery=nil then begin
193 FQuery := TSQlQuery.Create(nil);
FQuery.SQLConnection := Base.Base_;
194 end;
195 FQuery.close;
196 FQuery.SQL.clear;
197 FQuery.SQL.Text := custom_sql;
198 FQuery.Open;
IsFQueryOpen := True;
199end;
200
201function TClassSQL.RecordCount: Integer;
202begin
203 Result := FQuery.fieldbyname('Field').asinteger;
204end;
205
206
207function TClassSQL.SelectOpenStringReturnInteger(Value,
208FieldResult,FieldSearch:string): integer;
209begin
210 q := TSqlQuery.Create(nil);
211 q.SQLConnection := TDataBase;
q.SQL.Text:='Select * from ' + TTableName + ' WHERE (' + TTableName + '.'
212 + FieldSearch + ' = ''' + Value + ''')';
213 try
214 q.Open;
215 Result:=q.fieldbyname(FieldResult).asinteger;
216 q.Free;
except
217 q.Free
218 end;
219end;
220
221function TClassSQL.ListTableReturnField2(Field: String): string;
222begin
Result:=FQuery.fieldbyname(Field).AsString;
223end;
224
225function TClassSQL.GetIsNotEmpty: Boolean;
226begin
Result:=False;
227 if FQuery <> nil then begin
228 if not FQuery.IsEmpty then
229 Result:=True;
230 end else
if Q <> nil then begin
231 if not Q.IsEmpty then
232 Result:=True;
233 end;
234end;
235
236procedure TClassSQL.ReturnGenerator(Gen:string;Value: Integer);
begin
237// StartTransaction;
238 Q := TSQLQuery.Create(nil);
239 Q.SQLConnection := TDataBase;
240 Q.close;
241 Q.sql.clear;
Q.sql.text:='Set generator '+Gen+' to '+Inttostr(Value);
242 Q.ExecSQL;
243 // CommitTransaction;
244end;
245
246
247function TClassSQL.GetList: TClassList;
begin
248 Result:=FUtilList;
249end;
250
251function TClassSQL.GetId2(Field: string): integer;
252begin
253 Result:=FQuery.fieldbyname(field).AsInteger;
end;
254
255procedure TClassSQL.LocateValueField(Value, Field: String);
256begin
257 FQuery.Locate(field,Value,[]);
258end;
259
260
261
262
263
264
procedure TClassSQL.LoadListObject_(Img: TImage; Field: string);
265var
266 msBMP: TBitmap;
267 msJPG: TJPEGImage;
268 BlobStream : TStream;
269begin
//BlobStream := TBlobStream.Create(Q.fieldbyname(Field) as TBlobField, bmRead);
270 BlobStream:=Q.CreateBlobStream(Q.FieldByName(Field),bmRead);
271 if BlobStream.Size > 0 then begin
272 try
273 msJPG := TJpegImage.Create;
msJPG.LoadFromStream(BlobStream);
274 Img.Picture.Assign(msJPG);
275 except
msBMP := TBitmap.Create;
276
msBMP.LoadFromStream(BlobStream);
277 Img.Picture.Assign(msBMP);
278 end;
279 Img.Repaint;
280 end;
281{ if msBMP then
msBMP.Free;
282 if not msJPG.Empty then
283 msJPG.Free;}
284end;
285
286function TClassSQL.GetField(Field:string): TField;
begin
287 Result:=Q.fieldbyname(Field);
288end;
289
290procedure TClassSQL.LoadListObject_(Img: TRlImage; Field: string);
291var
292 msBMP: TBitmap;
msJPG: TJPEGImage;
293 BlobStream : TStream;
294begin
295 //BlobStream := TBlobStream.Create(Q.fieldbyname(Field) as TBlobField, bmRead);
296 BlobStream:=Q.CreateBlobStream(Q.FieldByName(Field),bmRead);
if BlobStream.Size > 0 then begin
297 try
298 msJPG := TJpegImage.Create;
299 msJPG.LoadFromStream(BlobStream);
300 Img.Picture.Assign(msJPG);
except
301 msBMP := TBitmap.Create;
302 msBMP.LoadFromStream(BlobStream);
303 Img.Picture.Assign(msBMP);
304 end;
305 Img.Repaint;
end;
306
307end;
308
309
310
311procedure TClassSQL.LocateValueField_(Value, field: String);
312begin
313 Q.Locate(field,Value,[]);
314 end;
315
316
function TClassSQL.ExecuteUpdateNoWhere: Boolean;
317var Sql: string;
318 q:TSQLQuery;
319 i:integer;
320begin
321
322 Result:=True;
sql := 'UPDATE ' + TTableName + ' SET ';
323 for i := 0 to FUtilList.Count-1 do begin
324 sql := sql + ' ' + FUtilList.GetStringKey(i) + ' = ' + FUtilList.GetItem(i);
325 if i <> FUtilList.Count-1 then
sql := sql + ',';
326
end;
327 q := TSQLQuery.Create(nil);
328 q.SQLConnection := TDataBase;
329 q.SQL.Text := sql;
330
331 try
q.ExecSQL;
332 except
333 Result:=False;
334 end;
335 q.Free;
336 Result:=False;
337
end;
338
339
340
341
342
343function TClassSQL.GetField2(Field: string): TField;
344begin
345 Result:=FQuery.fieldbyname(Field);
346end;
347
348
349
350procedure
begin
TClassSQL.Next;
351if FQuery <> nil then
352 FQuery.next;
353 if Q <> nil then
354 Q.next;
end;
355
356procedure TClassSQL.First;
357begin
358if FQuery <> nil then
359 FQuery.First;
if Q <> nil then
360 Q.first;
361end;
362
363procedure TClassSQL.SelectOpenSql(Sql: string);
364begin
365 q := TSqlQuery.Create(nil);
q.SQLConnection := TDataBase;
366 q.SQL.Text:=Sql;
367 try
368 q.Open;
369 except
370 q.Free
end;
371
372end;
373
374function TClassSQL.ExecuteSimpleInsert: integer;
375var
376 i, r: Integer;
sql: string;
377 TableName:string;
378 Base:TSQLConnection;
379 x,y:TSQLQuery;
380begin
sql := '';
381 sql := sql + 'INSERT INTO ' + TTableName + ' (';
382 for i := 0 to FUtilList.Count-1 do begin
383 sql := sql + ' ' + FUtilList.GetStringKey(i);
384 if i <> FUtilList.Count-1 then
385 sql := sql + ',';
end;
386 sql := sql + ') VALUES(';
387 for i := 0 to FUtilList.Count-1 do begin
388 sql := sql + ' ' + FUtilList.GetItem(i);
389 if i <> FUtilList.Count-1 then
sql := sql + ',';
390 end;
391 sql := sql + ')';
392
393
394 q := TSQLQuery.Create(nil);
395 q.SQLConnection := TDataBase;
396
397 FClientDataSet:=TClientDataSet.Create(nil);
FDataSetProvider:=TDataSetProvider.Create(nil);
398 FClientDataSet.SetProvider(FDataSetProvider);
399 FDataSetProvider.DataSet:=q;
400 q.SQL.Text := sql;
401 q.ExecSQL;
q.free;
402end;
403
404function TClassSQL.EofTable:Boolean;
405begin
406 Result:=False;
407 if FQuery <> nil then begin
if FQuery.eof then
408 Result:=True;
409 end;
410 if Q <> nil then begin
411 if Q.eof then
Result:=true
412
end;
413end;
414
415function TClassSQL.ExecuteBeforeDeleteTwoFields(IndexField1,
416 IndexField2: string; IndexValue1, indexValue2: Integer): boolean;
417begin
418 Result:=True;
q := TSqlQuery.Create(nil);
419 q.SQLConnection := TDataBase;
420 q.SQL.Text:='DELETE FROM ' + TTableName + ' WHERE
421 (' + TTableName + '.'
422 + IndexField1 + ' = ' + IntToStr(IndexValue1) + ' and '+TTableName + '.'
+ IndexField2 + ' = ' + IntToStr(IndexValue2) +')';
423 try
424 StartTransaction;
425 q.ExecSQL;
CommitTransaction
426
except
427 Result := False;
428 end;
429 q.Free;
430
431end;
432
433function TClassSQL.GetQry: TClientDataSet;
begin
434 Result:=FClientDataSet;
435end;
436
437{ TClassSQL }
438
439procedure TClassSQL.AddBooleanField(field_name: string;
field_value: Boolean);
440begin
441 if field_value then
442 FUtilList.Add(field_name, QuotedStr( 'S'))
443 else
444end;FUtilList.Add(field_name, QuotedStr('N'));
445
446procedure TClassSQL.AddDateField(field_name: string;
447 field_value: TDate);
448begin
449 FUtilList.Add(field_name, QuotedStr(FormatDateTime('mm/dd/yyyy',field_value)));
end;
450
451procedure TClassSQL.AddDoubleField(field_name: string;
452 field_value: Double);
453begin
454 FUtilList.Add(field_name, DoubleForSql(field_value));
455end;
procedure TClassSQL.AddIntegerField(field_name: string;
456 field_value: Integer);
457begin
458 if (Copy(field_name, 0,2) = 'Id') and (field_value = 0) then
459 FUtilList.Add(field_name, 'NULL')
else
460 FUtilList.Add(field_name, IntegerForSql(field_value));
461end;
462
463procedure TClassSQL.AddIntegerFkField(field_name: string;
464 field_value: Integer);
465begin
if field_value = 0 then
466 FUtilList.Add(field_name, 'NULL')
467 else
468 FUtilList.Add(field_name, IntegerForSql(field_value));
469 end;
470
471procedure TClassSQL.AddOptionField(field_name, field_value: string);
begin
472 FUtilList.Add(field_name, QuotedStr(field_value));
473end;
474
475procedure TClassSQL.AddStringField(field_name, field_value: string);
476begin
FUtilList.Add(field_name, QuotedStr(field_value));
477end;
478
479procedure TClassSQL.AddTimeField(field_name: string;
480 field_value: TTime);
481begin
FUtilList.Add(field_name, QuotedStr(TimeToStr(field_value)));
482end;
483
484constructor TClassSQL.CreateSQL(TableName:string;
485
486Id:integer; IdFieldName:string;Base:TSqlConnection);
487
488begin
489 FUtilList:=TClassList.Create;
TTableName:=TableName;
490 TIdPk:=id;
491 TIdPkFieldName:=IdFieldName;
492 TIdFieldValue:=IdFieldName;
493 TDataBase:=Base;
494
495end;
function TClassSQL.ExecuteUpdate:boolean;
496var
497 I: Integer;
498 Sql: string;
499begin
500
Result:=True;
501 sql := 'UPDATE ' + TTableName + ' SET ';
502 for i := 0 to FUtilList.Count-1 do begin
503 sql := sql + ' ' + FUtilList.GetStringKey(i) + ' = ' + FUtilList.GetItem(i);
504 if i <> FUtilList.Count-1 then
505 end;sql := sql + ',';
506 sql := sql + ' WHERE (' + TTableName + '.'
507 + TIdPkFieldName + ' = ' + IntToStr(TIdPk) + ')';
508 q := TSQLQuery.Create(nil);
509 q.SQLConnection := TDataBase;
q.SQL.Text := sql;
510
511 try
512 q.ExecSQL;
513 except
514 Result:=False;
515 end;
q.Free;
516 Result:=False;
517end;
518function TClassSQL.ExecuteInsert:integer;
519var
520 i, r: Integer;
sql: string;
521 TableName:string;
522 Base:TSQLConnection;
523 x,y:TSQLQuery;
524begin
// if ValidateInsert=True then begin
525 sql := '';
sql := sql + 'INSERT INTO ' + TTableName + ' (';
526
for i := 0 to FUtilList.Count-1 do begin
527 sql := sql + ' ' + FUtilList.GetStringKey(i);
528 if i <> FUtilList.Count-1 then
529 sql := sql + ',';
530 end;
sql := sql + ') VALUES(';
531 for i := 0 to FUtilList.Count-1 do begin
532 sql := sql + ' ' + FUtilList.GetItem(i);
533 if i <> FUtilList.Count-1 then
534 sql := sql + ',';
535 end;
sql := sql + ')';
536
537
538 q := TSQLQuery.Create(nil);
539 q.SQLConnection := TDataBase;
540
541 FClientDataSet:=TClientDataSet.Create(nil);
542 FDataSetProvider:=TDataSetProvider.Create(nil);
FClientDataSet.SetProvider(FDataSetProvider);
543 FDataSetProvider.DataSet:=q;
544 q.SQL.Text := sql;
545 try
546 q.ExecSQL;
547 except
q.Free;
548 q := TSQLQuery.Create(nil);
549 q.SQLConnection := TDataBase;
550 q.SQL.Text := sql;
551 try
q.ExecSQL;
552 except
553 end;
554 end;
555
556 Try
557 q.close;
q.SQLConnection := TDataBase;
558 q.SQL.Text:='SELECT trim(GEN_ID('+ 'GEN_'+TTableName +
559'_ID' + ', 0)) as FIELD FROM RDB$DATABASE' ;
560 try
561 q.Open;
except
562
//Ajuste para Generator antigo
563 q.SQL.Text:='SELECT Trim(GEN_ID('+
564 'GEN_'+TTableName+ ', 0)) AS FIELD FROM RDB$DATABASE' ;
565 q.Open;
566 end;
// end
567 // else if FormPrincipal.TypeConnection='SS' then begin
568 // q.SQL.Text:='Select IDENT_CURRENT('''+TTableName+''') AS Field';
569 // q.Open;
570 // end;
571 Result := q.FieldByName('FIELD').AsInteger;
q.Close;
572 q.Free;
573 FClientDataSet.free;
574 FDataSetProvider.free;
575 except
end;
576
577
578
end;
579
580end.
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
Classe Lista Sobre essa classe você pode estudar neste artigo
Muito bem, uma vez implementadas as classes, crie um projeto teste com essa aparência.

Figura 1. Layout do Formulário


Listagem: E faça as seguintes declarações:
unit Unit1;
1
2 interface
3
4 uses
5 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
6 Dialogs, StdCtrls, Grids, DBGrids, DB, ClassSQL;
7
8 type
TForm1 = class(TForm)
9 Button1: TButton;
10 Button3: TButton;
11 DataSource1: TDataSource;
12 DBGrid1: TDBGrid;
Edit1: TEdit;
13 Label1: TLabel;
14 private
{ Private declarations }
15
QSql:TClassSQL;
16 public
17 { Public declarations }
18
19 procedure OpenSelect;
20 procedure Save;
procedure Delete;
21 end;
22
23 Implemente os métodos:
24
25 unit Unit1;
26
27 interface
28
29 uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
30 Dialogs, StdCtrls, Grids, DBGrids, DB, ClassSQL, FMTBcd, SqlExpr,
31 Provider, DBClient;
32
33 type
34 TForm1 = class(TForm)
BtnInserir: TButton;
35 BtnExcluir: TButton;
36 DataSource1: TDataSource;
37 DBGrid1: TDBGrid;
38 Edit1: TEdit;
39 Label1: TLabel;
BtnOpen: TButton;
40 DataSetProvider1: TDataSetProvider;
41 SQLQuery1: TSQLQuery;
42 ClientDataSet1: TClientDataSet;
43 BtnAlterar: TButton;
procedure BtnOpenClick(Sender: TObject);
44 procedure BtnInserirClick(Sender: TObject);
45 procedure BtnAlterarClick(Sender: TObject);
46 procedure DBGrid1CellClick(Column: TColumn);
47 procedure BtnExcluirClick(Sender: TObject);
48 private
{ Private declarations }
49 QSql:TClassSQL;
50 public
51 { Public declarations }
52 procedure Create;
53 procedure OpenSelect;
procedure SaveInsert;
54 procedure SaveUpDate;
55 procedure Delete;
56 procedure GetData;
57 end;
58
var
59 Form1: TForm1;
60
61 implementation
62
63 uses DataBase;
64
65 {$R *.dfm}
66
67 { TForm1 }
68
procedure TForm1.Delete;
69 begin
70 QSql:=TClassSQL.CreateSQL('Reg_CodeColor',
71 Qsql.GetId('IdColor'), 'IdColor', Base.Base_);
72 Qsql.ExecuteDelete;
//IRA EXLUIR O DADOS SELECIONADO NO GRID
73 end;
74
75 procedure TForm1.OpenSelect;
76 begin
77 { Estacie a classe informando a tabela de conexao,
78 o Id de pesquisa na tabela(caso necessario), o Field Id e a base de coenxao}
Qsql.OpenTableSimple;
79 DataSource1.DataSet:=QSql.GetQry;
80
81 end;
82
83 procedure TForm1.SaveInsert;
84 begin
QSql.AddStringField('CodeColor',Edit1.Text);
85 if Qsql.GetIsNotEmpty then
86 QSql.ExecuteInsert ;
87
88 // QSql.AddIntegerField('CodeColor',Edit1.Text);//Tipo Integer
89 // QSql.AddDateField('CodeColor',Edit1.Text);//Tipo Date
90 // QSql.AddTimeField('CodeColor',Edit1.Text);//Tipo Time
// QSql.AddDoubleField('CodeColor',Edit1.Text)//TipoDouble
91 // QSql.AddBooleanField('CodeColor',Edit1.Text);//Tipo Boolean
92
93 end;
94
95 procedure TForm1.BtnOpenClick(Sender: TObject);
96 begin
Create;
97 OpenSelect;
98 end;
99
100procedure TForm1.Create;
101begin
102 QSql:=TClassSQL.CreateSQL('Reg_CodeColor', 0, 'IdColor', Base.Base_);
end;
103
104procedure TForm1.BtnInserirClick(Sender: TObject);
105begin
106 SaveInsert;
107 OpenSelect;
108end;
109
procedure TForm1.SaveUpDate;
110begin
111 QSql.AddStringField('CodeColor',Edit1.Text);
112 if Qsql.GetIsNotEmpty then
113 QSql.ExecuteUpdate ;
114
115// QSql.AddIntegerField('CodeColor',Edit1.Text);//Tipo Integer
116// QSql.AddDateField('CodeColor',Edit1.Text);//Tipo Date
// QSql.AddTimeField('CodeColor',Edit1.Text);//Tipo Time
117// QSql.AddDoubleField('CodeColor',Edit1.Text)//TipoDouble
118// QSql.AddBooleanField('CodeColor',Edit1.Text);//Tipo Boolean
119
120end;
121
122procedure TForm1.BtnAlterarClick(Sender: TObject);
begin
123 SaveUpDate;
124 OpenSelect;
125end;
126
127procedure TForm1.GetData;
128begin
Edit1.Text:=QSql.ListTableReturnField('CodeColor');
129end;
130
131procedure TForm1.DBGrid1CellClick(Column: TColumn);
132begin
133 GetData;
134end;
135procedure TForm1.BtnExcluirClick(Sender: TObject);
136begin
137 Delete;
138 OpenSelect;
139end;
140
end.
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
Pronto, agora devidamente linkado com seu banco de dados local é só testar!!!
Neste caso você não precisa mais encher a tela ou data modulo com dezenas de componentes de
conexão PALETAS [interbase ou dbExpress], basta usar a Classe ClassSql, com isso talvez sem alguém
perceber nos tivemos uma pequena introdução a PARADIGMA ORIENTADOA A OBJETOS.
Lembrando estude bem o conceito de Classes, analise as classes criadas para que possas entender o
funcionamento delas.
Em uma próximo artigo com essas mesmas classes iremos criar componentes e frames para serem
utilizados por este FrameWork.
Qualquer dúvida, comentário ou sugestão entre em contato atestanieski@gmail.com ou
comercial@sinaiinformatica.com.br.

Read more: http://www.linhadecodigo.com.br/artigo/3416/desenvolvendo-framework-em-


delphi.aspx#ixzz6v3YkaBbo

Você também pode gostar