Jump to content
Fivewin Brasil

Sugestao para guardar um arquivo


edutraini

Recommended Posts

Bom dia, a todos

Preciso deixar uma opcao no meu sistema de cadastro de pedidos aonde o cliente quer armazenar uma copia do pedido original que o cliente passou para ele.

Minha duvida e de que forma guardar o endereco de onde esta esse arquivo guardado pois as vezes esse endereco pode ser muito grande.

Tenho que criar um campo memo pois se for criar um campo caracter fico limitado.

Link to comment
Share on other sites

Edu, como a Ana disse "gambiarra é com nois memo" vou apresentar a minha: Para casos parecidos sempre usei campo MEMO, nunca me passou pela cabeça a solução apresentada pelo João, porém sempre tive problemas com corrupção e lentidão ao indexar. Então parti para solução que para mim foi mágica, "gambiarra", para estes casos uso o SQLIte, ele não usa gerenciador, tudo que precisa via comando sql, vc pode até enganar, usando o nome do arquivo com a extensão DBF. Com isto solucionou os problemas de velocidade, corrupção e é tranquilo para implementar.

Link to comment
Share on other sites

Olá, desculpe a demora, segue a rotina completa, devidamente testada no Harbour e xHarbour: Cria banco e tabela, salva e recupera. Incluir hbsqlit3.lib

/*
 * Project: sqlite
 * File: Main.prg
 * Description:
 * Author:
 * Date: 07-16-2016
 */

#include "fivewin.ch"
#DEFINE SQLITE_OK 0
Static nConn

**===================================
Function Main()
**===================================
Local aVet:={}, cInFILE, cOutFILE, cSql, nId := 1, nBytes
Local cNome := "NotaFiscal.pdf"
Local cFile := "c:\temp\mydatabase.db"

//Cria banco de dados
IF !FILE(cFile)
    Cria_bancoDados(cFile)
ENDIF

//leitura e gravação

IF !FILE("C:\Correio\"+cNome)
   MsgStop("Arquivo não existe !!!")
   QUIT
ENDIF
cInFILE := MemoRead("C:\Correio\"+cNome)

//converter para hexdecimal
cInFILE := StrToHex(cInFILE)

//inicio da gravação
nConn := SQL_OPEN_DB(cFile,.F.)
IF !Empty(nConn)

   If SQL_DBSEEK(nConn,nId) // atualiza - Update
      cSql := "UPDATE arquivos SET nome = '"+cNome+"', "
      cSql += "conteudo ='"+cInFILE+"' WHERE id = "+Str(nId)+";"
  Else  // novo - insert
      cSql := "INSERT INTO arquivos(id,nome,conteudo) "
      cSql += "VALUES("+Str(nId)+",'"+cNome+"','"+cInFILE+"');"
   Endif

   If !SQL_EXEC(nConn,cSql)
      Alert("Erro ao GRAVAR o registro.")
   Endif

   SQL_CLOSE_DB() //Fecha
Endif
//Final da gravação

//Inicio da recuperação
nConn := SQL_OPEN_DB(cFile,.f.)
IF !Empty(nConn)
   // id = 1 e o registro
   cSql := "SELECT nome,conteudo FROM arquivos WHERE id="+Str(nId)+";"
   aVet := SQL_GET_TABLE(nConn,cSql)
   If Len(aVet) > 0
      cNome    := AllTrim(aVet[2,1]) // nome do arquivo
      cOutFILE := aVet[2,2] // conteudo

      //converte para string
      cOutFILE := HexToStr(cOutFILE)

      //cria novamente
      MemoWrit("c:\temp\"+cNome,cOutFILE)
   Endif
   SQL_CLOSE_DB() //Fecha
Endif
//fim da recuperação
MsgStop("The End")
Return Nil


//para cria banco e tabelas
**============================================================
FUNCTION Cria_bancoDados(cFILE)
**============================================================
LOCAL cSql

// cria o arquivo
nConn := sqlite3_open(cFILE, .T.)  //T=CRIA E ABRE F=SOABRE
If !Empty(nConn)
   SQL_EXEC(nConn, "PRAGMA auto_vacuum=0" )   //CONFIGURAÇÕES GERAL
   SQL_EXEC(nConn, "PRAGMA page_size=4096" )

   // cria a tabela
   cSql := "CREATE TABLE arquivos(id INTEGER PRIMARY KEY, "
   cSql += "nome text, conteudo text);"

   IF !SQL_EXEC(nConn,cSql)
       Alert("Erro de criação da tabela")
       RETURN .F.
   ENDIF
Endif
SQL_CLOSE_DB() //Fecha

RETURN NIL

**============================================================
FUNCTION SQL_OPEN_DB(cFILE,lMODE)
**============================================================
LOCAL nHD:=NIL
nHD := sqlite3_open(cFILE, lMODE)  //T=Cria e Abre F=Só abre
RETURN(nHD)

**============================================================
FUNCTION SQL_CLOSE_DB()  //*SQLDISCONNECT()
**============================================================
nConn := NIL
RETURN NIL


**===================================================================
FUNCTION SQL_EXEC(nCN,cSQL)
** RETORNA= TRUE / FALSE
** HB_SQLITE_OK 0 /* Successful result */
** HB_SQLITE_ERROR 1 /* SQL error or missing database */
** HB_SQLITE_INTERNAL 2 /* An internal logic error in SQLite */
** HB_SQLITE_PERM 3 /* Access permission denied */
** HB_SQLITE_ABORT 4 /* Callback routine requested an abort */
** HB_SQLITE_BUSY 5 /* The database file is locked */
**===================================================================
LOCAL lRET, cError
lRET := (SQLITE3_EXEC(nCN,cSQL,@cError) == SQLITE_OK)
RETURN(lRET)


**===================================================================
FUNCTION SQL_DBSEEK(nCN,nId)
**===================================================================
LOCAL lRET := .F.,aVET:={},cSql

cSql := "SELECT id FROM arquivos WHERE id="+Str(nId)+";"

aVET := SQL_GET_TABLE(nCN,cSql)

IF LEN(aVET) > 0 //ACHOU
   lRET := .T.
ENDIF

RETURN(lRET)


**===================================================================
FUNCTION SQL_GET_TABLE(nCN,cSQL)
**===================================================================
LOCAL aVET:={}
aVET := sqlite3_get_table(nCN,cSQL)
IF Len(aVET) <= 1
   aVET :={}
ENDIF

RETURN(aVET)
Link to comment
Share on other sites

JMSilva, obrigado pelo apoio.

Mas testando aqui deparei com os erros:

Error: Unresolved external '__endthreadex' referenced from \XH_1504\LIB\HBSQLIT3.LIB|sqlite3
Error: Unresolved external '__beginthreadex' referenced from \XH_1504\LIB\HBSQLIT3.LIB|sqlite3

Alguma dica? Obrigado!

Rodrigo Melo

Link to comment
Share on other sites

JMSilva,

Obrigado! Funcionou nos meus testes...

Percebi que vetor que recebe a lista de registros pesquisados traz também o nome das colunas... É isso mesmo?

Um abraço!

Rodrigo Melo

Correto, se o resultado do cmd sql for zero registro, o vetor vai estar vazio, caso tenha um ou mais, o vetor traz na primeira linha os nomes das colunas e mais a quantidade de registros, no exemplo espera-se apenas um registro ele vai estar sempre na segunda linha.

JMSilva

Link to comment
Share on other sites

  • 3 weeks later...

Colegas,


Estou tentando testar o exemplo do JMSILVA, mas estou tendo problemas.

Estou usando fivewin 15.07 e harbour 3.0. Inclui a hbsqlit3.lib, porém, na compilação, recebo vários "Error: Unresolved external '". Por exemplo:
Error: Unresolved external '_sqlite3_user_data' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|core
Error: Unresolved external '_sqlite3_value_type' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|core
Error: Unresolved external '_sqlite3_value_text' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|core
Error: Unresolved external '_sqlite3_value_double' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|core
Error: Unresolved external '_sqlite3_value_int64' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|core...

e por aí vai.

Encontrei uma outra lib nas subpastaa do harbour que resolvi testar: hbsqlit3-bcc.lib. Daí compila beleza, mas não abre o EXE porque diz estar faltando uma DLL: hbsqlit3-32-bcc.dll. Mas não consigo encontrar esta dll em nenhum lugar. Nem nos subdiretórios do harbour ou bcc ou fivewin e nem tão pouco no google.

Alguém tem uma luz?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...