minigui ( manipular arquivo TXT)

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

minigui ( manipular arquivo TXT)

Mensagem por Amparo »

ola amigos

tenho um arquivo chamado F_ILES.INI este arquivo é texto puro e contem todas as TAG que uso para criar meu arquivo de indice *.CDX segue parte dele:
onde: T = TAG K=ao nome do campo F=condicao especifica O e C é so pra mostrar pro usuario

parte do arquivo...

Código: Selecionar todos

[BANCOS_ORDERS]
T:CODIGO;K:CODIGO;O:Código;
T:CONTAS;K:NUM_CONTA;O:Número da conta;

[CHEQUES_ORDERS]
T:NUMERO;K:NUMERO;O:Número;
T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA";O:Número;C:Recebidos;
T:EMITIDOS;K:NUMERO;F:TIPO="DESPESA";O:Número;C:Emitidos;

[CAIXAS_ORDERS]
T:NUMERO;K:NUMERO;O:Nº do Caixa;
T:ABERTOS;K:DtoS(DATA_ABRE)+OPERADOR;F:Empty(DATA_FECHA);O:Abertura;
T:FECHADOS;K:DtoS(DATA_FECHA)+OPERADOR+NUMERO;F:!Empty(DATA_FECHA);O:Fechamento;
T:CXTODOS;K:DTOS(DATA_ABRE)+OPERADOR+NUMERO;F:EMPTY(DATA_FECHA);O:Abertos;C:Todos;
para editar este arquivo uso a seguinte linha:

Código: Selecionar todos

VETE_ORDER :=  LEARQINI( aSystem[ SYS_SYSDIR ], "F_ILES", "CHEQUES_ORDERS" )
onde: VETE_ORDER recebe os ARRAYS criados
aSystem[ SYS_SYSDIR ] = ao diretorio onde esta o arquivo
f_iles = é o arquivo F_ILES.INI
"CHEQUES_ORDERS" = o que devo procurar no arquivo F_ILES.INI

a funçao LEARQINI() é esta

Código: Selecionar todos

FUNCTION LEARQINI( CPASTA, cField, cKey )

LOCAL x := 0, y := 0, f := 0
LOCAL lOk := .F.
LOCAL cStr := ""
LOCAL aRetVal := {}

IF Empty( cField ) .OR. Empty( cKey )
   RETURN  {" "}
ENDIF

cField := AllTrim( cField )
cKey   := Upper( AllTrim( cKey ) )

CPASTA := ALLTRIM( UPPER( CPASTA ) )

IF Right( CPASTA, 1 ) <> "\"
   CPASTA += "\"
ENDIF

IF !FILE( CPASTA +  cField + ".INI" )
   ALERT( 'Arquivo de configuracao ' + cField + ' corrompido ou inexistente!' )
   RETURN  {" "}
ENDIF

cField := MEMOREAD( CPASTA + cField + ".INI" )

f := MLCount( cField, 250 )

FOR x := 1 TO f
   cStr := Upper( AllTrim( MemoLine( cField, 250, x ) ) )
  
   IF Empty( cStr ) .OR. cStr = "//"
      LOOP
   ENDIF

   IF cStr = "[" .AND. ( cKey $ cStr )
      lOk := .T.
      EXIT
   ENDIF
NEXT x

IF lOk
   FOR y := x+1 TO f
      cStr := AllTrim( MemoLine( cField, 250, y ) )

      IF Empty( cStr ) .OR. cStr = "//"
         LOOP
      ENDIF

      IF cStr = "["     // nova chave
         EXIT
      ENDIF

      IF cStr == "<vazio>"
         cStr := ""
      ENDIF

      AAdd( aRetVal, cStr )
   NEXT y
ENDIF

RETURN  aRetVal
pois bem, tendo os arrays montado posso mostrar ao usuario manipular e por ai vai, meu problema esta como gravar uma informação que eu alterei, por exeplo eu trouxe somente os dados do arquivos que sao estes:

Código: Selecionar todos

T:NUMERO;K:NUMERO;O:Número;
T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA";O:Número;C:Recebidos;
T:EMITIDOS;K:NUMERO;F:TIPO="DESPESA";O:Número;C:Emitidos;
se eu alterar por exemplo o segundo item passando desta forma

Código: Selecionar todos

T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA" .AND. !EMPTY(DT_BAIXA) ;O:Número;C:Recebidos;
como faço para gravar esta alteraçao no arquivo F_ILES.INI mantendo os outros dados, apesar do arquivo estar nomeado como INI nao posso utilizar a regra de manipulação de arquivo INI.

se alguem tiver alguma ideia sera bem vinda.

abraços
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

minigui ( manipular arquivo TXT)

Mensagem por Jairo Maia »

Olá Amparo,

Ao que me parece, nenhuma linha é igual a outra. Se esta dedução confere, tente o seguinte:

Após obter os Arrays na varialvel, VETE_ORDER, eu faria uma cópia desta matriz:

Código: Selecionar todos

VETE_ORDER_FIX:=ACLONE(VETE_ORDER)
Após efetuar a(s) alteração(ões), verificaria o que foi alterado e alteraria a varialvel cField:

Código: Selecionar todos

For nVar = 1 To Len( VETE_ORDER )
 If VETE_ORDER_FIX[nVar] # VETE_ORDER[nVar] // se necessário use Uppe() para checar
  cField:=StrTran( cField, VETE_ORDER_FIX[nVar], VETE_ORDER[nVar] )
 EndIf
Next nVar

MemoWrit( CPASTA + cField + ".INI", cField )
Espero ter ajudado.
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 do usuário
Amparo
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 20 Ago 2010 10:38
Localização: caieiras / sao paulo

minigui ( manipular arquivo TXT)

Mensagem por Amparo »

ola amigos

Jairo,

pelo que eu entendi voce esta criando a variavel CFIELD com apenas a array que eu mudei certo
e depois

Código: Selecionar todos

MemoWrit( CPASTA + cField + ".INI", cField )
aqui voce grava novamente o arquivo F_ILES.INI com o contedo do cField
este é o meu problema, eu carreguei no array apenas um pedaço do arquivo, eu peguei apenas as linhas que referenciam ao meu cadastro de cheques, no arquivo tenho cadastro de BANCOS, CIDADES, CLIENTES, FORNECEDORES etc etc, tenho que gravar a alteração feite em cheques e manter os outros intactos.

no exemplo que dei o array ficou assim:

Código: Selecionar todos

VET_ORDER[1] é = a T:NUMERO;K:NUMERO;O:Número;
VET_ORDER[2] è = a T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA";O:Número;C:Recebidos;
VET_ORDER[3] é = a T:EMITIDOS;K:NUMERO;F:TIPO="DESPESA";O:Número;C:Emitidos;
eu alterei o VET_ORDER[2] para T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA" .AND. !EMPTY(DT_BAIXA) ;O:Número;C:Recebidos;

entao faço assim:

Código: Selecionar todos

VET_OREDR[2] := T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA" .AND. !EMPTY(DT_BAIXA) ;O:Número;C:Recebidos;
agora ja tenho meu array alterado, o problema é como gravar no arquivo TXT

estava pensando em carregar todo o arquivo TXT no array so que ai vou ter de mudar a rotina que carrega o arquivo pois nela pego apenas o que me interessa e gostaria de gravar novamente no arquivo somente aquilo que foi mudado.

nao sei se fui bem claro.

abraços
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

minigui ( manipular arquivo TXT)

Mensagem por alxsts »

Olá!

Você poderia gravar o array em disco. Quando fosse alterar, ler (vai obter um array), alterar e gravar de volta. Só vai precisar colocar algum flag sinalizando o período em que os dados estiverem em manutenção. Existem funções que fazem isto.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

minigui ( manipular arquivo TXT)

Mensagem por Jairo Maia »

Olá Amparo,

Veja este exemplo:

Código: Selecionar todos

// Você carregou em VETE_ORDER as informações de CHEQUES_ORDERS:
VETE_ORDER :=  LEARQINI( aSystem[ SYS_SYSDIR ], "F_ILES", "CHEQUES_ORDERS" )

// Não se sabe o que vai mudar, vamos guardar as informações originais em outra matriz:
VETE_ORDER_FIX:=ACLONE(VETE_ORDER)

// Altera p.ex. o elemento 2:
VETE_ORDER[2] := [T:RECEBIDOS;K:NUMERO;F:TIPO="RECEITA" .AND. !EMPTY(DT_BAIXA) ;O:Número;C:Recebidos;]

// pega todo o conteúdo do arquivo F_ILE.INI:
cArq_INI:=MemoRead( cPasta + "F_ILE.INI" )

// Salva a alteração no arquivo F_ILE.INI:
For nVar = 1 To Len( VETE_ORDER ) 
 If VETE_ORDER_FIX[nVar] # VETE_ORDER[nVar] 
  cArq_INI:=StrTran( cArq_INI, VETE_ORDER_FIX[nVar], VETE_ORDER[nVar] ) 
 EndIf 
Next nVar 
  
MemoWrit( CPASTA + "F_ILE.INI", cArq_INI )
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)
Responder