Append from sdf
Moderador: Moderadores
-
MarceloHenrique
- Usuário Nível 1

- Mensagens: 30
- Registrado em: 06 Jul 2004 09:59
- Localização: São Paulo - SP
Append from sdf
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
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
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: Append from sdf
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
xHarbour.org + Hwgui + PostgreSql
Re: Append from sdf
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.
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}
{POG - Programação Orientada a Gambiarra}
-
MarceloHenrique
- Usuário Nível 1

- Mensagens: 30
- Registrado em: 06 Jul 2004 09:59
- Localização: São Paulo - SP
Re: Append from sdf
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
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
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Append from sdf
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
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Append from sdf
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:
Analisando o texto:
Verificando as posições posso gerar o array com as seguintes posições/tamanhos:
Eu usaria a função DefPiece() assim:
Então processaria meus REPLACEs assim:
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:
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:
Desta forma usando a função StringToArray com o separador "|" voce dificilmente obterá erros.
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
Código: Selecionar todos
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
Código: Selecionar todos
123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
4947 3E XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX YYYYYYYYYYYYY R$ 5,00 60,00 1.253,12 606,76 31/07/2009
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} } )
...
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 )
...
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
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
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
