Página 2 de 3

HBSQL (Sql Tool)

Enviado: 19 Set 2019 09:43
por Ranier
Nova versão:
Suporte inicial para MySQL.

https://drive.google.com/open?id=1X8Sh3 ... QZzFR4aGDc

HBSQL (Sql Tool)

Enviado: 19 Set 2019 14:42
por Ranier
"Talvez para as colunas vazias na primeira linha você possa colocar um tamanho de 10 ou 20? Assim pelo menos mostra que tem o campo, mas não perde tempo tentando achar o maior de todos com a função MAX()."
Coloquei tamanho fixo de 16 para o HBSQL, para campos sem tamanho definido.
"De qualquer forma isso pode ser um problema na "vida real" e precisariamos encontrar uma solução viável..."
O tamanho final da apresentação dos dados é de responsabilidade do usuário da HBDBD. Com um datatype VARCHAR(64), a lib reporta como tamanho do campo 64. Usar TEXT é mesmo que um campo BLOB.
"Outra coisa é sobre os caracteres acentuados que estão aparecendo errado, veja na imagem que você mesmo enviou."
Me parece que são lixo. Pesquisei e não encontrei nenhum registro acentuado.
De qualquer forma, a responsabilidade da entrada/saída dos dados é de responsabilidade do usuário HBDBD. No caso do HBSQL, está sendo usado a "codepage" padrão.
"Você poderia enviar junto o arquivo .hbp que usa para compilar o programa?"
Desculpe. Ainda estou no tempo dos .rmk. Não tenho nenhum .hbp criado.
Qual seria a dúvida?

HBSQL (Sql Tool)

Enviado: 19 Set 2019 14:49
por Ranier
Sou do tempo do Clipper/Blinker:

hbsql.rmk

Código: Selecionar todos

#ifdef DEBUG
.prg.c:
     \harbour\bin\harbour /n /q0 /gc0 /w3 /b /v /DDEBUG /i\harbour\include $<
.c.obj:
     cl /c /TP /Zi /Wall /DDEBUG /I\harbour\include $<
#else
.prg.c:
     \harbour\bin\harbour /n /l /gc0 /q0 /w3 /DNDEBUG /i\harbour\include $< >> harbour.log
.c.obj:
     cl /c /TP /Wall /O2xtyb1 /Gy /GS- /GR- /EHs- /I\harbour\include $<
#endif

hbsql.c:        hbsql.prg
abrws.c:        abrws.prg
brws.c:         brws.prg
queries.c:      queries.prg
rddsys.c:       rddsys.prg

hbsql.obj:      hbsql.c
abrws.obj:      abrws.c
brws.obj:       brws.c
queries.obj:    queries.c
rddsys.obj:     rddsys.c

out = hbsql.exe
#ifdef DEBUG
$(Out): $(Objects)
        link @debug.lnk > hbsql.log
#else
$(Out): $(Objects)
        link @release.lnk > hbsql.log
#endif
hbsql.lnk

Código: Selecionar todos

/out:hbsql.exe
/subsystem:console
/release
/opt:ref

hbsql.obj
abrws.obj
brws.obj
queries.obj

hbvm.lib
hbrtl.lib
hbpp.lib
hbcommon.lib
hbnulrdd.lib
hbmacro.lib
hblang.lib
gtwin.lib
\usr\lib\sqlite\sqlite3.lib
\usr\lib\postgresql\libpq.lib
\usr\lib\mysql\libmysql.lib
\harbour\lib\hbdbd.lib

shell32.lib
user32.lib
winspool.lib
ole32.lib
olepro32.lib
ws2_32.lib
kernel32.lib
gdi32.lib
comctl32.lib
comdlg32.lib
advapi32.lib
iphlpapi.lib
winmm.lib

HBSQL (Sql Tool)

Enviado: 19 Set 2019 15:26
por Ranier
Onde estão as funções DBD_*()?
\harbour\lib\hbdbd.lib"

HBDBD é um produto comercial. Uma biblioteca de acesso a Bancos de Dados.
Features:
Harbour 3.2/3.4
32/64bits
Plataformas: Windows, Linux, FreeBSD
Bancos: PostgreSQL 9 a 12, Sqlite 3 e Mysql 5 e 8
Em desenvolvimento: Firebird 3

A ferramenta HBSQL é somente para demonstração das capacidades da biblioteca HBDBD.

HBSQL (Sql Tool)

Enviado: 21 Set 2019 17:11
por Ranier
"Projeto comercial? Hmm... isso já me causa a ficar desinteressado... tem muita coisa gratuíta que funciona bem, creio que terá mais sucesso se criar algo gratuíto e disponibilizar os fontes para quem tiver interesse em dar continuidade pois acho que será mais proveitoso inclusive para você mesmo."
Não, muito obrigado.

"Em todo caso, para gerar o executável basta você criar um arquivo texto com o seguinte nome: proj.hbp e dentro do arquivo com o seguinte conteúdo:"
Não obrigado, estou satisfeito com os meus makefiles.

"Uma coisa muito útil sobre o hbmk2 é que ele pode ajudar a encontrar funções para suas aplicações, por exemplo digite:"
Não obrigado, utilizo um programa arcaico, desde o ano de 1992, chamado grep.exe, feito pela Inprise Corporation, que resolve pra mim.

"Se precisar posso lhe auxiliar a configurar um .hbc assim a geração da lib será facilitada também, apesar que você pode dar uma olhada na pasta Contibs e vai ver exemplos de como fazer isso para qualquer ambiente, Windows, OS/X, Linux etc..."
Não muito obrigado, continuo com os meus makefiles para gerar as bibliotecas.

HBSQL (Sql Tool)

Enviado: 21 Set 2019 17:16
por Ranier
Nova versão d HBSQL.
Suporte para MySQL, quase pronto.

Fiz uma inclusão de um outro projeto, chamado sdbu.exe, para demonstrar as capacidades da nossa outra RDD (DBDRDD), que emula a DBFCDX, para substituição dos DBFs por SGDB.
O utilitário é bem simples, e mostra todas as tabelas de um database (configurado dentro do sdbu.ini) e ao teclar ENTER, executa um browser (BrowserDB), mostrando todos campos.
A DBDRDD está em desenvolvimento ainda, mas está "testável".

Novo link:
https://drive.google.com/open?id=13szkG ... dPEfDFx2xH

HBSQL (Sql Tool)

Enviado: 23 Set 2019 09:42
por Ranier
hazael escreveu:Olha, não fique chateado, mas projeto privado, fechado e pago não me interessa e sinceramente acho não vai intereressar ninguém... melhor usar ADO, ODBC ou SQLMIX que é aberto, gratuíto e funciona.
Só não queria que ficasse frustrado com a baixa aceitação e antes que invista o seu tempo desenvolvendo para ninguém se interessar, achei melhor deixar você saber."
De maneira alguma, estou chateado. Estamos num país livre. Cada um façam suas escolhas e vivam com elas. A HBDBD, está 100% pronta. A DBDRDD vai continuar a ser desenvolvida e estará 100% pronta logo. Elas foram feitas, exatamente pra isso, para que haja escolhas.
Agora todos as escolhas, têm seus custos. Não existe almoço grátis. Eu posso escolher andar a pé, é livre e grátis, mas não posso escolher andar de Ferrari sem pagar, não importa o que eu digo para a fábrica da Ferrari.
Andar a pé, tenho que pagar com o "tempo" de deslocamento e com os riscos das intempéries do clima.
O mesmo vale para usar ADO ou SQLMIX, com ADO têm que-se pagar com performance e limitação de plataformas, uma vez que está disponível somente para Windows e depende da Microsoft para funcionar (ou seja, alguém está pagando por isso) e por usar ODBC que é mais uma camada de tradução entre o SGDB e o cliente. Com a SQLMIX têm que se pagar com limitações no uso da sintaxe e com falta de recursos não inclusos, que alguém terá que fazer e acredito, atualmente, não têm ninguém com conhecimento e disposição para desenvolver a SQLMIX. Claro que pode aparecer alguém e fazê-lo, mas é esperar para ver.
Mas então, alguém tem que fazer a Ferrari e esse é o meu objetivo, a HBDBD e DBDRDD, serão as Ferraris, do acesso a banco de dados, pelo Harbour e o seu uso não será "free", pois tenho meus próprios custos para desenvolvê-las. Nenhuma "free beer here".
hazael escreveu:"Sem contar que não vai fazer pelos padrões do Harbour com uso do hbmk2 que é a ferramenta básica e indicada para qualquer compilação, mesmo para geração de Libs. Leve em consideração que o Harbour está em contínuo desenvolvimento, é livre, aberto, permite usar compiladores diferentes, 32/64 bits, se não vem o código fonte para gerar junto com um pacote de compilação, provavelmente vai ficar muito difícil usar. Isso poderia funcionar para o Harbour 3.0 mas acho que não valeria a pena pois já está muito defasado..."
Aqui há um bocado de desconhecimento. A utilização das bibliotecas compiladas é simples e fácil de usar, tanto para o Harbour 3.2 ou Harbour 3.4, 32bits ou 64bits e em qualquer plataforma, seja Windows ou LInux, ou FreeBSD até mesmo MacOS.
Tudo o que precisa ser feito é uma modificação, nos seus próprios .hbp, que devem referenciar a biblioteca em alguma linha e pronto. Não têm mistério algum. Não importa por qual meio seja produzido a biblioteca, uma vez ela estando pronta, é só usá-la. Quem têm o mínimo de conhecimento em usar Harbour sabe disso.
O Harbour faz uso de bibliotecas prontas, desde sempre, basta ver que ninguém, compila PCRE, ZLIB, Postgresql, Sqlite ou Openssl, apesar de que também isso possa ser feito.

Então para se usar a HBDBD ou a DBDRDD, basta incluir na primeira linha do .bbp
-hbdbd // HBDBD
ou
-rdddbd // DBDRDD

Que estarão disponíveis em versões idênticas de 32bits ou 64 bits, para Windows, Linux, Android, FreeBSD e MacOS.

HBSQL (Sql Tool)

Enviado: 23 Set 2019 09:53
por JoséQuintas
Não esqueça da opção de usar nome de campo.
Até mesmo na TMySQL tem isso.
E no ADO tem isso também.
Fica extremamente antiprático usar por número ao invés de nome.
Nem que seja array do tipo HASH.

Código: Selecionar todos

? Rs:Field(1):Value
? Rs:Field( "CODIGO" ):Value
...
aValues[ 1 ]
aValues[ "CODIGO" ]
Por número atrapalha qualquer alteração posterior de estrutura na tabela, e atrapalha a visualização dos campos do fonte.
Por nome tá fácil conferir.

Código: Selecionar todos

      WITH OBJECT cnMySql
         :CreateCreate()
         :QueryAdd( "FINUMLAN", mfiNumLan )
         :QueryAdd( "FITIPLAN", iif( oNFE:Emitente:Cnpj == jpempre->emCnpj, "1", "2" ) )
         :QueryAdd( "FINUMDOC", oNFE:cNumDoc )
         :QueryAdd( "FIDATEMI", oNFE:DataEmissao )
         :QueryAdd( "FIPARCELA", StrZero( 1, 3 ) )
         :QueryAdd( "FICLIFOR", mCliCod )
         :QueryAdd( "FISACADO", mCliCod )
         :QueryAdd( "FIVALOR", oNFE:Totais:ValNot )
         :QueryAdd( "FIDATVEN", oNFE:DataEmissao )
         :QueryAdd( "FIPEDIDO", jppedi->pdPedido )
         :QueryAdd( "FIINCINF", LogInfo() )
         :DBFQueryExecuteInsert()
         :QueryExecuteInsert( "JPFINAN" )
      ENDWITH
Velocidade?
Entre um fonte fácil de alterar ou um fonte que vai ser complicado mexer, talvez melhor sacrificar um pouco de velocidade.
Nada impede de você deixar as duas opções, e o usuário que faça a própria escolha.

HBSQL (Sql Tool)

Enviado: 23 Set 2019 10:05
por Ranier
JoséQuintas escreveu:Não esqueça da opção de usar nome de campo.
Até mesmo na TMySQL tem isso.
E no ADO tem isso também.
Fica extremamente antiprático usar por número ao invés de nome.
Nem que seja array do tipo HASH."
Justo, tanto que já adicionei esse recurso para a HBDBD.
DBD_RES_HASH traz todo o dataset em HASH para o usuário. Enquanto que DBD_FETCH_ROW_HASH, traz uma linha em HASH para o usuário que poderá referenciar diretamente pelo nome do campo.
Acredito que a versão em HASH será um pouco mais lenta, mas como você disse, pode-se ganhar em clareza e facilidade para manutenção do código.

Código: Selecionar todos

aValues[ "CODIGO" ] := 1

HBSQL (Sql Tool)

Enviado: 26 Set 2019 10:40
por JoséQuintas
Ranier

Não lembro se foi no seu fonte, lembro de ter visto o uso de funções separadas dos parêntesis, tipo Str ( 2 )
CUIDADO
Uma onde isso pode ser problema:

SELECT ( nArea )

Select( nArea )

No Clipper/Harbour/XHarbour existe o comando SELECT e a função Select()
O comando é pra trocar área em uso, e a função apenas retorna a área atual, ou a área aonde o arquivo está aberto.
Então... o espaço em branco NESSE caso faz muita diferença.

HBSQL (Sql Tool)

Enviado: 26 Set 2019 12:41
por Ranier
JoséQuintas escreveu:Ranier
Não lembro se foi no seu fonte, lembro de ter visto o uso de funções separadas dos parêntesis, tipo Str ( 2 )
CUIDADO
Uma onde isso pode ser problema:
SELECT ( nArea )
Select( nArea )
No Clipper/Harbour/XHarbour existe o comando SELECT e a função Select()
O comando é pra trocar área em uso, e a função apenas retorna a área atual, ou a área aonde o arquivo está aberto.
Então... o espaço em branco NESSE caso faz muita diferença.
OK, obrigado, irei verificar.
Em Clipper/Harbour sigo mais ou menos o padrão que é sempre usar um espaço separando os "tokens".
Str( 2 )

HBSQL (Sql Tool)

Enviado: 26 Set 2019 17:54
por JoséQuintas
Seria... mas esqueceu de outro detalhe:

SELECT CLIENTE

se cliente é variável ou não... vai selecionar "CLIENTE"

HBSQL (Sql Tool)

Enviado: 27 Set 2019 04:22
por JoséQuintas
Sinto muito.... tudo isso pra nada

SELECT 1
Isto aceita, vai alterar pra área de determinado número, é o que mostra o manual

SELECT CLI
Isto aceita, vai alterar pra área de determinado nome, isto é o que mostra o manual

CLI := 10
SELECT CLI
Não adianta, vai alterar pra área CLI, isto o manual não mostra claramente

CLI := 10
SELECT ( CLI )
Aí sim, vai alterar pra área 10, isto o manual não mostra
Ou... como muitos fazem... SELECT &CLI

HBSQL (Sql Tool)

Enviado: 27 Set 2019 20:02
por rochinha
Amiguinhos,

Não quero mudar o foco do post mas quero colocar somente um pensamento.

quando eu estava criando a ADOxB para manusear arquivos via ADO me deparei com esta questão de usar áreas e selects sem usar números engessados.

Não criei classes, somente as funções que uso até hoje para manusear arquivos SQL remotos em meu sistema.

E o que acho realmente, manter a marcação da seleção por áreas numeradas não funcionariam no meu caso quando usando MDI e creio que se deva pensar em não usar este meio mas sim usar nomes.

Em um aplicativo MDI que se abra duas janelas onde na primeira temos 10 áreas e na posição 8 eu abro o arquivo de venda e minimizo abrindo nova janela com 8 áreas e esta nova janela tenha na posição 8 o arquivo estoque então já sobrescrevi a área da primeira janela.

Tratar posicionamentos com nomes dão mais segurança até na visualização do código.

Um trechinho de como é na ADOxB:

Código: Selecionar todos

    PUBLIC oRs

    ADOSetRDD( "Firebird" )

    StrDatabase   := "Z:\D_\disco\E\FONTES\NFW\harbour\libs\adodb\gdb\adogdb.gdb"
    StrConnection := "DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; Database="+StrDatabase+"; DIALECT=3" //; vendorclient=gds32.dll;"
    
    MsgRun( "Conectando..." )
    
    ADO CONNECT StrConnection

    oRs := oRecordSet

    // Cria tabelas se nao existirem
    if ADOFile( "clientes" )
    else  
       MsgRun( "Criando tabela CLIENTES..." )
       ADO EXECUTE "DROP TABLE clientes"
       ADO EXECUTE "CREATE TABLE clientes (nome char(45), email char(45), unique(nome))"
    endif
    if ADOFile( "siglas" )
    else
       MsgRun( "Criando tabela SIGLAS..." )
       ADO EXECUTE "DROP TABLE siglas"
       ADO EXECUTE "CREATE TABLE siglas (uf char(2), estado char(20), unique(uf))"
    endif
    if ADOFile( "teste" )
    else
       MsgRun( "Criando tabela TESTE..." )
       ADO EXECUTE "DROP TABLE teste"
       ADO EXECUTE "CREATE TABLE teste (uf char(2), estado char(20), unique(uf))"
    endif

    // Abre as tabelas
    ADO USE clientes
    ADO USE siglas

    // Verifica se ja possuem dados
    ADO SELECT clientes
    //ADO GOTOP
    nRegistros := ADORecCount()
    // ? ADOAlias(), nRegistros 
    if nRegistros = 0
       ADO APPEND BLANK
       ADO REPLACE nome        WITH "JOSE CARLOS DA ROCHA"
       ADO REPLACE email       WITH "IROCHINHA@ITELEFONICA.COM.BR"
       ADO COMMIT 
    endif
    ADO SELECT siglas
    //ADO GOTOP
    nRegistros := ADORecCount()
    // ? ADOAlias(), nRegistros 
    if nRegistros = 0
       ADO APPEND BLANK
       ADO REPLACE uf          WITH "SP"
       ADO REPLACE estado      WITH "SAO PAULO"
       ADO COMMIT 
       ADO APPEND BLANK
       ADO REPLACE uf          WITH "RJ"
       ADO REPLACE estado      WITH "RIO DE JANEIRO"
       ADO COMMIT 
    endif

    MsgRun( "Executando..." )
    ADO SELECT clientes
    ADO GOTOP

    MsgRun( "Executando SET FILTER TO nome like '*teste*'..." )
    ADO SET FILTER TO "nome like '*tete*'"
    if ADOEof()
       ? 'Nada foi filtrado'
       ADO SET FILTER TO
       ADO GOTOP
    endif
    Browse( oRs )
    ADO SET FILTER TO

    MsgRun( "Executando LOCATE nome like 'TESTES'..." )
    ADO LOCATE "nome like 'TESTES*'"
    if ADOEof()
       ? 'Nada foi encontrado'
       ADO GOTOP
    endif
    Browse( oRs )

    //MsgRun( "Executando SORT ON nome..." )
    //ADO SORT ON clientes.nome
    //Browse( oRs )

    //WBrowseRecordSet( oRs, StrField2 )
    //Browse( oRs )

    ADO CLOSE
Em suma não testei a HBDBD e não estou criticando, somente apresentando a dificuldade que tive.

HBSQL (Sql Tool)

Enviado: 27 Set 2019 20:33
por JoséQuintas
A velha mania de olhar fontes.....

Porque ao invés disto:

Código: Selecionar todos

 if ADOFile( "clientes" )
    else  
       MsgRun( "Criando tabela CLIENTES..." )
       ADO EXECUTE "DROP TABLE clientes"
       ADO EXECUTE "CREATE TABLE clientes (nome char(45), email char(45), unique(nome))"
    endif
não isto:

Código: Selecionar todos

 if ! ADOFile( "clientes" )
       MsgRun( "Criando tabela CLIENTES..." )
       ADO EXECUTE "DROP TABLE clientes"
       ADO EXECUTE "CREATE TABLE clientes (nome char(45), email char(45), unique(nome))"
    endif
Ou, se possível, trocar tudo por uma única linha:

Código: Selecionar todos

ADO EXECUTE "CREATE TABLE IF NOT EXISTS JPREGUSO ( ..."
Só como curiosidade.... no meu uso:

Código: Selecionar todos

cnMySql:Execute( "CREATE TABLE IF NOT EXISTS JPREGUSO ( ..." )
// oADO:Execute( "CREATE TABLE IF NOT EXISTS JPREGUSO ( ..." )
Uso classe que é pra tratar eventuais problemas, mas seria o mesmo sem ela, basta a conexão.
Neste caso foi só pra curiosidade, no final, qualquer que seja o componente, acaba nos comandos SQL sendo executados mesmo.
Mas fica visível que é a conexão que faz isso, talvez mais fácil de entrar na cabeça de quem não está acostumado.

Pensando bem... talvez eu troque o nome da minha conexão, só não sei o nome adequado, porque ADO é muito comum pra pesquisar em fontes, talvez oConexao mesmo, e como a variável sempre é local, dá pra alterar um fonte de cada vez.