memo X txt

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

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

memo X txt

Mensagem por Amparo »

ola amigos

tenho varios DBF com campos memos e estou querendo acabar com eles e passar a gravar em arquivos TXT so nao estou sabendo como fazer, por exemplo tenho o arquivo clientes.dbf dentro dele tenho 2 memos um chama-se NOTAS e o outro HISTORICOS, em notas é gravado todas as informacoes de usuarios ou seja o usuario digita qualquer informações sobre este cliente o outro campo o sistema grava automaticamente o que ocorreu com o cliente, exemplo quando é feito qualquer movimentação no cadastro de cliente o sistema grava..

O usuario FULANODETAL alterou o registro em 03/04/2011 as 08:00 (altercli 328 )
O usuario FULANODETAL inclui o registro em 01/04/2011 as 15:00 (inclucli 850 )

este é apenas um exemplo, repare que a odem de gravação é decrecente.

estava pensando em gerar um arquivo txt com o codigo ou o cnpj do cliente ficando +- assim 61419723000188.txt

so que dentro do arquivo queria separar o que é campo NOTAS de HISTORICOS e sempre gravar as mudanças recentes primeiro depois as mais antigas ficando mais ou menos assim quase igual a um arquivo *.ini

[NOTAS]
EM 03/04/11 O CLIENTE REPROVOU O ORÇAMENTO 10345 E FICOU DE PASSAR UM NOVO PEDIDOS
EM 22/02/11 O CLIENTE PEDIU PARA TROCAR O ITEM X PELO ITEM Y DO PEDIDO 10213
EM 15/02/11 O CLIENTE DEVOLVEU A MERCADORIA DO PEDIDO 10185 ALEGANDO ESTAR EM DESACORDO COM O SEU PEDIDO


[HISTORICOS]
O usuario FULANODETAL alterou o registro em 03/04/2011 as 08:00 (altercli 328 )
O usuario FULANODETAL inclui o registro em 01/04/2011 as 15:00 (inclucli 850 )


nao sei como e qual é a melhor forma para fazer, lembrando que o campo NOTAS deve ficar aberto na alteração ou inclusao para o usuario digitar.

qualquer sugestao é bem vinda.

abraços
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á

memo X txt

Mensagem por Pablo César »

tenho 2 memos um chama-se NOTAS e o outro HISTORICOS
Eu criaria dois arquivos.
estava pensando em gerar um arquivo txt com o codigo ou o cnpj do cliente ficando +- assim 61419723000188.txt
Sugiro você pegar o código do cliente que provavelmente deve ser menor que o cnpj. Pois o tamanho do arquivo seria melhor ser no padrão 8x3. Não sei se em Harbour na hora de criar ele cria com nomes longos.
so que dentro do arquivo queria separar o que é campo NOTAS de HISTORICOS
Separar os arquivos pela sua nomenclatura seria mais fácil. Você até pode armazená-los separadamente em sub-pastas diferentes. Criaria N0000001.TXT para Notas e H0000001.TXT para os históricos. Ou C0000001.NOT para notas ou C0000001.HIS para históricos. E os histórico para que seja gravado em forma decrescente, você poderia fazer algo assim:

Código: Selecionar todos

cLog:="O usuario FULANODETAL alterou o registro em 03/04/2011 as 08:00 (altercli 328 )"+MEMOREAD("C0000001.HIS")
MEMOWRIT("C0000001.HIS",cLog)
Ou você pode fazer com a funções de baixo nível (FOPEN/FWRITE) caso você perceba que o histórico possa a vir a ser muito grande.
lembrando que o campo NOTAS deve ficar aberto na alteração ou inclusao para o usuario digitar
Com mais razão, eu separaria os arquivos. Daí quando o usuário queira inserir alguma observação, ele tecle F8 por exemplo e abra o MEMOREAD para edição do arquivo do cliente tal.
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
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

memo X txt

Mensagem por Amparo »

ola amigos

ja montei parte da minha rotina de gravação em arquivo TXT para substituir os CAMPOS MEMOS, agora estou com uma dificultade em mostrar este arquivo na execução do programa.

para criar o arquivo fiz desta forma, eu gravo e regravo o arquivo do jeito que necessito:

Código: Selecionar todos

TEXTO := 'Dia ' + DTOC(DATE()) + ' as ' + SUBS(TIME(),1,5) + ' o Usuario ' + cUser +' '+ RSIT + CRLF + MEMOREAD(CPASTA+CARQUI)

MEMOWRIT( CPASTA+CARQUI,TEXTO )
agora para mostrar quando estou executando meu programa ja nao da certo, a tela aparece em branco ja tentei colocar por exemplo ALERT( MEMOREAD(CPASTA+CARQUI) ) e mostra vazio, abaixo a rotina que fiz

Código: Selecionar todos

PROCEDURE HISTORTXT( aLocal )

LOCAL SvScr := SaveScreen(1,,,)
LOCAL SvCur := SetCursor(0)
LOCAL cMemo
LOCAL CPASTA := UPPER( ALLTRIM( aSystem[ SYS_FILEDIR ] ) )
LOCAL CARQUI := aLocal[1] + ALLTRIM( STR( ( aLocal[1] )->( RECNO() ) ) ) + ".HIS"

DisableMenu()

AJan( 3, xc-37, yc+10, xc+37, B_NONE, aColor[ CL_NORMAL ], 8 )
MyFrame( 4, xc-37, yc+9, xc+37 )

@ 3, xc-37 SAY PadR( "HISTORICOS: " + aLocal[1], 75) COLOR aColor[ CL_LI00 ]

Li23("Historicos de Movimentacao. Esc: Fecha Tela")

SetKey( K_F10, { || Grava() } )
SetCursor(2)

ALERT( 'LINHA 647    ' + MEMOREAD(CPASTA+'NOTA3.HIS') )     //aqui salvei com outro nome menor nao funcionou
cMemo := ' ' + MEMOREAD(CPASTA+CARQUI)
ALERT( 'LINHA 649    ' + cMemo)                                           //aqui pega o nome real mas nao funciona
cMemo := MemoEdit( cMemo, 5, xc-34, yc+8, xc+34, .F. ,,70 )

EnableMenu(1)

SET KEY K_F10 TO
SetCursor(SvCur)
RestScreen(1,,,,SvScr)

RETURN
se colocar macro em cMemo assim &cMemo da erro sintax, onde estou errando????

abraços
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á

memo X txt

Mensagem por Pablo César »

Você não mostrou o conteúdo de cPasta. Provavelmente esteja faltando a "\" (barra invertida) entre cPasta e o nome do arquivo cArqui.

Outra coisa: depois do seu MEMOEDIT, não vejo rotina alguma para gravação. Depois do MEMOEDIT eu colocaria:

Código: Selecionar todos

SET KEY 27 TO VESI_GRAVA()

cMemo := MEMOEDIT(cMemo, 5, xc-34, yc+8, xc+34, .F. ,,70 )

IF !LASTKEY()=27
   IF LEN(ALLTRIM(cMemo))<4
      IF FILE(cPasta+"\"+cArqui)
         DELETE FILE(cPasta+"\"+cArqui)
      ENDIF
   ELSE
      MEMOWRIT(cPasta+"\"+cArqui,HARDCR(cMemo))
   ENDIF
ENDIF
SET KEY 27 TO

FUNCTION VESI_GRAVA()
IF MODET=.T.
   IF PERGUNTA("Gravar antes de sair ?")="S"
      KBDEMULATE(CHR(23))
   ELSE
      IF LASTKEY()=28
         // HELP()
      ENDIF
      SET KEY 27 TO
      KBDEMULATE(CHR(27))
   ENDIF
ELSE
   SET KEY 27 TO
   KBDEMULATE(CHR(27))
ENDIF
RETURN
A função VESI_GRAVA intersepta o pressionamento do ESC durante o MEMOEDIT para que force a gravação após fazer qualquer alteração do texto. Para o caso dos arquivos ".HIS" você não está precisando editar, talvez apenas exibir. Mas irá precisar para a edição dos arquivos .NOT
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
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

memo X txt

Mensagem por asimoes »

Olá Amparo,

Existe uma alternativa para campos memos que eu postei, veja se atende a sua necessidade.
https://pctoledo.org/forum/viewto ... 43&t=11757


[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
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

memo X txt

Mensagem por Amparo »

ola amigos

alexandre sua rotina é muito interessante vou estudala com carinho, obrigado

pablo
Pablo César escreveu:Você não mostrou o conteúdo de cPasta. Provavelmente esteja faltando a "\" (barra invertida) entre cPasta e o nome do arquivo cArqui.
repare que a variavel cPasta esta declarada no inicio da PROCEDURE HISTORTXT

Código: Selecionar todos

LOCAL CPASTA := UPPER( ALLTRIM( aSystem[ SYS_FILEDIR ] ) )
o elemento aSystem[SYS_FILEDIR] recebe a informação do diretorio de arquivos de usuario configurado no sistema, neste diretorio fica gravado todos os arquivos dos usuarios arquivos em TXT em EXECEL (quando o usuario vai tirar um relatorio pode escolher em TXT ou impressora).

so que eu estou colocando o diretorio para gravar os arquivos *.HIS (HISTORICOS) e *.NOT (NOTAS E OBSERVAÇOES) em um diretorio fixo e esquici de passar esta linha ou seja logo apos declarar estas linha:

Código: Selecionar todos

LOCAL CPASTA := UPPER( ALLTRIM( aSystem[ SYS_FILEDIR ] ) )
LOCAL CARQUI := aLocal[1] + ALLTRIM( STR( ( aLocal[1] )->( RECNO() ) ) ) + ".HIS"
tenho que colocar estas:

Código: Selecionar todos

IF Right( CPASTA, 1 ) <> "\"
   CPASTA += "\HISTORICOS\"
ELSE
   CPASTA += "HISTORICOS\"
ENDIF
agora funcionou.
Pablo César escreveu:Outra coisa: depois do seu MEMOEDIT, não vejo rotina alguma para gravação. Depois do MEMOEDIT eu colocaria:
esta rotina o usuario nao pode alterar, pois ela grava tudo o que ele fez, por isso setei memoedit como .f. para edição, vou fazer a rotina para o arquivo *.NOT e irei usar seu exemplo.

abraços
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

memo X txt

Mensagem por Amparo »

ola amigos

Pablo,

esta eu fazendo alguns testes na montagem dos arquivos é so peguei parte da tabela de CLIENTES e chegou a gerar +- 14.590 geristros, pegunto: o sistema vai ficar lento com tantos arquivos a manipular?, seu sistema trabalha e gera mais ou menos quantos arquivos TXT?

se fiz certo, eu anexei dois arquivos so como exemplo.

abraços
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á

memo X txt

Mensagem por Pablo César »

Visto que praticamente você está precisando criar um arquivo ou até mesmo dois para cada registro, o que pode chegar a saturar a capacidade do diretório de repositório. Mas isso é uma limitação do proprio SO, que no momento não lembro qual seria o número máximo tolerável. Pelo sim pelo não, sugiro você separar em pastas diferentes para os arquivos HIS e os NOT. Além disso também sugiro que armaze em sub-pastas que guardem tais arquivos de 100 em 100 (ou até mesmo de 1000 em 1000), criando assim nomenclaturas diferenciadas.

Exemplo:

cSubPasta:="C:\SISTEMA\NOTAS\N0000001\" // aqui gravaria as notas de 1 a 100
DirMake(cSubPasta)
MemoWrit(cSubPasta+cArqui)
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á

memo X txt

Mensagem por Pablo César »

Amparo, resolveu ? Adiantou a minha dica ?
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.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

memo X txt

Mensagem por alxsts »

Olá!

Também acho que ficaria muito mais fácil criar 2 DBFs, nos moldes que o Simões sugeriu. No layout que ele mostrou, eu apenas acrescentaria 2 campos para armazenar a data e hora da geração do registro e talvez alguns outros para gravar quem incluiu ou alterou cada registro.

Acho que fica mais seguro, apesar de ser DBF. Você permite ao usuário digitar uma linha e a inclui no arquivo. Permite que ele selecione uma linha e altere ou exclua. Com o TXT, quando você abre na Memoedit(), permite que ele altere qualquer coisa.

Além disso, o arquivo poderia ser indexado pela chave desejada.
[]´s
Alexandre Santos (AlxSts)
Responder