Salvar variáveis

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

marcoantonio.sommus
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 16 Mai 2012 11:08
Localização: Minas Gerais

Salvar variáveis

Mensagem por marcoantonio.sommus »

Bom dia pessoal,

Estou tentando salvar as variáveis do meu sistema, com os respectivos valores, num arquivo externo num determinado momento da minha aplicação, para que seja possível restaura-las posteriormente. Para isso estou utilizando o comando SAVE TO, contudo este comando só salva os 10 primeiros dígitos do nome da variável. Esse problema já foi citado no post a seguir: viewtopic.php?f=4&t=10403 , contudo não foi dada uma solução. Algúem sabe alguma forma de salvar as variáveis do sistema em algum arquivo (.INI ou .MEM por exemplo) com o nome completo?

Desde já, muito obrigado!

Marco Antônio do Couto Fernandes
SOMMUS Automação
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Salvar variáveis

Mensagem por Jairo Maia »

Olá Marco Antônio,

Use Hb_MvSave() e Hb_MvRestore. Veja o exemplo abaixo:
Nota: Assim como no Clipper, essas funções não salvam variáveis declaradas como LOCAL

Código: Selecionar todos

Function Main()

 Private cVariavel_Caracter := "Teste"
 Private nVariavel_Numerica := 10
 Private dVariavel_Data     := Date()
 Private lVariavel_Logica   := .t.

 Hb_MvSave( "Teste1.Mem", "*.*")

 Release  cVariavel_Caracter
 Release  nVariavel_Numerica
 Release  dVariavel_Data
 Release  lVariavel_Logica

 VerVariaveis()

Return Nil

Function VerVariaveis()

 Clear Screen 

 Hb_MvRestore( "Teste1.Mem", .t. )

 ?
 ? cVariavel_Caracter
 ? nVariavel_Numerica
 ? dVariavel_Data
 ? lVariavel_Logica
 ?

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
marcoantonio.sommus
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 16 Mai 2012 11:08
Localização: Minas Gerais

Salvar variáveis

Mensagem por marcoantonio.sommus »

Olá Jairo,

Cara eu tentei usar estas funções no meu sistema mas ocorreu erro, dizendo que as funções não existiam. Você sabe se eu preciso adicionar alguma dll ou coisa do tipo?

Desde já, obrigado!

Marco Antônio do Couto Fernandes
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Salvar variáveis

Mensagem por alxsts »

Olá!

Eu utilizaria aquelas funções que salvam e restauram arrays am disco (não me lembro dos nomes). Nelas dá para salvar variáveis do tipo LOCAL, STATIC, codeblocks e até mesmo arrays. Ou partiria para os arquivos .INI.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Salvar variáveis

Mensagem por sygecom »

Eu compartilho com a idéia do Alexandre, eu usaria uns .INI , como uso Hwgui já tem até umas funçõs que usa isso hoje:
Exemplo Lendo o INI:
nTIPO_IMP := VAL(Hwg_GetIni( 'Geral' , 'DANFE' , , "C:\CAMINHO_PASTA\ACBrNFeMonitor.ini")) // 0=retrato 1=paisagem

Exemplo gravando no INI
Hwg_WriteIni( 'Geral' , 'DANFE' , alltrim(str(nTIPO_IMP)) , "C:\CAMINHO_PASTA\ACBrNFeMonitor.ini" )
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcoantonio.sommus
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 16 Mai 2012 11:08
Localização: Minas Gerais

Salvar variáveis

Mensagem por marcoantonio.sommus »

Mas galera, existe alguma função que me retorne todas as variáveis do sistema com os respectivos valores para que assim eu as salve no .INI ?

att
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Salvar variáveis

Mensagem por Jairo Maia »

Olá Marco Antônio,
marcoantonio.sommus escreveu:Você sabe se eu preciso adicionar alguma dll ou coisa do tipo?
Antes de publicar o post , compilei usando HARBOUR com o comando: HBMK2 TESTE.PRG. Não inclui nenhuma lib.

Você está usando Harbour ou xHarbour? Me parece que estas funções são do Harbour.

Nota:
A função que o colega Alexandre citou (e que também não lembro o nome), foi implementada na versão 5.2 do Clipper.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Salvar variáveis

Mensagem por sygecom »

marcoantonio.sommus escreveu:Mas galera, existe alguma função que me retorne todas as variáveis do sistema com os respectivos valores para que assim eu as salve no .INI ?
a:=__MVSYMBOLINFO() // retorna um vetor com todas as variáveis e seus conteudos
? valtoprg(a)
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
marcoantonio.sommus
Usuário Nível 1
Usuário Nível 1
Mensagens: 6
Registrado em: 16 Mai 2012 11:08
Localização: Minas Gerais

Salvar variáveis

Mensagem por marcoantonio.sommus »

Leonardo, funcionou!

Muito obrigado a todos.

att

Marco Antônio do Couto Fernandes
Avatar do usuário
viniciuspc
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 19 Dez 2006 17:18
Localização: Rio de Janeiro

Salvar variáveis

Mensagem por viniciuspc »

Para salvar Arrays, eu utilizo uma função do Rick Spence, Em Clipper

creditos para RICK SPENCE (me avisem se não puder ser publicado)

Código: Selecionar todos

/***
* SAVEARRAY e RESTARRAY    POR	R I C K   S P E N C E
**/

#include "save_arr.ch"

/***
*   SaveArray(aArray, cFileName)
*
*    aArray[]	 - -Array to save
*    cFileName	 - -File in which to save array
*/

FUNCTION SaveArray(aArray, cFileName)

LOCAL fHandle := FCreate(cFileName , 0 ) // 0 = normal read/write; se ja existe sera esvaziado!

  SaveArr(fHandle, aArray)
  FClose(fHandle)

RETURN NIL


STATIC FUNCTION SaveArr(fHandle, aArray)

LOCAL LenArray, ElemType, i

  // Write the array header
  WRITE_AHD(fHandle, aArray)  && save_arr.ch
  LenArray := Len(aArray)

  // Write each element in the array ~EL
  FOR i := 1 TO LenArray
    ElemType := ValType(aArray[i])
    DO CASE
      CASE ElemType == "A"
       	// A subarray, recurse ~EL
	      SaveArr(fHandle, aArray[i])

      CASE ElemType == "B"      
	      // Fatal error here- -we cannot write blocks
	      ? "ERROR: CANNOT SAVE A CODE BLOCK"
	      InKey(0)

      CASE ElemType == "C"
	      // Save a character element
	      SAVE_CHAR(fHandle, aArray[i])

      CASE ElemType == "D"
	      // Save a date element
	      SAVE_DATE(fHandle, aArray[i])

      CASE ElemType == "L"
	      // Save a logical element
	      SAVE_LOG(fHandle, aArray[i])

      CASE ElemType == "N"
	      // Save a numeric element
	      SAVE_NUM(fHandle, aArray[i])
    ENDCASE
  NEXT

RETURN NIL

/***
*    RestArray(cFileName)
*
*    cFileName	 - -File from which to restore array
*/

FUNCTION RestArray(cFileName)

LOCAL aRestArr, fHandle := FOpen(cFileName , 0) // 0 = reading only !

  GET_TYPE(fHandle)
  aRestArr := RestArr(fHandle)
  FClose(fHandle)

RETURN aRestArr



FUNCTION RestArr(fHandle)

LOCAL LenArray, i, ElemType, aArray

  // Determine array's size and allocate it
  LenArray := GET_AR_SIZE(fHandle)
  aArray   := Array(LenArray)

  // Restore each element
  FOR i := 1 TO LenArray
    // Determine its type
    ElemType := GET_TYPE(fHandle)
    DO CASE
      CASE ElemType == "A"
	// A sub array so recurse ~EL
	aArray[i] := RestArr(fHandle)

      CASE ElemType == "B"      
	// Fatal error here ... we did not save one

      CASE ElemType == "C"
	aArray[i] := GET_CHAR(fHandle)

      CASE ElemType == "D"
	aArray[i] := GET_DATE(fHandle)

      CASE ElemType == "L"
	aArray[i] := GET_LOG(fHandle)

      CASE ElemType == "N"
	aArray[i] := GET_NUM(fHandle)

    ENDCASE
  NEXT

RETURN aArray
arquivo save_arr.ch

Código: Selecionar todos

// Listing 3.5: Macros to read and write array elements

/***
*  SAVE_ARR.CH
*
* Clipper header file for array save and restore
*
*/

//  In the following macros fh is a file handle

// Write character element: C<5 digit length><character value>
#define SAVE_CHAR(fh, cv) FWrite(fh, "C" + Str(Len(cv), 5) + cv)

// Write date element:      D<datestring>
#define SAVE_DATE(fh, dv) FWrite(fh, "D" + Dtoc(dv))

// Write logical element:   L<T or F character>
#define SAVE_LOG(fh, lv)  FWrite(fh, "L" + Iif(lv, "T", "F"))

// Write numeric element:
//                          N<2 digit length>
//                           <numeric formatted as a string>
#define SAVE_NUM(fh, nv) FWrite(fh, "N" + Str(Len(Str(nv)),2) + ;
                                Str(nv))

// Write array header:      A<4 digit array length>
#define WRITE_AHD(fh, av) FWrite(fh, "A" + Str(Len(av), 4))

// Read a type
#define GET_TYPE(fh)     FReadStr(fh, 1)

// Read an array size
#define GET_AR_SIZE(fh) Val(FReadStr(fh, 4))

// Read a character element
#define GET_CHAR(fh)    FReadStr(fh, Val(FReadStr(fh, 5)))

// Read a date element
#define GET_DATE(fh)    Ctod(FReadStr(fh, 8))

// Read a logical element
#define GET_LOG(fh)     FReadStr(fh, 1) == "T"

// Read a numeric element
#define GET_NUM(fh)     Val(FReadStr(fh, Val(FReadStr(fh, 2))))
modo de se utilizar :

Código: Selecionar todos

...
local aVetor
local aVetRead

aVetor := {  "primeiro" , "segundo"  ,{{100,.T.}}   };
SAVEARRAY(aVetor,"VETOR.ARR")
...
...
aVetRead := RESTARRAY("VETOR.ARR")
* assim aVetRead fica igual a aVetor
....
[]´s
Clipper 5.2e + Blinker 5.10
Harbour 3.0.0 (Rev. 16951) + Microsoft Visual C++ 16.0.40219 (32-bit)
Responder