Página 1 de 1

minigui ( manipular arquivo TXT)

Enviado: 04 Jun 2011 11:30
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

minigui ( manipular arquivo TXT)

Enviado: 05 Jun 2011 13:32
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.

minigui ( manipular arquivo TXT)

Enviado: 06 Jun 2011 16:26
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

minigui ( manipular arquivo TXT)

Enviado: 06 Jun 2011 18:04
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.

minigui ( manipular arquivo TXT)

Enviado: 07 Jun 2011 10:45
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 )