terça-feira, 28 de junho de 2011

Migração de dados entre bancos ou tabelas


Administrador Esta é uma dica simples de como fazer migração de dados entre bancos ou entre tabelas diferentes, utilizando poucas linhas de código e deixando o trabalho maior na organização dos componentes

Você deve deixar os campos com as mesmas posições em seus componentes DataSet de origem e destino (componentes que farão a leitura de uma tabela e edição na outra). Este DataSet, obviamente pode ser um TQuery, TTable, TIBQuery, TADOQuery, TClientDataSet ou, enfim, qualquer outro componente descendente da classe TDataSet.

Vamos supor que estamos fazendo a migração de um banco Access para Firebird. Para acessar o Access, usaremos um ADOQuery, e para Firebird, ClientDataSet.

Feitas as conexões, o que precisamos fazer é organizar os campos no ADOQuery e no ClientDataSet para que fiquem com as mesmas posições, ou seja, campo[0] do ADOQuery equivale ao campo[0] no ClientDataSet, assim como os demais, campo[1], campo[2], etc.

Organizados os campos, o seguinte código seria suficiente para transferir os dados entre as tabelas:

//código do botão "Transferir"
var
  c: integer;
begin
  //abre a tabela Destino
  ClientDataSet1.Open;
  //abre a tabela Origem
  ADOQuery1.Open;
  //enquanto não chegar ao fim da origem
  while not ADOQuery1.EOF do
  begin
    //abre um novo registro no destino
    ClientDataSet1.Append;
    //para cada campo da tabela destino
    for c := 0 to ClientDataSet1.FieldCount-1 do
      //preenche cada campo com seu valor respectivo da origem
      //ClientDataSet1.Fields[c].Value := ClientDataSet1.Fields[c].Value;
      //Corrigido em 16/07/2009 15:45
      ClientDataSet1.Fields[c].Value := ADOQuery1.Fields[c].Value;
    //grava o registro na tabela destino (em memória)
    ClientDataSet1.Post;
    //confirma as alterações no banco de dados
    //(desnecessário se não for um ClientDataSet)
    ClientDataSet1.ApplyUpdates(0);
    //vai para o próximo registro da origem
    ADOQuery1.Next;
  end;
  //fecha a origem
  ADOQuery1.Close;
  //fecha o destino
  ClientDataSet1.Close;
end;

Backup com MySQL e Delphi


Mesmo que saibamos tudo sobre o MySQL Server 5.0, comandos, sintaxe, recursos entre outras coisas, tudo ficará perdido se um vírus ou outra praga digital invadir o computador e acabar com os nossos dados. Por isso é bom fazer backups da base de dados

O MySQL Server 5.0 tem um recurso chamado mysqldump, que ajuda a fazer backups da base de dados, mas, o problema é que tudo por meio de linhas de comando, o que um usuário final (na maioria dos casos) não saberá fazer.

Para contornar essa barreira, podemos utilizar os arquivos bat, automatizando o processo de backup, ou melhor, do mysqldump! Veja um exemplo:

  cd C:\Arquivos de programas\MySQL\MySQL Server 5.0\bin
  mysqldump nome_da_base_de_dados > caminho_onde_ficara_salvo_o_bakup
  -u Nome_do_usuario_do_mysql -p senha_do_mysql -x -e -a -v
  exit

Essa é a sintaxe do comando que deve conter o arquivo bat, e pronto!

Para executar o bat de uma aplicação em Delphi, use a seguinte linha de comando:

  WinExec(Pchar('Caminho onde esta salvo o arquivo bat'), SW_SHOWNORMAL);

Bom pessoal, espero que tenham gostado da dica.

Segue um link para baixar um pequeno programa que fiz para demonstrar como fazer a conexão com MySQL Server 5.0 e com o exemplo de arquivo bat para o backup: exemplo_backup_mysql.zip

Um lembrete: para compilar o exemplo, copie-o para o seu C:\

segunda-feira, 20 de junho de 2011

Consulta entre datas Usando SQL

Essa é minha primeira dica aqui. Antes de mais nada, gostaria de agradecer muito ao Planeta Delphi, que com suas dicas tem me ajudado a aprender a programar no Delphi. Bom, eu sou iniciante ainda, apesar de estar no meu terceiro programa, que possui uso real em um escritório, estou contente pois estou aprendendo "na raça", sem curso e nem nada, apenas com as dicas daqui e o help do Delphi.

Bom, essa dica se destina a quem estiver tendo problemas na hora de fazer consultas SQL entre datas.

Quem nunca recebeu a mensagem "EDataBase Error: Unassigned Code" quando fez essa pesquisa? O que acontece é que mesmo que utilizemos funções de conversão de data como StrToDate, StrToDateTime e similares, ainda assim não estaremos no mesmo formato de data utilizado nos SGBDs (eu uso o Interbase 7.5).

Acontece que mesmo para os campos de data simples "Date", quando vamos nos relacionar com esses dados devemos estar no tipo primário do BD, que é SqlTimeStamp. Assim sendo, devemos incluir na cláusula "uses" da nossa unit que contém a consulta a unit "SqlTimSt", que nos proporcionará o uso do tipo de dados referido acima.

Devemos então realizar duas conversões:

1 - Converter o tipo de dados DateTime nativo do Delphi em SqlTimeStamp
2 - Passar esse dado convertido como parâmetro da busca.

Eu utilizei dois DateTimePickers do Delphi, pra quem não conhece é "aquele calendariozinho" utilizado para que o usuário selecione a data como se estivesse acertando a data no calendário do Windows, pois ele já nos fornece os dados no formato DateTime nativo do Delphi e nos poupa linhas de código adicionais para ter informação convertida nesse formato, por[em quem quiser fazer isso a partir de um Edit por exemplo, que fique à vontade.

Bom, segue o código que eu usei e funcionou direitinho:


procedure TForm_Planilha.SpeedButton5Click(Sender: TObject);

var
D1,D2 : TDateTime;

begin
      D1 := DateTimePicker_Inicial.DateTime;
      D2 := DateTimePicker_Final.DateTime;

      DM.Query_Geral.Close;
      DM.Query_Geral.CommandText := 'Select * from GERAL Where DATA_FATURA >= :D1 and DATA_FATURA <= :D2';
      DM.Query_Geral.ParamByName('D1').AsSQLTimeStamp := DateTimeToSQLTimeStamp (D1);
      DM.Query_Geral.ParamByName('D2').AsSQLTimeStamp := DateTimeToSQLTimeStamp (D2);
      DM.Query_Geral.Open;
end;

sábado, 18 de junho de 2011

Como colocar seus "Forms" e "Projetos Modelos" no Repository

Fonte: www.activedelphi.com.br

Acredito que muitos já tentaram colocar seus forms mais usuais ou projetos modelos que são utilizados em várias aplicações no repository do Delphi, mas não tiveram muito sucesso.
Por isso resolvi escrever este artigo demonstrando uma maneira fácil de fazer isso.

O Repository ou "Repositor de objetos" é um conjunto de forms e projetos que podemos usar para criar um programa ou inserir determinados formulários à aplicação, por exemplo o "About".
    Nos rendemos a facilidade de ir no menu "File -> New -> Other..." e escolher os modelos existentes ali para adicionar ao nosso programa, por isso adicionar os nossos próprios modelos de forms e projects ao repository pode nos render facilidade e economia de tempo ao programar.
    Então mãos a obra, digo, ao teclado.
    Os arquivos do Repository, em uma instalação padrão, ficam em: "C:\Arquivos de programas\Borland\DelphiX\Objrepos" onde "X" refere-se a versão do Delphi.
    Aí encontramos diversos diretórios organizando os diferentes tipos de modelos.
    Portanto seus modelos também deverão ser colocados ai, de preferência dentro de um diretório criado por você.     Ex.: "C:\Arquivos de programas\Borland\DelphiX\Objrepos\Adair"
    Importante: Para um form é necessário ter os seguintes arquivos dentro deste diretório:
    "Sobre.dfm" -> Formulário
    "Sobre.pas" -> Código fonte do formulário Sobre
    "Sobre.ico" -> Ícone representativo do formulário Sobre(Irá parecer na lista do Repository)
    Para um project modelo deve-se criar um diretório próprio para o projeto.
    Ex.: "C:\Arquivos de programas\Borland\DelphiX\Objrepos\Adair\Projeto"
    Todos os arquivos do projeto (*.pas, *.dfm, *.res, e os demais) devem estar dentro deste diretório.
    Depois disso devemos alterar as configurações do Delphi para que os nossos modelos apareçam no repository.
    Para isso devemos localizar o arquivo "C:\Arquivos de programas\Borland\DelphiX\Bin\delphi32.dro" que contém as configurações referentes ao repository.
    Devemos editar este arquivo com o bloco de notas do Windows.
    Importante: Este arquivo só pode ser editado por um editor de textos simples, pois não pode conter outras informações a não ser texto, e muito cuidado ao alterar as informações contidas ali, se forem modificadas sem o devido cuidado, o repositoy pode não funcionar direito. Para prevenir, faça uma cópia do arquivo antes de altera-lo.
    Em primeiro lugar devemos localizar a seguinte expressão "[Repository Pages]" (que está bem no final do arquivo) e adicionar "Adair=" (que se refere ao diretório que criamos).
    Para incluir um Form devemos adicionar as seguintes linhas ao arquivo (de preferência já no início do arquivo para faciliar futuras alterações):
    [C:\Arquivos de programas\Borland\Delphi7\Objrepos\Adair\Sobre]
    Type=FormTemplate
    Name=Meu Sobre
    Page=Adair
    Icon=C:\Arquivos de programas\Borland\Delphi7\Objrepos\Adair\Sobre.ICO
    Description=Sobre do meu programa.
    Author=Adair
    DefaultMainForm=0
    DefaultNewForm=0
    Ancestor=
    Designer=dfm
    ATENÇÃO: As opções abaixo não podem ser modificadas:
    Type=FormTemplate
    DefaultMainForm=0
    DefaultNewForm=0
    Ancestor=
    Designer=dfm
  
    Para incluir um Project devemos adicionar as seguintes linhas ao arquivo:
    [C:\Arquivos de programas\Borland\Delphi7\Objrepos\Adair\Projeto\Modelo]
    Type=ProjectTemplate
    Name=Projeto Modelo
    Page=Adair
    Icon=C:\Arquivos de programas\Borland\Delphi7\Objrepos\Adair\Projeto\Modelo.ico
    Description=Meu Projeto Modelo.
    Author=Adair
    DefaultProject=0
    Designer=dfm
  
    Onde "Modelo" é o Delphi Project.
    ATENÇÃO: As opções abaixo não podem ser modificadas:
    Type=ProjectTemplate
    DefaultProject=0
    Designer=dfm
    Depois de adicionado todas as entradas, deve-se salvar e fechar o arquivo.

quinta-feira, 16 de junho de 2011

Acessando o Firebird via ASP

Fonte: www.activedelphi.com.br

Este artigo demonstra como desenvolver uma aplicação web utilizando a linguagem asp, acessando uma base de dados Firebird. Um caso típico para a aplicação disto é a necessidade de disponibilizar na web algum tipo de informação ou funcionalidade de um sistema local/desktop. Muitos fazem isso via php ou com o próprio delphi. Aqui vai uma outra alternativa
O Firebird é usado na maioria das vezes para ser acessado através de um programa executável (exe). Entretanto ele também pode ser utilizado em aplicações para Web, onde atualmente o banco de dados mais utilizado para é o poderoso MySQL. Entretanto o Firebird não deixa nada a desejar quando usado para esta finalidade também.
No nosso exemplo mostrarei como utilizar o ASP para acessar um banco de dados Firebird através de VisualBasicScript, JavaScript e PerlScript. Apesar de não ser minha linguagem favorita, o ASP servirá para ilustrar o exemplo. Note ainda que o ASP utiliza a tecnologia ADO para acesso ao banco de dados. Isto implica em muitas “camadas” para que o acesso ocorra. Naturalmente isso pode deixar o acesso um pouco lento, mas não é o objeto de estudo deste artigo. Também pressupõe-se que o leitor conheça um pouco da tecnologia ASP.
Nos três casos utilizaresmos os códigos como scripts dentro da página ASP. O Perl entretanto pode ainda ser utilizado como script a parte nos famosos “cgi-bin”. A estrutura básica da conexão será a seguinte:
ASP(asp.dll) -> VBS(vbscript.dll) | JS(jscript.dll) | Perl(PerlSE.dll) -> Oledb(oledb32.dll) -> ODBC(odbc32.dll) -> ODBCfb(odbcfb.dll) -> fbclient(fbclient.dll)
Precisaremos instalar o Microsoft Internet Information Services (IIS - servidor web), o Firebird, o Firebird ODBC Driver e o ActiveState Perl.
Para instalar o IIS:
1.Vá até o Painel de Controle,
2.Adicionar ou Remover Programas,
3.Adicionar ou Remover Componentes do Windows,
4.Marque a opção Internet Information Services (IIS),
5.Coloque o CD do Windows no Drive e click em avançar.
Para instalar o Firebird, faça download do programa na página official do Firebird e proceda a instalação padrão (superserver).
Para instalar o Firebird ODBC Driver, faça download do programa no site da IBPhoenix e proceda a instalação com as opções padrão.
Para instalar o ActiveState Perl, faça download do programa no site da ActiveState e proceda a instalação com as opções padrão.
Antes de criar a página, precisamos configurar a conexão:
1.Vá até o Painel de controle,
2.Ferramentas administrativas,
3.Fontes de dados (ODBC),
4.Fontes de Dados do Sistema e click em adicionar.
5.Selecione o driver “Firebird/InterBase(r) driver” e click em concluir.
6.Preencha os campos com os dados abaixo:

DSN
: examples
Database
: C:\Arquivos de programas\Firebird\Firebird_2_1\examples\empbuild\EMPLOYEE.FDB
Client
: C:\Arquivos de programas\Firebird\Firebird_2_1\bin\fbclient.dll
Database Account
: sysdba
Password
: masterkey
Transaction
: nowait
Se utilizar uma versão diferente de 2.1, o nome do banco de dados e DLL cliente podem alterar. Caso tenha mudado a senha do sysdba, também lembre-se de colocar a correta. Você pode clicar no botão “Testar Conexão” para se certificar de que tudo deu certo.
Digite o conteúdo abaixo e salve em C:\Inetpub\wwwroot\firebird.vbs.asp:
<% @LANGUAGE = VBScript %>
<%
Dim oConn, oRs, i
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open "Driver=Firebird/InterBase(r) driver;Data Source=examples"
Set oRs = oConn.Execute("SELECT * FROM PHONE_LIST")
Response.Write("")
Do while (Not oRs.eof)
 Response.Write("")
 For i = 0 to (oRs.fields.count - 1)
  Response.Write("")
 Next
 Response.Write("")
 oRs.MoveNext 
Loop
Response.Write("
" & oRs(i) & "
") oRs.close oConn.close %>
Digite o conteúdo abaixo e salve em C:\Inetpub\wwwroot\firebird.js.asp:
<% @LANGUAGE = JavaScript %>
<%
var oConn, oRs, i
oConn = Server.CreateObject("ADODB.Connection");
oConn.Open("Driver=Firebird/InterBase(r) driver;Data Source=examples");
oRs = oConn.Execute("SELECT * FROM PHONE_LIST");
Response.Write("");
while (!oRs.eof) {
 Response.Write("");
 for (i = 0; i <= oRs.fields.count - 1; i++) {
  Response.Write("");
 }
 Response.Write("");
 oRs.MoveNext;
} 
Response.Write("
" + oRs(i) + "
"); oRs.close(); oConn.close(); %>
Digite o conteúdo abaixo e salve em C:\Inetpub\wwwroot\firebird.pl.asp:
<% @LANGUAGE = PerlScript %>
<%
use OLE;
$objConn = CreateObject OLE "ADODB.Connection";
$objConn->Open("Driver=Firebird/InterBase(r) driver;Data Source=examples");
$objRS = $objConn->Execute("SELECT * FROM PHONE_LIST;");
$Response->Write("\n");
while (!$objRS->EOF) {
 $Response->Write("\n");
 for ($i = 0; $i <= $objRS->Fields->Count - 1; $i++) {
  $Response->Write("\n");
 }
 $Response->Write("\n");
 $objRS->MoveNext;
}
$objConn->Close;
$objRS->Close;
$Response->Write("
" . $objRS->Fields($i)->value . "
"); %>
Os códigos acima instanciam o ADO, criam uma conexão com o ODBC, executam o comando e preenchem o resultado na tela. São utilizados um objeto Connection e um RecordSet para isso.
Abra seu navegador web e nele abra três guias. Na 1ª digite: http://localhost/firebird.vbs.asp; na 2ª http://localhost/firebird.js.asp e na 3ª http://localhost/firebird.pl.asp. Você verá o resultado sendo preenchido nas respectivas páginas.
Caso queira confirmar, utilize o FlameRobin para acessar a View e comparar o resultado. Apesar de ser um exemplo simples, ele ilustra o problema.

sábado, 11 de junho de 2011

Comandos básicos SQL (inserir / alterar / deletar)


Crie uma tabela com o nome de teste.db, e coloque os seguintes campos:
COD = auto_increment
NOME = alpha = 255 caracteres
Neste artigo irei mostrar de forma fácil e rápida, os comandos básicos para: (inserir,alterar,deletar).
Primeiramente vamos aos comandos:

Para inserir dados, com comandos SQL
('insert into tabela (nome_capo) values ('+''''+edit.Text+''''+');

Para selecionar dados, com comandos SQL
('select * from tablea where = campo "'+edit.Text+'"');

Para deletar dados, com comandos SQL
('delete from tabela where campo = '+''''+edit.Text+''''+'');

Para atualizar dados, com comandos SQL
('update tabela set campo = '+''''+edit.Text+''''+' where campo = '+''''+edit1.Text+''''+'');

Agora vamos passo a passo:
Primeiramenta crie um novo aplicativo em: File >New >Application

Após ter criado, coloque no form os componentes: 3 componentes "TButton", 1 componente "TEdit", 1 "TDBGrid", 1 "TDataSource", 1 "TSQLQuery".

No componente, TDataSource, na propriedade DataSet, coloque o valor "query1".
Pronto, as configurações dos componentes já foram feitas, agora vamos colocar os comandos no projeto.

Você colocou 3 componentes "TButton".
Faça as seguintes configurações nas propriedades do 3 "TButton".

Button1: Caption = Inserir
Name = btn_inserir
Button2: Caption = Alterar
Name = btn_alterar
Button3: Caption = Deletar
Name = btn_deletar

Agora de um duplo clique sobre o Botão "Inserir","btn_inserir".
Irá aparecer o editor do delphi, onde serão colocados os comandos.
Neste botão "Inserir", você coloca o seguinte comando:

query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('insert into teste (nome) values ('+''''+edit1.Text+''''+') ');
query1.ExecSQL;

Bom, estas linhas de comando acima irá inserir o dado em uma tabela.

Agora no botão "Alterar", você coloca as seguinte linhas de comandos:

query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('update teste set nome = '+''''+edit1.Text+''''+' where = COD');
query1.ExecSQL;

As linhas de comandos acima irão fazer com que altere um certo dado, este é o comando básico.

Agora no botão "Deletar", você coloca as seguintes linhas de comandos:

if MessageDlg('AVISO: Confirma Exclusão?', mtInformation, [mbYES, mbNO], 0) = mrYES then
begin
query1.Active := False;
query1.SQL.Clear;
query1.SQL.Add('delete from teste where COD = '+''''+edit1.Text+''''+'');
query1.ExecSQL;
end

Bom ai está, como inserir, aletrar e deletar dados de uma tabela, com comandos básicos. 

Objetos Distribuídos


Um dos maiores paradigmas da indústria de informática, nos dias de hoje, é o novo conceito de processamento cliente/servidor, onde existe...
uma mudança das aplicações codificadas em segmentos, partes ou componentes. Estas aplicações são separadas logicamente em três camadas: usuário, regras de negócio e dados.

A aplicação está dividida ao longo de linhas locais/remotas de dados, o que torna a infra-estrutura de redes das empresas um dos grandes fatores críticos de sucesso no desenvolvimento e implantação de um sistema. O cliente, tipicamente um PC, fornece a interface gráfica enquanto os servidores fornecem um conjunto de serviços.


Esses componentes, conhecidos como objetos, são distribuídos nas redes gerando um novo paradigma dentro de um já existente: a revolução do cliente/servidor. O resultado final é a quebra das aplicações em componentes, onde a reutilização e o baixo custo de implementação são os grandes benefícios obtidos.


Um objeto é essencialmente um componente com inteligência que opera entre sistemas operacionais heterogêneos, desenvolvido em várias linguagens de programação. Na área de desenvolvimento de sistemas, o conceito de objetos está alterando totalmente a arquitetura, desenvolvimento, empacotamento, distribuição e manutenção de software.


Então, qual a diferença entre um objeto clássico e um objeto distribuído? Um objeto clássico possui propriedades e métodos e é gerado através de uma linguagem de programação como Delphi, C++, VB, entre outras.


Esses objetos fornecem reusabilidade de código através de herança, encapsulamento e polimorfismo, propriedades fundamentais da teoria orientada a objetos. Contudo, esses objetos só vivem dentro de um programa; apenas o compilador que os criou conhece a sua existência.


O mundo externo os desconhece e não tem formas de acessá-los. Um objeto distribuído também é uma classe que pode publicar (tornar disponível) tanto suas propriedades quanto seus métodos, mas a linguagem e o compilador usados para criar objetos distribuídos são totalmente transparentes para a implementação desses. Esses objetos têm uma interface definida onde os compiladores geram um código a mais para serem acessados por outros objetos de forma totalmente transparente, isto é, o invocador desconhece o local do objeto invocado, o sistema operacional que esse executa, podendo estar fisicamente na mesma máquina (processo) ou em alguma máquina remota.


Um dos fatores críticos para a implementação de um sistema com componentes distribuídos é a transparência da sua localização física, podendo operar num processador local, num processo diferente ou num processador remoto. Porém, um componente não pode operar no vácuo, e por isso precisa de uma base denominada "barramento" de objetos distribuídos (ORB - Object Request Broker). Esse barramento oferece serviços que permitem a interligação entre os diversos componentes nas diferentes plataformas. É necessário utilizar esse serviço porque a interação entre componentes é requisito básico para a construção de uma aplicação de negócio. Os componentes estão sempre adicionando novos serviços, que são herdados durante sua compilação ou execução e alcançam altos níveis de colaboração entre si.


Nos dias de hoje, existem na indústria dois grandes padrões para desenvolvimento de objetos distribuídos que separam a interface de um objeto de sua implementação: DCOM (Distributed Component Object Model) e CORBA (Common Object Request Broker Architecture).


Os elementos principais da especificação CORBA são a linguagem de definição das interfaces dos objetos que serão criados e colocados à disposição na rede (IDL - Interface Definition Language) e um repositório (IR - Interface Repository) que representa as interfaces (ou classes) de todos os objetos disponíveis no sistema distribuído.


Como criarmos objetos para CORBA e/ou DCOM? Ambos têm o objetivo de fornecer uma transparência de localização de objetos e sua implementação, o que exige definição de interface entre os componentes. Essa interface deve ser publicada (tornada pública) e serve como mecanismo de ligação e acionamento entre esses componentes. A interface dos componentes é especificada em IDL, uma linguagem puramente declarativa que não define nada sobre a implementação desses componentes.

DCOM, além de separar a interface de um objeto de sua implementação, é uma extensão de COM (Component Object Model), parte da família Windows de sistemas operacionais, baseada na infra-estrutura de OLE e Active X. COM/DCOM é um framework baseado na construção de objetos para desenvolvimento que usa uma variedade de linguagens e ferramentas totalmente independentes de linguagem de programação, sendo parte implícita dos sistemas operacionais da Microsoft Windws NT e Windows 95.

Os fatores para uma comparação entre DCOM e CORBA são suporte para plataforma e linguagem, custo e integração.


Com relação à integração é importante a construção de "pontes" entre CORBA e DCOM, que permitirá distribuir objetos entre servidores e estações na Internet/intranet. O OMG definiu os mapeamentos entre COM e CORBA de tal forma que objetos COM podem invocar objetos CORBA e objetos CORBA invocam objetos COM.

Curso de Delphi: 7.Consultas SQL