Inserir registro no TBROWSE() posição cursor?
Moderador: Moderadores
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
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....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...
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...
- clodoaldomonteiro
- Usuário Nível 4

- Mensagens: 821
- Registrado em: 30 Dez 2006 13:17
- Localização: Teresina-PI
- Contato:
O Eolo escreveu:
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?.
... é 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.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 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
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Ah, sim. Eu entendi vc dizer que só o GAS fazia...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?
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

- Mensagens: 14
- Registrado em: 13 Set 2007 13:45
- Localização: são paulo
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
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
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.
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)- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Edição de Texto em arquivos
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()
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:
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.
MEMOREAD()
MEMOEDIT()
MEMOWRIT()
MEMOLINE()
MLCOUNT()
MLPOS()
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 !.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
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
RETURNUm 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.
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

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

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

- Mensagens: 14
- Registrado em: 13 Set 2007 13:45
- Localização: são paulo
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
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
Obrigado
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
É 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.A utilização dos dois muda quando se trata de arquivos TXTComo fica a utilização deles . . .?
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.
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, 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?
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?
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
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: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...
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.
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.
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......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...
Dei uma olhada rápida no link, parece que a função sugerida é só pra "visualizar" e não pra editar o arquivo......e se for maior que 64k utilizar a seguinte rotina: exemplo p/edição acima de 64k...
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...
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
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 ?.
?
de todas formas, a sua indagação é válida para casos excepcionais acima de 64k, certo ?.
Tão somente antes da edição não resolve, mas é essencial saber antes.Eolo escreveu:Verificar o tamanho antes da edição não resolve.
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).Tinha que examinar era DURANTE a edição.
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 indicadoDei uma olhada rápida no link, parece que a função sugerida é só pra "visualizar" e não pra editar o arquivo...
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 ?checar o tamanho do arquivo. Se chegar nos 64k, a função refuga a entrada e alerta o usuário...
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.
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.
