Editorial - The Club · Data Provider da Oracle para .Net implementam estes objetos de forma...

32

Transcript of Editorial - The Club · Data Provider da Oracle para .Net implementam estes objetos de forma...

3

THE CLUBAv. Profº Celso Ferreira da Silva, 190

Jd. Europa - Avaré - SP - CEP 18.707-150Informações: (14) 3732-3689

Suporte: (14) 3733-1588 - Fax: (14) 3732-0987

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected]

Informações: [email protected]

DúvidasCorrespondência ou fax com dúvidas devem

ser enviados ao - THE CLUB, indicando"Suporte".

OpiniãoSe você quer dar a sua opinião sobre o clube

em geral, mande a sua correspondência para aseção "Tire sua dúvida".

ReproduçãoA utilização, reprodução, apropriação,

armazenamento em banco de dados, sobqualquer forma ou meio, de textos, fotos e

outras criações intelectuais em cada publicaçãoda revista “The Club Megazine” são

terminantemente proibidos sem autorizaçãoescrita dos titulares dos direitos autorais.

Impressão e acabamento:GRAFILAR

Tel.: (14) 3841-2587 - Fax: (14) 3841-3346Rua Cel. Amando Simôes, 779

Cep 18.650-000 - São Manuel - SPTiragem: 5.000 exemplares

Copyright The Club Megazine 2005

Diretor TécnicoMauro Sant’Anna

ColaboradoresMário Bohm, Fábio Câmara

EDITORIAL

Editorial

Delphi é marca registrada da Borland International,as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Editorial .................................................................................. 03Dicas & Truques .................................................................... 04Utilizando VS.Net com “Data Provider” Oracle... ................... 07dbExpress - Extração e Reaproveitamento dados via SQL ... 09Delphi 2006 - Developer Studio IDE ....................................... 13Desmistificando VSTS ........................................................... 16Instalando o Firebird 1.5 com segurança ............................... 20Utilizando o tipo Record ......................................................... 25Perguntas & Resopstas ......................................................... 27

Olá amigos,

Aproximamo-nos de mais um final de ano e neste momento é tempo de fazermosum balanço de tudo que fizemos durante 2005. Com certeza muitos obstáculos foramvencidos, muita informação e conhecimento foram adquiridos e 2006 vem novamenteabrir as portas para novos desafios que juntos iremos superar um a um, mantendonossa parceria de sucesso! Assim sendo, queremos agradecer a você que esteveconosco o ano todo ou que se juntou agora ao The Club, fazendo de nós por mais umano o “Maior Clube de Programadores do Brasil”, sinceramente, muito obrigado, umFeliz Natal e um 2006 cheio de sucesso!

Enquanto 2006 não chega, confira o que preparamos para esta edição, começandocom algumas das dicas mais solicitadas ao suporte técnico. Nosso amigo Mário Bohmtraz a quinta parte do artigo sobre VS.NET e Oracle. Nosso consultor AlessandroFerreira prossegue com sua série de artigos sobre dbExpress e demonstra comoextrair e reaproveitar dados de bancos Firebird.

O ano novo ainda não chegou mais o Delphi 2006 já está por aí, confira asnovidades aqui na The Club Megazine. Nosso amigo Fábio Câmara desmistifica oVSTS – Virtual System Transaction Services, não deixe de conferir. Nosso consultorClaudinei Rodrigues em seu primeiro artigo demonstra como instalar o Firebird comsegurança e no segundo como utilizar o tipo Record, muito útil no Delphi.

E para finalizar, nossa sessão Perguntas & Respostas com algumas dassolicitações atendidas neste mês.

Forte abraço à todos e muito sucesso em 2006

4

Delphi – Formatando a entrada

Neste exemplo iremos demonstrar como formatar dados nomomento da sua digitação, ou seja, conforme o usuário fordigitando, o dado irá tomando o formato que desejar, comoexemplo um CEP, um CNPJ, etc.

Para este exemplo, adicione alguns componentes Editconforme apresentada a figura 1.

Figura 1

Iremos agora codificar os métodos que serão responsáveispela formatação. Basicamente iremos interceptar as teclas

através do evento OnKeyPress dos componentes, contudo iremoscriar métodos genéricos para serem chamados nos eventos doscomponentes, acompanhe a listagem 1.

implementation{$R *.dfm}procedure TForm1.FormataCPF

(Sender: TObject; var Key: Word; Shift: TShiftState);begin if Key in [VK_SPACE, VK_BACK] then Exit; // Coloca máscara: 999.999.999/99. with TEdit(Sender) do case SelStart of 3,7 : SendMessage(Handle, WM_CHAR,Word(‘.’), 0); 11 : SendMessage(Handle, WM_CHAR,Word(‘/’), 0); end;end;

procedure TForm1.FormataTEL(Sender: TObject; var Key: Word;

Shift: TShiftState);begin if Key in [VK_SPACE, VK_BACK] then Exit; // Coloca máscara: (99) 9999-9999

Dicas & Truques

5

with TEdit(Sender) do case SelStart of 2: begin SelStart := 0; SelText := ‘(‘; SelStart := Length(Text); end; 4: begin SelStart := 3; SendMessage(Handle, WM_CHAR,

Word(‘)’), 0); SendMessage(Handle, WM_CHAR,

Word(‘ ‘), 0); SelStart := Length(Text); end; 9: SendMessage(Handle, WM_CHAR, Word

(‘-’), 0); end;end;

procedure TForm1.FormataCEP(Sender: TObject; var Key: Word;

Shift: TShiftState);begin if Key in [VK_SPACE, VK_BACK] then Exit; // Coloca máscara: 99.999-99 with TEdit(Sender) do case SelStart of 2: SendMessage(Handle, WM_CHAR,

Word(‘.’), 0); 6: SendMessage(Handle, WM_CHAR, Word

(‘-’), 0); end;end;

procedure TForm1.FormataDATA(Sender: TObject; var Key: Word;

Shift: TShiftState);begin if Key in [VK_SPACE, VK_BACK] then Exit; // Coloca máscara: 99/99/9999 with TEdit(Sender) do case SelStart of 2,5: SendMessage(Handle, WM_CHAR,

Word(‘/’), 0); end;end;

Listagem 1

Observe que, como tratam-se de métodos, devem estaratrelados a uma classe, neste caso TForm1 que é a classe donosso projeto de exemplo e consequentemente declarados namesma, veja a listagem 2.

type TForm1 = class(TForm) private procedure FormataCPF

(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormataTEL

(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormataCEP

(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormataDATA

(Sender: TObject; var Key: Word; Shift: TShiftState); { Private declarations } public { Public declarations } end;

var Form1: TForm1;

Listagem 2.

Estando com os métodos criados, bastará efetuar a chamadados mesmos no evento OnKeyPress de cada Edit, acompanhe alistagem 3.

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);begin FormataCPF(Sender, Key, Shift);end;procedure TForm1.Edit2KeyUp

(Sender: TObject; var Key: Word; Shift: TShiftState);begin FormataTEL(Sender, Key, Shift);end;procedure TForm1.Edit3KeyUp

(Sender: TObject; var Key: Word; Shift: TShiftState);begin

Dicas & Truques

6

FormataCEP(Sender, Key, Shift);end;procedure TForm1.Edit4KeyUp

(Sender: TObject; var Key: Word; Shift: TShiftState);begin FormataDATA(Sender, Key, Shift);end;

Listagem 3.

Veja que passamos os parâmetros fornecidos pelo próprioevento. Para testar, rode o exemplo e terá como resultado algoparecido com a figura 2.

Figura 2.

Firebird – Verificar se está rodando.

Neste exemplo iremos demonstrar como verificar se oFirebird está rodando. O que difere este exemplo de outros jáapresentados nesta sessão, é que iremos informar o IP e a portapara verificação. Isso é interessante, pois poderemos saber se oFirebird está rodando em qualquer máquina da rede definidacomo servidor e não somente na máquina local.

Para este exemplo, iremos utilizar o componente IdTCPClientda suíte de componente Indy (disponível a partir do Delphi 6, casoesteja utilizando Delphi 5 poderá efetuar download gratuitamenteno site do fabricante, www.nevrona.com/indy). A figura 3 sugereum layout para este exemplo.

Partiremos agora para a codificação da função responsávelem verificar se o Firebird está rodando na servidor “X” e porta“Y”, acompanhe a listagem 4.

Figura 3.

function ServerIsRunning(AHost: string;APort: integer): Boolean;begin { Declare IdTCPClient no uses } with TIdTCPClient.Create(nil) do begin Host := AHost; Port := APort; Result := true; try Connect; Disconnect; except Result := false; end; end;end;

Listagem 4.

E para finalizar, iremos codificar o evento OnClick referenteo botão “Está Rodando?”, confira a listagem 5.

procedure TForm1.btEstaRodandoClick(Sender:TObject);begin if not ServerIsRunning(maskIP.Text,StrToInt(maskPorta.Text)) then ShowMessage(‘O Firebird não estárodando!’) else ShowMessage(‘O Firebird está rodando!’)end;

Listagem 5.

Para testar, informe o endereço IP do servidor ou qualquermáquina da rede que possua o Firebird Server rodando e a porta3050 (este é o número padrão da porta que o Firebird utiliza paracomunicação, contudo, essa pode ser alterada, assim sendo,certifique-se de informar a porta corretamente).

Dicas & Truques

7

Utilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net com“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...

Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.

Oracle

Utilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net comUtilizando VS.Net com“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...“Data Provider” Oracle...

Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.Parte 5 – Camada de Acesso ao Oracle – Codificação.

Quando utilizamos um Banco de Dados em nossasaplicações, uma boa maneira de evitar a necessidade derepetir várias vezes o mesmo código para as rotinas de acessoa Base de Dados, é criarmos uma classe que encapsule estasfuncionalidades.

No artigo anterior (Parte 4) aprendemos um pouco maissobre os principais objetos do ADO.Net, e como as classes doData Provider da Oracle para .Net implementam estesobjetos de forma otimizada para utilização com o Oracle.

Agora iremos iniciar a codificação de nosso exemplo,lembrando sempre que o objetivo da classe queconstruiremos é isolar em um único lugar as rotinasreferentes a Acesso ao Oracle, desta forma podemos reutilizá-la em vários projetos e para diferentes cenários(Web,Windows,Pocket PC,etc...).

Crie um novo projeto no Visual Studio.Net (Menu File > NewProject), escolha a pasta Visual C# Projects e o template ClassLibrary, dê o nome ao projeto de OracleDataAccess e escolha umlocal de sua preferência para salvá-lo.

Utilizando o Solution Explorer do VS.Net (Menu View >Solution Explorer) apague o arquivo Class1.cs geradoautomaticamente e em References adicione a referência a DllOracle.DataAccess,que é a implementação da Oracle doADO.Net.(para maiores informações sobre o Oracle Data

Provider consulte os artigos anteriores ou acessehttp://www.oracle.com/technology/tech/dotnet/index.html).

Ainda no Solution Explorer selecione com o botão direitodo Mouse o projeto e em seguida Add > Add New Item eadicione uma Class com o nome de DAL.cs.(conforme figuraacima).

Modifique o código de sua classe para o seguinte:

using System;using System.Data;using Oracle.DataAccess.Client;

//Oracle Provider

namespace OracleDataAccess

8

Oracle

{public class DAL//classe que será responsável pelo acesso aoOracle

{#region Variaveis e Objetos Locais//a utilização de #region ajuda na// organização do código objetos que// serão utilizados para o acesso ao//Oracle

private OracleConnection conn;private OracleCommand cmd;private OracleDataAdapter da;private DataSet ds;

//string de conexãoprivate string connectionString;

#endregion

#region Construtor

public DAL(string conexao){ //recebe a string de conexão connectionString = conexao;

}

#endregion

#region Métodos de Acesso aos Dados

public DataSet RetornaDataSet(string SQL)

{ try { //inicia a conexão com a // string deconexão // informada no construtor

conn = new OracleConnection (connectionString);

// inicia o objeto Command,que // recebe a instrução SQL e a // conexão

cmd = newOracleCommand(SQL,conn);

// Data Set que será retornadods = new DataSet();//inicia o objeto Adapter que// carregará o DataSet passando// o Command como parametroda = new OracleDataAdapter(cmd);//carregá o DataSet com os// dados e retornada.Fill(ds);return ds;

} catch (Exception ex) { // em caso de erro retorna uma // mensagem personalizada.

throw new Exception(“Erro...”,ex); }}

#endregion

}}

Compile sua classe pressionando F5.

Já criamos até aqui o básico de nossa classe, com as variáveisque serão utilizadas e um método que retorna um DataSet apartir de uma instrução SQL, no próximo artigo demonstraremoscomo testar nosso exemplo e continuaremos a implementação denossa classe. Até Lá...

Para conhecer maiores detalhes sobre as ferramentas daOracle para .Net visite:

http://www.oracle.com/technology/tech/dotnet/index.html

Referências :http://www.oracle.com/technology/tech/dotnet/index.htmlhttp://msdn.microsoft.com/

Sobre o autorMário Camilo BohmBohm Soluções [email protected] - www.bohm.com.br

9

dbExpressdbExpressdbExpressdbExpressdbExpressExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQL

dbExpress

dbExpressdbExpressdbExpressdbExpressdbExpressExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQLExtração e Reaproveitamento de dados via SQL

Salve amigos usuários da dbExpress!Continuando nossa série de artigos sobre estáótima engine de acesso a banco de dados,demonstrarei neste artigo como extrair dadosde tabelas existentes em um banco de dadosgerando um script DML (Data ManipulationLanguage) de INSERT. Isso pode ser muitoútil quando necessitamos extrair dados de umbanco de dados e adicionar em outro banco,visto que o Interbase/Firebird não possibilitaquerys heterogêneas (acesso a tabelas debancos diferentes em uma mesma instrução).

Vale lembrar, que para os usuários quefazem acesso ao banco de dados utilizando aengine IBX (palheta Interbase) poderão fazeruso do componente IBExtract que já faz isso automaticamente.

Banco de dados

Para este exemplo iremos utilizar o banco de dados“EMPLOYEE.FDB” que é um banco de exemplo que acompanhaa instalação do Firebird, geralmente disposto na pasta:C:\Arquivos de programas\Firebird\Firebird_1_5\examples.Sugiro que efetue uma cópia do mesmo para a pasta que iráutilizar neste exemplo.

Definindo a interface

Prosseguindo, crie um novo projeto Delphi, salve e veja olayout sugerido na figura 1

Estando com o componente SQLConnection em seuformulário, dê um duplo clique no mesmo e vamos configurar aconexão com o banco de dados “EMPLOYEE.FDB”, veja a figura 2.

Figura 1 – Layout sugerido

Figura 2 – Conexão com o banco de dados

por Alessandro Ferreira, [email protected]

10

Clique OK e lembre-se de alterar as propriedadesLoginPrompt e Connected para false, visto que iremos ativar aconexão no evento OnCreate do formulário, conforme códigoapresentado na listagem 1.

procedure TForm1.FormCreate(Sender: TObject);begin // abre conexão. cnxExtract.Open;end;

Listagem 1.

Continuando, vamos codificar o evento BeforeConnect eAfterConnect do SQLConnection. Nestes eventos iremosinformar o caminho do banco de dados e também carregar a listade tabelas do referido banco no componente ComboBox,acompanhe a listagem 2.

procedure TForm1.cnxExtractBeforeConnect(Sender: TObject);

begin // ajusta o caminho do banco de dados. cnxExtract.Params.Values

[DATABASENAME_KEY] :=ExtractFilePath(ParamStr(0))+’EMPLOYEE.FDB’;

end;

procedure TForm1.cnxExtractAfterConnect(Sender: TObject);

begin // Atribui lista de tabela do // banco ao ComboBox. cmbTabela.Clear; cnxExtract.GetTableNames(cmbTabela.Items); cmbTabela.ItemIndex := 0;end;

Listagem 2 – Before e After connect do SQLConnection.

Nosso próximo passo será a codificação do procedimentoListData que irá receber como parâmetros o componenteSQLConnecton, o nome da tabela, o dialeto e a lista onde serãoadicionados as instruções de INSERT, acompanha a listagem 3.

{ Colocar nomes de campos entre aspas, casonecessário. }function QuoteIdentifier(Dialect: Integer;Value: String): String;

begin if Dialect = 1 then Value := AnsiUpperCase(Trim(Value)) else Value := ‘“‘ + StringReplace (Value,

‘“‘, ‘“”’, [rfReplaceAll]) + ‘“‘; Result := Value;end;

{ Extrair dados da tabela em instruçõesINSERT. }procedure ListData(Cnx: TSQLConnection;

ObjectName: String; SQLDialect:Integer;

FMetaData: TStrings);const SelectSQL = ‘SELECT * FROM %s’; TERM = ‘;’;var qrySelect : TSQLQuery; Line, FieldName, Fields, Values, DateStr :String; i : Integer;begin qrySelect := TSQLQuery.Create(nil); qrySelect.SQLConnection := Cnx; try qrySelect.SQL.Text := Format(SelectSQL,

[QuoteIdentifier(SQLDialect,ObjectName)]);

qrySelect.Open; Fields := ‘’; { Gerar sequencia de campos. } for i := 0 to qrySelect.Fields.Count - 1do begin FieldName := qrySelect.Fields[i].

FieldName; if Fields <> ‘’ then Fields := Fields + ‘, ‘; Fields := Fields + QuoteIdentifier

(SQLDialect, FieldName);

end;

while not qrySelect.Eof do begin Line := ‘INSERT INTO ‘ +

QuoteIdentifier(SQLDialect,ObjectName) + ‘ (‘;

dbExpress

11

Line := Line + Fields + ‘) VALUES (‘; Values := ‘’; for i := 0 to qrySelect.Fields.

Count - 1 do begin if (Values <> ‘’) then Values := Values + ‘, ‘; if qrySelect.Fields[i].IsNull then begin Values := Values + ‘NULL’; end else case qrySelect.Fields[i].DataType of ftString : Values := Values + QuotedStr

(qrySelect.Fields[i].AsString); ftDate, ftDateTime : begin DateTimeToString(DateStr,

‘mm/dd/yyyy’,qrySelect.Fields[i].AsDateTime);

Values := Values + QuotedStr(DateStr);

end; ftTime : begin DateTimeToString(DateStr,

‘hh:mm:ssss’, qrySelect.Fields[i].AsDateTime);

Values := Values +QuotedStr(DateStr);

end; ftTimeStamp : begin DateTimeToString(DateStr, ‘mm/dd/

yyyy hh:mm:ssss’,qrySelect.Fields[i].AsDateTime);

Values := Values + QuotedStr(DateStr);

end; ftInteger, ftSmallint, ftFloat,

ftLargeInt, ftFMTBcd, ftBCD: Values := Values +

qrySelect.Fields[i].AsString; ftMemo: Values := Values + QuotedStr

(qrySelect.Fields[i].AsString); ftArray, ftBlob, ftBytes : Values := Values + ‘NULL’; end;

end; Line := Line + Values + ‘)’ + Term; FMetaData.Add(Line); qrySelect.Next; end; finally qrySelect.Free; end;end;

Listagem 3 - Procedimento ListData.

A idéia básica deste procedimento é a seguinte: Efetuamosum select na tabela que foi informada como parâmetro,efetuamos um laço para obter campo a campo desta tabela a fimde montar a primeira parte da instrução INSERT (insert into<tabela> (<campos) values) e após isso efetuamos um outro laçowhile para percorrer a tabela registro a registro e dessa formacomplementar a instrução INSERT (values(<valores_dos_campos>) e é claro, testando cada tipo de campopara efetuar o tratamento necessário deixando em um formatoválido para poder ser reutilizado posteriormente.

Com isso, concluímos a implementação do procedimento paraextração dos dados e para concluir iremos efetuar a chamada domesmo no evento OnClick do btnExecutar, confira a listagem 4.

procedure TForm1.btnExecutarClick(Sender:TObject);var D: Integer;begin if rgDialect.ItemIndex = 0 then D := 1 else D := 3; btnExecutar.Enabled := false; try mScript.Lines.Clear; ListData(cnxExtract, cmbTabela.Items

[cmbTabela.ItemIndex], D,mScript.Lines);

finally btnExecutar.Enabled := true; end;end;

Listagem 4 – OnClick do btnExecutar.

Para o script gerado ser útil devemos ter a possibilidade de

dbExpress

12

salvá-lo em um arquivo texto e para isso vamos programar oevento OnClick do btnSalvar, veja a listagem 5.

procedure TForm1.btnSalvarClick(Sender: TObject);

begin if sDialog.Execute then mScript.Lines.SaveToFile(sDialog.FileName);end;

Listagem 5 – OnClick do btnSalvar.

Pronto! Tecle <F9> para rodar o projeto e se tudo estivercorreto teremos o resultado apresentado na figura 3.

Você pode estar se perguntando: O que eu vou fazer com ummonte de instruções INSERT? Como isso pode ser útil? Respondo:Isso pode ter várias aplicações, por exemplo, se você necessitarreplicar estes dados em uma tabela com a mesma estrutura emum outro banco de dados, poderá rodar o referido script atravésde qualquer console (IBConsole, IBExpert, etc) ou ainda, atravésdo próprio componente SQLConnection, veja a listagem 6.

var Script: TStringList; i: Integer;begin Script := TStringList.Create; try Script.LoadFromFile(‘c:\country.sql’);

Figura 3Projeto em execução

for i := 0 to Script.Count - 1 do SQLConnection1.ExecuteDirect(Script[i]); finally Script.Free; end;end;

Listagem 6 – Rodando o script via SQLConnection.

Considerações finais

Demonstrei neste artigo uma abordagem bastante simplespara extração e reaproveitamento de dados utilizando a enginedbExpress. Vale a pena ressaltar que este tipo de abordagemoferece grande performance na inclusão de grandes volumes dedados, visto que a execução através do método ExecuteDirect doSQLConnection envia a instrução diretamente ao banco de dadossem a necessidade de fazer cache local.

Abraço e sucesso à todos,

Download

O projeto de exemplo referente este artigo encontra-sedisponível para download em: http://www.theclub.com.br/revista/download/dbextract.zip.Sobre o autorAlessandro Ferreira, Consultor Técnico do The [email protected]

dbExpress

13

Delphi 2006Delphi 2006Delphi 2006Delphi 2006Delphi 2006Developer Studio IDEDeveloper Studio IDEDeveloper Studio IDEDeveloper Studio IDEDeveloper Studio IDE

Delphi 2006Delphi 2006Delphi 2006Delphi 2006Delphi 2006Developer Studio IDEDeveloper Studio IDEDeveloper Studio IDEDeveloper Studio IDEDeveloper Studio IDE

DelphiWin32

C++BuilderWin321

Delphi.NET

C#Builder.NET

As organizações já estão preferindo os softwares de aplicaçãoe montagem web, esta é a melhor alternativa para os negócios,que frequentemente estão reutilizando para manter a existênciadesses softwares, a questão é escrever bem e aprovar o sistemanos lugares onde serão somente rodados para substituir, já quefoi adotada recentemente uma nova tecnologia capaz deproporcionar essa mudança sem alterações. Isto é, o benefício doDelphi 2006 é permitir uma mistura de métodos no projeto, sendoassim uma multicamada.

Como se pode ver na figura, observa-se que Win32, C++,DLL estão promovendo a comunicação do que esta sendomostrado com os componentes do form (Como sistemasindustriais, bancários ou um simples banco de dados), o Delphiutiliza aplicação Win32 no caso de várias camadas de aplicaçãoDataSnap, podendo este conectar com uma DLL em C++ e

incluir as informações em um banco de dados., e tambémpermitir o acesso a um provedor WEB, utilizando C# paraprojetar ASP.Net. Todos os projetos que forem desenvolvidos eadministrados estarão disponíveis em um único projeto queagruparam todos os outros dentro do Delphi 2006.

Isso tudo mostra que Delphi2006 possui grande capacidade eflexibilidade para que se desenvolvam todos os tipos dearquitetura que tiver a oportunidade de se diagramar.

São vários os novos níveis de características no Delphi 2006.Estas variam de alto nível Application Lifecycle Management(ALM) como as características de baixo nível permitem acodificação nivelada. A Borland foi bem expressiva em focar aresponsabilidade e a desempenho do seu novo lançamentopodendo ser evidenciada pela facilidade do gerenciamento deatualização em memória da IDE, para ajudar no suporte e

poderio algumas das novascaracterísticas estão detalhadasabaixo.

Outra melhora é o tempo deinicialização da IDE e podeaumentar, mas no caso de resolverinstalar alguma linguagempreferencial para utilizar emqualquer ponto, em algummomento. Na realidade é umsimples “-p” na linha de comandopara carregar uma das linguagensescolhidas, por exemplo: “-pDelphiDotNet” carregará somente oDelphi.DotNET que irá

Delphi 2006

14

personalizar todos os atalhos que são adicionados no inicio domenu como partes da instalação do Delphi 2006 para cadapersonalidade. Algumas das novas características estão maisamigáveis como também provém uma melhora, as vantagens nodia-a-dia para desenvolver são as melhorias em codificaçãonivelada.

SurroundQuando você estiver escrevendo seu código, você poderá

utilizar esta opção clicando na área de código você poderá escolhera item “surround” e selecionar qualquer comando do menu paraauxiliá-lo na codificação da melhor maneira possível.Incrementando e evoluindo o código que esta sendo escrito.

DebuggerA equipe Delphi teve um grande trabalho, focando as

características intuitivas que mostraram o desenvolvimento combenefícios, tornando os ciclos mais rápidos e ágeis. O debugging éo encarecimento do código incluindo a expansão visual e maioresinformações em todos os níveis da inspeção do debug. Você verá aapresentação das informações em diversas visualizações queestam nas entrelinhas do código, mostrando assim os dados queestão no ponto mais crítico.

Um dos assuntos notados pelo novo debug é o encarecimentodas características, e qual o modo de você trabalhar com osdetalhes mostrados no CPU, então você poderá selecionarmúltiplos itens e copiar ao clipboard. Há boas noticias com debugremoto que agora esta disponível para aplicação Win32,Administrativas e ASP.Net.

DatabaseBanco de dados é a parte vital para todo o comércio de

desenvolvimento de software e o Delphi 2006 continuamelhorando o suporte que a Borland desenvolve para desfrutarde um trabalho conjunto com o banco de dados principal.Desenvolvedores estão esperando consistência, funcionalidade,mas com acesso local para diferentes bancos de dados, colocandoos drivers como sendo o suporte básico para as atualizações decada versão de banco de dados..

Houve uma alteração bem vinda para desenvolvedores deWin32, o DBexpres foi completamente incorporado ao Explorerdo banco de dados. Este permitirá completamente o acesso àvisualização e mudança das tabelas que se teve acesso através doDBExpress aos drivers dentro da IDE.

No tipo Net há apoio total em conecção concentradaacrescentado ao Borland Data Providers (BDP), isto provocaprincipalmente um aumento do desempenho das aplicações,

especialmente ao qual servirá muitos pedidos para múltiplosclientes, como aplicações web em ASP.Net.. Agora você pode usaruma conecção agrupada para diminuir o tempo da mesmautilizando a conecção com o grupo existente.

Você pode ver na figura, conecção agrupada do banco dedados com opções disponíveis na caixa de dialogo ‘ConnectionsEditor’.

Integrando com o DelphiUma das mais novas adições para o Delphi 2006 é que agora

inclui um padrão UML 1.5 e UML 2.0. Modelando de acordo coma capacidade. Os benefícios da funcionalidade são aplicados emtodos os tipos de desenvolvimento, por causa deste mesmo códigocentral, que usa a modelagem em partes para estender asaplicações junto com o ciclo de vida do mesmo.

Junto com a essência da automação teve de reescrever ocódigo para assegurar o dispositivo de integração, a capacidade doLiveSource pode mostrar uma visão atualizada do códigoexistente, e permitir você ver a mudança do código como tambémcriar um código para alterar o design. Há várias áreas deinteresse como: tipos de diagramas, modelos de design, auditoria,medição e geração de documentação. Também tem ítem novosintegradas como o modelo refactorings que completa bem o códigorefactorings.

Tipos de Diagramas O diagrama do tipo UML esteve muito estendido no

Delphi 2006

15

Delhi2005, agora na edição de 2006 está disponível os seguintesdiagramas: : Class diagram, Use Case diagram, Sequencediagram, Collaboration diagram, State chart diagram, Activitydiagram, Component diagram, Deployment diagram, Class,Interface, Structure, Enumeration, Delegate, Namespace,Object. Como se observa na figura abaixo.

Modelos de DesignPor muitos anos trabalhando com uma poderosa linguagem

orientada a objetos e usando componentes próximos da base,desenvolvedores de Delphi alcançam frequentemente níveis maisaltos quando o usam novamente.

Os níveis podem ser reutilizados mais adiante graças àinclusão de um repositório de padrões de design, isso vem prontoe carregado com o design padrão do Delphi.

A parte principal deste padrão é a facilidade que você podearmazenar, organizar e compartilhar seus próprios padrões dedesign para modelos, ou o novo código que criou. Quando vocêadiciona esta este padrão para importar e exportar usando XMLcomo também MDL, você pode compartilhar design e outrasferramentas, linguagens ou outras plataformas como Java.

ECO III – Modelo Dirigido ao DesenvolvimentoEnterprise Core Objects (ECO), objeto central de

empreendimento, o modelo da Borland dirigido para FrameWorkfoi introduzido primeiro em C#Builder 1 com ECOII estreando noDelphi 2005. Desde então, ECO proporcionou para muitosclientes uma melhora dramática em produtividade e qualidadeno desenvolvimento de aplicações.

ECO prove um aumento de produtividade significativa paraautomatizar a aplicação precisou programar o código daarquitetura, qualquer outra solução para codificar você precisa

programar manualmente. Faz isto examinando as informaçõesdos modelos em tempo de execução, usando estas informaçõesentão para executar serviços automaticamente comopermanecendo seus objetos no banco de dados, obrigando osserviços à executar o código sem o código adicional requerido dodesenvolvedor.

A combinação profunda da integração, junto com a criação domodelo de design em tempo, e um framework em execução comoECO para consumir aqueles resultados dos modelos de modo aconstruir as aplicações .NET mais rápidas.

ECO – Linguagem de AçãoContinuando o tema de expressar mais sua lógica de

aplicação do seu modelo em lugar de em código, ECO IIIintroduzir o ECO Action Language. Esta é uma extensão a OCL,enquanto o permitindo ambos definem a implantação de métodosem seu modelo, como também invocar outros métodos que vocêmodela de dentro.

Isto reduz a quantia de codificação exigida para construiruma aplicação sofisticada até mesmo mais adiante.

Padrões de DomínioMais adiante alcançando a integração junto com o Delphi

2006, agora você pode definir padrões de domínio comuns,enquanto acontecem coleções de objetos empresariais geralmente,e armazena estes em um diretório central assim a equipe inteirapode influenciar a consistência das definições dos problemas queestão sendo resolvidos.

ECODesde que a Borland lançou ECO na primeira versão

C#Builder, desenvolvedores tem encontrado aumento naprodutividade e construindo aplicações melhores.

Pensado nisto, todos os desenvolvedores de Delphi agorapodem experimentar o ECO, pois esta incluída em toda edição doDelphi 20006.

Usuários de Delphi2006 Professional.poderão construiraplicações em ECO-Winform e mantém os dados em arquivosXML. Além disso, o trabalho do desenvolvedor pode estender oECO das aplicações para web que usam ASP.NET, e mantêm osobjetos relacionados com o banco de dados como o Interbase, SQLServer, Oracle e outros.

Atualmente, desenvolver arquitetura em Delphi2006 ganhasuporte State Machine, como também as características desincronização precisam desdobrar o server-side ECO quepertence aos múltiplos servidores.

Delphi 2006

16

Desmistificando VSTSDesmistificando VSTSDesmistificando VSTSDesmistificando VSTSDesmistificando VSTSVisual Studio

Siglas novas em nosso universo “informático” podem passardesapercebidas face ao exagero existente. Por exemplo, VSTSpode significar “Virtual System Transaction Services” ou “VisualSoftware Tool for SAP”. A criatividade permitirá diversassugestões, contudo nossa preocupação é que o verdadeirosignificado de VSTS - Visual Studio Team System não consegueexplanar por si a magnitude desta ferramenta.

A primeira percepção no contato com a ferramenta foi quefinalmente vamos resolver inúmeras questões de controle deprojetos e acabar com o processo artesanal baseado em confiançapresente aos projetos de desenvolvimento de software.

Entretanto, evoluímos uma percepção positiva cada vez quenos aprofundamos em estudar a proposta da ferramenta,certificando-nos que é uma solução completa para SDLC -Software Development Life Cycle.

Os papéisAntes de qualquer ação é imprescindível compreender o que

chamamos de “Team System Roles”. TSR são os papéiscontemplados no VSTS e possuem suas próprias ferramentas detrabalho dentro da solução. Os papéis são: Project Managers,Software Architects, Software Developers, Software Testers e aadministração de tudo isso com um único controladordenominado Team Foundation Server.

Para estes papéis existem uma série de ferramentas oufuncionalidades dentro do Visual Studio 2005 na versão doproduto intitulada Team System (VSTS) conforme suasrespectivas necessidades especialistas. Explicando em miúdos,partimos do principio mínimo que você tem o Visual Studio 2005Professional, plugado no Team Foundation Client e a partir daíseparado nas opções Visual Studio Team Architect, Visual StudioTeam Developer e Visual Studio Team Test.

No Visual Studio Team Architect temos contempladoferramentas e funcionalidades para: Application Modeling,Logical Infrastructure Modeling, Deploying Modeling, ClassModeling e Visio and UML Modeling.

Algumas destas ferramentas ou funcionalidades podem serencontradas em outro papel, como por exemplo o Class Modeling

e o Visio and UML Modeling presentes no Visual Studio TeamDeveloper.

Tratando do Visual Studio Team Developer, sabendo-se que ofoco deste papel é a codificação, encontramos as seguintesferramentas e funcionalidades além dos compiladores delinguagem: Dynamic Code Analizer, Static Code Analizer, CodeProfiler, Unit Test e Code Coverage. Confesso queparticularmente considero as duas últimas a realização deantigos sonhos de programador, pois são ferramentasextremamente funcionais à garantia de qualidade dos produtosdesenvolvidos.

Para os analistas de testes, o Visual Studio Team Test possuias seguintes ferramentas e funcionalidades: Load Testing,Manual Testing, Test Case Management, Unit Test e CodeCoverage.

Para os Project Managers, com base em padrões e práticas doMSF - Microsoft Solutions Framework, existem “templates” e“work flows” para o gerenciamento e controle de projetos. Casonão seja esta metodologia a sua predileção, você tem apossibilidade de encontrar templates para RUP, XP, MSF Agile eoutras metodologias ágeis como TDD - Test Driven Developmentpor exemplo. Adicionalmente, você também pode gerar seuspróprios templates para seus projetos.

Quando um projeto é criado com o VSTS, automaticamenteum Project Site é disponibilizado e informações em tempo real sãodisponibilizadas conforme os eventos configurados. Por exemplo,é possível ao seu time e “stakeholders” do projeto acessaremgráficos como o demonstrado na figura 2.

Profissionalizando o projetoA base da solução VSTS está fundamenta nos papéis

necessários aos projetos e nos pilares: Work Item Tracking,Source Control, Build Automation, Project Site como geradoresde informações automáticas a boa gerência do projeto. Estasinformações estarão sempre disponíveis ao time e aosstakeholders do projeto em construção, seja em forma derelatório, gráfico ou e-mails de alerta.

A grande evolução foi que mesmo em processos unificados e

Desmistificando VSTSDesmistificando VSTSDesmistificando VSTSDesmistificando VSTSDesmistificando VSTSpor Fábio Câmara

17

Figura 1 - Gráfico com as ferramentas que compõe o Visual Studio Team System,denominadas Visual Studio Team Suite

Figura 2. Gráfico que demonstra a qualidade do projeto gerado pelos controlesVSTS

um controle muito próximo através de ProjectManagers e cronogramas, os projetos dedesenvolvimento possuíam uma relaçãoartesanal de confiança entre os gerentes econtroladores com os implementadores.Explicando melhor, uma tarefa eraconsiderada pronta após a afirmativa doprogramador. Esta relação, sempretendenciosa ao otimismo de que teremostempo de fazer tudo o que precisa,historicamente foi o “calcanhar de Aquiles”dos projetos de desenvolvimento de software.

Com o Work Item Tracking poderemosverificar com exatidão os problemas ocorridosno projeto e os seus respectivos impactos. Ositens serão sempre atribuídos a colaboradoresdo time que estarão com a responsabilidadede encaminhá-los dentro do projeto.Naturalmente, as ferramentas efuncionalidades do VSTS demonstraramtodos os itens em aberto e permitiram aclassificação de risco e impacto dos mesmos.

No Source Control temos uma evolução doVisual SourceSafe somado a característicasde compartilhamento e visualização doMicrosoft SharePoint, facilitando acomunicação entre os membros do time epermitindo inúmeras funcionalidades novascomo acesso remoto a documentos, artefatos ecódigo fontes.

O Build Automation, como o nome deixaclaro, é a implantação de uma excelenteprática da própria Microsoft que agorapodemos usar em nossos projetos. É apossibilidade de ter builds programados,sejam por períodos definidos ou não, mas quepermitam resgatar uma “foto” do cenárioatual do projeto. Com o resultado do build,podemos iniciar verificações e certificarmosdo real estágio de nosso projeto.

O Project Site possibilita a visualização deimportantes informações automaticamenteatualizadas para todo o time e stakeholders doprojeto. É uma eficiente forma de dizerdefinitivamente “adeus” a desculpa de quevocê não sabia determinada informação ou

Visual Studio

18

fato do projeto.

Team Foundation ServerO Team Foundation Server é o “gerenciador e servidor” que

proporciona uma série de ferramentas de controle de projetosbaseadas em SPM - Software Project Management como porexemplo o Microsoft Excel, Microsoft Project e WindowsSharePoint Services.

O Visual Studio Team Foundation Server é um produtoseparado com a finalidade de controlar o Work Item Tracking,Integration Services, Project Management, ChangeManagement, Project Site e Reporting. Se audaciosamentefizermos uma analogia, o TFS seria o coração e o cérebro doVSTS.

Através de informações controladas pelo TFS, considerandoque você está desenvolvendo um projeto com base no “template”MSF Agile, você pode obter automaticamente os seguintesrelatórios:

• Remaining Work - Os itens que ainda serão desenvolvidos(backlog). Responde a pergunta: _ Quanto trabalho falta equando está previsto de estar pronto?

• Velocity - Uma média entre bugs encontrados esolucionados que responde a pergunta: _ Qual a produtividade deseu time?

• Unplanned Work - Um interessante gráfico que expõe ositens inclusos durante o projeto que não faziam parte do baseline.Responde a pergunta: _ Quanto trabalho não planejado nóstemos?

• Quality Indicators - Importante relatório que demonstra aquantidade de bugs em aberto, a percentagem de código cobertopor testes (code coverage), o número de testes aprovados, emconclusão e reprovados. Responde a pergunta: _ Qual a qualidadedo seu projeto?

• Bug Rates - Demonstra a taxa de bugs em backlog, bugsrecentemente descobertos e bugs solucionados. Responde apergunta: _ Como efetivamente estamos encontrando, resolvendoe fechando os bugs?

• Reactivations - Um relatório objetivando medir o re-trabalho, seja em bugs ou falsas tarefas. Responde a pergunta: _Quanto re-trabalho nós temos neste projeto?

• Bugs by Priority - O título do relatório é intuitivo,demonstra se os bugs prioritários estão realmente sendo tratadoscom prioridade. Responde a pergunta: _ Estamos trabalhandocorretamente os bugs?

• Actual Quality versus Planned Velocity - “Místico” relatórioque responde a pergunta: _ Quão rápido nós caminhamos semcomprometer a qualidade do projeto? Possui como informaçãobase as interações nos cenários, bugs encontrados por cenários e

resolvidos, total de trabalho estimado e eficiência.

Como começar?Muito provavelmente você já possui alguma espécie de

ferramenta com seu time de desenvolvimento e migrar para umanova opção pode ser uma tarefa árdua, ou no mínimopreocupante. Também podemos supor que seu processo dedesenvolvimento não está formalizado ainda e você preocupa-seem como adaptar-se a processos formais controlados por umaferramenta de SDLC. Vamos tratar os dois temas com uma visãototalmente prática.

Se sua empresa utiliza o ClearQuest da Rational, porexemplo, você pode utilizar o aplicativo CQConverter.exe paramigrar sua base de work items para o Visual Studio IssueTracking. Este aplicativo além de analisar seu banco de dados doClearQuest, permite você mapear os dados a serem migrados.Este utilitário vem conjuntamente com o Visual Studio TeamFoundation.

Obviamente que se estamos preparados para migrações desoftware de outros fornecedores, o Visual SourceSafe possui todoo suporte para integrar-se com o Team Foundation. O utilitárioVSSConverter.exe faz todo o trabalho após algumas pequenasdireções determinadas pelo administrador da migração.Adicionalmente é gerado um relatório sobre esta migração paracertificar que os resultados serão os esperados.

A partir destas migrações, as ferramentas integradas com oTeam Foudation serão o Microsoft Project e o Microsoft Excel, quecertamente são as mesmas ferramentas utilizadas hoje pelo seutime de projetos de software. Em outras palavras, será indolor aadaptação do seu time de desenvolvimento as novas ferramentasde controle, visto que serão utilizados o próprio Visual Studio2005 e basicamente o Microsoft Project e o Microsoft Excel.

Já para o caso de implantar o Visual Studio Team System emum time sem processos formalizados de desenvolvimento desofware, segue uma proposta de “caminho das pedras”.

1. Primeiramente defina e crie seu team project. Existe ummanual explicativo na ferramenta para esta finalidade, maspraticamente é cadastrar os participantes do projeto e outrosbreves passos para configuração dos clientes;

2. No passo anterior um Team Project Web Site é geradoautomaticamente com sugestões de documentos conforme aconfiguração de metodologia definida;

3. Também o Item Tracking database é automaticamentecriado para controlar todo o esforço empreendido no projeto;

4. O template escolhido derteminará todas as regras, questõesde segurança e outro itens de controle necessários ao

Visual Studio

19

acompanhamento do projeto;5. Depois de tudo isso pronto em apenas um passo, cadastre

tarefas no seu cronograma do projeto com a ferramentaMicrosoft Project e utilize normalmente o Visual Studio 2005.Inclusive pelo próprio Visual Studio 2005, você conseguirácadastrar novos itens como tarefas, cenários e bugs.

Como pré-requisito para este “caminho das pedras”, se faznecessário conhecer a metodologia escolhida como template parao Team Project visando entender os documentos e itens propostosautomaticamente. Entretanto arrisco-me em afirmar que émuito fácil compreender e adequar-se ao Microsoft SolutionsFramework Agile, ou simplesmente MSF Agile. Desta forma,quaisquer times de projeto podem aproveitar destas facilidades deimplantação e usufruirem dos resultados diferenciados que sãoproporcionados nos projetos com ferramentas de controle e apoioa gestão.

ConclusãoApresentamos um conjunto de ferramentas que certamente

irão evolucionar seu SDLC, tornando-o automatizado eprofissional. Extremamente recomendado para times com maisde 5 pessoas, proporcionando a facilidade da comunicação e a

previsibilidade do projeto. Para times pequenos, sugerimosutilizar o Visual Studio Professional em conjunto com o VisualSourceSafe 2005.

As características que superficialmente citamos, quandocorretamente aplicadas pelo seu time de projeto possibilitarãonovas visões de como trabalhar seus processos, direcionando-osa especialização que maximizará os seus resultados.

Por ser uma proposta de controle e gerenciamento deprojetos, queremos cativar os coordenadores e gestores deprojetos em geral a experimentar e avaliar os benefíciosresultantes. Tememos que os desenvolvedores sejam os maiorescríticos à implantação desta iniciativa, pois certamente serãoacompanhados e mensurados com mais profissionalismo.

Sucesso em seus projetos.

Sobre o autorFabio Camara ([email protected]) é MCP, MCSA,MCAD Charter, MCDBA, MCSE, MCSD.NET e MSF Practitioner -Utiliza MSF em seus projetos há mais de 4 anos e sonha comuma ferramenta como esta desde que começou a coordenarprojetos de software com grupo de pessoas.

Visual Studio

20

Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5com segurança.com segurança.com segurança.com segurança.com segurança.

Firebird

Neste artigo vamos abordar algumas informações sobre aquestão de segurança na instalação do Firebird 1.5.

Por padrão o Firebird vem com um usuário default chamadoSYSDBA e uma senha default para este usuário que é a masterkey.

Alterar a senha do usuário SYSDBA é uma prática muitorecomendável. Para realizar a sua alteração é muito simples.Chame uma tela do DOS ou Prompt de comando. Para isto cliqueno botão iniciar do Windows | Todos os programas | Acessórios |Prompt de Comando.

Dentro da tela Prompt de comando vá até o diretórioC:\Arquivos de programas\Firebird\Firebird_1_5\Bin. Nestelocal você irá localizar um programa chamado GSEC. É com esteprograma que vamos trocar a senha. Veja a seguir a sua sintaxede uso:

gsec –user SYSDBA –password masterkey –modifySYSDBA –pw <nova senha>

Basta que você troque <nova senha> pela nova senha que vocêquer utilizar.

Uma informação muito importante é que apenas os oitoprimeiros dígitos da senha é que serão reconhecidos. Se vocêtentar alterar a senha para um tamanho maior que oito dígitos,você receberá um aviso informando que apenas os oito primeirosdígitos serão utilizados.

Outra informação importante é que se você instalar oFirebird em um Windows onde tenha um Firewall bloqueando aporta 3050, você pode receber uma mensagem dizendo que obanco de dados não está disponível. Nestas circunstanciasadicione o seguinte parâmetro no GSEC.

-database localhost: <caminho do banco dedados>\security.fdb.

Por padrão o Firebird utiliza a porta 3050, se você estáutilizando algum Firewall você terá que habilitar esta porta paraque os usuários externos possam acessar o seu banco de dados.

AliasO Firebird tem a capacidade de utilizar alias. Isto auxilia

bastante na segurança, pois os usuários não precisam ficarsabendo a localização exata do banco de dados. Os alias ficamarmazenados no arquivo aliases.conf que pode ser encontrado nodiretório onde está instalado o Firebird.

Veja a seguir um exemplo do arquivo:

## List of known database aliases# ———————————————## Examples:# dummy = c:\data\dummy.fdb#

SegurançaPara proteger o Firebird você precisará rodar um serviço

dentro de um contexto de um usuário e alterar as permissões dapasta. Isto envolve criar uma conta de usuário no Windows emodificar as permissões de NTFS no drive e na pasta.

Usuário SeguroÉ importante criar um usuário para rodar o Firebird. Isto lhe

permitirá dar mais segurança ao banco de dados, usando aspermissões NTFS.

Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5Instalando o Firebird 1.5com segurança.com segurança.com segurança.com segurança.com segurança.

Por Claudinei Rodrigues

21

Criando um usuárioPara criar um novo usuário clique no botão Iniciar, Painel de

Controle, Ferramentas Administrativas, Gerenciamento doComputador. Agora clique em Usuário e grupos locais como estásendo mostrado na figura 1.

Agora clique com o botão direito do mouse no item Usuários, edepois clique em Novo Usuário. Na próxima tela informe umapelido para o usuário, o nome completo do usuário, umadescrição e a senha. Veja um exemplo na figura 2. Depois cliqueno botão Criar.

Figura 1:Gerenciamento docomputador

Figura 2: Criando um novo usuário

Ainda dentro do Gerenciamento do computador, dê um duploclique no usuário que você acabou de criar. Fazendo isto você teráacesso às propriedades deste novo usuário. Agora clique na abaMembro de. Selecione o usuário como está mostrado na figura 3 eclique no botão Remover.

Figura 3: Removendo usuário.

Firebird

22

Segurança no Drive e na Pasta.Para que os usuários não criem a

base de dados em qualquer lugar, vocêvai precisar configurar as permissõesNTFS. Para fazer isto você precisaráconfigurar a permissão em cada drive.

A partir do Windows Explorer, cliquecom o botão direito sobre um determinadodrive, por exemplo, o drive C e depoisclique em propriedades. Clique na abaSegurança e remova um usuáriochamado TODOS.

Agora nós precisamos habilitar o nosso usuário,FB_UsrBanco. A primeira coisa a ser feita é selecionar a pastaonde o Firebird está instalado. Feito isto, clique com o botãodireito sobre a pasta e depois em Propriedades. Agora clique naaba segurança e depois no botão Adicionar. Depois disto digite onome do nosso usuário na caixa de texto como mostrado nafigura 5:

Clique no botão Ok. Feito isto você terá uma tela igual àmostrada na figura 6:

Figura 4: Propriedades do drive C

Figura 5: Seleção de usuários

Figura 6: Propriedades

Nesta tela, não esqueça de marcar o checkbox Gravar. Repitaesta operação na pasta onde está gravado o banco de dados.

O NTFS utiliza a herança para as permissões, portanto cadapasta e arquivo, abaixo da pasta que foi configurada herdarão asmesmas propriedades.

Firebird

23

Firebird.ConfO Firebird pode se tornar mais seguro utilizando o arquivo

Firebird.conf. Qualquer alteração feita neste arquivo requer queo serviço do Firebird seja reinicializado antes que as modificaçõestenham efeito.

Se você não estiver contente alterando o arquivo Firebird.confvocê pode fazer o download de um utilitário chamadoFBConfigManager que configura o arquivo .conf. Você poderáfazer o download a partir do link no final desta matéria.

Caminho do banco de dadosNo arquivo Firebird.conf você vai encontrar uma entrada

chamada Database Paths/Directories. Nesta parte do arquivovocê pode restringir o caminho a ser utilizado para armazenar obanco de dados. Você pode utilizar os seguintes valores:

Full: Tabelas externas podem ser armazenadas emqualquer local.Restrict: Restringe a localização das tabelas externaspara um local especifico.None: Não permite tabelas externas.

Por questões de segurança é aconselhável que se utilize ovalor None.

UDF (Funções externas)Define onde as UDFs podem ser localizadas. As UDFs são

arquivos .DLL que são dinamicamente linkados ao Firebird. OFirebird vem com uma biblioteca UDF que está instalada nomesmo diretório onde está o Firebird em um subdiretório \UDF.Os valores válidos são:

Full: A UDF pode ser localizada em qualquer local.Restrict: Restringe a localização da UDF em umlocal especifico.None: Não permite utilizar UDF.

Por questões de segurança neste caso é aconselhável utilizara opção Restrict seguida pela UDF, por exemplo:

UdfAccess = Restrict UDF

Isto permitirá ao usuário ter acesso completo as UDFspadrões, mas não permitirá a utilização de suas próprias UDFs.

Configuração de Protocolo TCP.Define a porta utilizada pelo Firebird para comunicações

TCP. O Firebird 1.5 introduziu a possibilidade de configurar qualporta será usada, isto é muito útil quando você tem, por exemplo,

o Firebird e o Interbase instalado na mesma máquina. Ambosutilizam à porta 3050, mas com este recurso você pode alterar aporta que o Firebird vai utilizar.

Veja abaixo os valores que podem ser configurados:RemoteServiceName = gds_db. Especifica a porta

dentro do arquivo de serviço.RemoteServicePort = 3050. Este valor ser alterado para

qualquer outro valor que não esteja sendo utilizado.

Modificando este valor você quebrará a compatibilidade comprogramas mais antigos que não estão configurados para utilizarportas alternativas.

Remote Bind AddressDefine qual endereço IP está definido para o Firebird. Por

padrão o Firebird define todos os endereços como disponíveis. Vejaabaixo como ele é configurado.

RemoteBindAddress = [IP ADDRESS]

Por exemplo: RemoteBindAddress = 192.168.0.1O Remote Bind Address é muito útil quando você tem outros

servidores com o Firebird instalado, ou quando você quercontrolar qual interface será utilizada para comunicaçãoexterna.

Service PropertiesPor padrão o Firebird é executado como um serviço, menos no

Windows 98, e vem com o Guardian para assegurar que oFirebird sempre estará rodando.

De qualquer forma, um problema com o Guardian é quequando um usuário não pertence ao perfil que está configuradopara rodá-lo, ele pode não ter o direito para iniciar um serviço.Então ele não irá trabalhar. Para evitar isto nós precisaremosalterar as propriedades para ambos o Firebird Service e oFirebird Guardian.

Para fazer esta alteração vá até ao Painel de Controle doWindows, clique em Ferramentas administrativas e depois emServiços. Na lista de serviços encontre o serviço “FirebirdGuardian - DefaultInstance”.

Dê um duplo clique sobre ele para acessar a tela depropriedades. Clique sobre a aba Recuperação. Assegure-se que aresposta do computador no caso de acontecer alguma falha nestebanco seja para que o serviço seja reiniciado, conforme mostradona figura a seguir. Caso não esteja igual à figura, você deveráconfigurá-lo.

Firebird

24

Figura 7: Propriedades do Firebird Guardian

Agora selecione a aba Logon para que possamos realizar asalterações para que o serviço utilize a conta do nosso usuário,aquele que criamos anteriormente. Veja na figura 8. Assegure-seque a senha esteja digitada corretamente, pois o serviço pode nãoser inicializado. Agora selecione a aba Geral. É neste local quevamos informar qual o tipo de inicialização do serviço.

Figura 8: Propriedades do Firebird Guardian

Figura 9: Propriedades do Firebird Guardian

Configure como Automático, igual a da figura anterior.Finalmente clique no botão OK, para salvar as alterações. Realizeestes mesmos passos para o item “Firebird Server -DefaultInstance”. Depois de completado reinicialize os doisserviços.

Log FilesO Firebird mantém um arquivo de log dentro da pasta onde

ele está instalado, ele pode ser utilizado em conjunto com oVisualizador de Eventos do Windows para poder diagnosticarqualquer problema de instalação.

ConclusãoA partir de agora o seu Firebird está devidamente instalado e

pronto para ser utilizado. Com estas informações você terá umbanco de dados mais seguro.

Download em: http://www.theclub.com.br/revisrta/download/FbConfigManager.zip

Firebird

25

Delphi

O tipo Record é uma estrutura de dados do Delphi que podemisturar vários tipos de variáveis. Vamos supor que você precisearmazenar em uma variável algumas informações como o código,nome e salário de um funcionário. A primeira idéia seria criaruma array tridimencional. Mas existe um problema. O arrayteria que ser de apenas um tipo, ou seja, do tipo string. Se vocêprecisar, por exemplo, fazer algum calculo com o salário você teráque converter a variável de string para double. O tipo Recordpode lhe auxiliar muito neste sentido.

Vamos agora à estrutura do tipo Record.

type TFuncionario = Record Codigo : string; Nome : string; Salario : double;end;

Como você pôde ver, acima, uma estrutura de dados do tipoRecord pode misturar vários tipos de variáveis. Cada item é comouma variável, consistindo de nome e tipo.

O tipo TFuncionario contém três itens, o Codigo e o Nome dotipo string e o Salario do tipo Double.

Agora que já temos o tipo Record definido, vamos criar umavariável do tipo Record. Alias, você pode criar quantas variáveisdo tipo Record forem necessárias. Vale lembrar que a declaraçãoTFuncionario não aloca nenhuma informação na memória paraCodigo, Nome e Salario.

Para instanciar o tipo TFuncionario nós podemos criar umavariável da seguinte forma:

Var Adm : TFuncionario; Prod : TFuncionario;

Agora para ter acesso a cada item de cada variável queacabamos de criar, basta colocar o nome da variável seguindo deponto, por exemplo:

Adm.Codigo := ‘000001’; Adm.Nome := ‘José da Siva’; Adm.Salario := 1500;

Prod.Codigo := ‘000156’; Prod.Nome := ‘Antonio da Conceição’; Prod.Salario := 3000;

Como você pôde ver é bem simples. Um outro recurso quetemos disponível neste caso é a utilização do operador with, vejacomo é simples.

with Adm do begin Codigo := ‘000001’; Nome := ‘José da Siva’; Salario := 1500; end;

with Prod do begin Codigo := ‘000156’; Nome := ‘Antonio da Conceição’; Salario := 3000; end;

Se você quiser é possível copiar todo o conteúdo da variávelAdm para a variável Prod da seguinte forma:

Prod := Adm;

ArraysComo o tipo TFuncionario trabalha como qualquer outro tipo

Por Claudinei Rodrigues – [email protected]

Utilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo RecordUtilizando o tipo Record

26

Delphi

do Delphi, nós podemos declarar um array deste tipo, por exemplo

var Empresa : array[1..50] of TFuncionario;

Para acessar o décimo elemento deste array você pode fazerda seguinte forma:

with Empresa[10] do begin Codigo := ‘000025’; Nome := ‘Antonio Ribeiro’; Salario := 8000; end;

Ou, por exemplo, montar um contador para mostrar osnomes contidos neste array:

var i : integer;

for i := 1 to 50 do ShowMessage(Empresa[i].Nome);

Como foi dito anteriormente que o tipo Record trabalha comoqualquer outro tipo do Delphi, nós podemos ir ainda mais além.Você pode criar um tipo Record dentro de outro Record. Veja.

type TDepartamento = record Codigo : string;

Func : TFuncionario;end;

Para preencher todas as informações necessárias deste novoRecord basta você seguir a mesma regra.

Veja como fazer:

var Depto : TDepartamento;

Depto.Codigo := ‘000001’; Depto.Func.Codigo := ‘000101’; Depto.Func.Nome := ‘Antonio da Silva’; Depto.Func.Salario := 3500;

Considerações finaisO tipo Record é uma estrutura que pode nos auxiliar muito

no dia a dia deixando o código mais fácil de ser entendido. Semcontar na organização do código.

Até a próxima.

Sobre o autorClaudinei Rodrigues,Consultor Técnico do The [email protected]

Estamos chegando ao final de mais um ano. Esperamos que nossosserviços tenham atendido as expectativas de todos vocês, e que otrabalho de todos tenha sido produtivo. Agora neste final de ano, vamosaproveitar dois feriados para darmos férias para nossos consultores.Portanto o suporte técnico não atenderá no período de 16/12/2005 à01/01/2006, voltando as suas atividades normais a partir de 02/01/2006após as 13:00 horas.

ATENÇÃO

27

Perguntas & Respostas

Pergunta: Eu gostaria de saber se pra imprimir emmatriciais é necessário mesmo o uso de um componente? Caso forSIM gostaria que me recomendassem o melhor componenteFreeware. Caso for NÃO gostaria de receber um exemplo com ocódigo fonte!!!

Resposta: Nós temos uma matéria em nossa revista queirá lhe ajudar muito neste sentido, veja no link http://www.theclub.com.br/revista/writ0104.aspx.

Dúvida enviada por Evandro, São Paulo – SP

Pergunta: Tenho o seguinte problema:Em um cliente que ainda tem programa em Clipper, tenho

que imprimir um relatório em uma impressora Laser (que tem asaída USB). Como sabemos o Clipper não imprime em portaUSB. Pois bem, o tal sistema gera relatórios em arquivo texto,Pensei o seguinte:

Solução em Delphi:Criar um programa que fique carregado em memória,

verificando a cada x segundos se há um arquivo texto emdeterminado diretório, se houver lê o arquivo texto e envia para aimpressora padrão do Windows, após a impressão apaga oarquivo.

Ps. Teria também que enviar um comando para a impressoraLaser para comprimir as letras.

Isso é possível? Vocês podem me guiar nessa missão?

Resposta: Ao invés disso, faça o seguinte:Você simplesmente irá compartilhar a sua impressora local

para ser usada em rede (não precisa estar em rede para isso),então vá em propriedades da impressora e clique na guiaDetalhes e depois no botão Capturar porta da impressora,selecione a saída USB que a sua impressora está instalada aqui,depois clique no campo Imprimir na seguinte porta e coloque aquia saída LPT1 e pronto.

Passo a passo:

Clique no botão INICIAR do Windows;. Vá em CONFIGURAÇÕES > PAINEL DE CONTROLE . Dê

dois cliques em REDE . Clique no botão Compartilhamento dearquivos e impressoras e veja se a opção Desejo que outros usuáriostenham acesso a minha(s) impressora(s) está marcado, se não estiver,marque-o agora, esta opção precisa estar ativada para que sepossa compartilhar uma impressora de rede. Note que o sistemadeverá pedir o disco de instalação do Windows, ok?!

. Vá em CONFIGURAÇÕES > IMPRESSORAS

. Clique com o botão direito na sua impressora padrão, agoraclique em Propriedades.

. Clique em Capturar porta da impressora e escolha a saídaUSB que sua impressora está instalada..

- clique em Finalizar captura.. Vá no campo Imprimir na seguinte porta e coloque a porta

LPT1: . Clique em Aplicar e pronto!!! Você deve querer manter duas instalações da sua

impressora, uma LPT para DOS e outra USB para Windows, ésó adicionar a mesma impressora de novo no Windows e mudarde impressora padrão conforme convier. Cada uma com suaconfiguração específica.

Dúvida enviada por Francisco, São José do Rio Preto – SP

28

Perguntas & Respostas

Pergunta: Estou querendo mudar minhas aplicações deDelphi 4 para o Delphi 2005 e gostaria de saber se essa migraçãoseria muito complexa, se teria que reescrever todos os programase aprender o Delphi 2005 ou o ambiente é parecido no que dizrespeito a programação win32 e não Web.

Resposta: No que diz respeito a programação Win32, vocênão precisa se preocupar. Os comandos são os mesmos. Oambiente do Delphi 2005 realmente mudou bastante, mas podeter certeza que foi para melhor. O que você deve tomar muitocuidado é em relação aos componentes de terceiros. Se você utilizacomponentes de terceiros verifique se já existem versões destescomponentes para o Delphi 2005.

Dúvida enviada por Junior, São José do Rio Preto – SP

Pergunta: Estou desenvolvendo um sistema para farmáciae os distribuidores de medicamentos disponibilizam aos clientesas notas e os pedidos feitos nos seus servidores para que osclientes possam baixar. Eu preciso saber como eu faço estacomunicação via modem ou internet.

Resposta: Nós temos uma matéria publicada na revista deOutubro de 2004 que fala sobre o download de arquivos. Veja nolink http://www.theclub.com.br/revista/moni1004.aspx. Estamatéria poderá lhe ser muito útil.

Dúvida enviada por Lauro, Ronda Alta – RS

Pergunta: Tenho uma aplicação que executa diversosprocessos que demandam muito tempo. Gostaria de criar umarotina genérica, que valesse para toda aplicação, que quando elaestivesse executando algum processo a tela não ficasse comaquele jeitão de travada (se você passa outra janela na frente asua fica com o “rastro”) e que apareça a ampulheta no cursor.Como fazer isso??

Resposta: Geralmente o congelamento acontece quandovocê tem algum laço, por exemplo: While, for...next. Dentro destebloco inclua o comando Application.ProcessMessages. Istoprovavelmente resolverá o seu problema. Sobre o cursor vocêpode utilizar a classe TScreen, por exemplo:

Quando for iniciar o processamento inclua a seguinte linha:Screen.Cursor := crHourGlass;Application.ProcessMessages;

Quando terminar o processamento inclua a seguinte linha:

Screen.Cursor := crArrow;Application.ProcessMessages;

Dúvida enviada por Vicente, São Paulo – SP

Pergunta: Estou mudando para o Delphi 7 e também estouutilizando o Rave. Como posso confgurar o Rave para que eleabra o relatório final maximizado, ou seja, em tela cheia?

Resposta: Você deve utilizar o componente RVSystem.Neste componente vá até a propriedade SystemPreview e altere asubpropriedade FormState para wsMaximized. Depois disso, váaté o componente RvProject e ligue o componente componenteRvSystem na propriedade Engine.

Dúvida enviada por Edivaldo, Rio Branco - AC

Pergunta: Gostaria de saber como faço para salvar meusrelatórios com a extensão pdf! Eu uso pra imprimir relatórios ocomponente QuickReport e também um componente externochamado RDprint!

Resposta: Veja uma matéria publicada em nossa revista deMaio de 2005 ou no link http://www.theclub.com.br/revista/cria0505.aspx.

Dúvida enviada por Daniel, TRES PONTAS – MG

Pergunta: Gostaria de saber se é possível alinhar peladireita valores, usando Printer.Canvas.textout e como?

Resposta: Para fazer o controle de posicionamento devalores durante a impressão, faça o seguinte:

uses ......type .....privatepublicend; //Definição da função functionTam_Coluna(coluna:integer;valor:Double;mascara:string):integer; var Form1: TForm1;implementation

29

Perguntas & Respostas

Uses Printers;

procedure .........

begin..........

// Ao imprimir o valor a ser formatado chame// a função de Tam_Coluna.// Esta função vai retornar o numero da// coluna onde deverá ser impresso o valor já// formatado.// Informe na variável Coluna o numero da// coluna a ser impressa// Na variável Total informe valor a ser// impresso// No terceiro parametro da função Tam_Coluna// a mascara desejada

Printer.Canvas.TextOut( Tam_Coluna( Coluna,Total , ‘###,##0.00’ ), Linha,FormatFloat(‘###,##0.00’, Total ) );..........end;

function Tam_Coluna( coluna:integer;valor:Double; mascara:string):integer; var Masc : string; Tam1,Tam2 : integer;begin Masc := FormatFloat(mascara,valor); Tam1 := Printer.Canvas.TextWidth(Masc); Tam2 := Printer.Canvas.TextWidth(mascara); Tam_Coluna := coluna + (Tam2-Tam1);end;

Dúvida enviada por Sebastião, Salvador – BA.

Pergunta: Temos um sistema de automação comercial, emDelphi 3, que utiliza o Interbase 6.X com dialeto 1.

Queremos utilizar o Firebird com o Dialeto 3, entãogostaríamos de saber qual versão do Firebird devemos utilizar,sem ter que mudar a linha de código em nosso programa, isto é, épossível trocar o banco de dados, mudar o Dialeto sem alterar oprograma e sem perder os dados já cadastrados ?

Em caso negativo, qual modificações teremos que fazer paratrabalhar com o Firebird utilizando o Dialeto 3, sem perder osdados cadastrados ?

Resposta: Como você está utilizando o Delphi 3, é bemprovável que você esteja utilizando o BDE. O BDE a principio nãotrabalha com o Dialeto 3, mas existe uma solução para esteproblema.

Vamos começar pelo banco de dados. Eu lhe aconselho autilizar a versão 1.52 que está disponível para download no sitewww.ibphoenix.com.

Agora você deve mudar o dialeto do seu banco de dados, masantes você deve fazer uma cópia de segurança, sabe como é né.

Para mudar o dialeto do banco você deve utilizar o utilitárioGFIX, da seguinte forma:

gfix -sql_dialect 3 c:\seu_banco.gdb -usersysdba -password masterkey

Para que o BDE utilize o dialeto 3 você tem que ir até oregistrador do Windows em

HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\Drivers\Intrbase\Db Open\SQLDIALECT

E configurar o valor para 3.

Dúvida de Cristina S. Rodrigues, Rio de Janeiro – RJ

Pergunta: Instalei o componente QuickReport no Delphi 7 epercebi que o componente QRChart não existe. Isso está certo? Sesim como faço para imprimir um gráfico com o Delphi 7?

Resposta: Neste caso você deve instalar o componente. Façada mesma forma que fez ao instalar o QuickReport, mas localizeo arquivo dcltqr70.bpl.

Dúvida enviada por Rinaldo M. Furtado, Ferraz deVasconcelos – SP.

Pergunta: Estou com o seguinte problema: Tenho umrelatório feito no QuickReport. No relatório tem dois componentesTQRImage, se imprimir em uma impressora a jato de tinta,imprime normal e em uma impressora a laser sai deformado.

Resposta: Este problema pode estar relacionado com o driveda impressora, pois eu fiz um teste em uma impressora HP 693(Jato de tinta) e numa Lexmark E210 (Laser) e em ambas aimpressão foi igual ou seja, imprimiram corretamente. Eu lheaconselho neste caso a não utilizar o driver fornecido peloWindows, mas sim o driver fornecido pelo fabricante da

30

Perguntas & Respostas

impressora.Dúvida enviada por Rafael, Americana - SP

Pergunta: Quais as opções disponíveis para acessar oFirebird 1.5xx com o Delphi 2005 ?

Resposta: No Delphi 2005, você pode utilizar os driversFirebird .NET Data Provider e o Borland Data Provider forFirebird para aplicações .NET. Você pode fazer o download destesdrivers a partir deste link, &http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_download_dotnet.

Já para aplicações Win32 você pode utilizar o DBExpress.Dúvidas enviada por Leandro, Novo Hamburgo - RS

Pergunta: Eu fiz um formulário de compras, onde euadiciono itens nele, então fica: uma tabela de venda, e uma deitens de venda, acontece que eu não quero usar o comandoapplyupdates toda vez que um item for adicionado. Por questãode segurança prefiro fazer isso apenas quando a compra forconfirmada. Mas é ai que está o meu problema. Eu não queroregistros duplicados, e então eu uso o comando locate, paraverificar se o produto já foi adicionado. Está acontecendo que oDelphi retorna como falso a execução deste comando até que eufaça o applyupdates. Depois que faço o applyupdates eu consigoque o locate funcione. Como posso resolver isto?

Resposta: Isto é perfeitamente normal, o Locate realmentevai retornar falso porque o registro não está gravado. Eusuponho que você esteja utilizando o componente ClientDataSet,sendo assim você deve clonar o ClientDataSet. Ou seja, criar umacópia do conteúdo do componente em memória e nesta cópia fazera pesquisa desejada. Veja abaixo como clonar o ClientDataSet.

procedure CloneRecord(Cds: TClientDataSet);varCdsClone: TClientDataSet;i: integer;beginCdsClone :=TClientDataSet.Create(Application);tryCdsClone.CloneCursor(Cds, True);Cds.Append;for i := 0 to Cds.FieldCount-1 doCds.Fields[i].Value :=CdsClone.Fields[i].Value;CdsClone.Close;finallyCdsClone.Free;end;

end;procedure TForm1.Button1Click(Sender:TObject); beginCloneRecord(ClientDataSet1);end;

Dúvida enviada por João, Barretos - SP

Pergunta: Preciso deletar todos os arquivos que estão napasta m:\abc e também preciso copiar somente os arquivos .dbde um diretório C:\abc para o m:\abc. Como posso fazer isso viaprogramação?

Resposta: Veja a seguir as duas rotinas que você estáprecisando.

Para deletar os arquivos você pode utilizar a rotina abaixo:

procedure TForm1.Button1Click(Sender: TObject);

var SearchRec:TSearchRec;Result:Integer;beginResult:=FindFirst(‘c:\Dir_1\*.*’, faAnyFile,

SearchRec);while Result=0 dobeginDeleteFile(‘C:\Dir_1\’+SearchRec.Name);Result:=FindNext(SearchRec);end;end;

Para cópia de arquivos você pode utilizar a rotina abaixo:

procedure TForm1.BitBtn1Click(Sender: TObject);

var SearchRec:TSearchRec;Result:Integer;Origem:array[00..255] of char;Destino:array[00..255] of char;beginResult:=FindFirst(‘c:\Dir_1\*.*’, faAnyFile,

SearchRec);while Result=0 dobeginStrPCopy(Origem,’C:\Dir_1\’+SearchRec.Name);StrPCopy(Destino,’C:\Dir_2\’+SearchRec.Name);CopyFile(Origem,Destino, True);Result:=FindNext(SearchRec);end;end;

Dúvida enviada por Tavares, Santos – SP.