Inserir registro no TBROWSE() posição cursor?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

Esqueci de dizer, a senha de entrada no sistema é EST e o nome de usuário é SUPERVISOR.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

...pelo GASpro que no browse dele pode-se criar duas janelas relacionadas entre si por um campo comum entre dois DBFs, o famoso relacionamento de arquivos. Em cima fica o dbf pai e em baixo o filho. O browse do GAS é muito dinâmico, e quando pressionamos a tecla "J" no browse, ele divide a janela...
Uai, o Clipper também tem o SET RELATION... Aliás, com o Clipper vc pode inverter, colocar o DBF pai em baixo e o filho em cima, ou os dois lado a lado, em cascata... Ainda, vc não fica preso a uma determinada tecla: vc decide, no TBrowse, qual tecla (ou combinação de teclas) usar.

Eu, particulamente, não gosto do SET RELATION. O sistema fica lento. Como teste, pegue dois DBF (pai e filho) meio grandinhos, aperte e segure a 'seta abaixo', no pai, e veja como se comporta a coisa em rede... Ainda, eu acho complicado manejar os Flock() e RLock()s em arquivos relacionados / compartilhados na rede...
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Mensagem por clodoaldomonteiro »

O Eolo escreveu:
Uai, o Clipper também tem o SET RELATION... Aliás, com o Clipper vc pode inverter, colocar o DBF pai em baixo e o filho em cima, ou os dois lado a lado, em cascata... Ainda, vc não fica preso a uma determinada tecla: vc decide, no TBrowse, qual tecla (ou combinação de teclas) usar
... é claro que o clipper faz tudo e muito mais que o GAS faz pois o GAS é 100% clipper, e eu nunca quis dizer que o clipper é pior que o GAS, pois nem caberia essa comparação.

Eu quis dar um exemplo de como poderia fica a consulta em um browser dividido em duas telas, com dois arquivos que não são pai e filho.

Você disso que não gosta do Set Rela, mas tem outra opção de relacionar dois arquivos?.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Eu quis dar um exemplo de como poderia fica a consulta em um browser dividido em duas telas... Você disso que não gosta do Set Rela, mas tem outra opção de relacionar dois arquivos?
Ah, sim. Eu entendi vc dizer que só o GAS fazia... :-)

Sobre o SET RELA, não tem substituto direto (não que eu saiba). O que eu faço, neste caso do tópico, é o seguinte: o usuário navega no tbrowse do PAI.dbf e, quando dá ENTER em um registro, eu bloqueio esse registro, seleciono no FILHO.dbf os registros correspondentes, jogo esses registros em um TEMP.dbf e abro um tbrowse do TEMP. O usuário trabalha (inclui / exclui / altera) no TEMP e, na saída, eu atualizo (se for necessário) o PAI.dbf.
Rodrigo Reis
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 13 Set 2007 13:45
Localização: são paulo

Mensagem por Rodrigo Reis »

Bom dia mestres . .

Agradeço muito pela atenção de todos . . . Realmente, o pessoal aqui ajuda mesmo !!!
Vou começar agora a testar as soluções indicadas . . . Eu entendi a solução dos DBFs, com o truque na tela . . . Entendi tb a solução dos arquivos texto . . No meu caso, acho que a solução dos arquivos texto seria a mais ideal, pois hj no sistema do pessoal eles usam ( sem saber é claro!!! ) o MEMOEDIT e se acostumaram com o CTRL+W pra salvar, e outras coisas . .estão mais familiarizados com ele . . .
Porém, como eu procederia pra utilizar o MEMOEDIT com arquivos texto Pablo ...?
Eu fiz o seguinte agora . . .eu criei arquivos texto da sefuinte forma

nome dos arquivos -> HC -> Abreviação Histórico Cliente
00001 -> Campo numérico do código do cliente

Fiz isso , incluindo nesses 7121 arquivos o conteúdo do campo memo de cada código. Ex: Existia um campo memo HCCLI , e percorri cada registro do DBF, jogando o conteúdo do MEMO no arquivo TXT e utilizando o código do cliente no registro pra formar o nome do arquivo texto

Como procedo agora para editar esses arquivos com o MEMOEDIT ...
A linha do memoedit era assim:
MEMOEDIT(HCCLI,11,02,21,77,.t.,'HIST',79)
Obrigado

Rodrigo Reis
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Rodrigo,

Embora tenha 'MEMO' no nome, a função MEMOEDIT() edita variáveis também... Use MEMOREAD() para jogar o conteúdo do arquivo em uma variável e depois MEMOEDIT() para editá-la. Na saída, use MEMOWRIT() para atualizar o arquivo com as alterações feitas.

Código: Selecionar todos

var=memoread("c:\pasta\arq12345.txt")
memoedit(var)
memowrit("c:\pasta\arq12345.txt",var)
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á

Edição de Texto em arquivos

Mensagem por Pablo César »

Ok, Rodrigo fico feliz de saber que você conta (como muitos de nós) ajuda da mais variada do nobres colegas. E fico contente saber da sua opção tenha sido com o MEMOEDIT. Quando falamos de MEMOEDIT, na verdade aliamos todas as funções de edição e manipulação que o Clipper tem para auxilio de edição de TEXTOS.

MEMOREAD()
MEMOEDIT()
MEMOWRIT()
MEMOLINE()
MLCOUNT()
MLPOS()
Rodrigo Reis escreveu:Fiz isso , incluindo nesses 7121 arquivos o conteúdo do campo memo de cada código. Ex: Existia um campo memo HCCLI , e percorri cada registro do DBF, jogando o conteúdo do MEMO no arquivo TXT e utilizando o código do cliente no registro pra formar o nome do arquivo texto
Aqui você ja deu o primeiro passo e foi por conta própria. Isto é, converter todos os campos MEMO para arquivos independente composto pelo nome do arquivo com o código do cliente. Perfeito !.

Para edição, assim como explicou o colega Eolo, é justamente essa sequência que você deve dar. Para ser mais detalhado então faça:

1. Colocar em variavel o local onde você quer guardar os arquivos (assim não fica tudo misturado). Exemplo:

VDIR:=DIRNAME()+"\OBS"

2. Compor o nome do arquivo texto que como você mencionou é composto pela string "HC"+STRZERO(COD_CLI,5,0)+".TXT". Exemplo:

VARQUIVO:=VDIR+""+"HC"+STRZERO(COD_CLI,5,0)+".TXT"

3. Para edição basta saber qual é o código do cliente. Exemplo:

Código: Selecionar todos

VARQUIVO:=VDIR+""+"HC"+STRZERO(COD_CLI,5,0)+".TXT"
IF FILE(VARQUIVO) // Imagino que não todo cliente tem uma observação
   VOBS:=""
ELSE
   VOBS:=MEMOREAD(VARQUIVO)
ENDIF
SET KEY 27 TO VESI_GRAVA() // Serve para perguntar ao usuario de gravar
XOBS:=MEMOEDIT(TEXTO,04,04,18,75,.T.,"CONTROL",70)
IF !LASTKEY()=27
    IF LEN(ALLTRIM(XOBS))<4 // Tamanho minimo para gravar (se quiser)
        IF FILE(VARQUIVO)
            DELETE FILE(VARQUIVO)
         ENDIF
    ELSE
         MEMOWRIT(VARQUIVO,XOBS)
    ENDIF
ENDIF
SET KEY 27 TO

FUNCTION CONTROL(MODO,LINHA,COLUNA)
PUBLIC INS_MUDA,MODET
IF MODO=ME_INIT
   INS_MUDA=.F.
   MODET=.F.
   KSETINS(.F.)
   SETCURSOR(1)
ENDIF
IF MODO=0
   @ 19,40 SAY " Linha: "+STRZERO(LINHA,3,0)+" " COLOR CONTECOR[12]
   @ 19,53 SAY " Coluna: "+STRZERO(COLUNA,3,0)+" " COLOR CONTECOR[12]
   QTECLA:=LASTKEY()
   IF !(QTECLA=27)
      IF QTECLA=7 .OR. QTECLA=8 .OR. QTECLA=9 .OR. QTECLA=13 .OR. QTECLA=127 .OR. (QTECLA>32 .AND. QTECLA<255)
         MODET=.T.
      ENDIF
   ENDIF
ENDIF
IF KSETINS()
   SETCURSOR(3)
ELSE
   SETCURSOR(1)
ENDIF
IF INS_MUDA=.T.  // Acerta o Ins
   READINSERT(.T.)
   INS_MUDA=.F.
ENDIF
RETURN 0

FUNCTION VESI_GRAVA()
IF MODET=.T.
   IF PERGUNTA("Gravar antes de sair ?",,"Aten‡„o")="S"
       KBDEMULATE(CHR(23))
   ELSE
       SET KEY 27 TO
       KBDEMULATE(CHR(27))
   ENDIF
ELSE
   SET KEY 27 TO
   KBDEMULATE(CHR(27))
ENDIF
RETURN
Você vai ver que não vai se arrepender da sua decisão para esta questão de observações. Na minha opinião foi uma decisão muito acertada. Claro que com muita paciência e dedicação você poderia colocar emprática diversas formas. Ao fim das contas TODOS os caminhos levam a ROMA.
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.
Rodrigo Reis
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 13 Set 2007 13:45
Localização: são paulo

Mensagem por Rodrigo Reis »

criei um string com o nome do arquivo txt . . .

variavel = str(codigo)+".txt"

ai . .
variavel2 = memoread(variavel)
memoedit(variavel2,11,02,21,77,.t.,'funcao',79)
memowrit(variavel,variavel2)

Não ta dando certo, onde está meu erro?

Obrigado
Rodrigo Reis
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 13 Set 2007 13:45
Localização: são paulo

Mensagem por Rodrigo Reis »

acabei de ver agora seu post pablo, vou tentar aqui . .obrigado
Rodrigo Reis
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 13 Set 2007 13:45
Localização: são paulo

Mensagem por Rodrigo Reis »

Boa tarde novamente mestres . . .

Bem, como não podia deixar de ser, a implementação dos txts , substituindo os dbfs que existiam no sistema ( dbfs estes que foram substitutos dos MEMOs ) deu absolutamente certo . . .
Estou guardando os nomes dos arquivos em uma variavel, chamo o memoread, depois memoedit e depois memowrit . .tudo ok . . .

Restam algumas pequenas duvidas . . .
Existe um relatorio nesse sistema que usa o MLCOUNT() pra contar as linhas dos MEMOs na época, e tb usa o MEMOLINE pra imprimir as linhas . . .
A utilização dos dois muda quando se trata de arquivos TXT ??? Como fica a utilização deles . . .?

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

Mensagem por Pablo César »

A utilização dos dois muda quando se trata de arquivos TXT ??? Como fica a utilização deles . . .?
É absolutamente IGUAL. O importante é você limitar a edição com MEMOEDIT, veja que o oitavo parametro refere-se a largura por linha do seu MEMOEDIT e esse mesmo valor tem que ser para MLCOUNT. E lembre de inserir a variavel que compõe o nome do arquivo TXT para cada registro da mesma forma que eu indiquei.

Percebeu que a composição do nome do arquivo é usada a função STRZERO() e NÃO a STR(). Simplesmente não podem haver ESPAÇOS no nome de arquivos. era por isso que não dava certo. Depois nos diga se o seu relatorio está OK como previsto.
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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

Rodrigo, se não me engano o MEMOREAD() só aguenta até 64k (65.535 caracteres). Embora isto seja 'bastante', talvez vc devesse testar o tamanho do TXT antes de ler...

Também, eu não sei como fazer para testar 'depois', ou seja: se eu abrir um TXT com 65.500 caracteres (permitido) e incluir mais 100 caracteres na edição, o que acontece? Run time error?
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á

Mensagem por Pablo César »

Eolo escreveu:se não me engano o MEMOREAD() só aguenta até 64k (65.535 caracteres). Embora isto seja 'bastante', talvez vc devesse testar o tamanho do TXT antes de ler...
De fato o MEMOREAD/MEMOEDIT como eu também ja disse tem limite de 64K. Se bem que eu nunca precisei usar a outra função que não limita o tamanho agora eu acho que o programador deve saber se os textos são grandes ou pequenos através do usuário. Outra coisa que poderia ser feito é verificar o tamanho do arquivo se excede os 64K ou se está próximo a esse tamanho, bastaria utilizar a função FILESIZE() da CT.LIB e se for maior que 64k utilizar a seguinte rotina:

exemplo p/edição acima de 64k

Mas não sei qual seria o erro teria que ser feito um exemplo ou alguem reportar qual é o erro que dá ao atingir 64k. Também acho que se houver dúvidas... pelo sim pelo não então não utilize o MEMOEDIT/MEMOREAD/MEMOWRIT e utilize a õutra função exemplo. Mas a decisão de edição de texto nesse caso do colega (na minha opinião) é a melhor opção.
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
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Mensagem por Eolo »

...verificar o tamanho do arquivo se excede os 64K ou se está próximo a esse tamanho, bastaria utilizar a função FILESIZE() da CT.LIB...
Verificar o tamanho antes da edição não resolve. Tinha que examinar era DURANTE a edição. É como o Maligno costuma dizer: o Mr. Murphy está sempre rondando a área... :-)

...e se for maior que 64k utilizar a seguinte rotina: exemplo p/edição acima de 64k...
Dei uma olhada rápida no link, parece que a função sugerida é só pra "visualizar" e não pra editar o arquivo...

Mas, como ela usa o Tbrowse() sugerido, eu acho que fica fácil: a cada tecla digitada (exceto as de movimento), é só checar o tamanho do arquivo. Se chegar nos 64k, a função refuga a entrada e alerta o usuário...
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á

Mensagem por Pablo César »

Caro Eolo, vale esclarecer antes de tudo que na maioria das vezes não há tanta necessidade de preocupar-se com os 64k de edição pelo MEMOEDIT. Sabemos que muitas vezes não atinge (eu mesmo nunca passei nem meu clientes ultrapassaram). Tudo depende como é disonibilizados os dados para o usuário. Por exemplo, se no seu cadastro de clientes, não tiver um campo BAIRRO, CELULAR, EMAIL (por exemplo), daí o usuário vai escrever todas essas informações TUDO num lugar só (neste caso irá ser feito no arquivo texto). Olha que não é isso que eu estou sugerindo (de substituir a edição TXT pelos dados separados). Acho que cada informação DEVE ser armazenada devidamente separada por campos diferentes.
de todas formas, a sua indagação é válida para casos excepcionais acima de 64k, certo ?.
Eolo escreveu:Verificar o tamanho antes da edição não resolve.
Tão somente antes da edição não resolve, mas é essencial saber antes.
Tinha que examinar era DURANTE a edição.
Sim, é também válido e necessário principalmente quando temos em mente que tais observações de clientes possam exceder de 64K (65.535 caracteres, como você mesmo disse).
Dei uma olhada rápida no link, parece que a função sugerida é só pra "visualizar" e não pra editar o arquivo...
Tens razão colega, só exibe não dá para alterar. Mas então pessamos ajuda aos "universitários" (hihihi), na verdade eu não tenho tanta intimidade com as funções de baixo nível como FOPEN/FWRITE/HANDLE, ect... então quem sabe o colega "digitom" ou até mesmo o Maligno (coitado, sempre sobra pra ele) poderia fazer mais uma função na hora de inserção de linha ou inserção de string e possa ser incorporado no exemplo indicado ????
checar o tamanho do arquivo. Se chegar nos 64k, a função refuga a entrada e alerta o usuário...
Eu seria mais da idéia não de dar alerta somente, pegar esse 64k lidos e sair gravándo aquela string de 64k e depois dar a mensagem que precisa ser feito em outra etapa o resto. porque pode ser interrompido a hora que quiser a edição de dentro do MEMOEDIT, certo ?
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