Página 1 de 2

Trocar String - No Clipper Vai no xHb Não.

Enviado: 19 Jan 2009 15:52
por fladimir
Olá Colegas, tenho uma função q troca strings em um arquivo texto, inclusive foi pego e adaptado de uma do Fórum feita pelo colega Marcelo, com ajuda dos colegas Maligno e Eolo.

Agora a mesma função apenas mudando de compilador tem retornos diferentes, no Clipper esta Ok, agora no xHarbour não deu certo, alguém poderia ajudar...

Grato...

Segue abaixo trecho q da para testar...

Código: Selecionar todos

Proc Main
If File("Carne.TXT")
               FileCopy("Carne.TXT", "Carne.TMP")
               ArqTxt := "carne.tmp"
               PesqByte(ArqTxt,"@empresa", "Loja Mae Joana")
               PesqByte(ArqTxt,"@endemp", "Rua das Amoreiras, 2040")
               PesqByte(ArqTxt,"@cidaemp", "Sertaozinho")
               PesqByte(ArqTxt,"@estadoemp", "MT")
               PesqByte(ArqTxt,"@foneemp", "65-3331-7070")
               PesqByte(ArqTxt,"@codcli", "04152")
               PesqByte(ArqTxt,"@nomecli", "Jose Armando Siqueira")
               PesqByte(ArqTxt,"@endereco", "Rua Cel. Ponciano, 123")
               PesqByte(ArqTxt,"@bairro", "Centro")
               PesqByte(ArqTxt,"@cidade", "Sertaozinho")
               PesqByte(ArqTxt,"@estado", "MT")
               PesqByte(ArqTxt,"@cep", "85456-547")
               PesqByte(ArqTxt,"@telefone", "65-3331-5050")
Else
   // Não Gera Carne
Endif
Return



*--------------------------------------------------------------------------*
*        Funcao para Trocar Strings em qualquer arquivo              *
*--------------------------------------------------------------------------*

/*
Pesquisa a existencia de um determinado texto dentro de um arquivo
O arquivo pode ter qualquer extensao (prg,exe,com,dll,txt,etc...)

Parametros
  cArq   = Nome do arquivo a ser pesquisado
  cPesq  = Cadeia a ser pesquisada
  cTroca = Caso seja informado ao encontrar a sequencia sera feita a troca
  Obs : Se a nova string for menor que a pesquisada entao a diferenca
        : sera preenchida com espacos

 Retorno :
 Retorna a quantidade de ocorrencias
 Em caso de erro retorna -1, -2 ou -3 dependendo do erro

 Alterada em : 11.02.2008 as 14:29 horario de Brasilia
 A pesquisa agora e feita do 1º byte em diante
 A funcao agora nao diferencia maisusculas de minusculas

 Obs : Na pesquisa tanto faz se e maiuscula ou minuscula
         porem no caso da nova string vale como ela foi passada
         Ex : Se a nova string for "BaRtOlomEU" assim ela sera gravada

  Contribuicoes : Maligno e Eolo
*/

*------------------------------------*
Function PesqByte(cArq,cPesq,cTroca)


if cArq=nil .or. cPesq=nil // Falta de parametros
   return(-1)
endif

cPesq=alltrim(cPesq)

if cTroca<>nil
   cTroca=Alltrim(cTroca)
   if len(cPesq)>len(cTroca)  // a nova string e menor que pesquisada entao
      espacos=len(cPesq)-len(cTroca) // a diferenca sera preenchida com espacos
      cTroca=cTroca+space(espacos)
   endif
endif

if !File(cArq) // Arquivo nao encontrado
   return(-3)
endif

       pl:=upper(substr(cPesq,1,1))
     hand:=fopen(cArq,2)
     Byte:=1
  Tamanho:=Fseek(hand,0,2)
posiciona:=Fseek(hand,0,0)
    conta:=0

do whil .T.
   lebyte:=freadstr(hand,1)


// Coloquei para observar como retona diferente algumas variáveis
//cls
//@08,10 say cArq
//@09,10 say cPesq
//@10,10 say lebyte
//@12,10 say pl
//inkey(0)

   if upper(lebyte)=pl
      posiciona:=fseek(hand,-1,1)
            leu:=freadstr(hand,len(cPesq))
      if upper(leu)=upper(cPesq)
         conta++
         if cTroca<>nil
            fseek(hand,-len(cPesq),1)
            fwrite(hand,cTroca,len(cTroca))
         endif
      endif
   endif
   byteatual:=fseek(hand,1,-1)
   byte++
   if byte>=tamanho-len(cPesq)+1
      fclose(hand)
      return(conta)
   endif
enddo
Return
Abaixo, arquivo Carne.TXT
carne.txt
(737 Bytes) Baixado 191 vezes
Abaixo o Arquivo Gerado através do exemplo acima compilado em CLIPPER 5.2
gerado.txt
(737 Bytes) Baixado 175 vezes
Agora se compilo utilizando o xHarbour 0.99.70 q utilizo a algum tempo não dá o mesmo resultado...não sei dizer pq.

Abaixo segue td compactado com o executavel compilado em Clipper, mas tb com o .BC para quem quiser testar no xharbour.

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 20 Jan 2009 09:20
por Eolo
Agora a mesma função apenas mudando de compilador tem retornos diferentes, no Clipper esta Ok, agora no xHarbour não deu certo, alguém poderia ajudar...
Fladimir, explique esses "retornos diferentes", aí fica mais fácil de lhe ajudar. Dê algum exemplo de como era pra sair e como está saindo.

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 20 Jan 2009 10:55
por fladimir
Olá Eolo... obrigado pela atenção... seguinte o q eu quero dizer com retornos diferentes é o seguinte... qdo eu passo a String a ser procurada para a Função PesqByte para ela trocar por outra String se vc descomentar as linhas da Função PesqByte, compilar no Clipper e rodar vai ver q ele vai procurando e trocando caracter por caracter...

Agora se vc simplesmente compilar o mesmo fonte no xHarbour verá q ele não consegue encontrar os mesmos caracteres para substituir, os retornos q aparecem dos mesmo comandos para obter os caracteres a serem substituidos no arquivo texto, não correspondem...

Caso queira ver melhor pegue o codigo q postei junto e descomente as linhas abaixo:

// Coloquei para observar como retona diferente algumas variáveis
//cls
//@08,10 say cArq
//@09,10 say cPesq
//@10,10 say lebyte
//@12,10 say pl
//inkey(0)


Grato....

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 20 Jan 2009 20:37
por Eolo
Fladimir,

Seguinte, antes da procura pela solução do tal erro, esclarece uma coisa.

Imagino que vc tenha um cadastro de nomes num arquivo DBF e aí usa o tal arquivo TXT (com os "@") como uma máscara para imprimir alguma coisa (carnês?), certo? É isso?

Se sim, por que esse passo "a mais", passando pelo TXT com os "@"? Por que vc não pega os valores do DBF e joga DIRETO no TXT final, pronto pra imprimir?

Olhe o exemplo a seguir. Note que é um exemplo. A partir dele, dá pra colocar mais coisas.

Código: Selecionar todos

Proc Main
arq="carne.txt"
hand=fcreate(arq,0)
if !hand>0
  ?"Incapaz de criar arquivo"
  retu
endi
use clientes
go top
erro=.f.
do whil !eof()
  if grava(NOME)=.f.
    exit
  endi
  if grava(ENDERECO)=.f.
    exit
  endi
  if grava(alltrim(CIDADE)+" - "+ESTADO)=.f.
    exit
  endi
  if grava(" ")=.f. // linha em branco
    exit
  endi
  if grava(repl("-",50))=.f. // separador de nomes
    exit
  endi
  skip
endd
use
fclose(hand)
if erro=.t.
  ?"Erro da gravação"
else
  * aqui vc manda imprimir o txt
endi

Código: Selecionar todos

function grava(oque)
priv gravou
oque=oque+chr(13)+chr(10)
* quebra de linha
gravou=fwrite(hand,oque)
if gravou=len(oque)
  retu .t.
else
  retu .f.
endi

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 21 Jan 2009 00:39
por fladimir
Sim Eolo a idéia central é exatamete esta de substituir direto no TXT, mas eu uso um TMP devido nao prejudicar o Layout do Cliente para o Formulario dele pré impresso, tipo a partir do TXT Layout do Formulario Pre-impresso gero um TMP q eh substituida as Strings pelo conteudo do BD e gerado o Arquivo para Impressao, dessa maneira fica flexivel no sentido de tipo independente do cliente mudo soh o TXT sem mudar o PRG servindo para varios fins. Entao utilizo esta funcao pois depois de pesquisar foi a q encaixou blz no sentido de preservar os espacamentos entre um campo e outro... onde debatemos e trocamos muitas ideias no topico abaixo....

https://pctoledo.org/forum/viewto ... &sk=t&sd=a

O problema eh q os mesmo PRG nao esta se comportando da mesma maneira no xHarbour.

Espero ter elucidado mais um pouco do meu problema...

Grato.

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 22 Jan 2009 11:51
por gvc
Este resolve o problema da substituição e é mais simples do que a função que vc usa.
Vc pode mudar para acertar os devidos tamanhos, inclusive mudando tudo para trabalhar com funções.
Lembre que o campo memorando tem tamanho limitado.

Código: Selecionar todos

Proc Main
If File("Carne.TXT")
   ctext := memoread("Carne.TXT")
   ctext := strtran(ctext, "@empresa", "Loja Mae Joana")
   ctext := strtran(ctext, "@endemp", "Rua das Amoreiras, 2040")
   ctext := strtran(ctext, "@cidaemp", "Sertaozinho")
   ctext := strtran(ctext, "@estadoemp", "MT")
   ctext := strtran(ctext, "@foneemp", "65-3331-7070")
   ctext := strtran(ctext, "@codcli", "04152")
   ctext := strtran(ctext, "@nomecli", "Jose Armando Siqueira")
   ctext := strtran(ctext, "@endereco", "Rua Cel. Ponciano, 123")
   ctext := strtran(ctext, "@bairro", "Centro")
   ctext := strtran(ctext, "@cidade", "Sertaozinho")
   ctext := strtran(ctext, "@estado", "MT")
   ctext := strtran(ctext, "@cep", "85456-547")
   ctext := strtran(ctext, "@telefone", "65-3331-5050")
   memowrit("carne2.tmp", ctext)
Else
   alert('Arquivo Nao Encontrado!!!')
Endif
Return

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 22 Jan 2009 16:36
por fladimir
gvc.. obrigado pela atencao... mas pelo q entendi a sua idéia era exatamente o q eu usava, algum tempo atras... mas por favor de uma rapida olhada no tópico em q eu debati esse assunto, com base em praticamente o mesmo codigo q vc exemplificou, onde eu tinha problemas... exatamente com a questao do tamanho dos campos..

https://pctoledo.org/forum/viewto ... &sk=t&sd=a

Grato...

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 23 Jan 2009 08:43
por gvc
Vc pode resolver isso com padr na hora de substituir as strings.
Se vc tem um caracter marcador de final de linha, vc pode usar o stuff para apagar os espaços excedentes.

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 23 Jan 2009 21:03
por fladimir
Obrigado gvc pela atenção... vou testar e depois posto os resultados...

Vlw...

Sucesso!!!!

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 11 Abr 2009 14:28
por sygecom
Olá Fladimir,
Nós de mais detalhes o que não esta acontecendo que deveria acontecer. Não entendi muito bem onde esta dando o problema.

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 13 Abr 2009 23:17
por fladimir
Entao Leonardo vamos lá... a questao eh q quero q o PesqByte q funciona no clipper funcione no xHarbour, qdo compilo no xHarbour nao da erro nenhum acontece q tb nao faz nada com o arquivo texto base q tem as TAG's ele gera um arquivo final igual ao BASE ou seja nao funciona como no Clipper.

Como eu disse no inicio do topico se vcs baixarem o arquivo compactado chamado TUDO lah tera o fonte o arquivo TXT base e o makefile q estou usando e tb o EXE compilado em clipper, ou seja, se vc baixar o TUDO.RAR e rodar o Executavel vera q sera gerado um arquivo chamado CARNE.TMP preenchido ao inves das TAG's e se compilar no xHarbour, tipo eu faço assim: hbmake xxxx.bc , ai ele gera um Executavel compilado no xHB e rodando o mesmo ele gera um CARNE.TMP IGUAL ao CARNE.TXT (Base), não sei o q pode estar ocorrendo, e preferia nao ter q mudar a Função PESQBYTE, pois ela nao mexe na posicao do Texto ou seja se tiver uma TAG chamada:

Código: Selecionar todos

 @NomeCliente                 Dt. Nasc.  @DtNasc 
ela preenche certinho sem jogar o Dt. Nasc pra frente mesmo se o nome do cliente for: Joao da Silva ou se for Jose Joao da Silva, e é isso q desejo nao bagunçar o Layout Origina do arquivo TXT de uma forma pratica assim como no fonte.

Agora caso algum colega tenha alguma idéia tb q de o mesmo resultado e de forma prática, agradeceria, pois no q corresponde trabalhar com Arquivos Texto e TAG's sinceramente, até hj nao entendo direito.

:(Neg

Grato

:)Pos

Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 14 Abr 2009 11:06
por Pablo César
Fladimir, sei que você está precisando resolver este assunto e que o seu assunto foi transferido para esta seção. Mas será que você poderia responder as minhas as questões que levantei lá na seção Clipper também ? Pois eu agora estou com um assunto parecido e talvez aquela questão vá de encontro ao seu problema. Ou prefere que unamos as mensagens referente a este mesmo tópico ?

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 14 Abr 2009 12:39
por fladimir
Olá Plabo, então eu estava tentando de td q eh lado e como tive um retorno lá no seção clipper, fui praquele lado devido tipo tentar mudar da PesqByte para outra q compile no Clipper e no xHB sem mudar o resultado, eu antes tinha tentando aki neste tópico, mas como não tive retorno, até o Leonardo falar para continuarmos aki, então não sei como podemos fazer a nivel de topicos e mensagens, mas na verdade o q eu busco mesmo é tipo a Função PESQByte funcionando no xHarbour e não ter q trocar, ou se tiver, por outra q ofereça a mesma praticidade q tinha com ela no Clipper.

Qto as suas perguntas, me desculpe a sinceridade, mas o problema não é contigo, mas eu não consigo entender direito suas argumentações, tipo qdo na escola aparecia uma questão de Física ou Matemática q a professora explica explica e continuo boiando...
Na verdade se vc pudesse passar uma MP pra eu entrar em contato direto contigo e depois postar os resultados aki, talvez se conversarmos por MSN, Skype ou Tel consiga entender melhor. Desculpe a minha de certa forma não sei esse é o termo, ignorância.

Agradeço muito a vcs q estão se esforçando em me auxiliar, me sinto constrangido de tipo contar com tanto apoio da equipe de moderadores e coleas essa minha cabeça dura não conseguir desenrolar o trem.

Att.
:%

Re: Trocar String - No Clipper Vai no xHb Não - Alguém já Viu ?

Enviado: 15 Abr 2009 00:43
por asimoes
Olá Fladmir,

Eu fiz uma versão para ser apreciada por todos, compartilhando minha experiência.

Veja o código e por favor faça o teste.

Código: Selecionar todos

#include "Fileio.ch"
#include "common.ch"
FUNCTION MAIN

     LOCAL nLineLen  := 150
     LOCAL nTabSize  :=  0
     LOCAL lWrap     := .F.
     LOCAL i, imax, cText, cLine, nOffSet, nTextLen
     LOCAL t1, t2, t3
     FileCopy("base1-1.txt","arq_des.txt")

     aPesq:= {"@empresa",;
              "@valor",;
              "@cidaemp",;
              "@venda",;
              "@nomecli",;
              "@vcto"}

     aTroca:={"EMPRESA NUCLEAR DE COBALTO",;
              "200,00",;
              "RIO DE JANEIRO",;
              "R$ 10,00",;
              "ALEXANDRE SIMÕES",;
              "31/12/2009"}

     SET PRINTER TO TESTE.TXT
     SET DEVICE TO PRINT
     SET PRINT ON
     SETPRC(0,0)
     MascaraTXT("arq_des.txt",aPesq,aTroca,150)
     SET PRINT OFF
     SET PRINTER TO
     SET DEVICE TO SCREEN
     SET CONSOLE ON
RETURN

FUNCTION MascaraTXT(cArquivo,aPesq,aTroca,nLineLen,nTabSize,lWrap)
******************************************************************************
* Autor    : ALEXANDRE SIMåES                                                *
* Data     : ABRIL/2009                                                      *
*----------------------------------------------------------------------------*
* Objetivo : Pesquisar Tags [@] e substituir por outro valor                 *
******************************************************************************
LOCAL iMax, cText,I
   DEFAULT nLineLen TO 150,;
           nTabSize TO 0,;
           lWrap    TO .F.

   /*
   Ex.:
      Copiar o arquivo template para o de trabalho.

      FileCopy("arq_ori.txt","arq_des.txt")

      Criar os vetores para pesquisa e troca
      aPesq :={}
      aTroca:={}
      ÚÄÄÄÄ 1 - AADD(aPesq,"@empresa")
      ³ ÚÄÄ 2 - AADD(aPesq,"@valor")
      ÀÄÅÄ 1 - AADD(aTroca,"EMPRESA S/A")
        ÀÄ 2 - AADD(aTroca,"200,00")

      SET PRINTER TO TESTE.TXT
      SET DEVICE TO PRINT
      SET PRINT ON
      SETPRC(0,0)
      MascaraTXT(Arq_Des,aPesq,aTroca,150)
      SET PRINT OFF
      SET PRINTER TO
      SET DEVICE TO SCREEN
      SET CONSOLE ON

   Obs.: O vetor aTroca  deve obedecer a mesma ordem do aPesq
         dos dados a serem pesquisados

   */
   cText := MemoRead( cArquivo )
   Imax := MLCount( cText, nLineLen, nTabSize, lWrap )
   aLine:={}
   nElemento:=1
   FOR I:=1 TO Imax
      cLine := MemoLine( cText, nLineLen, I, nTabSize, lWrap )
      For nLenLinha:=1 to Len(cLine)
         For J:=1 To Len(aPesq)
            If aPesq[J] $ cLine
               cLine:=STUFF(cLine,AT(aPesq[J],cLine),Len(aTroca[J]),aTroca[J])
            EndIf
         Next
      Next
      @ PROW()  ,000 Say cLine
      @ PROW()+1,000 Say ""
   NEXT
RETURN Nil

Re: Trocar String - No Clipper Vai no xHb Não ** RESOLVIDO **

Enviado: 15 Abr 2009 20:53
por fladimir
Primeiramente quero Agradecer a todos os colegas q colaboraram e tiveram paciência com meu problema.

Hj fiz uma pesquisa sobre o tema e acredito q consegui entender um pouquinho sobre TAGs e com as idéias dos colegas e a função do colega Alexandre Simões dei uma modificada no código do colega (sintam-se a vontade para criticar e ou melhorar) e consegui ter a função de acordo com minha necessidade inicial...

O probleminha eh q ela tipo tem q ter um caracter posterior a TAG + ESPACOS + CARACTERDIFERENTEdeESPACO...., tipo se for utilizar em um contrato em q a TAG esteja assim:

@empresa,
@endemp,

Ela entra num Loop Infinito... ai tenho q colocar algum caracter diferente de espaço para ela tipo terminar o preenchimento da TAG exemplo:

@empresa, x
@endemp, *

Ai ela da continuidade... mas como já resolve 90% dos meus problemas, vou olhar isso depois com mais calma afinal já eh madrugada...


Segue abaixo código Original do colega ASIMOES + partes modificadas comentadas...
.

Código: Selecionar todos

    #include "Fileio.ch"
    #include "common.ch"
    FUNCTION MAIN

         LOCAL nLineLen  := 150
         LOCAL nTabSize  :=  0
         LOCAL lWrap     := .F.
         LOCAL i, imax, cText, cLine, nOffSet, nTextLen
         LOCAL t1, t2, t3
         FileCopy("base1-1.txt","arq_des.txt")

         aPesq:= {"@empresa",;
                  "@valor",;
                  "@cidaemp",;
                  "@venda",;
                  "@nomecli",;
                  "@vcto"}

         aTroca:={"EMPRESA NUCLEAR DE COBALTO",;
                  "200,00",;
                  "RIO DE JANEIRO",;
                  "R$ 10,00",;
                  "ALEXANDRE SIMÕES",;
                  "31/12/2009"}

         SET PRINTER TO TESTE.TXT
         SET DEVICE TO PRINT
         SET PRINT ON
         SETPRC(0,0)
         MascaraTXT("arq_des.txt",aPesq,aTroca,150)
         SET PRINT OFF
         SET PRINTER TO
         SET DEVICE TO SCREEN
         SET CONSOLE ON
    RETURN

    FUNCTION MascaraTXT(cArquivo,aPesq,aTroca,nLineLen,nTabSize,lWrap)
    ******************************************************************************
    * Autor    : ALEXANDRE SIMåES                                                *
    * Data     : ABRIL/2009                                                      *
    *----------------------------------------------------------------------------*
    * Objetivo : Pesquisar Tags [@] e substituir por outro valor                 *
    ******************************************************************************
    LOCAL iMax, cText,I
       DEFAULT nLineLen TO 150,;
               nTabSize TO 0,;
               lWrap    TO .F.

       /*
       Ex.:
          Copiar o arquivo template para o de trabalho.

          FileCopy("arq_ori.txt","arq_des.txt")

          Criar os vetores para pesquisa e troca
          aPesq :={}
          aTroca:={}
          ÚÄÄÄÄ 1 - AADD(aPesq,"@empresa")
          ³ ÚÄÄ 2 - AADD(aPesq,"@valor")
          ÀÄÅÄ 1 - AADD(aTroca,"EMPRESA S/A")
            ÀÄ 2 - AADD(aTroca,"200,00")

          SET PRINTER TO TESTE.TXT
          SET DEVICE TO PRINT
          SET PRINT ON
          SETPRC(0,0)
          MascaraTXT(Arq_Des,aPesq,aTroca,150)
          SET PRINT OFF
          SET PRINTER TO
          SET DEVICE TO SCREEN
          SET CONSOLE ON

       Obs.: O vetor aTroca  deve obedecer a mesma ordem do aPesq
             dos dados a serem pesquisados

       */
       cText := MemoRead( cArquivo )
       Imax := MLCount( cText, nLineLen, nTabSize, lWrap )
       aLine:={}
       nElemento:=1
       FOR I:=1 TO Imax
             cLine := MemoLine( cText, nLineLen, I, nTabSize, lWrap )
             For nLenLinha:=1 to Len(cLine)
                   For J:=1 To Len(aPesq)
                   If aPesq[J] $ cLine
            
// Inicio da Modificação da Função do Colega Alexandre Simões, com devidos
// comentários
				
				* Define o TAM da TAG
				nTamTAG     := Len(aPesq[J])             

				* Define a Posição Final da TAG
				nPosFimTAG  := ( AT(aPesq[J],cLine) + nTamTAG )

				* Define a Posição Inicial do Prim. Espaço Posterior ao Fim da TAG
				nPosInEsp   := nPosFimTAG + 2

				* Define o Tam. da Cadeia de Caract. q sera Eliminada ;
				* Que é Igual ao Tamanho da TAG + Espaços Posteriores a TAG
				* com o auxilio da Função: FunConEsp
				nTamElimi   := nTamTAG + (FunConEsp( cLine, nPosInEsp ) - nPosInEsp )
				
				* Define o q sera inserido na proporção q foi eliminada
				OqSeraIns   := PADR(aTroca[J],nTamElimi)
				
				* Efetua a Troca da TAG pelo Conteúdo
				cLine:=STUFF(cLine,AT(aPesq[J],cLine),nTamElimi,OqSeraIns)	

// Final da Modificação da Função do Colega Alexandre Simões


//          Linha Original da Função do Alexandre Simões
//				cLine:=STUFF(cLine,AT(aPesq[J],cLine),Len(aTroca[J]),aTroca[J])

         EndIf
      Next
   Next
   @ PROW()  ,000 Say cLine
   @ PROW()+1,000 Say ""
NEXT
RETURN Nil


Function FunConEsp( LinhaTXT, PosInEsp )
******************************************************************************
* Autor    : Fladimir                                                        *
* Data     : ABRIL/2009                                                      *
*----------------------------------------------------------------------------*
* Objetivo : * Função para contar qtos espaços tem posteriores a TAG         *
******************************************************************************

nPosFinEsp := 0
ForEspaco:=.t.
While ForEspaco =.t.
	Eh_Espaco := Substr( LinhaTXT, (PosInEsp), 1 )
	IIf( EH_Espaco = " ", PosInEsp++, ForEspaco:=.f.)
End	
nPosFinEsp += PosInEsp
Return nPosFinEsp

O meu muito obrigado e SUCESSO a TODOS!!!

:)Pos