Clipper On Line • Ver Tópico - Arquivo TXT

Arquivo TXT

Discussão sobre a linguagem CA-Clipper.

Moderador: Moderadores

 

Arquivo TXT

Mensagempor marsp » 15 Jul 2016 14:57

Boa tarde.

Como preencher nas 2 ultimas posições de cada linha de um arquivo TXT com asc(13) + ASC(10), como assinalado na pagina 1 e 3 do arquivo anexado.



Obrigado
Anexos
ISSWeb_layout.pdf
(516.31 KiB) Baixado 190 vezes
marsp
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 46
Data de registro: 11 Fev 2013 13:09
Curtiu: 2 vezes
Mens.Curtidas: 3 vezes

Arquivo TXT

Mensagempor Jairo Maia » 15 Jul 2016 15:33

Olá marsp,

Em Clipper acho que mais fácil seria dessa forma:
Local cLinha

SET DEVICE TO PRINTER
SET PRINTER TO "Teste.Txt"

@ pRow()+0, 0 Say "Teste de linha texto 1"
@ pRow()+1, 0 Say "Teste de linha texto 2"
@ pRow()+1, 0 Say "Teste de linha texto 3"
@ pRow()+1, 0 Say "Teste de linha texto 4"

SET DEVICE TO SCREEN
SET PRINTER TO

RUN Teste.txt
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Arquivo TXT

Mensagempor marsp » 15 Jul 2016 16:01

Obrigado Jairo por responder.

Mas o que quero, é que nas 2 ultimas posições (79 e 80) de uma linha por exemplo de 80 caracteres dentro de um arquivo texto seja preenchido com 2 caracteres que represente o asc(13) e asc(10) ou chr(13) e chr(10).
marsp
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 46
Data de registro: 11 Fev 2013 13:09
Curtiu: 2 vezes
Mens.Curtidas: 3 vezes

Arquivo TXT

Mensagempor Jairo Maia » 15 Jul 2016 16:55

Olá Marsp,

Da forma que coloquei, ele faz isso. a sequência de caracteres Chr( 13 ) + Chr( 10 ) representa a quebra de linha e retorno de carro. Isso é o que está dizendo seu leiaute. a Linha precisa ser finalizada com os caracteres para Windows, que são esses.

Ou você já tem um texto retilíneo e quer quebrar as linhas?
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

Arquivo TXT

Mensagempor JoséQuintas » 15 Jul 2016 20:44

Há diversas formas, depende de como vai gerar o txt.

SET ALTERNATE TO TEXTO.TXT
SET ALTERNATE ON
SET CONSOLE OFF
?? "sxxxx" + "XXXXX" + Chr(13) + Chr(10)
SET CONSOLE OFF
SET ALTERNATE OFF
SET ALTERNATE TO


que pode ser melhorado usando função ou #define

#define CRLF Chr(13) + Chr(10)

?? "Texto" + CRLF
?? "outro texto" + CRLF

?? "Texto" + CrLf()
?? "outro texto" + CrLf()

FUNCTION CrLf()
   RETURN Chr(13) + Chr(10)


Tem também fOpen(), fWrite(), que grava em disco.
Tem esse que foi mencionado.

Dependendo da opção, pode ser necessário no final fOpen(), fSeek(), fWrite() pra eliminar o Chr(26) que indica fim de arquivo, pra ficar compatível com Windows.

Se o arquivo ficar limitado a 64kb, que é o limite do Clipper pra string, pode criar em TXT e gravar no final.

cTxt := ""
cTxt += "linha1" + CrLf()
cTxt += "linha2" + CrLf()
MemoWrit( "texto.txt", cTxt )


E por aí vai.
No caso de #define, o CRLF é substituído por Chr(13) + Chr(10), o que deixa o EXE grande.
No caso de função CrLf(), pode reduzir o tamanho do EXE, por eliminar todos os Chr(13)+Chr(10) que existiriam nos fontes.
Se preferir, pode até usar como nome hb_Eol() que é o mesmo usado no Harbour, assim o fonte fica pronto pra Harbour.

Lembrando que isto também é possível
?? "texto"
? "outro texto"
?


?? indica que a saída será em sequência ao texto atual
? indica que vai pular uma linha ANTES do texto atual
Por isso, pra não ter uma linha em branco no início, o primeiro tem que ser ??
E um ? no final pra encerrar a última linha
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Arquivo TXT

Mensagempor JoséQuintas » 15 Jul 2016 20:55

Pra ilustrar, uma geração de NFE em txt, que tenho aqui:

#define FO_READWRITE 2
#define FS_END 2

   SET ALTERNATE TO ( mTxtNfe )
   SET ALTERNATE ON
   SET CONSOLE OFF
   ?? "NOTA FISCAL"
   ?? mTraco
   ?? "1" // Qtde de notas fiscais no arquivo
   ?? mTraco
   ?? " "
   ?? hb_eol()

   mChaveDigital := ;
      "35" + ; // UF Ibge
     Substr( Dtos( Date() ), 3, 4 ) + ; // AnoMes
     SoNumeros( mECnpj ) + ; // Cnpj
     "55" + ; // Modelo de Docto Fiscal
     "001" + ; // Serie Docto Fiscal
     StrZero( notas->Nf, 9 ) + ; // NF
     "1" + ;
     Right( StrZero( notas->Cod, 10 ), 3 ) + StrZero( notas->Cod, 5 ) // Chave Aleatoria
   mChaveDigital := mChaveDigital + CalculaDigito( mChaveDigital, "11" )

   // ---------- (NOTAFISCAL-A)

   ?? "A"
   ?? mTraco
   ?? "3.10" // 1 a 4 digitos versao do layout
   ?? mTraco
   ?? "NFe" + mChaveDigital // na exportação vai ser seguido da chave digital, na importação tanto faz se tem chave digital
   ?? mTraco
   ?? " "
   ?? hb_eol()
...
   SET CONSOLE ON
   SET ALTERNATE OFF
   SET ALTERNATE TO

   // Deixa Ctrl-Z no final da ultima linha

   mHandle := fOpen( mTxtNfe, FO_READWRITE )
   FSeek( mHandle, -3, FS_END )
   fWrite( mHandle, "   " )
   fClose( mHandle )


Ah sim, pra deixar Chr(13) + Chr(10) exatamente na posição 80, se a linha não tem 80 colunas, talvez assim:

cTexto := ""
cTexto += "campo1"
cTexto += "Campo2"
?? Pad( cTexto, 80 ) + hb_Eol()
...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Arquivo TXT

Mensagempor JoséQuintas » 15 Jul 2016 20:58

E uma geração do Itaú, onde preferi colocar observação no início da linha pra indicar posição no txt.
Pode ser interessante pra procurar problema depois.

   /* 001 */ cTxt +=  "0"
   /* 002 */ cTxt +=  "1"
   /* 003 */ cTxt +=  "REMESSA"
   /* 010 */ cTxt +=  "01"
   /* 012 */ cTxt += Pad( "COBRANCA", 15 )
   /* 027 */ cTxt += cBancoAgencia
   /* 031 */ cTxt += "00"
   /* 033 */ cTxt += Substr( cBancoConta, 1, Len( cBancoConta ) - 1 )
   /* 038 */ cTxt += Substr( cBancoConta, Len( cBancoConta ), 1 )
   /* 039 */ cTxt += Space(8)
   /* 047 */ cTxt += cEmpresaNome
   /* 077 */ cTxt += cBancoCodigo
   /* 080 */ cTxt += cBancoNome
   /* 095 */ cTxt += StrZero( Day( dDataProcesso ), 2 ) + StrZero( Month( dDataProcesso ), 2 ) + StrZero( Year( dDataProcesso ) - 2000, 2 )
   /* 101 */ cTxt += Space(294)
   /* 395 */ cTxt += StrZero( nSequencial++, 6 )
   cTxt += hb_eol()


Nota: Valem no Clipper 5.x e no Harbour. No caso do Clipper, só criar a função hb_Eol() como já coloquei antes.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Arquivo TXT

Mensagempor Nascimento » 28 Jun 2021 15:10

amigo quintas como faz para deixar alinhados os valores?

por exemplo "123" + Spac(02)+trans(1000,"@E999.99")

se eu diminuir o 123 por so "12" o valor desalinha indo para o lado esquerdo

como fazer dessa forma que vc fez mais como coluna fixa ? por exemplo:

linha:= PRow()

      @ linha,  7 say grupo + sub_grupo + codigo + ;
                   "-" + SubStr(produto, 1, 26) picture "@!"
                @ linha, 42 say preco / qtd picture "9,999.99"  // aqui sempre vai estar na linha 42, tem como fazer isso usando o exemplo seu citado a cima?


mesmo que um valor se altere as colunas fiquem "fixas" acho que deu pra entender
A arte de programar é simplesmente fazer seus pensamentos serem interpretados por uma maquina :) clipper 5.3 /harbour/minigui
Avatar de usuário

Nascimento
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 711
Data de registro: 19 Jul 2008 12:11
Cidade/Estado: OLINDA-PE
Curtiu: 110 vezes
Mens.Curtidas: 76 vezes

Arquivo TXT

Mensagempor Itamar M. Lins Jr. » 28 Jun 2021 15:53

Olá!
Use a função pad("campo variavel",30). Fixa o campo variável em 30

Saudações,
Itamar M. Lins Jr
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6949
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 312 vezes
Mens.Curtidas: 506 vezes

Arquivo TXT

Mensagempor JoséQuintas » 28 Jun 2021 16:18

trans(1000,"@E999.99")


Isso daí é transformar 1.000 em só 3 dígitos.... tá certo isso?

Essa integração é com ponto decimal, vírgula, ou nenhum dos dois?
Geralmente txt é com zeros e sem vírgula/ponto.

StrZero( 1000.00 * 100, 6 )


O Transform com @E, é com espaço depois do E, mas vai usar vírgula ao invés de ponto.
Confirme como deve ser o txt.

StrZero( 1000, 4, 2 )
StrZero( 1000, 6, 2 )
StrZero( 1000 * 100, 6, 2 )
Str( 1000, 4, 2 )

Confirmar:
1 - Se é ponto, vírgula, ou números sem decimais multiplicado por 100/
2 - Se é com espaços em branco ou se com zeros.
3 - Confirmar o tamanho, porque usou um tamanho menor que o número

Ah sim, o transform() também acrescenta separação de milhar, além das decimais, o que dá mais um caractere.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

Arquivo TXT

Mensagempor JoséQuintas » 28 Jun 2021 16:23

Pegando seu exemplo

@ linha,  7 say grupo + sub_grupo + codigo + ;
   "-" + SubStr(produto, 1, 26) picture "@!"
@ linha, 42 say preco / qtd picture "9,999.99"  // aqui sempre vai estar na linha 42, tem como fazer isso


Pra não fazer conta:

Pad( 
   Space(7) +
   grupo +
   sub_grupo +
   codigo
   + "."
   +  Substr( PRODUTO, 1, 26 )
, 42 )
+ Transform( preco / qtd, "9,999.99" )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18150
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes




Retornar para CA-Clipper

Quem está online

Usuários vendo este fórum: Google Adsense [Bot] e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro