Página 1 de 1

Set Printo to arq.txt (primeira linha em branco)

Enviado: 19 Abr 2008 02:05
por donato23
Olá,
Porque em qualquer situação que é usado.:

Código: Selecionar todos

Set print on
set console off
set print to arq.txt
    DO WHILE .not. eof()   
    ? linhas
    Skip
    Enddo
set console on
Set print off
set print to
A primeira linha do arq.txt sai em branco??

No caso especifico, preciso usar algumas lista txt para direcionar para emails diferentes e depois o BLAT fazer o envio.

Código: Selecionar todos

.
.
USE MTODOS
GO TOP

FOR contlist=1 to var_l
        contmail=0

    Set print on
    set console off
    vplist="list"+allTrim(str(contlist,2))+".txt"
    set print to &vplist

   DO WHILE contmail < vr1
    ? linhas
   Skip
   contmail++
   Enddo

        set console on
        Set print off
        set print to
 
NEXT contlist
Neste caso, todas os TXT gerados, que variam dependendo do BD selecioanado, tem a primeira linha impressa em branco. Como remover esta linha? ou é uso correto so Set Print?
Obrigado.

Enviado: 19 Abr 2008 09:27
por Pablo César
Olá Wilson, isso é uma particularidade do comando de console.
O "?" envia um carriage-return/line-feed ao console antes de exibir os resultados da lista de expressões. E ja o "??" exibe a sa¡da na posição corrente do cursor ou cabeça de impressão. Isto permite que você use sucessivos "??" para exibir a sa¡da na mesma linha.
Então para que na 1ª linha do seu arquivo não seja pulada comece utilizando o "??" apenas uma única vez no processo todo da sua rotina. Cómo faz isso ?. Olhe este exemplo:

Código: Selecionar todos

/*Set print on 
set console off
set print to arq.txt */

// Também dá para usar seta forma em vez da forma acima
SET ALTERNATE TO ("ARQ.TXT")
SET ALTERNATE ON

Uma_Vez:=.F.  /* Pode fazer com uma flag logico                         */
Conta_Vez:=1  /* Ou com uma variavel tipo contador                      */

DO WHILE .not. eof()

   /* este exemplo usa a variavel flag (var logica)                     */
   IF Uma_Vez=.F.
      ?? linhas
      Uma_Vez=.T.
   ELSE
      ? linhas
   ENDIF

   /* agora outro exemplo caso voce utilize algum contador para compor
      a linha do seu arquivo.                                           */
   IF Conta_Vez=1
      ?? STR(Conta_Vez)+linhas
   ELSE
      ? STR(Conta_Vez)+linhas
   ENDIF
   Conta_Vez=Conta_Vez+1

   Skip
Enddo
SET ALTERNATE OFF
SET ALTERNATE TO

/*set console on 
Set print off 
set print to*/
Espero ter esclarecido essa questão. Talvez até haja outro tratamento que poderá ser utilizado também e que os outros colegas queiram contribuir.

SET PRINT TO

Enviado: 19 Abr 2008 11:13
por Adalberto
Wilson,

Com toda seguridade que exemplo de Pablo César ira funcionar corretamente, solo como alternativa, em lugar de ? ou ?? eu utilizo a forma:

@ fila,coluna

Sem problema.

Enviado: 19 Abr 2008 11:21
por Alcir
Bem estranho isso.

Mas não precisa usar o SET CONSOLE OFF, pq vai direto pro .TXT, experimente tira-lo. Abraços

Enviado: 19 Abr 2008 11:24
por Maligno
Mas é o que o Pablo disse. É só trocar ? por ?? na primeira linha que o problema acaba. O NG explica: o comando ? antes de qualquer caractere, envia um par CR/LF para a saída. Por isso acontece o salto de uma linha.

Enviado: 19 Abr 2008 12:05
por donato23
Obrigado à todos,
depois de explicado e exemplificado , tudo se torna simples rs.rs.rs
O flag logico sugerido pelo Pablo resolve tudo.

Enviado: 19 Abr 2008 13:12
por Pablo César
Puxa... que chic ! Temos mais um colega que é engenheiro (aasim como o Manuel Modernel, Vander e outros). Que bom é contar com pessoas com conhecimentos técnicos do mais variados.

Notar que a minha mensagem foi re-editada, para mostrar outra forma de criar o arquivo.

Enviado: 19 Abr 2008 13:18
por Toledo
Amigos, só para simplificar mais os exemplos do Pablo.

Código: Selecionar todos

Set print on
set console off
set print to arq.txt
  DO WHILE .not. eof()   
    ?? linhas
    ?
    Skip
  Enddo
set console on
Set print off
set print to 
Abraços,

Enviado: 19 Abr 2008 20:52
por Pablo César
?? linhas
?
Legal ! Bem lógico e simples, não testei mas poderia afirmar que isso está totalmente correto. Taí mais uma forma. Obrigado Toledo.

Enviado: 22 Abr 2008 13:39
por gvc

Código: Selecionar todos

set alternate to arq.txt
set alternate on
set console off
while !eof()   
    ?? linha
    ?
    dbskip()
end
set console on
set alternate off
set alternate to 
Eu uso assim. Como o mestre Toledo postou eu acho que é para trabalhar com "@ linha,coluna", como postado pelo nosso amigo Adalberto (Santa Cruz - Bolivia).

Enviado: 22 Abr 2008 16:21
por Toledo
Gilberto, eu também uso desta maneira, mas procurei seguir o mesmo exemplo do Wilson, já que o resultado será o mesmo. E também dependendo da versão do Windows que o Wilson tiver usando (Windows XP por exemplo), o set alternate deixa no final do arquivo um quadradinho (caracter ASCII), que as vezes atrapalha, principalmente para validar arquivos de remessa (Bancos, Receita Estadual, Federal, etc), agora com o set printer to, sem usar o eject no final, isto não acontece.

Abraços,

Enviado: 22 Abr 2008 16:33
por gvc
[Toledo]
(Gilberto???) Juro que achei que era com outra pessoa que vc estava falando/respondendo.
Quando minha família trata pelo nome completo é pq eu fiz algo de errado.

O caracter é o final de arquivo, chr(26) ou CTRL Z, já discutido anteriormente neste forum.

Vou observar sua dica nos próximos arquivos que terei que gerar para envio.

[donato23]
Vc conseguiu resolver sua dúvida?

Enviado: 22 Abr 2008 16:39
por Toledo
Hahahaha... isto acontece comigo também quando alguém me chama de Paulo...

Abraços,

Enviado: 22 Abr 2008 17:31
por gvc
[Toledo]
E não é que a sua dica funcionou mesmo. Valeu.

[donato23]
Vc conseguiu resolver sua dúvida?