Página 3 de 4
Enviado: 22 Set 2007 00:22
por clodoaldomonteiro
Esqueci de dizer, a senha de entrada no sistema é EST e o nome de usuário é SUPERVISOR.
Enviado: 22 Set 2007 07:58
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...
Enviado: 22 Set 2007 14:22
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?.
Enviado: 22 Set 2007 15:32
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.
Enviado: 24 Set 2007 08:02
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
Enviado: 24 Set 2007 08:31
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)
Edição de Texto em arquivos
Enviado: 24 Set 2007 14:47
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.
Enviado: 24 Set 2007 14:50
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
Enviado: 24 Set 2007 14:53
por Rodrigo Reis
acabei de ver agora seu post pablo, vou tentar aqui . .obrigado
Enviado: 24 Set 2007 17:05
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
Enviado: 24 Set 2007 17:39
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.
Enviado: 24 Set 2007 17:59
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?
Enviado: 25 Set 2007 08:08
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.
Enviado: 25 Set 2007 08:37
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...
Enviado: 25 Set 2007 11:41
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 ?