Importação "Dinâmica"
20/07/2012 04:02
0
Pessoal,

Queria dar um pouco de dinamismo para regras de importação e bolei um negócio que, em teoria, resolveria meu problema.

Esse é o jeito que funciona... com o "campo[]" sendo informado diretamente no meu controlador

File file = new File("D:\Exemplo\Arquivo.txt")
file.splitEachLine(";"){campo ->
pessoa = Pessoa.findByCnpj(campo[0]) ?: new Pessoa(nome:campo[1],cnpj:campo[0]).save()


esse é o que escrevi para dar dinamismo
 
File file = new File("D:\Exemplo\Arquivo.txt")
def layout = Importador.findByNomeLike('%Teste%') // Pega a regra de importação que já cadastrei
file.splitEachLine(";"){campo ->
def pessoa = Pessoa.findByCnpj(layout.cnpj) ?: new Pessoa(nome:layout.nome,cnpj:layout.cnpj).save() // colocaria "campo[0]" e "campo[1]" dinamicamente com as informações salvas


O problema é que ele está entendendo o "campo[0]" e "campo[1]" como Strings, e não como variaveis do splitEachLine... Quando eu abro no banco de dados, meu "Pessoa" é cadastrado com nome = "campo[1]" e cnpj="campo[0]" e na verdade deveria ser nome="Rafael" cnpj="CnpjDORafael"

Alguem sabe um macete pra driblar essa dificuldade?

Obrigado!
Tags: Importação Dinâmica


0
Tentei salvar direto no banco a informação "${campo[0]}" ao invés de salvar apenas o "campo[0]"... mas também não deu...
20/07/2012 05:23


0
Olá, Rafael.

Se puder mandar uma amostra do teu arquivo ".txt" ajuda muito.

Abraços.


0
Yoshiriro, obrigado pelo retorno.

Meu arquivo de texto é basicamente assim

Rafael; 0269205444;19;21212121;19;91565679;Av Abc n777; Jd Nova Asia; Campinas; SP

de modo que quando eu dou o splitEachLine(";")
Nome = campo[1]
CPF/CNPJ = campo[0]

- -- --- ----- -------- -------------

Quando faço assim, funciona:

File file = new File("D:\Exemplo\Arquivo.txt")
file.splitEachLine(";"){campo ->
pessoa = Pessoa.findByCnpj(campo[0]) ?: new Pessoa(nome:campo[1],cnpj:campo[0]).save()


Mas como terei vários layouts diferentes eu queria deixar ele mais dinamico, onde o usuário seleciona qual regra da importação e o negócio importa bonitinho.

Para isso eu criei um novo modelo chamado "importador"


class Importador {

String nome // nome da regra criada

String nomeCompleto
String primeiroNome
String sobreNome
String cnpjCpf

String cep
String endereco
String logradouro

(... e assim sucessivamente)
}


Com essa classe criada, criei uma entidade com nome (da regra) "Teste" e informei que

def regraTeste = new Importador()
regraTeste.nomeCompleto = campo[1]
regraTeste.cnpjCpf = campo[0]
regraTeste.save()


E aí eu finalmente adapetei o código que estava funcionando para o que em teoria resolveria meu problema:

File file = new File("D:\Exemplo\Arquivo.txt")

// Pega a regra de importação que já cadastrei
def layout = Importador.findByNomeLike('%Teste%')

file.splitEachLine(";"){campo ->
// colocaria "campo[0]" e "campo[1]" dinamicamente com as informações salvas
def pessoa = Pessoa.findByCnpj(layout.cnpj) ?: new Pessoa(nome:layout.nome,cnpj:layout.cnpj).save()


O Problema, como disse no post anterior, é que quando eu faço isso, ele busca literialmente por "Campo[0]" na base e se não existe, ele cria uma pessoa com o CNpj "Campo[0] e Nome "Campo[1]", quando eu queria que ele verificasse/incluisse o valor que estava nessas posições no arquivo texto.

Eu tentei alterar o "Teste" que criei no importador para armazenar nome=${campo[1]} e cnpj=${campo[0]}, mas não adiantou: ele continou verificando e incluindo essas informações "literalmente" e não os valores...

Acho que consegui expressar melhor agora, embora tenha ficado bem extenso, a dificuldade que eu to pasando

Muito obrigado, mais uma vez

Abs!

RC
24/07/2012 20:01


0
Eu inverti no post acima os campos do arquivo texto!! (CNPJ com NOME)

Ele é assim:

0269205444;Rafael;19;21212121;19;91565679;Av Abc n777; Jd Nova Asia; Campinas; SP


De modo que CPF = Campo[0]
E Nome = Campo[1]

desculpa o vacilo

Abs

RC
24/07/2012 20:03


0
Pessoal,

Estou revivendo esse tópico pq ainda não achei uma solução para fazer a importação dinâmica.

Minha ideia era criar uma classe "Importadora" para armazenar os layouts que seriam aceitos pelo sistema e fazê-lo armazenar a posição do campo do arquivo txt que será importado.


Class Importador {

String nomeLayout // nome da regra criada

String cnpj // armazenar "campo[5]", por exemplo
String nomePessoa // armazenar "campo[1]", por exemplo
String telefonePessoa // armazenar "campo[0]", por exemplo
String cargoPessoa // armazenar "[campo[3]", por exemplo
String emailPessoa // armazenar "[campo[2]", por exemplo
}


Quando eu fosse importar, ao invés de fazer o que eu faço (e funciona):

File file = new File("D:\Exemplo\Arquivo.txt")
file.splitEachLine(";"){campo ->
pessoa = Pessoa.findByCnpj(campo[0]) ?: new Pessoa(nome:campo[1],cnpj:campo[0]).save()


Queria dar dinamismo fazendo mais ou menos dessa forma:

File file = new File("D:\Exemplo\Arquivo.txt")

// Pega a regra de importação que já cadastrei
def layout = Importador.findByNomeLayoutLike('%Teste%')

file.splitEachLine(";"){campo ->
// colocaria "campo[0]" e "campo[1]" dinamicamente com as informações salvas
def pessoa = Pessoa.findByCnpj(layout.cnpj) ?: new Pessoa(nome:layout.nomePessoa,cnpj:layout.cnpjPessoa ......).save()



O Problema é que ao invés do groovy entender que eu quero o "Campo[n] do arquivo" texto que está sendo importado, na hora de criar ele gera Strings "Campo[n]"....

.. ou seja, ao invés do nome da pessoa ficar "rafael", que era o que estava na posição "campo[x]", o nome está ficando literalmente "campo[x]".

Alguma dica?

Obrigado!
17/12/2012 16:24


0
Fala brother!

Rapaz dei uma lida rápida no seu post! e me veio a seguinte idéia! Retornar uma mapa com os campos e os valores que vão vir do seu csv, eu fiz só com uma linha de valores, muito provavelmente vc vai querer com mais linhas.. mas aí é só adaptar essa idéia a sua realidade! :D

List<String> fields = "nome;sobrenome;tel;email".split(";")
List<String> datas = "fulano;De Tal;2733334546;contato@fulanodetal.com".split(";")

Map<String, String> fulanosData = mapFieldsAndData(fields, datas)

//println fulanosData.nome

public Map<String, String> mapFieldsAndData(List<String> fields, List<String> datas) {
Map<String, String> fieldsAndData = [:]

fields.size().times { int i ->
fieldsAndData[fields.getAt(i)] = datas.getAt(i)
}

return fieldsAndData
}


Não comentei o código por preguiça mesmo! foi mals! mas creio que tah tranquilo de entender! :D

Qualquer coisa estamos aí! Abração!



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto