Clipper On Line • Ver Tópico - SQLITE 3 - Básico em Harbour

SQLITE 3 - Básico em Harbour

Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

 

SQLITE 3 - Básico em Harbour

Mensagempor susviela@bol.com.br » 18 Jul 2017 20:31

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


#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)
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour (ADD)

Mensagempor susviela@bol.com.br » 20 Jul 2017 16:36

Nesse segundo passo adicionamos dados a tabela de usuários já criada no passo anterior, mesmo assim vou incluir o fonte completo.

#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)
   
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour - New

Mensagempor susviela@bol.com.br » 05 Set 2018 18:49

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/2018/09/05/harbour-sqlite-classe-i/

==========================

#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 ....
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour - New

Mensagempor susviela@bol.com.br » 06 Set 2018 19:37

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/2018/09/06/harbour-sqlite-classe-iii

*---------------------------------------------------------------------------
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:

   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.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour - NEW

Mensagempor susviela@bol.com.br » 10 Set 2018 12:14

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/2018/09/10/harbour-sqlite-classe-iv/

*---------------------------------------------------------------------------
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:

   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 )
   
   
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour - NEW -CRUD SQLite

Mensagempor susviela@bol.com.br » 11 Set 2018 14:25

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/2018/09/11/harbour-sqlite-classe-v/

*---------------------------------------------------------------------------
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:

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.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour

Mensagempor HASA » 28 Set 2018 13:47

:)) :D
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
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1007
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 38 vezes

SQLITE 3 - Básico em Harbour

Mensagempor susviela@bol.com.br » 28 Set 2018 14:35

HASA escreveu::)) :D
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/
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar de usuário

susviela@bol.com.br
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 145
Data de registro: 30 Jun 2017 11:17
Cidade/Estado: São José / SC
Curtiu: 74 vezes
Mens.Curtidas: 14 vezes

SQLITE 3 - Básico em Harbour

Mensagempor HASA » 28 Set 2018 14:49

:)) :)) :)) :{
Combinado, vou acompanhar,
:-Y
HASA
Avatar de usuário

HASA
Colaborador

Colaborador
 
Mensagens: 1007
Data de registro: 01 Set 2003 19:50
Cidade/Estado: São Paulo
Curtiu: 0 vez
Mens.Curtidas: 38 vezes




Retornar para Banco de Dados

Quem está online

Usuários vendo este fórum: Google [Bot] e 2 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro