Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

Objetivo

O objetivo deste documento é auxiliar o usuário a criar um “script” para importar e exportar dados, de/para um arquivo TXT, de/para uma tabela personalizada por meio do Person.

Este exemplo facilmente pode ser modificado para ser utilizado com tabelas de sistemas. Não existe nenhuma restrição quanto a isso.

Além da importação e exportação dos dados, será mostrado como fazer um controle das ações, também em outra tabela personalizada.

Estrutura das tabelas personalizadas

Tabela U_CTRLIMPORTACAO

Coluna

USUARIO

Descrição completa/reduzida

Usuário

Dica para usuário

Usuário que fez a importação

Tipo da coluna

Texto

Tamanho máximo

20 caracteres 

 

 

Coluna

DATAHORA

Descrição completa/reduzida

Data e Hora

Dica para usuário

Data e hora na qual a importação foi feita

Tipo da coluna

Data/Hora

Tamanho máximo

 

 

Coluna

ARQUIVOTXT

Descrição completa/reduzida

Arquivo .TXT

Dica para usuário

Descrição da conversão

Tipo da coluna

Texto

Tamanho máximo

250 caracteres 

Tabela U_IMPORTATXT

Coluna

NOME

Descrição completa/reduzida

Nome

Dica para usuário

Nome a ser importado

Tipo da coluna

Texto

Tamanho máximo

45

Coluna

EMAIL

Descrição completa/reduzida

Email

Dica para usuário

email a ser importado

Tipo da coluna

Texto

Tamanho máximo

100

Coluna

CELULAR

Descrição completa/reduzida

Celular

Dica para usuário

Celular a ser importado

Tipo da coluna

Texto

Tamanho máximo

14

Coluna

DOCUMENTO1

Descrição completa/reduzida

Documento 1

Dica para usuário

Documento 1 a ser importado

Tipo da coluna

Texto

Tamanho máximo

11

Coluna

DOCUMENTO2

Descrição completa/reduzida

Documento 2

Dica para usuário

Documento 2 a ser importado

Tipo da coluna

Texto

Tamanho máximo

14

Estrutura do arquivo TXT

O arquivo TXT a ser utilizado para a importação de dados deverá receber a estrutura abaixo, a saber:

NOME;EMAIL;CELULAR;DOCUMENTO1;DOCUMENTO2;

O caractere separador dos campos é o ';'.

Não deve ser colocado espaço em branco entre os campos e o separador.

Em teoria, não existe limite de linha de dados. Porém, o tamanho dos campos deve ser respeitado. Se existir a necessidade de aumentar o tamanho dos campos, bastará fazê-lo no momento da criação da tabela personalizada no Person, ou depois, fazendo a alteração dos tamanhos desejados.

Exemplo de um arquivo de dados:

FLORIANO PEIXOTO;floriano@email.com;5561999999901;566301;9175015;
GASTÃO SOBRAL;gastao@email.com;5561999999902;566302;9175016;
ADAMASTOR PITÁGORAS;adamastor@email.com;5561999999903;566303;9175017;
VITOR HUGO;vitor@email.com;5561999999904;566304;9175018;
OLAF BERGER;olaf@email.com;5561999999905;566305;9175019;
JARDEL FILHO;jardel@email.com;5561999999906;566306;9175020;
JACK TRAVIS;jack@email.com;5561999999907;566307;9175021;
JOHN LENNON;john@email.com;5561999999908;566308;9175022;
MALCON X;malcon@email.com;5561999999909;566309;9175023;
ORVILE BLANC;orvile@email.com;5561999999910;566310;9175024;
SALVADOR DALI;salvador@email.com;5561999999911;566311;9175025;
LEO DAVINCI;leo@email.com;5561999999912;566312;9175026;

Construindo o ‘Script’ de importação de dados

Esse exemplo será construído no evento “Ao iniciar a inclusão” do formulário de manutenção da tabela U_CTRLIMPORTACAO.

A tabela U_IMPORTATXT não será utilizada diretamente na construção da customização. Porém, os dados oriundos do arquivo de dados serão gravados nela.

O Gerente será utilizado para a construção da personalização alvo deste tutorial. Ao carregá-lo e fazer a autenticação, acessar o menu Cadastro → Minhas Tabelas → Tabela de controle de importação.

Se tudo deu certo na criação da tabela, será mostrado o formulário abaixo:

No menu representado por duas linhas paralelas, sendo a primeira maior que a segunda, escolher a opção Eventos via script → Ao Iniciar Inclusão, conforme exemplo abaixo:

O editor VsScripter deve ser aberto, conforme imagem abaixo:

Começaremos o desenvolvimento do script pela unit cPrinc que será é a unit principal. Ela será a primeira a ser executada quando o script for invocado.

uses
   // Importa a unit do formulário
   uImportaDados;
                  
var
  // declara o objeto que herdará todas as características do formulário
  form : TfrmImportaDados;

begin
  // inicia o ciclo de vida do script
  try
    // cria o formulário com o nome form
    form := TfrmImportaDados.Create(nil);

    // aguarda o resultado das ações no formulário por meio do modalresult
    if form.ShowModal = mrOk then
    begin  
    end;    
    
  finally
    // destrói o formulário no final do ciclo de vida do script
    form.Free;
  end;
end;    

Desenhando o formulário “Importa Dados”

Para criar um novo formulário, acessar o menu File → New Form. O formulário abaixo deverá aparecer:

Alterando algumas propriedades do formulário e seus componentes

O nome do formulário deve ser mudado para frmImportaDados. Para tanto, é necessário alterar a propriedade name do formulário.

A propriedade position deve ser alterada para poMainFormCenter. Assim, o formulário sempre aparecerá no meio do formulário.

A propriedade caption deve ser alterada para Importa/Exporta Dados.

Serão utilizados quatro componentes no formulário. Dois botões (TButton), uma caixa de diálogo do tipo TOpenDialog, que é responsável por abrir um diálogo para o usuário escolher o arquivo a ser aberto para importação dos dados, e uma caixa de diálogo do tipo TSaveDialog, que é responsável por dar nome ao arquivo TXT para onde os dados serão exportados.

Mudar o nome do primeiro botão, na propriedade name, para btnImportar.

Mudar o título do primeiro botão, na propriedade caption, para &Importar.

Mudar o nome do segundo botão, na propriedade name para btnExportar.

Mudar o título do segundo botão, na propriedade caption, para &Exportar.

Mudar o nome do componente TOpenDialog, na propriedade name, para abreArquivo.

Mudar o nome do componente TSaveDialog, na propriedade name, para dlgCriar.

Tanto os botões quanto as caixas de diálogo são componentes que podem ser encontrados na Tool Palette, a direita da área de edição do código do script. Os botões (TButton) ficam na lista chamada Standard e as caixas de diálogo (TOpenDialog e TSaveDialog) ficam na lista chamada Dialogs.

Clique no botão Salvar e nomeie a unit com o nome uImportaDados.

A aparência final do formulário deve ficar como o que se apresenta abaixo.

Criando o código do formulário

Na base esquerda do editor de códigos existem duas abas: Code e Design.

Selecione a aba Code para podermos iniciar a codificação do script.

{$FORM TfrmImportaDados, uImportaDados.sfm} 

uses
  // Essas units serão adicionadas automaticamente.
  Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, System,
  // Já essas units devem ser incluídas manualmente
  Db, DbClient, bib;
                      
// função que adiciona os dados na tabela U_IMPORTATXT
function adicionaDados(campo: Array[0..4] of String; sTabela: String):Boolean;
var
   // declarando o client data set cds, que será utilizado para gravar os dados 
   // importados na na tabela U_IMPORTATXT
   cds: TClientDataSet;
begin
    // criando o cds
    cds := TClientDataSet.Create(nil);
    // preparando o cds para a edição da tabela
    dmConexao3c.GetDspEdicao(cds, sTabela, true);                   

    // executará se o array passado possuir dados a serem gravados na tabela
    if Length(campo) > 0 then    
    begin
      try
        // colocando o cds em modo de operação
        cds.Open;
        // criando espaço no cds para a associação dos dados do arquivo TXT.
        cds.Append;
        // Gerando o índice primário da tabela, buscando o maior índice existente e somando 1.
        cds.FieldByName('U_IMPORTATXT_ID').value := dmConexao3c.QueryPegaCampo('SEL_PADRAO_COM_WHERE',
                                                                               'MAX(U_IMPORTATXT_ID)',
                                                                               ['?', '1:s', sTabela,              
                                                                               '?', '2:s', '0=0'],   
                                                                               [ftString, ftString],
                                                                               [20, 100])+1;
        
        // Atribuindo os valores
        cds.FieldByName('NOME' ).value := campo[0];
        cds.FieldByName('EMAIL').value := campo[1];
        cds.FieldByName('CELULAR').value := campo[2];
        cds.FieldByName('DOCUMENTO1').value := campo[3];
        cds.FieldByName('DOCUMENTO2').value := campo[4];
        // gravando os dados na tabela
        cds.post;
        dmConexao3c.CDSApplyUpdates([cds]);        
      finally
        // destruindo o formulário
        cds.Free;
      end;    
    end else
        // caso dê erro, mostrar a mensagem de dados não importados
        ShowMessage('Dados não foram importados.');
end;

// programando o comportamento do botão btnImportar                      
procedure btnImportarClick(Sender: TObject);
var
  // declarando o objeto dados, do tipo TStringList, que receberá os
  // dados a serem importados
  dados: TStringList;
  // criando variáveis auxiliares para lidar com as estruturas de repetição e array de dados
  a, i, j  : Integer;
  // declarando variáveis auxiliares para lidar com os dados
  novaString: String;
  campo: Array[0..4] of String;
begin
  try
      dados := TStringList.Create();
      // configurando o diretório inicial do componente TOpenDialog      
      abreArquivo.InitialDir := '.\';
      // Se for escolhido um arquivo pelo usuário, ele será carregado na lista
      // dados      
      if abreArquivo.Execute(nil) then
          dados.LoadFromFile(abreArquivo.FileName);
          
        // se a lista dados contiver informações, as mesmas serão enviadas colocadas
        // no array campo  
        if (dados.Count > 0) then
        // cria uma estrutura de repetição que irá ler o arquivo de dados do início ao fim
        // para importar as linhas de dados, uma por uma.
        for i:=0 to dados.Count - 1 do
        begin
          if (length(dados.Strings[i]) > 0) and (dados[i] <> '') then
          begin
            novaString := dados.Strings[i];
            a:=0;
            for j:=0 to length(novaString) do
            begin
               if Pos(';', novaString)>0 then
               begin
                  campo[a]:=(Copy(novaString, 1, Pos(';', novaString)-1));             
                  novaString := Copy(novaString, Pos(';', novaString)+1, length(novaString));
                  a:=a+1;
               end;
            end;
            // enviando dados para a função adicionaDados. Ela é responsável por gravar os dados na tabela
            // U_IMPORTATXT. 
            if not adicionaDados(campo, 'U_IMPORTATXT') then
            begin
                // Caso esta função retorne erro, o usuário será avisado
                showMessage(Format('Erro na importação da linha de dados #%d.', [i]));
                // cancela a inclusão dos dados no formulário de controle de importação                
                FFormPadraoU_CTRLIMPORTACAO.ActRetornarExecute(nil);
            end
            else begin
                 // se os dados forem gravados, o cadastro do controle preenchido.
                 // bastará ao usuário salvar os dados preenchidos automaticamente
                 FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('USUARIO',
                                                           oDadosSis.UserId);
                                                           
                 FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('DATAHORA', Now);
                 
                 FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('ARQUIVOTXT',
                                                           abreArquivo.FileName);
                                                  
                // executando automaticamente o clique no botão de salvar
                FFormPadraoU_CTRLIMPORTACAO.ActSalvarExecute(nil);                                                             
            end;                
          end;
        end;                            
   finally
    // no final do processo, a tStringList dados é destruída e o ModalResult será a constante MrOk
    dados.Free;                                                   
    ModalResult := mrOk;
  end;                               
end;

// programando o comportamento do botão btnExportar
procedure btnExportarClick(Sender: TObject);
var
  // declarando variáveis e objetos
  cds: TClientDataSet;
  dados: TStringList;
  a: integer;
   
begin
   // criando o objeto dados do tipo TStringList
   dados := TStringList.Create();
   // iniciando o ciclo de exportação dos dados
   try
     // criando o client data set cds
     cds := TClientDataSet.Create(nil);
     // carregando os dados da tabela a ser exportada para o cds.
     // o quarto parâmetro descreve o tipo de dados de cada campo
     // carregado na pesquisa. Já o quinto parâmetro especifica o
     // tamanho desses campos individualmente.
     cds.Data := dmConexao3c.QueryPegaData('SEL_PESQUISAFILTRO', '*',
                           ['?', '1:s', 'U_IMPORTATXT',              
                           '?', '2:s', '0=0'],   
                           [ftString, ftString, ftString, ftString, ftString],
                           [45, 100, 11, 14, 11]);

     // iniciando estrutura de repetição que fará a exportação de todos os dados
     // da tabela U_IMPORTATXT                          
     for a:=0 to cds.RecordCount - 1 do
     begin
        // montando a estrutura do arquivo de destino dos dados num
        // objeto TStringList. Cada registro será um item na lista.
        dados.Add(cds.FieldByName('NOME').value + ';' +
                  cds.FieldByName('EMAIL').value + ';' +
                  cds.FieldByName('CELULAR').value + ';' +
                  cds.FieldByName('DOCUMENTO1').value + ';' +
                  cds.FieldByName('DOCUMENTO2').value + ';');
        // carregando o próximo registro
        cds.Next;
     end;
   // finalizando o ciclo de exportação dos dados
   Finally
     // configurando a pasta inicial onde o arquivo de dados será gravado
     dlgCriar.InitialDir := '.\';      
     // se o usuário indicar nome e local válidos para o arquivo de daos
     // e clicar no botão Salvar, o arquivo será gravado contendo os dados
     // da lista de strings 'dados'.
     if dlgCriar.Execute(nil) then
     begin
        // salvando dados no arquivo final
        dados.SaveToFile(dlgCriar.FileName);
        // preenchendo automaticamente os dados do formulário de 
        // controle de importação e exportação
        FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('USUARIO',
                                                  oDadosSis.UserId);
                                                                                
        FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('DATAHORA', Now);
     
        FFormPadraoU_CTRLIMPORTACAO.ValorParaTela('ARQUIVOTXT',
                                                  dlgCriar.FileName);
                                                                                               
        // executando automaticamente o clique no botão de salvar
        FFormPadraoU_CTRLIMPORTACAO.ActSalvarExecute(nil);                                                   
     end;
     cds.Free;                                                   
     ModalResult := mrOk; 
   end;
end;

Associando eventos aos botões

Os eventos relacionados aos botões devem ser associados as suas procedures. Para tanto, será necessário selecionar o botão btnImportar e, no Object Inspector (F11), na aba Events, clicar duas vezes a direita do campo OnClick.

Da mesma forma, repetir o procedimento para o botão btnExportar.

Assim, a ação de clicar/pressionar os botões terão seu comportamento programado. Esta ação é necessária toda vez que o usuário simplesmente copiar e colar o código da unit do formulário.

  • No labels