edutraini Posted July 14, 2016 Report Share Posted July 14, 2016 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. Quote Link to comment Share on other sites More sharing options...
joaosolution Posted July 14, 2016 Report Share Posted July 14, 2016 Edu Bom dia Consigo gerar campo caracter com 500 posições, isso não resolveria? Att João Bosco Quote Link to comment Share on other sites More sharing options...
AnaCatacombs Posted July 14, 2016 Report Share Posted July 14, 2016 Aqui temos até de 1000 e não tivemos problemas. Não é muito aconselhado, mas "nois faiz gambiarra memo" Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 15, 2016 Report Share Posted July 15, 2016 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. Quote Link to comment Share on other sites More sharing options...
ram_bh Posted July 15, 2016 Report Share Posted July 15, 2016 JMSilva, boa tarde! Como você acessa o SQLite? Pode me enviar os exemplos para insert, update e query? Obrigado! Rodrigo Melo Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 16, 2016 Report Share Posted July 16, 2016 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) Quote Link to comment Share on other sites More sharing options...
edutraini Posted July 19, 2016 Author Report Share Posted July 19, 2016 Obrigado a Todos Quote Link to comment Share on other sites More sharing options...
ram_bh Posted July 19, 2016 Report Share Posted July 19, 2016 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 Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 20, 2016 Report Share Posted July 20, 2016 Tenho sim, está faltando uma lib do Borland(BCC), veja: //Unresolved external '__beginthreadex' use {bcc} cw32mt.lib e cw32mti.lib //Unresolved external '__endthreadex' use {bcc} cw32mt.lib e cw32mti.lib att JMSilva Quote Link to comment Share on other sites More sharing options...
ram_bh Posted July 20, 2016 Report Share Posted July 20, 2016 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 Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted July 20, 2016 Report Share Posted July 20, 2016 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 Quote Link to comment Share on other sites More sharing options...
ricardomouramarques Posted August 7, 2016 Report Share Posted August 7, 2016 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|coreError: Unresolved external '_sqlite3_value_type' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|coreError: Unresolved external '_sqlite3_value_text' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|coreError: Unresolved external '_sqlite3_value_double' referenced from E:\SQLITE_TESTES\NOVO\LIB\HBSQLIT3.LIB|coreError: 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? Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted August 7, 2016 Report Share Posted August 7, 2016 No HB3, são duas hbsqlit3 e sqlite3.lib JmSilva Quote Link to comment Share on other sites More sharing options...
ricardomouramarques Posted August 7, 2016 Report Share Posted August 7, 2016 No HB3, são duas hbsqlit3 e sqlite3.lib JmSilva JmSilva, Funfou blz! Valeu! Brigadú!!! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.