Importação e exportação de dados usando arquivos TXT, dentro de um Projeto Personalizado 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 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 (log das transações)

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 (tabela que guardará os dados a serem exportados e importados)

Coluna

NOME

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 linhas 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

Acesse o Gerenciador de Projetos por meio do menu Configurações → Projetos Personalizados → Gerenciador de Projetos:

Em seguida, clique no menu Novo Projeto para executar o editor do VsScripter. Utilize o nome “ImportaExportaDados” no campo adequado e clique em OK, conforme imagem 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.

Código:

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 cds cds.Free; end; end else // caso dê erro, mostrar a mensagem de dados não importados ShowMessage('Dados não foram importados.'); end; function RegistraLog(IdUsuario, Arquivo: String):Boolean; var cdsControle: TClientDataSet; begin // resultado negativo. Caso o processo não finalize corretamente, // o resultado será falso. Ou seja, não haverá registro dos dados na tabela Result := False; // inicia o ciclo do registro dos dados na tabela try // cria o objeto cdsControle do tipo TClientDataSet cdsControle := TClientDataSet.Create(nil); // preparando o objeto cdsControle para receber um TDataSetProvider com nome formado por // dsp+NOMETABELA e abertura automática dmConexao3c.GetDspEdicao(cdsControle, 'U_CTRLIMPORTACAO', true); // abre o cdsControle cdsControle.Open; // coloca o cdsControle em modo de inserção de dados cdsControle.Append; // busca um valor válido e ordenado que será o índice da tabela, armazenado em // U_CTRLIMPORTACAO_ID cdsControle.FieldByName('U_CTRLIMPORTACAO_ID').value := dmConexao3c.QueryPegaCampo('SEL_PADRAO_COM_WHERE', 'MAX(U_CTRLIMPORTACAO_ID)', ['?', '1:s', 'U_CTRLIMPORTACAO', '?', '2:s', '0=0'], [ftString, ftString], [20, 100])+1; // atribui ao campo USUARIO o valor do UserID cdsControle.FieldByName('USUARIO').value := IdUsuario; // atribui ao campo DATAHORA com a data/hora atual cdsControle.FieldByName('DATAHORA').value := now; // atribui ao campo ARQUIVOTXT com o nome do arquivo informado cdsControle.FieldByName('ARQUIVOTXT').value := Arquivo; // Indica ao cds que os dados podem ser gravados cdsControle.post; // indica ao servidor de aplicações para aplicar as alterações feitas dmConexao3c.CDSApplyUpdates([cdsControle]); // retornando resultado Result := True; // finalizando o ciclo de inclusão do log finally cdsControle.free; end; 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])); end else begin // se os dados forem gravados, o cadastro do controle preenchido. // bastará ao usuário salvar os dados preenchidos automaticamente end; end; end; if (RegistraLog(oDadosSis.UserId, abreArquivo.FileName)) then ShowMessage('Importação de dados bem sucedida.') else ShowMessage('Erro no registro do log da Importação de dados.'); finally // no final do processo, a tStringList dados é destruída dados.Free; // ModalResult será a constante MrOk 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 if (not RegistraLog(oDadosSis.UserId, dlgCriar.FileName)) then ShowMessage('Erro no registro do log da exportação dos dados.'); 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.

Testando o script de importação e exportação de dados

Para testar o “script”, é necessário executá-lo por meio do botão Executar, a partir do Gerenciador de Projetos, conforme imagem abaixo:

Após efetuar a troca do usuário, o projeto Importação e Exportação de Dados aparecerá no menu Projetos Personalizados, conforme imagem abaixo:

Com o formulário aberto, escolha o botão Importação:

A caixa de diálogo para escolha do arquivo TXT será mostrada. Escolha o arquivo que contém os dados para importação:

Assim que o arquivo é selecionado, o processo de importação já é iniciado. Assim que finalizado, caso tudo tenha transcorrido corretamente, aparecerá a mensagem confirmando a importação, tal qual figura abaixo:

Em seguida, o script é finalizado.

Para exportar dados, execute o script e clique no botão exportar. A caixa de diálogo “Salvar Como“ para criação do arquivo destino dos dados será mostrada, conforme abaixo:

Informe o nome do arquivo a ser criado, lembrando que se for informado o nome de um arquivo já existente, o mesmo terá seu conteúdo substituído, e clique em salvar.

Para confirmar a exportação, bastará abrir o arquivo criado. Abaixo, segue imagem com exemplo:

O registro das ações é gravado na tabela U_CTRLIMPORTACAO, que guarda o log das transações, conforme mostrado na imagem abaixo: