Importação e exportação de arquivos texto, por meio do VsScripter
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 | |
Descrição completa/reduzida | |
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);