Append from sdf

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MarceloHenrique
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 06 Jul 2004 09:59
Localização: São Paulo - SP

Append from sdf

Mensagem por MarceloHenrique »

Pessoal,

Preciso importar um arquivo texto tabulado, que tem valores formatados com ponto para milhar e virgula para centavos (1.235,47). Se uso direto o append from ARQ.TXT sdf o valor fica errado. Tem algo a ser feito direto com o append from sdf ou tenho que ler a linha como texto, converter e depois dar um replace?
Estou usando o xHarbour 1.2.1

Exemplo do relatorio a ser importado:
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009

Estrutura do banco de importação:
CODIGO C 7
N C 1
R C 2
CLIENTE C 38
VENDEDOR C 15
MOEDA C 3
EXTDESC N 9 2
EQUIP N 10 2
LINK N 11 2
VALOR N 13 2
LIXO1 C 2
DATACAD C 10
LIXO2 C 1

Obrigado e abraço a todos.

Marcelo Henrique
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Append from sdf

Mensagem por sygecom »

Se remover todos os PONTOS(Milhar) resolve, então é só ler o TXT uma vez, remover e mandar o APPEND FROM, não sei mas acho que achei meio facil o caso, como o valor está ficando no DBF ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Re: Append from sdf

Mensagem por gvc »

Pelo que vc esta informando, é melhor vc importar para um arquivo temporário com todos os dados sendo do tipo caracter e depois rodar uma função para transformar e importar os dados para o arquivo final.
Isso pq o DBF usa ponto para separar casa decimal e o seu arquivo tem a virgula para isso. Além do campo data e casa de milhar.
Inclusive fazendo isso vc pode colocar filtros para a importação e validações, antes de importar para o arquivo final.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
MarceloHenrique
Usuário Nível 1
Usuário Nível 1
Mensagens: 30
Registrado em: 06 Jul 2004 09:59
Localização: São Paulo - SP

Re: Append from sdf

Mensagem por MarceloHenrique »

Obrigado pelas respostas.
Eu imaginei que poderia existir no Harbour algo como um SET ou coisa parecida para mudar o critério de importacao de pontos e virgulas e assim conseguir importar diretamente com o append from sdf.
Mas importando a linha toda e tratando também dá certo e resolve meu problema.
Agora que converti tudo, vou começar a estudar a parte gráfica (provavelmente HwGui) e melhorar algumas coisas explorando recursos da parte de impressão e assim melhorar meus relatórios.
Mais uma vez, obrigado e um grande abraço.

Marcelo Henrique
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Append from sdf

Mensagem por rochinha »

Amiguinho,

Tempos atras discutimos algo parecido e apresentei uma função que pode ser inicio de sua solução.

Como colocado no post nosso amigo Maligno frisa que não é uma solução completa, portanto voce terá que melhorar a solução:

ARRAY - Função que transforma string demilitada em vetor
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Append from sdf

Mensagem por rochinha »

Amiguinho,

Somente complementando, eu encontrei algo que pode servir para voce e para todos os outros que pesquisarem sobre o assunto.

Levando em consideração o ao que o amigo Malgno postou no link/tópico do meu post anterior cheguei a uma função em minha biblioteca que pode auxiliar:

Código: Selecionar todos

/*
 * Array bidimensional com a posicao inicial e o tamanho de cada campo num string
 * ex: { {1,5}, {6,2}, {8,4}, {12,15} }
 */
FUNCTION DefPiece( pArray )
   PUBLIC ST_Piece
   if pArray != NIL
      ST_Piece := pArray
   endif
   return ST_Piece

/*
 * Array bidimensional com a posicao inicial e o tamanho de cada campo num string
 * Pstring  - string a ser dividida em campos
 * PnCampo  - numero do campo de acordo com a definicao em DefPiece
 * Preplace - novo valor no string
 */
FUNCTION SetPiece( Pstring, PnCampo, Preplace )
   LOCAL tRet := substr( Pstring, ST_Piece[PnCampo][1], ST_Piece[PnCampo][2] )
   if Preplace != NIL
      stuff( Pstring, ST_Piece[PnCampo][1], ST_Piece[PnCampo][2], Preplace )
   endif
   return tRet
Analisando o texto:

Código: Selecionar todos

4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
Verificando as posições posso gerar o array com as seguintes posições/tamanhos:

Código: Selecionar todos

123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
Eu usaria a função DefPiece() assim:

Código: Selecionar todos

...
DefPiece( { {1,4},{6,2},{9,34},{45,13},{59,2},{62,4},{67,5},{73,8},{82,6},{89,10} } )
...
Então processaria meus REPLACEs assim:

Código: Selecionar todos

Pstring := "4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009"
...
replace CODIGO with SetPiece( Pstring, 1, NIL )
replace R with SetPiece( Pstring, 2, NIL )
replace CLIENTE with SetPiece( Pstring, 3, NIL )
replace VENDEDOR with SetPiece( Pstring, 4, NIL )
replace MOEDA with SetPiece( Pstring, 5, NIL )
replace EXTDESC with SetPiece( Pstring, 6, NIL )
replace EQUIP with SetPiece( Pstring, 7, NIL )
replace LINK with SetPiece( Pstring, 8, NIL )
replace VALOR with SetPiece( Pstring, 9, NIL )
replace DATACAD with SetPiece( Pstring, 10, NIL )
...
Veja que a função recebe a posição da string que será manipulada e devolve o resultado conforme as posições/tamanhos contidos no subvetor.

Repare também que não fiz nenhuma consistencia de transformação dos trechos de valores para tipo numérico. Fica a seu cargo.

Os campos acima, por não saber de sua estrutura "quem recebe o quê" coloquei a representação apenas para ilustrar, cabendo a voce colocar corretamente.

É lógico pensar que todo o conteúdo acima foi exemplificado sobre o resultado de seu post, ou seja, sua string, que por estar mal formatada pode rá causar erros nos resultados obtidos em próximas leituras, exemplo:

Código: Selecionar todos

4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 645,00 1,20 735,12 706,76 31/07/2009
5433 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
5874 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 24,50 0,45 856,12 424,76 31/07/2009
Como exemplo das strings acima vemos que os resultado pode não ser obtido com a função acima, pois para que a mesma funciona é necessário que voce tenha.

Minha sugestão é que se o seu sistema gera esta string ou texto, então voce deve gerar a string com separadores diferenciados de forma a poder recuperar com menos erros possiveis. Exemplo:

Código: Selecionar todos

5433|3E|XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX|YYYYYYYYYYYYY|R$|5,00|60,00|1.253,12|606,76|31/07/2009
Desta forma usando a função StringToArray com o separador "|" voce dificilmente obterá erros.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder