Preencher dados em Um Arquivo um Pouco diferente.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

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

Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por fladimir »

...

Olá nobres colegas, venho até vcs para dividir um problema e poder compartilhar as possíveis soluções.

Em meu sistema consigo atualmente substituir TAGs por determinadas Strings oriundas ou não deu um Banco de Dados, agora meu dilema é um pouco mais complicado um cliente precisa que eu faça imprimir os pedidos em um determinado Layout pré-impresso, até ai não é o problema o fato é que quero aproveitar e fazer tipo um Arquivo Modelo onde ao manipular as TAGs consiga encaixar em qualquer Layout não so deste cliente mas de qualquer outro.

Ok, pq não usar a rotina que já possuo para Substituir TAGs por Strings, a resposta esta na questão dos itens (produtos ou serviços) a serem impressos ser variável.

Já pensei em algumas possibilidades, mas tem uma que me chamou mais a atenção...

Em ANEXO esta um modelo de arquivo de um outro sistema que conheço o qual é muito interessante os colegas analisarem...

Ele possui no inicio uma descrição dos Numeros q referenciam Campos e tb tem caracteres como () q simbolizam que os campos entre () devam sair condensados e na largura maxima definida, além de outras informações onde possibilita determinar o número maximo de itens e após atingida esta quantidade de ites salta para uma nova pagina continuando, caso existam mais itens.

Atualmente para Carnes, Boletos e Contratos utilizo a função MASCARATXT conseguida aqui no fórum com a ajuda dos colegas e adaptada.

Código: Selecionar todos

*----------------------------------------------------------------------------*
FUNCTION MascaraTXT(cArquivo,aPesq,aTroca,nLineLen,nTabSize,lWrap, cArqRet)
*----------------------------------------------------------------------------*
/*
* Exemplo..: 
 FileCopy("Carne.TXT","Carne.TMP")
 cArqBase := "Carne.TMP"
 aPesq:= {}
 AADD(aPesq,"@empresa"  )
 AADD(aPesq,"@endemp"   )   
 AADD(aPesq,"@cpf"          )
 AADD(aPesq,"@rg"       )
 aTroca:={}
 AADD(aTroca, User->NOME)                
 AADD(aTroca,ALLTRIM(User->ENDERECO)+USER->NUMERO )
 AADD(aTroca,IIf( Clientes->TIPO=="F", Clientes->CPF, Clientes->CNPJ         ) )
 AADD(aTroca,IIf( Clientes->TIPO=="F", Clientes->RG,  Clientes->INSCRICAO ) )
 Mensag("Aguarde... Imprimindo o carnˆ de pagamentos","")
 PrintON()
 SetPRC(0,0)
 MascaraTXT(cArqBase,aPesq,aTroca,150)                           
*/
* Objetivo : Pesquisar Tags [@] e substituir por outro valor                 *
*----------------------------------------------------------------------------*

LOCAL iMax, cText, I

IIf( nLineLen = NIL, 150,)  
IIf( nTabSize = NIL,   0,)
IIf( lWrap    = NIL,  .F.,)
IIF( cArqRet = NIL, "Gerado.TXT",)     

cText := MemoRead( cArquivo )
Imax := MLCount( cText, nLineLen, nTabSize, lWrap )
aLine:={}
nElemento:=1

cText2 := ""
ret_line := Chr(13) + Chr(10)

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
            
				* 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)	

         EndIf
      Next
   Next
	cText2 := cText2 + cLine + ret_line
	memowrit(cArqRet,cText2)
	
NEXT
RETURN Nil

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

nPosFinEsp := 0
ForEspaco:=.t.
While ForEspaco =.t.
	Eh_Espaco := asc(Substr( LinhaTXT, (PosInEsp), 1 ))
	IIf( EH_Espaco = 32, PosInEsp++, ForEspaco:=.f.)
	If Eh_espaco=13 .or. eh_espaco=10 //.or. eh_espaco=""
	   exit
	Endif   
End	
nPosFinEsp += PosInEsp
Return nPosFinEsp
Sds.
:)Pos
Anexos
PED.INI
Arquivo Modelo
(5.17 KiB) Baixado 91 vezes
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
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por rochinha »

Amiguinho,

Voce pretende criar seus relatorios baseados em pequeninos arquivos como este e usar uma unica rotina para reconhece-los, configurar, gerar o conteúdo e imprmi-lo?

Em 2003 quando eu havia transportado meu sistema para Harbour usando Fivewin cheguei a criar uma rotina que identificava arquivos com uma formatação identica.

Baseei-me em um pequeno aplicativo DOS escrito em C, encontrado num destes sites, OASIS ou USENET nem lembro mais.

O aplicativo reconhecia o script, abria um .DBF e exibia o resultado.

Mas para mim era necessário mais parametros e maior controle, pois precisava de uns Wheres e Filter e abrir mais de um arquivo.

Exemplo do script:

Código: Selecionar todos

--RPT2.FRM
HT Contas a Receber/Pagar
HT Vencto   Descricao                                Nome                                        Valor 
HT -------- ---------------------------------------- ---------------------------------------- --------
DT 99/99/99 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 99999.99
ET**** END OF REPORT ****
GT                                         --------
GT                                   Total 99999.99
TA contas
--NX conta001,conta002
DC areceber, descricao, nome, valor
GC valor
--CQ areceber
--SM areceber
--RE SIM
--ST SIM
LP 99
--WH MONTH(ARECEBER) > 3
No meu código cheguei a faze-lo retornar calcular colunas, resumir e/ou agrupar.

No seu caso, para usar este script que mostrou(PED.INI) ou algo semelhante para imprimir cabecalho, corpo e rodape, sugiro que voce separe o mesmo nestas 3 áreas.

A primeira área será o cabeçalho e voce fará o tratamento do código e a troca das variaveis desta área.
A segunda área será o corpo que deverá ter o conteúdo trocado e concatenado a ele mesmo a cada registro existente.
A terceira área será o rodapé e voce fará o tratamento do código e a troca das variaveis desta área também.

Exemplo de sequencia:

Código: Selecionar todos

LINHA    := 1
TOTALLIN := 10
DO WHILE .NOT. EOF()
   IF LINHA = 1
      // Codigo que troca as variaveis da area de cabecalho
   ENDIF
   // Codigo que troca as variaveis da area do corpo    
   SKIP
   IF LINHA > TOTALLIN
      LINHA    := 1
   ENDIF
   IF EOF()
      // Codigo que troca as variaveis da area de rodape
   ENDIF
ENDDO   
Exemplo de conteudo mesclado:

Código: Selecionar todos

   cCABTFile21 := StrTran( cHTMLFile2 , "{#Resumido#}"  , SUBSTR(ES->RESUMIDO,1,10) )
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.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por fladimir »

Obrigado Rochinha pela ajuda, vou analisar suas informações e depois posto o resultado comentado.

Vlw mesmo pela força.

Sds.
:{
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
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por rochinha »

Amiguinho,

Analise o conteudo deste link: http://www.vagucs.com.br/dwclipper/repdos.zip
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.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Re: Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por fladimir »

Rochinha, matou a pau, desnucou, distrinchou, arrebentou, era exatamente, ou melhor, esse link é a essencia da idéia q quis passar no início do tópico e já com a evolução do raciocínio.

SHOW DE BOLA!!!!

:{ :{ :{ :{
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
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Preencher dados em Um Arquivo um Pouco diferente.

Mensagem por rochinha »

Amiguinho,

Obrigado,

Eu estava procurando outra coisa na internet e cai na página de downloads do Vagner Nunes.

Agradecimentos a ele por manter o site com material pertinente.

Agradeço também ao Toledo por manter esta fonte maravilhosa de aprendizado, conteúdo e amizade aberto a todos nós utilizadores e colaboradores.
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.
Responder