Página 1 de 2
SQLITE 3 - Básico em Harbour
Enviado: 18 Jul 2017 20:31
por susviela@bol.com.br
Bom gente, esse tópico eu estou criando para contribuir com o povo, que assim como eu está (re)iniciando xBase; Vou tentar contribuir também.
Passo um, solucionado os problemas de compilação, a nova etapa do meu aprendizado é habitar o uso desse excelente banco de dados. Para minha surpresa o Harbour embarcou o SGBD no executável criado, isso é uma maravilha, pensem bem, só um EXE e o sistema está funcionando no cliente.
Claro que isso tem implicações do tipo, se sair uma versão mais atual, por exemplo a 4.0 do SQLITE, teríamos que rever esse recurso, mas a princípio está ótimo no momento em que escrevo esse texto (Jul/2017).
No exemplo abaixo já é possível:
1) CRIAR O BANCO DE DADOS
2) CRIAR AS TABELAS DO BANCO DE DADOS
Código: Selecionar todos
#require "hbsqlit3"
PROCEDURE Main()
LOCAL db := sqlite3_open( "dados.db", .T. ) // .T. = criar banco se não existir
LOCAL tabcliente := "CREATE TABLE cliente( " +;
" idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
" nome CHAR(100), "+;
" idade INTEGER, "+;
" dtnascimento DATE ); "
LOCAL tabusuario := "CREATE TABLE usuario( " +;
" idusuario INTEGER PRIMARY KEY AUTOINCREMENT, " +;
" nome CHAR(100), "+;
" senha CHAR(15), "+;
" nivel INTEGER NOT NULL DEFAULT (1) ); "
IF sqlite3_exec( db, tabcliente ) == SQLITE_OK
? " Tabela clientes criada com sucesso..."
ENDIF
IF sqlite3_exec( db, tabusuario ) == SQLITE_OK
? " Tabela usuario criada com sucesso..."
ENDIF
sqlite3_sleep( 3000 )
RETURN
Após rodar o sistema o banco é criado e depois são criadas as tabelas, fiz testes e está funcionando bem. Vou tentar manter esse tópico com mais atualizações, espero que possa ser útil para algum colega.
Quem quiser pode usar o excelente gerenciador do SGBD SQLITE o SQLiteStudio, ele é free e pode ser baixado em: (
https://sqlitestudio.pl/index.rvt)
SQLITE 3 - Básico em Harbour (ADD)
Enviado: 20 Jul 2017 16:36
por susviela@bol.com.br
Nesse segundo passo adicionamos dados a tabela de usuários já criada no passo anterior, mesmo assim vou incluir o fonte completo.
Código: Selecionar todos
#require "hbsqlit3"
PROCEDURE Main()
LOCAL db := sqlite3_open( "novodb.db", .T. ) // .T. = criar banco se não existir
Local sql := ""
LOCAL tabcliente := "CREATE TABLE cliente( " +;
" idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
" nome CHAR(100), "+;
" idade INTEGER, "+;
" dtnascimento DATE ); "
LOCAL tabusuario := "CREATE TABLE usuario( " +;
" idusuario INTEGER PRIMARY KEY AUTOINCREMENT, " +;
" nome CHAR(100), "+;
" senha CHAR(15), "+;
" nivel INTEGER NOT NULL DEFAULT (1) ); "
IF sqlite3_exec( db, tabcliente ) == SQLITE_OK
? " Tabela clientes criada com sucesso..."
ENDIF
IF sqlite3_exec( db, tabusuario ) == SQLITE_OK
? " Tabela usuario criada com sucesso..."
ENDIF
// vamos adicionar dados ao banco
sql := CrudAdd()
IF sqlite3_exec( db, sql ) == SQLITE_OK
? " Novos usuarios cadastrados..."
? "Numero Linhas incluídas: " + hb_ntos( sqlite3_changes( db ) )
? "Total Alterações: " + hb_ntos( sqlite3_total_changes( db ) )
ELSE
? "Erro: ao gravar novos usuários"
ENDIF
sqlite3_sleep( 6000 )
RETURN
Function CrudAdd(sql)
sql := " " + ;
"BEGIN TRANSACTION;" + ;
"INSERT INTO usuario ( nome, senha , nivel ) VALUES( 'Carlos', '999999', 3 );" + ;
"INSERT INTO usuario ( nome, senha ) VALUES( 'Jose', '123' );" + ;
"INSERT INTO usuario ( nome, senha ) VALUES( 'Simone', '123' );" + ;
"INSERT INTO usuario ( nome, senha ) VALUES( 'Zeca', '123' ); " + ;
"COMMIT;"
RETURN (sql)
SQLITE 3 - Básico em Harbour - New
Enviado: 05 Set 2018 18:49
por susviela@bol.com.br
Ano passado comecei esse tutorial e acabei não continuando o desenvolvimento do mesmo.
Agora motivado novamente vou concluir esse tutorial, para isso estou criando uma
Classe que tem por objetivo ser um
CRUD em SQLite;
Esse tutorial estou publicando no meu BLOG, espero a visita de vocês lá também:
https://programandoxbase.wordpress.com/ ... -classe-i/
==========================
Código: Selecionar todos
#include <hmg.ch>
#include "hbclass.ch"
#require "hbsqlit3"
CREATE CLASS tCliente
DATA ccBancoDados INIT "dados.db"
DATA ccTabela INIT "cliente"
DATA ccDB INIT NIL
// todas colunas da tabela
DATA idcliente INIT 0
DATA nome INIT ""
DATA idade INIT 0
DATA dtnascimento INIT CTOD("0001/01/01")
METHOD New(cArqDB) CONSTRUCTOR
METHOD CriarTabela()
METHOD Inserir()
ENDCLASS
*---------------------------------------------------------------------------
METHOD New(cArqDB) CLASS tCliente
*---------------------------------------------------------------------------
LOCAL retdb
cArqDB := IF( Empty( cArqDB ), ::ccBancoDados, cArqDB )
retdb := sqlite3_open( cArqDB, .T. ) // .T. = criar se não existir
IF Empty( retdb )
MsgInfo("Não foi possível criar banco de dados: " + ::ccBancoDados)
Return NIL
ENDIF
::ccDB := retdb
::CriarTabela() //self executa metodo CriarTabela dessa classe
Return Self // construtor retorna self
*---------------------------------------------------------------------------
METHOD CriarTabela() CLASS tCliente
*---------------------------------------------------------------------------
LOCAL cSql := "CREATE TABLE IF NOT EXISTS "+ ::ccTabela +"( " +;
" idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
" nome CHAR(100), "+;
" idade INTEGER, "+;
" dtnascimento DATE ); "
sqlite3_exec( ::ccDB, cSql )
IF sqlite3_errcode( ::ccDB ) > 0 // error executar SQL
MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
Return .f.
ENDIF
Return Nil
*---------------------------------------------------------------------------
METHOD Inserir() CLASS tCliente
*---------------------------------------------------------------------------
LOCAL retdb
LOCAL cSql :=""
LOCAL dt_nascimento := DTOS( ::dtnascimento )
dt_nascimento :=SUBSTR(dt_nascimento,1,4)+ "-"+;
SUBSTR(dt_nascimento,5,2)+ "-"+;
SUBSTR(dt_nascimento,7,2) //ajusta data aaaa-mm-dd (efeito colateral SET DATE)
cSql := "INSERT INTO "+ ::ccTabela +"( " +;
" nome , idade, dtnascimento ) " +;
"VALUES ( " +;
"'" + ::nome +"', "+;
" " + AllTrim(Str(::idade)) +" , "+;
"'" + dt_nascimento +"'); "
sqlite3_exec( ::ccDB, cSql )
IF sqlite3_errcode( ::ccDB ) > 0 // error executar SQL
MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
Return .f.
ENDIF
Return .T.
Continua ....
SQLITE 3 - Básico em Harbour - New
Enviado: 06 Set 2018 19:37
por susviela@bol.com.br
No post anterior ( Harbour: SQLite - Classe II ), adicionamos a nossa classe o método Inserir(), agora vamos implementar nessa mesma classe mais um método que vai nos permitir LISTAR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.
https://programandoxbase.wordpress.com/ ... classe-iii
Código: Selecionar todos
*---------------------------------------------------------------------------
METHOD Listar( cComplemento ) CLASS tCliente
*---------------------------------------------------------------------------
LOCAL cSql, cRet
LOCAL aDados := {}
cComplemento := IF(cComplemento == Nil, "", cComplemento)
cSql := "SELECT * FROM "+ ::ccTabela +" " + cComplemento
cRet := sqlite3_prepare( ::ccDB, cSql )
DO WHILE sqlite3_step( cRet ) == 100 // SQLITE_ROW 100 tem outra linha pronta
aLinha := {}
AADD( aLinha, sqlite3_column_int( cRet, 1 ) ) // idcliente
AADD( aLinha, sqlite3_column_text( cRet, 2 ) ) // Nome
AADD( aLinha, sqlite3_column_int( cRet, 3 ) ) // Idade
AADD( aLinha, sqlite3_column_text( cRet, 4 ) ) // dtnascimento
AADD(aDados, aLinha)
ENDDO
sqlite3_clear_bindings( cRet )
sqlite3_finalize( cRet )
Return ( aDados )
Exemplo de utilização do método:
Código: Selecionar todos
alista := {}
alista := oCliente:Listar()
msginfo( Len(alista) ) // total itens listados
msginfo( alista[1] ) // linha UM completa
msginfo( alista[1][2] ) // linha UM item DOIS (nome)
Lá no blog coloquei uma explicação mais detalhada para quem esta começando.
SQLITE 3 - Básico em Harbour - NEW
Enviado: 10 Set 2018 12:14
por susviela@bol.com.br
No post anterior (
Harbour: SQLite – Classe III ), adicionamos a nossa classe o método Listar(), agora vamos implementar nessa mesma classe mais um método que vai nos permitir ATUALIZAR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.
https://programandoxbase.wordpress.com/ ... classe-iv/
Código: Selecionar todos
*---------------------------------------------------------------------------
METHOD Atualizar( nIDcliente ) CLASS tCliente
*---------------------------------------------------------------------------
LOCAL retdb
LOCAL cSql :=""
LOCAL dt_nascimento := DTOS( ::dtnascimento )
IF (nIDcliente == Nil .OR. nIDcliente = 0 )
Msginfo("ID cliente inválida")
Return .F.
ENDIF
dt_nascimento :=SUBSTR(dt_nascimento,1,4)+ "-"+;
SUBSTR(dt_nascimento,5,2)+ "-"+;
SUBSTR(dt_nascimento,7,2) //ajusta data aaaa-mm-dd
cSql := " UPDATE "+ ::ccTabela +" SET " +;
" nome = '" + ::nome +"', "+;
" idade = " + AllTrim(Str(::idade)) +" , "+;
" dtnascimento ='" + dt_nascimento +"' " +;
" WHERE idcliente = " + AllTrim(Str(nIDcliente)) + " ;"
sqlite3_exec( ::ccDB, cSql )
IF sqlite3_errcode( ::ccDB ) > 0 // error executar SQL
MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
Return .f.
ENDIF
Return .T.
Como usar esse método:
Código: Selecionar todos
oCliente:= tCliente():New() // instancia a classe
oCliente:nome := "Cliente da Silva Sauro" // envia valores p/ classe
oCliente:idade := 37
oCliente:dtnascimento := CTOD("09/09/2000")
nIDcli := 3
ret = oCliente:Atualizar(nIDcli) // chama método com parâmetro 3
IF (ret == .T. )
msg := "Registro: " + STR(nIDcli) + " Atualizado com sucesso."
ELSE
msg := "Registro: " + STR(nIDcli) + " Não atualizado/localizado. "
ENDIF
MsgInfo( msg )
SQLITE 3 - Básico em Harbour - NEW -CRUD SQLite
Enviado: 11 Set 2018 14:25
por susviela@bol.com.br
No post anterior (
Harbour: SQLite – Classe IV ), adicionamos a nossa classe o método Atualizar(), o Update do Crud SQLite, agora vamos implementar nessa mesma classe mais um método que vai nos permitir EXCLUIR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.
https://programandoxbase.wordpress.com/ ... -classe-v/
Código: Selecionar todos
*---------------------------------------------------------------------------
METHOD Excluir( nIDcliente ) CLASS tCliente
*---------------------------------------------------------------------------
LOCAL retdb
LOCAL cSql :=""
IF (nIDcliente == Nil .OR. nIDcliente = 0 )
Msginfo("ID cliente inválida")
Return .F.
ENDIF
cSql := " DEL FROM "+ ::ccTabela +;
" WHERE idcliente = " + AllTrim(Str(nIDcliente)) + " ;"
sqlite3_exec( ::ccDB, cSql )
IF sqlite3_errcode( ::ccDB ) > 0 // error executar SQL
MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
Return .f.
ENDIF
Return .T.
Como usar o método criado:
Código: Selecionar todos
Function main
oCliente:= tCliente():New() // instancia a classe
nIDcli := 7
ret = oCliente:Excluir(nIDcli) // chama método com parâmetro 3
IF (ret == .T. )
msg := "Registro: " + STR(nIDcli) + " Excluído com sucesso."
ELSE
msg := "Registro: " + STR(nIDcli) + " Não foi Excluído/Localizado. "
ENDIF
MsgInfo( msg )
Return .T.
Conclusão:
Com a conclusão, nem de longe esse tutorial tem a pretensão de esgotar o tema, mas, pretende servir como base de conhecimento para quem deseja usar xBase, Harbour, SQLite, e serve como um incentivo para quem quer aprofundar-se em PPO xBase (Programação Orientada a Objetos ) e reaproveitar os códigos desenvolvidos no nosso bom e velho Clipper.
SQLITE 3 - Básico em Harbour
Enviado: 28 Set 2018 13:47
por HASA

)
Boa tarde, Susviela ainda utilizo DBF estou querendo migrar a tempos para um banco mais rápido e confiável ( claro ), o que gostei desse exemplo é saber que o Harbour embarcou o SGBD no executável criado, sempre foi meu dilema pois uso DBF que crio e atualizo campos sem problemas, acredito que pelo que estou vendo posso criar o banco de dados e no futuro precisando atualizar facilmente inserir novos campos na base de dados? Por exemplo a NF-e 4.0 criou novos campos que teremos que gravar em nosso BD´s crio e atualizo em DBF com "o pé nas costas" com esse SQLite posso fazer isso também?
Parabens por mais essa força,
:-Y
HASA
SQLITE 3 - Básico em Harbour
Enviado: 28 Set 2018 14:35
por susviela@bol.com.br
HASA escreveu:
)
Boa tarde, Susviela ainda utilizo DBF estou querendo migrar a tempos para um banco mais rápido e confiável ( claro ), o que gostei desse exemplo é saber que o Harbour embarcou o SGBD no executável criado, sempre foi meu dilema pois uso DBF que crio e atualizo campos sem problemas, acredito que pelo que estou vendo posso criar o banco de dados e no futuro precisando atualizar facilmente inserir novos campos na base de dados? Por exemplo a NF-e 4.0 criou novos campos que teremos que gravar em nosso BD´s crio e atualizo em DBF com "o pé nas costas" com esse SQLite posso fazer isso também?
Parabens por mais essa força,
:-Y
HASA
Um SQL Básico já resolveria
Incluir uma coluna:
ALTER TABLE cliente ADD COLUMN sexo char(1);
Mudar nome tabela:
ALTER TABLE cliente RENAME TO tbCliente;
Assim que tiver um tempinho vou publicar lá no blog uns exemplos SQLite.
https://programandoxbase.wordpress.com/
SQLITE 3 - Básico em Harbour
Enviado: 28 Set 2018 14:49
por HASA

)

)

) :{
Combinado, vou acompanhar,
:-Y
HASA
SQLITE 3 - Básico em Harbour
Enviado: 15 Jan 2020 12:16
por asimoes
Obrigado pela contribuição
No HBP ou HBC quais libs devo incluir, tem um exemplo de uso para compilar?
SQLITE 3 - Básico em Harbour
Enviado: 15 Jan 2020 12:23
por Marcos Kieron
Dá para usar com SQLMIX também, apenas para saber, mas não vou mencionar nada sobre isso aqui para não atrapalhar o tópico e confundir o pessoal, esse método acima é muito efetivo e rápido.
SQLITE 3 - Básico em Harbour
Enviado: 15 Jan 2020 16:49
por asimoes
na compilação dá esse erro:
hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s):
SQLITE3_PROFILE(), SQLITE3_TRACE()
No hbmk.hbm está incluindo a lib hbsqlit3.hbc
SQLITE 3 - Básico em Harbour
Enviado: 15 Jan 2020 17:25
por asimoes
Descobri no ChangeLog, harbour 3.4
2016-08-30 20:28 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com)
* contrib/hbsqlit3/core.c
* contrib/hbsqlit3/hbsqlit3.hbx
* deprecate SQLITE3_TRACE() and SQLITE3_PROFILE()
* add TODO to implement wrapper logic for replacement function
Isso significa que o demo do harbour não foi modifcado, está usando estas 2 funções obsoletas
SQLITE 3 - Básico em Harbour
Enviado: 16 Jan 2020 17:08
por alaminojunior
susviela@bol.com.br escreveu:HASA escreveu:
Um SQL Básico já resolveria
Incluir uma coluna:
ALTER TABLE cliente ADD COLUMN sexo char(1);
Mudar nome tabela:
ALTER TABLE cliente RENAME TO tbCliente;
Assim que tiver um tempinho vou publicar lá no blog uns exemplos SQLite.
https://programandoxbase.wordpress.com/
Não tenho certeza, mas com SQLite creio que não seja tão simples assim as alterações nas tabelas.
Posso estar enganado, mas até o próprio SQLiteStudio faz três tarefas para isso.
Podem confirmar essa informação ?
SQLITE 3 - Básico em Harbour
Enviado: 17 Jan 2020 12:26
por Marcos Kieron
Excelente para pesquisar e aprender a usar SQLite ou outros SGBD:
https://www.sqlitetutorial.net/sqlite-alter-table/