Página 1 de 1

Campo Memo

Enviado: 27 Jul 2010 13:28
por Josmar dos Santos
Boa tarde a todos, gostaria de saber se o xHarbour trabalha também com o campo "Memo" e se trabalha, gostaria também de obter unformações se alguem ao migrar algum sistema do Clipper para o mesmo, tiveram algum problema. Isso porque comigo no Clipper sempre rodou bem, mas ao migrar para o xHarbour, estou tendo problemas, pois, não está gravando as informações !e não foi alterado nada. Do jeito que veio, foi linkado pelo hbmake...

Obrigado a todos

:D

Re: Campo Memo

Enviado: 27 Jul 2010 14:30
por alxsts
Olá!

Os campos Memo independem do compilador. Estão diretamente ligados ao RDD ativo. Se no Clipper você utilizava DBFNTX e no Harbour está usando DBFCDX, vai dar problema. Teria que converter os arquivos .DBT para os do DBFCDX. Não sei se é o caso, é só um exemplo...

Re: Campo Memo

Enviado: 27 Jul 2010 15:08
por Josmar dos Santos
Ola alxsts, eu uso DBFNTX do jeito que veio do Clipper 5.2....

Josmar

Campo Memo

Enviado: 28 Jul 2010 14:59
por Pablo César
Josmar, por quê não tenta substituir o campo memo do DBF por arquivos .TXT ? Eu ja tive problemas com BD por causa do campo memo. Veja neste tópico como faço: viewtopic.php?f=1&t=4398#p17337

Re: Campo Memo

Enviado: 28 Jul 2010 22:59
por Itamar M. Lins Jr.
Ola!
No harbour uso campo memo, convertido do DBT->FPT sem problemas no Harbour, tanto faz no linux ou windows.

Saudações,
Itamar M. Lins Jr.

Re: Campo Memo

Enviado: 29 Jul 2010 02:27
por Josmar dos Santos
Ola Itamar, FPT faz parte do CDX creio eu, no entanto eu uso NTX em meus arquivos. Ja tentei colocar cdx no meu sistema, mas não deu muito certo, teria q mudar toda a estrutura do sistema. Até consegui aplicar o cdx em meu aplicativo, mas quando chegou na hora de gerar o código automático, aí enroscou ! Não consegui mudar essa estrutura. E uma observação, o campo do código automático é caracter. Agora se vc tiver um pequeno programinha que rode em rede com cdx e que gere código automático após o cadastro, eu agradeceria muito se vc me enviasse, nem q seja so de um cadastro para ver como funciona, É claro se não for encomodo !

Pablo, em uma ocasião atraz eu tive um problema com campo memo estourado e vc ja tinha me dado um toque sobre esse assunto de mudar o campo memo para txt...mas consegui driblar esse problema com um programinha que encontrei aqui mesmo no fórum que te confesso nem me lembro mais qual era ! agora eu te pergunto: será que vale a pena mudar para ntx um programa que ja tem 14 anos com milhares de registros . Eu concordo q seria uma ótima opção, mas o usuário está tão abtuado com essa situação. Mas é claro q quero aprender, até porque ntx são arquivos mais versátil e seguro. Agora, vamos supor q eu mude para ntx, e os aquivos ja registrados no memo, tem como transferí-los nesse novo procedimento ???
E os colegas não estranhe o horário em q enviei essa mensagem, é que chego tarde do serviço .

sem mais ...josmar

Obrigado

:xau

Re: Campo Memo

Enviado: 29 Jul 2010 08:46
por Itamar M. Lins Jr.
...enroscou ! Não consegui mudar essa estrutura. E uma observação, o campo do código automático é caracter. Agora se vc tiver um pequeno programinha que rode em rede com cdx e que gere código automático após o cadastro, eu agradeceria muito se vc me enviasse, nem q seja so de um cadastro para ver como funciona, É claro se não for encomodo !
Meus programas funcionam em rede iguais ao de qualquer um aqui do forum que usa [x]Harbour.
Agora não entendi que código automático é esse?
Pelo que sei mudar de NTX para CDX é muito simples.
E converter DBT para FPT é mais fácil ainda basta um append.

Saudações,
Itamar M. Lins Jr.

Re: Campo Memo

Enviado: 29 Jul 2010 09:54
por alaminojunior
Itamar M. Lins Jr. escreveu:E converter DBT para FPT é mais fácil ainda basta um append.
Pegou na veia essa. De repente o problema está aí.
As tabelas usadas no Clipper são, se não engano, do DBase III. No xHarbour é DBASE IV.
Talvez uma conversão (cópia com append) de todas as tabelas resolva.

Outra coisa Josmar, como você faz para pegar/ler o conteúdo do campo memo ?

Re: Campo Memo

Enviado: 29 Jul 2010 13:38
por Josmar dos Santos
Boa tarde Itamar, desconsidere o assunto sobre o código automático, depois eu vejo isso. Mas se vc puder me colocar uma rotina aqui mesmo no forum de como indexar através do cdx em rede...agradeceria muito, mas se não puder, agradeço do mesmo jeito, só o fato de vc estar aqui expondo as suas idéias é mais do q suficiente !


Josmar
:xau

Re: Campo Memo

Enviado: 29 Jul 2010 18:55
por Itamar M. Lins Jr.
Ola!
Fragmentos de códigos usados aqui por mim.
Com esses exemplos podemos indexar, importar, modificar as estruturas em tempo de execução, inclusive em rede.
De quebra algumas ideias usando o LetoDB.

Saudações,
Itamar M. Lins Jr.

Código: Selecionar todos

#include "ord.ch"
#include "hwgui.ch"
#include "rddleto.ch"
REQUEST HB_GT_GUI_DEFAULT
REQUEST HB_GT_WIN
REQUEST DBFCDX,DBFFPT,DBFDBT,LETO
REQUEST HB_LANG_PT,HB_CODEPAGE_PTISO,HB_CODEPAGE_PT850
*---------------------------------------------------------------------------------------
Function Main
*---------------------------------------------------------------------------------------

RDDSetDefault("DBFCDX")
set autopen on
set optimize on
Chk_DBF()
Check_indices()

**********************
Function check_indices
**********************
*
*
ordena_grupos()


****************
Function chk_dbf
****************
*
*
Private DRIVER := iif(lRddLeto,'LETO','DBFCDX')

CriaStruGrupos()

***********************
Function CriaStruGrupos // Grupos
***********************
*
*
aStru := EstruturaGrupos()
If lRddLeto

Else
   If !file(dDados+'grupos.dbf')
       rodape(oDlg,1,'Criando Estrutura grupos.dbf')
       dbcreate(dDados+'grupos.dbf',astru,DRIVER)
   Else
       ChecaEstrutura("grupos.dbf",astru)
   EndIf
EndIf


************************
Function EstruturaGrupos
************************
*
*
Return   {{'cod_grupo','c',06,0},;
          {'grupo'    ,'c',25,0},;
          {'tipo'     ,'c',01,0},;
          {'diamod'   ,'d',08,0},;
          {'digital'  ,'c',01,0},;
          {"enviado"  ,"l",01,0}}

**********************
Function ordena_grupos
**********************
*
If !file(dDados+"grupos.cdx")
  AbreDb('grupos.dbf','gr',.f.)
  nIni:=1; tReg:=gr->(RecCount())
  @ 10,10 say "Criando Indices dos Grupos -- Total: "+transf(treg,'999,999,999') of oDlg size 400,30
  index on cod_grupo tag gr01 to grupos.cdx  eval {||oBar:Set(,Recno()),.t.}
  index on grupo     tag gr02 to grupos.cdx  eval {||oBar:Set(,Recno()),.t.}
  close gr
EndIf

*****************************
Function AbreDb(db,Apel,lMod)
*****************************
*
*
lRet := .t.
if select(apel) > 0
   FechaDb(apel)
endif

if lMod

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
       If lRddLeto
           If Leto_File(dServidor+Db)
            DbUseArea(.t.,"LETO",dServidor+DB,apel,.T.,.F.,'PTISO')
           Else
              MsgStop('Arquivo Não Foi Localizado: '+dServidor+Db)
              lRet := .f.
           EndIf
       Else
           DbUseArea(.t.,'DBFCDX',dDados+db,apel,.T.,.F.,'PTISO')
       EndIf
     //use ( dDados+Db ) New Alias apel SHARED
   Recover
     msginfo('Erro, abrindo Arquivo: '+dDados+Db+' Compartilhado')
     lRet := .f.
   End Sequence

   if Neterr()
     MsgInfo('Usado de Forma Exclusiva, Em Outro Lugar.')
     lRet := .f.
   endif

else

   BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
        If lRddLeto
           If Leto_File(dServidor+Db)
            DbUseArea(.t.,"LETO",dServidor+DB,apel,.F.,.F.,'PTISO')
           Else
              MsgStop('Arquivo Não Foi Localizado: '+dServidor+Db)
              lRet := .f.
           EndIf
      Else
         DbUseArea(.t.,'DBFCDX',dDados+db,apel,.F.,.F.,'PTISO')
      EndIf
   Recover
      msginfo('Erro, abrindo Arquivo: '+dDados+Db,'Exclusivo')
      lRet := .f.
   End Sequence

    if Neterr()
       MsgInfo('Arquivo Aberto, Em Outro Lugar.')
       lRet := .f.
    endif

EndIf

If lRet
   If lRddLeto
      cFileCDX := dServidor+strtran(db,"dbf","cdx")
      //cFIleCDX := strtran(db,"\","/")

      If Leto_file(cFileCDX)
          OrdSetFocus(1) //Set Index to &cFileCDX
      Else
         // Msginfo('Sem Indice: '+cFileCDX)
      EndIf
   Else
       ind := dDados+substr(db,1,at('.',db))+'cdx'
       if file(ind)
         set index to &ind
       endif
   EndIf
EndIf

Return lRet

*********************************************
Function ChecaEstrutura(cDbf,aStruAtual,dAno)
*********************************************
*
*
local lMudou := .f.,   barra := iif (lLinux,"/","\")

dbt := substr(cDbf,1,at(".",cDbf))+'dbt'

if dAno == Nil
else
  cDbf := dAno+barra+cDbf
endif

While !AbreDb(cDbf,"dbchk",.T.) ;  Enddo

aStruAnt := dbStruct()
if Len(aStruAnt) != Len(aStruAtual)
    lMudou := .t.
else
    for nCont := 1 to Len(aStruAtual) // Compara cada campo
        for nCont2 := 1 to 4 // Compara nome, tipo, tamanho e decimais
            if nCont2 <= 2
                aStruAtual[nCont,nCont2] := upper(aStruAtual[nCont,nCont2])
            endif
            If aStruAtual[nCont,nCont2] == aStruAnt[nCont,nCont2]
            Else

               //MsgInfo('mudou: '+cDbf+" -- "+aStruAtual[nCont,nCont2]+" <> "+aStruAnt[nCont,nCont2])
               lMudou := .t.
               exit
            endif
        next
        if lMudou // Achou diferença já encerra
          exit
        endif
    next
endif

DbChk->(DbCloseArea())

if lMudou
   cdx  := substr(cDbf,1,at(".",cDbf))+'cdx'
   arq  := substr(cDbf,rat("\",cDbf)+1,len(cDbf) ) // )+'dbf'
   //msginfo(arq)

   nDir := substr(cDbf,1,rat("\",cDbf))

   If lRddLeto
      if len(nDir) > 0
         nDir := dServidor+nDir
      else
         nDir := dServidor
      endif
   Else
      if len(nDir) > 0
         nDir := dDados+nDir
      else
         nDir := dDados
      endif
   EndIf

   //msginfo('ndir:'+nDir)
   If lRddLeto
      If Leto_File(nDir+cdx)
        If Leto_fErase(nDir+cdx) > 0
          MsgInfo('Erro ao Apagar o Arquivo: '+nDir+CDX)
          close all
          cancel
        EndIf
      EndIf
   Else
      if file(nDir+cdx)
        if ferase(nDir+cdx) > 0
          MsgInfo('Erro ao Apagar o Arquivo cdx')
          close all
          cancel
        endif
      endif
     EndIF

  // rodape(oDlg,1,"Importando "+cDbf)
   If lRddLeto
     /*
      If Leto_File(nDir+"arqvelho")
      Else
         MsgInfo('Pasta: '+nDir+"arqvelho não existe.")
         Return .f.
      EndIf
     */
   Else
      If hb_DirExists(nDir+"arqvelho")
      Else
         If (makedir(nDir+"arqvelho")==0)
         Else
           MsgInfo('Sem Permissão de Criar a Pasta.')
           close all
          cancel
         Endif
      EndIf
   EndIf
   dbCreate(nDir+"temp.dbf",aStruAtual, iif(lRddLeto,"LETO","DBFCDX") )
   nTemp := nDir+"temp.dbf"

   Begin Sequence
      DbUseArea(.t., iif(lRddLeto,"LETO","DBFCDX") , nTemp , "dbc" ,.f.,.f.,'PTISO')
     // use (nTemp) new alias dbc exclusive via iif(lRddLeto,"LETO","DBFCDX")
   recover
      MsgInfo('Não Abriu o Arquivo: '+nTemp)
      close all
      cancel
   End Sequence
   If lRddLeto
      string := dServidor+cDbf
     Else
      string := dDados+cDbf
   EndIf

   Append from &string via iif(lRddLeto,"LETO","DBFCDX")
/*
   if file(dbt)
     append from &string //via 'DBFDBT'
   else
     append from &string //via 'DBFCDX'
   endif
*/

   dbc->(DbCloseArea())
   //rodape(oDlg,1,barra+curdir()+barra+cDBF+","+barra+curdir()+barra+"arqvelho"+barra+cDBF,0)
   If lRddLeto
     if Leto_ferase(nDir+"arqvelho\"+Arq) > 0
        MsgInfo('Não Apagou o Arquivo')
        close all
        cancel
     endif
    Else
     if ferase(nDir+"arqvelho\"+Arq) > 0
        MsgInfo('Não Apagou o Arquivo')
        close all
        cancel
     endif
    EndIf

   cLocal := nDir+Arq
   cNome  := nDir+strtran(Arq,'dbf','old')
   msginfo(cLocal+" "+cNome)

   If lRddLeto
      erro   := Leto_fRename(cLocal,cNome)
   Else
      erro   := FileMove(cLocal,nDir+"arqvelho"+barra+Arq)
   EndIf

   if erro = 0
   else
     msgstop("Não moveu o arquivo, erro: "+str(erro)+CrLf+"O Sistema Será Cancelado.")
     close all
     PostQuitMessage( 0 )
   endif

   if fRename(nDir+"temp.dbf",dDados+cDbf)>0
      MsgInfo('Erro ao Renomear o Arquivo: '+cdbf)
      close all
      cancel
   endif
   if file(nDir+"temp.fpt")
    cDbf := substr(cDbf,1,at('.',cDbf))+'fpt'
    if fRename(nDir+"temp.fpt",nDir+cDbf) > 0
       MsgInfo('Erro ao renomear o Arquivo: '+cdbf)
       close all
       cancel
    endif
   endif
   //rodape(oDlg,1,'')
endif
//dbchk->(DbCloseArea())
return lMudou


Re: Campo Memo

Enviado: 30 Jul 2010 01:23
por Josmar dos Santos
Ola Itamar, show de bola essa sua rotina, ja anotei e prometo que irei usa-la ...ok

Mais uma vez, orbrigado pela sau gentileza...


Josmar
:D