Atualização de campos memo

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
moraes
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 21 Jan 2006 23:24

Atualização de campos memo

Mensagem por moraes »

Preciso atualizar constantemente um campo memo. Ocorre que não estou conseguindo gravar linha a linha, ou seja, como se após a digitação teclassemos ENTER para uma nova linha. Existe como faze-lo automaticamente para que cada movimentação se inicie na linha inferior.
Avatar do usuário
rrfsistemas
Usuário Nível 3
Usuário Nível 3
Mensagens: 249
Registrado em: 11 Jul 2004 18:16
Localização: Uberlândia/MG

Mensagem por rrfsistemas »

Já tetou colocar um chr(13) no final do texto ?
"Não é a ferramenta que faz o artesão e sim a sua criatividade...""
Renato Ribeiro Ferreira
Tecnologia em Analise de Sistemas de Informação
http://www.rrfsistemas.hd1.com.br
( VFP 9 + MySql e/ou Oracle 11 ) - ...Harbour/MiniGui...
Avatar do usuário
moraes
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 21 Jan 2006 23:24

Mensagem por moraes »

Não funciona. Este procedimento do CHR(13) acrescenta um caracter no final mas não força a troca de linha.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Para manipular campos MEMO voce tera de fazer uso da função MEMOEDIT().

Procure neste link por FIVEDOC e baixe-o, tem algumas apostilas, inclusive uma de clipper.

Veja mais informações sobre sua sintaxe neste site aqui tem vários tutoriais.

De uma olhada neste tópico aqui e neste aqui.

@braços :?)
Avatar do usuário
moraes
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 21 Jan 2006 23:24

Mensagem por moraes »

Utilizo a função memoedit() para entrar com dados via teclado (edit) e para ler (read) o arquivo memo. Neste caso desejo atualizar o arquivo memo através de uma variável chamada whistory sem uso de edição via teclado. Verificando nos manuais não encontrei uma forma de faze-lo com a aplicação de memoedit(). Meu campo memo chama-se HISTORY.

// atualiza o campo memo inserindo o valor da variavel whistory
whistory := ' Acesso em ' + DTOC(DATE()
REPLACE FIELD->HISTORY WITH (FIELD->HISTORY + whistory)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Talvez eu tenha entendido mal, achei que precisava apenas editar, mas para salvar o conteudo de uma campo MEMO não existe segredo, é só dar um REPLACE da variavel no campo e pronto.

Quanto a edição do campo, ai é outra coisa, voce não edita como se fosse um GET normal, tera de sacar de alguma técnica, exemplo:

Voce tem um campo MEMO de nome OBS, eu faço assim:

M->ME_MO := "[OBS]" // Inicializo a variavel assim

Edito o MEMO em modo GET assim:
...
@ 14, 35 GET ME_MO PICT "9memo]" VALID EDITOR2( 14, 35, @OBS, "Informacoes Tecnicas" ) WHEN SAYIT( 'Digite um as INFORMACOES TECNICAS para a descricao.' )

Codigo da função EDITOR2

Código: Selecionar todos

#include "INKEY.CH"

FUNCTION EDITOR2
PARA M_LIN, M_COL, ME_VAR, ME_COM, ALTE_RA
IF ALTE_RA = NIL
   ALTE_RA := .T.
ENDIF
M_LARG := 40
IF M->ME_MO != "[OBS]"
   M->ME_MO := "[OBS]"
   RETURN .F.
ENDIF
IF LASTKEY() = T_ENTER .OR. !ALTE_RA
   SAVE SCREEN TO TELA
   MOUSE( DESLIGA )
   SAVE SCREEN TO M->T_ELA
   MOUSE( LIGA )
   MENSAGEM( "Tecle <CTRL-W> para finalizar a edicao" )
   COR( "JANELA DE DIALOGO" )
   IF (M_LIN+1+8) > MAXROW()
      M_LIN  := M_LIN-11
   ENDIF
   IF (M_COL+M_LARG+1) > MAXCOL()
      M_COL  := MAXCOL()-(M_LARG+2)
   ENDIF
   TA_MA_NHO := 7
   @ M_LIN+1,M_COL CLEAR TO M_LIN+2+TA_MA_NHO,M_COL+M_LARG+1
   @ M_LIN+1,M_COL       TO M_LIN+2+TA_MA_NHO,M_COL+M_LARG+1
   ME_VAR = MEMOEDIT( ME_VAR, M_LIN+2,M_COL+1,M_LIN+1+TA_MA_NHO,M_COL+M_LARG, ALTE_RA, "FUNMEMO2" )
   RESTORE SCREEN FROM M->T_ELA
   COR( "GETS" )
   RESTORE SCREEN FROM TELA
ENDIF
RETURN .T.

FUNCTION FUNMEMO2( MODO, LINHA, COLUNA )
IF LASTKEY() = T_TAB .AND. ALTE_RA
   IF .NOT. EMPTY( ME_VAR )
      KEYBOARD CHR(T_CTRL_W)
   ENDIF
ENDIF
RETURN 0

FUNCTION MENSAGEM( MSG )
   @ 24,0 SAY MSG

FUNCTION SAYIT( MSG )
   @ 24,0 SAY MSG
Desta forma ao editar o conteudo do campo MEMO o MEMOEDIT() permitira que voce digite até 64k de dados e o conteudo será salvo no campo MEMO basta dar um REPLACE da variavel que voce passou no EDITOR2.

Preste atenção a picture 9memo] que deve ser usada sempre com campos MEMO.

Beleza?

@braços :?)
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

A quebra de linha é controlada pela função MemoTran(), onde você pode especificar extamente qual será o caracter que inidicará a quebra de linhas, útil para importação ( colocando * ou ; para indicar final da linha) por exemplo.

Bom, isso é bobeira...

No caso padrão a quebra de linhas se dá pelo CHR(10), por exemplo, digamos que no campo temos: "Stanis", aí vai:

Memowrit( campo, memoRead( campo ) + chr(10) + "Luksys" )

Prontinho, no campo vc terá:

Stanis
Luksys

É só isso mesmo...
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
moraes
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 21 Jan 2006 23:24

Até agora nada funcionou !

Mensagem por moraes »

:( Pessoal ! Até o momento nada do que foi sugerido funcionou ! Não desejo criar um arquivo externo com o memowrit(). Possuo um campo memo em arquivo dfb e quero atualiza-lo constantetemente inserindo nele o valor de uma variável. Ocorre que a cada atualização as informações vão sendo escritas na mesma linha e eu desejo que sejam escritas linha a linha. A função memotran() também não funcionou.

Aguardo o precioso auxilio da comunidade...
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Aqui no meu Clipper 5.2e e no Clipper 5.3b o chr(10) funiona perfeitaente para este fim... Qual a versão do seu Clipper amigo?
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Caro Moraes,
um campo memo nada mais é do que um lonnnnnngo campo carctere (64 k).
As funções descritas anteriormente servem para você trabalhar esse campo memo.

Você pode formatá-lo como desejar, bem como incluir, editar e excluir informações.

Digite a palavra memo no formulário de pesquisa do forum e veja mais informações e exemplos.


Imagine o campo memo com a seguinte informação:

cMemo="abcdabcdabcdabcdabcd"

Você pode formatá-lo para x linhas com quatro caracteres (ou o tamanho da sua variável)

nLinhas:=MLCOUNT(cMemo,4)

FOR i=1 TO nLinha
? MEMOLINE(cMemo,4,i)
NEXT i

Você verá na tela:

abcd
abcd
abcd
abcd
abcd

Se fizer assim:

cMemo=cMemo+"que coisa em cara"

E repetir o procedimento, você verá na tela:

abcd
abcd
abcd
abcd
abcd
que
cois
a em
cara

Espero ter ajudado.

PS: É lógico que, conforme a situação, você deve tratar as informações obtidas com memoline de modo a conseguir o que você precisa.
Também, pode usar os CR´s indicados.
Avatar do usuário
moraes
Usuário Nível 1
Usuário Nível 1
Mensagens: 7
Registrado em: 21 Jan 2006 23:24

Re: Atualização de campos memo

Mensagem por moraes »

Permaneço tentanto resolver esta pendencia !
O exemplo de Marcelo não atende , vejamos:
Imagine que voce tem um campo memo chamado historico no qual voce quer registrar toda acao do usuario no sistema. Cada vez que o usuario confirma uma ação voce grava no campo historico, exemplo:
15/10/2009 - Fulano : entrada 15 pecas
16/10/2009 - Beltrano : retirou 12 pecas
16/10/2009 - Fulano : entrada de 3 peças em consignacao

Observe que os comprimentos das strings são diferentes para cada ação. Esta informação é inserida automaticamente pelo programa. O usuario nao tem acesso a editar, somente visualizar. Quando vc edita o campo memo voce dá um Enter e ele troca de linha e pronto. Atualmente o sistema mostra o seguinte na tela de consulta (sem trocar de linha na tela até o tamanho máximo da janela):

15/10/2009 - Fulano : entrada 15 pecas16/10/2009 - Beltrano : retirou 12 pecas16/10/2009 - Fulano : entrada de 3 peças em consignacao

Tentei inserir CHR(13) e CHR(141) ao final de cada string e nada funciona.
Eis novamente a linha de comando de gravação do campo memo:
REPLACE FIELD->OS_HISTORY WITH FIELD->OS_HISTORY + whistory + CHR(13) onde,
OS_HISTORY é o campo memo do DBF
whistory é a variavel que contem a string referente a última ação do usuário.

Utilizo a seguinte linha de comando para visualizar o campo OS_HISTORY na tela:
MEMOEDIT(M->OS_HISTORY,11,01,22,78,.F.)

Agradeço pela ajuda.

Moraes
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á

Atualização de campos memo

Mensagem por Pablo César »

Oi Moraes, considerando desde o tempo que você está precisando fazer um histórico com linhas de tamanhos irregulares e a impossibilidade fazer isso em campo memo, vou tentar ajudar-lhe. Digo impossibilidade conforme seu relato, não que eu tenha passado por essa experiência. Ora porque campos memos, na minha opinião não deveriam existir dentro (ou atribulado ao dbf). Eu tive experiências ruins a respeito de campos memos, os arquivos dbt são fáceis de fragmentar. Eu abolí de vez, quando em vez de: usar campo memo eu passei a usar um arquivo para cada registro (para cada registro em termos, sabemos que as vezes os registros não necessáriamente devam ter algo escrito). Eu acredito que você pode fazer isso tranquilamente gravando em arquivos em baixo nível e tendo como nomenclatura dos arquivos alguma referência ou campo chave de cada registro. Geralmente, para cada cliente existe um numero cadastral e sequêncial. Acho que para esse caso de vendas, deve haver um campo que represente o número da venda. Se for assim, tá fácil de implementar. Digamos por exemplo:

Venda 00001, tem que ser feito um histórico. Então o nome desse arquivo passaria a ser "VEN"+STRZERO(VENDA,5,0)+".LOG". A nomenclatura de cada arquivo deverá respeitar um padrão. Comecei com "VEN" mas pode dar qualquer designação que quiser mas que comece com caracter alfa, não pode ser numérico. E o tamanho do nome do arquivo deverá respeitar o padrão 8x3 (até oito caracters e extensão até 3 dígitos) para que em DOS o CLIPPER possa abrir sem problemas, não utilize nomes longos. Apesar que daria também pra usá-los mas daí iria precisar de biblioteca adicional.

Eu passaria todos os registros que contenham determinado tamanho, isto é, que tenha algo escrito no memo e gravaria em arquivos com a nomenclatura mencionada. MAs gravaria numa sub-pasta para que não enchesse o diretório onde o sistema se encontra e eliminaria o campo memo do DBF.

Se quiser saber mais sobre esse procedimento de substituição de campos memos, veja este tópicos:

viewtopic.php?f=1&t=6000&p=26231&hilit=campo+memo#p26231
viewtopic.php?f=1&t=4398&p=17334#p17337
viewtopic.php?f=1&t=8030&p=44897&hilit=campo+memo#p44897
viewtopic.php?f=1&t=9483&p=53798&hilit=campo+memo#p53798
viewtopic.php?f=1&t=4497&p=17899&hilit=campo+memo#p17899

E neste tópico tem como utilizar a visualização em baixo nível:
viewtopic.php?t=3954&highlight=editor+texto

Agora para gravar os arquivos em baixo nível, você substituiria onde você utiliza: "REPLACE FIELD->OS_HISTORY WITH FIELD->OS_HISTORY + whistory + CHR(13)" pelas funções de baixo níveis como a FWRITE(), FOPEN(), FSEEK() E FCLOSE(). Mas daí poste as suas dúvidas que iremos lhe atender. Mas faça um teste com as funções MEMOWRIT que talvez resolva.
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