Função para pesquisar e trocar texto qquer tipo de arquivo

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por fladimir »

Pessoal, ola, no Clipper funciona bem tranquilo, agora no xHarbour não consegui com q funcionasse.

Tipo a função nao substitui as TAGs... Já tinha a função do colega Marcelo rodando na integra como postada e funcionando perfeitamente onde eu a utilizava para substituir uma TAG pelo conteúdo de um campo do DBF, onde é gerado um carnes com as parcelas do clientes.
Tal geração obedece um Layout pré-estabelecido em um TXT, q não pode ser mudado pois se não não imprime certo.

Ja debati muito esse assunto em vários tópicos conforme abaixo, e a melhor função q se adequou foi esta q o Marcelo fez com contribuições de outros colegas como Eolo, Maligno e talvez outros.


https://pctoledo.org/forum/viewto ... f=4&t=9003

Este tópico abaixo esta como resolvido, mas não foi utilizando a função PesqByte, pois passei a utilizar a função PesqByte posteriormente... Mas este tópico é bom para relembrar e inteirar sobre o assunto quem queira colaborar.

https://pctoledo.org/forum/viewto ... f=1&t=7919


Mas torno a repetir a mesma função compilada em xHarbour, não da o mesmo resultado q compilada no clipper, caso alguém saiba o pq seria muito util, não sei se os colegas q utilizam a mesma função conseguiram migrar par ao xHarbour?


Colegas, sei q pra alguns ou até muitos esta questão acima não é um problema, mas se vcs verificarem as datas dos tópicos e td mais, pra mim é uma situação difícil q infelizmente não estou conseguindo resolver...

Agradeço....

Att.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por Maligno »

no Clipper funciona bem tranquilo, agora no xHarbour não consegui com q funcionasse.
Se o problema se relaciona com o XHarbour, abra um novo tópico naquela seção, descrevendo em detalhes o que já faz e o que não está dando certo. Ou, se já existir tópico tratando deste assunto, apenas continue nele.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por sygecom »

Olá fladimir,
Vamos dar continuidade no topico abaixo:
viewtopic.php?f=4&t=9003
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por Pablo César »

Acho que após aquele problema que deu no servidor, as minhas mensagens sumiram. Foram alguma questões que levantei pro Fladimir e não sei se ele alcançou a ler. No que eu me lembro, percebí que ele usava o SET PRINTER TO ARQUIVO e que dentro desse bloco (inicialização até o fim da de criação do arquivo, nesse meio) talvez estivesse tentando substituir as tags sem antes de fechar o SET PRINTER OFF. Mas como foi duplicado o tópico (no Xharbour e nesta seção) espero que ele consiga detectar o problema.

Agora pegando carona no assunto, eu nestes momentos me encontrei com uma situação similar. A minha dúvida é se seria melhor criar um segundo arquivo durante a criação com SET PRINTER TO ARQUIVO e fazer uma função que crie um segundo arquivo com outro formato. Vou me explicar melhor:

Trata-se de um módulo de impressão. No qual eu coloco um menu para usuário escolher: Tela ou impressora. Seja qual for a opção, sempre crio um arquivo PRN para impressão. Se o usuário escolheu visualizar em tela o relatório, entra numa função de navegação de dentro de um MEMOEDIT (memoedit, porque os relatório não são grandes). Daí disponibilizei pro usuário uma opção para que crie e visualize esse relatório num formato diferente. Vamos dizer: cria uma planilha em Excel, por exemplo. Claro que o relatório tem uma formatação diferente a da planilha. Daí então acho que na hora da criação do arquivo PRN, deveria criar o outro arquivo ja no formato CSV (por exemplo) a fim de que se o usuário acionar a opção de criar o arquivo durante a visualização do relatório, ja disponha o arquivo sem a necessidade de reprocessamento. E aí que vem a minha dúvida. Acho que tenho duas opções:

1. Crio o arquivo PRN através do SET PRINTER TO <arquivo_prn> e adiciono ao mesmo tempo uma função que crie o arquivo CSV em baixo nível ?

2. Copio o arquivo PRN para CSV e trato esse arquivo, subtituindo as diferenças de formatos ?

Qual seria a opção mais rápida, segura e menos redundante, na opinião de vocês ?

Pergunto isto, pois não sei se é possível criar dois arquivos ao mesmo tempo (nunca fiz esse teste). è dizer poderia fazer a criação de um arquivo durante a varrida do BD, através do SET PRINTER TO <arquivo> e na linha abaixo do @ say to arquivo chamaria uma função onde passaria string por string para compor o segundo arquivo.

Será que não seria mais ou menos isso que está ocorrendo com o colega Fladimir em xHarbour ? Claro que se a dúvida é com xHarbour, essa resposta mereceria ser respondida lá. No entanto, se temos intenção de migrar as aplicações em Clipper, ja deveríamos estar sabendo que certos procedimentos não dariam em xHarbour. Com isto não quero dizer que o problema do Fladimir esteja aí. Talvez seja alguma mudança que ele fez e esqueceu de fechar o arquivo que estava sendo criando pelo SET PRINTER na hora que faz a substituição das tags.

Bem espero ter levantado uma questão provável sobre o problema do Fladimir e sobre a criação de dois arquivos simultaneamente (com SET PRINTER e FWRITE) por exemplo.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por Pablo César »

Olá fladimir,
Vamos dar continuidade no topico abaixo: na seção xHarbour
Puxa Fladimir, você colocou seu problema em três tópicos...
Pablo César escreveu:Acho que após aquele problema que deu no servidor, as minhas mensagens sumiram. Foram alguma questões que levantei pro Fladimir e não sei se ele alcançou a ler.
Eu cheguei a pensar que as minhas mensagens que atendiam a sua questão tinham desaparecido, mas elas estão neste outro tópico: viewtopic.php?f=1&t=7919&start=30#p52571

Sei que está com dificuldades em resolver esse problema em xHarbour, mas que confusão...

Acho que deveríamos, juntar essas mensagens num tópico apenas ou máximo em dois.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Função para pesquisar e trocar texto qquer tipo de arquivo

Mensagem por fladimir »

Verdade Pablo eh q eu tinha colocado na xHarbour pq o problema aconteceu lá e como não consegui resolver reabri o do Clipper q foi resolvido com a PesqByte, mas devido no xHB não ter dado certo, voltei para ver se conseguia outra função q fizesse a mesma coisa q a PesqByte, mas q pudesse depois compilar no xHB, por isso esse vai e vem, mas agora estou continuando direto no do xHarbour, fica melhor em no máximo 2 tipo 1 do clipper e 1 do xHB.

Att.

:)Pos
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Arquivo de impressão

Mensagem por Pablo César »

Só para constar... ja que ninguém até agora respondeu a minha mensagem: viewtopic.php?f=1&t=7471&p=52606#p52606

Como eu disse antes, precisei de utilizar 3 arquivos de impressão com diferentes formatos. Passo a relatar a minha experiência, talvez sirva para outras situações similiares:

Na hora de criar um arquivo estou criando três, através do fwrite (função de baixo nível) a fim de criar diferentes formatos do mesmo processamento:

1. Um arquivo .PRN ja com os comandos de impressão.
2. Um arquivo .OEM sem comando, sem eject, apenas em puros ASCII no padrão DOS a fim de visualizar o relatorio
3. Um arquivo .ANS para abrir ou processar com utilitário no padrão Windows. Isto é, sem comandos de impressão mas a acentuação pronta para ser visualizada corretamente num editor padrão Windows (por exemplo um NOTEPAD).

Então decidí criar em vez de um arquivo, então três arquivos, no mesmo processamento. Com isto irei evitar re-processamento e talvez ganhar mais agilidade. Abandonei a idéia de criar o relatório através do SET PRINTER ou SET ALTERNATE. Em vez disso utilizo as funções em baixo nível FCREATE, FWRITE e FCLOSE, vejam como ficou parte do PRG:

Código: Selecionar todos

..//..
VTIPO_PRN=""
VTIPO_PRN:=MENU_PRN("LOCA_01")
IF EMPTY(VTIPO_PRN)
   FECHA()
ENDIF
SET CURSOR OFF

fh1:= fcreate("LOCA_01.PRN")
fh2:= fcreate("LOCA_01.OEM")
fh3:= fcreate("LOCA_01.ANS")
VX=1
VPAG=1
VTOT_0001=0
VTOT_0002=0
VSAI_DA="S"
IF QFAZ="GEN"
   SELE 1
   SET ORDER TO 2
   GOTO TOP
   IF VGRUP>1
      SEEK VGRUP1[VGRUP]
   ENDIF
   VQUEBRA_2=QGEN1(1->GENERO)
ENDIF
DO WHILE QFAZ="GEN" .AND. (1->(!EOF()))
   IF VX=1
      fwrite(fh1,(&(23->PN12)))
      fwrite(fh1,(&(23->PENF)))


      VTIT:=CENTIT3(VYFAN,"","P gina: "+STRZERO(VPAG,4,0),90+(IF(VANT=.T.,16,0)))
      fwrite(fh1,VTIT+CRLF)
      VTIT:=CENTIT3(VYFAN,"","P gina: "+STRZERO(VPAG,4,0),80+(IF(VANT=.T.,16,0)))
      fwrite(fh2,VTIT+CRLF)
      fwrite(fh3,VTIT+CRLF)


      IF VQFAZ=" "

         PRINTIN3("                           "+(IF(VANT=.T.,SPACE(8),""))+"Acervo de T¡tulos                    "+(IF(VANT=.T.,SPACE(8),""))+"Data: "+DTOC(DATE())+CRLF)
         // PADL(RTIM(PADC(,(80+(IF(VANT=.T.,16,0))))+PADL(

      ELSE
         PRINTIN3("                           "+(IF(VANT=.T.,SPACE(8),""))+PADR("Acervo de T¡tulos ("+ALLTRIM(WPROD2[OP_C])+")",37)+(IF(VANT=.T.,SPACE(8),""))+"Data: "+DTOC(DATE())+CRLF)
      ENDIF
      IF EMPTY(ALLTRIM(VQUEBRA_2))
         PRINTIN3(PADC("Gˆnero n„o definido (em branco).",80+(IF(VANT=.T.,16,0)))+CRLF)
      ELSE
         PRINTIN3(PADC(ALLTRIM(VQUEBRA_2),80+(IF(VANT=.T.,16,0)))+CRLF)
      ENDIF
      PRINTIN3(REPL("-",80+(IF(VANT=.T.,16,0)))+CRLF)
      PRINTIN3("C¢digo T¡tulo da c¢pia                               Promo‡„o     Interpreta‡„o"+(IF(VANT=.T.," C¢digo anterior",""))+CRLF)
      PRINTIN3(REPL("-",80+(IF(VANT=.T.,16,0)))+CRLF)

      fwrite(fh1,(&(23->TENF)))
      VPAG=VPAG+1
      VX=07
   ENDIF                                          
   IF VCPODE1(VQFAZ,(1->COD_TIT))=.T.
      SELE 2
      SET ORDER TO 1
      SEEK STRZERO((1->COD_TIT),5,0)
      DO WHILE (2->COD_T)=(1->COD_TIT)
         IF VCPODE2(VQFAZ,(2->PRODUTO))=.T.
            VPRO:=QPROM1(1->PROMOCAO)
            VTIT:=PADR(1->TITULO,46)
            PRINTIN3(" "+(2->CODIGO)+" "+VTIT+" "+VPRO+" "+SUBSTR(VQ_INTER(2->PORTUGUES,.F.),1,13)+(IF(VANT=.T.," "+PADC(2->N_ANT,15),""))+CRLF)
            VTOT_0001=VTOT_0001+1
            VTOT_0002=VTOT_0002+1
            VX=VX+1
         ENDIF
         VQREC=RECNO()
         MYMETER(VQREC,VLAST)
         SKIP
      ENDDO
   ENDIF
   SELE 1
   SKIP
   IF !(VQUEBRA_2=QGEN1(1->GENERO))
      IF VGRUP=1
         IF (2->(!EOF()))
            TOTALIZA(2,VTOT_0001,VTOT_0002,80)
         ENDIF
         VTOT_0001=0
         VX=1
         VQUEBRA_2=QGEN1(1->GENERO)
      ELSE
         TOTALIZA(2,VTOT_0001,VTOT_0002,80)
         EXIT
      ENDIF
   ENDIF
   IF VX>56 .OR. (1->(EOF()))
      IF (1->(EOF()))
         TOTALIZA(2,VTOT_0001,VTOT_0002,80)
      ELSE
         TOTALIZA(1,VTOT_0001,VTOT_0002,80)
         VTOT_0001=0
      ENDIF
   ENDIF
ENDDO
fwrite(fh1,(&(23->TENF)))
fwrite(fh1,(&(23->PN10)))
fwrite(fh1,CHR(12))
fwrite(fh3,CHR(12))
FOR I=1 TO 5
    CLOSE I
NEXT
fclose(fh1)
fclose(fh2)
fclose(fh3)

IF VTIPO_PRN = "T"
   IMP_TELA("LOCA_01",120)
ELSE
   IF (23->PORTA)=0
      IF SUBSTR(23->IMPLOCAL,1,3)="C:\"
         COPY FILE("LOCA_01.PRN") TO (ALLTRIM(23->IMPLOCAL)+"\LOCA_01.PRN")
      ELSE
         VIMP="COPY LOCA_01.PRN "+ALLTRIM(23->IMPLOCAL)+" > NUL"
         RUN (VIMP)
      ENDIF
   ELSE
      IF PRINTER((23->PORTA))
         COPY FILE("LOCA_01.PRN") TO ("LPT"+STR(23->PORTA,1,0))
      ENDIF
   ENDIF
ENDIF
DELETE FILE("TITUL000.NTX")
FECHA()
Faltam funções, portanto não poderá ser compilado de primeira. As funções que faltam não pretendo disponibilizá-las. Mas já com isto dá uma boa ideia de como trabalhar com várias criações de arquivos quase que ao mesmo tempo...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Responder