O uso de LIBs é bom, pois quando se tem muito fonte a ser alterado, elas reduzem o tempo necessário para a mudança deles.
Só que o uso estilo xbase não vai usar NENHUM recurso do MySql, e ao contrário, pode deixar tudo mais lento, e o servidor mais sobrecarregado.
Base de Dados
A base de dados é simplesmente o armazenamento dos dados.
Você salva e busca dados.
Isto é a base tradicional dos DBFs. Só salvar e buscar, e mais nada.
SQL/MySql
No MySql, trata-se de um gerenciamento de base de dados.
É um servidor, com programação própria, que lhe entrega tudo pronto.
Basta um comando SQL e todo processamento já vém pronto.
Exemplos práticos:
Imaginem um banco de dados com duas tabelas:
NOTAS FISCAIS: NUMERO, CODCLIENTE, DATAEMISSAO, VALOR
CLIENTES: CODCLIENTE, NOME
Vamos pegar um relatório médio:
- Somente totais por cliente
- Em ordem alfabética (em ordem de valores, o fonte ficaria muito grande)
- Somente valores acima de 5000
select 0
use notas index codcliente
select 0
use clientes index nome
Goto Top
Do While .Not. Eof()
mSoma := 0
Select notas
Seek clientes->CodCliente
Do While clientes->CodCliente == notas->CodCliente .And. .Not. Eof()
mSoma := mSoma + notas->Valor
Skip
Enddo
select clientes
If mSoma < 5000
Skip
Loop
Endif
@ Row(), 0 Say notas->numero
@ Row(), Col()+2 say notas->codcliente
@ Row(), Col()+2 say clientes->Nome
@ Row(), Col()+2 Say notas->DataEmissao
@ Row(), Col()+2 Say notas->Valor
@ Row()+1, 0 Say ""
Skip
Enddo
close databases
Legal, funciona direito, e se usar uma lib Mysql não precisa mexer no fonte.
Vai acessar o Mysql durante o relatório inteiro, processar TODOS os registros do banco de dados, que irão chegar via rede, ou via internet.
Vai estar usando muito o servidor MySql, mas NADA/ZERO de seus recursos.
Numa base de 10.000 notas, e 1.000 clientes, vai estar trazendo para o terminal 11.000 registros, via rede ou via internet, e também fazendo várias consultas durante o relatório.
Já usando recursos do MySql...
Uma única consulta ao banco e já teria o relatório pronto.
SELECT CODCLIENTE, NOME, SUM(VALOR) SOMA FROM NOTAS GROUP BY CODCLIENTE WHERE SOMA > 5000 ORDER BY NOME
Digamos que existam 100 clientes que atendam essa condição.
No estilo xbase, haverá o tráfego de 11.000 registros pela rede/internet, e várias consultas à base MySql.
Usando recurso do MySql, com a query acima, haverá o tráfego de somente 100 registros pela rede/internet, em uma única consulta à base MySql.
Diferença mais prática?
Suponha a base na internet, e 100 bytes cada registro.
11.000 registros x 100 bytes = 1.100.000 bytes = 1.1MB
100 registros x 100 bytes = 10.000 bytes = 10kb
Numa banda larga de 1MB, que baixa a uns 100kb, o primeiro demora 11 segundos, e o segundo apenas meio segundo, isso sem contar as várias solicitações ao servidor executadas na primeira opção, senão será uma diferença ainda maior.
O programa fica muito mais rápido, e com menos fonte.
Agora, imagine as possibilidades....
Imagine que o relatório poderia ser por ordem de valor.
O fonte em xbase seria muito maior, já em SQL, só mudaria o ORDER BY.
E se fosse total por data?
O fonte em xbase seria diferente, já em SQL, só mudaria o GROUP BY
O SQL permite:
- Totalizar dados (reduz tráfego de dados)
- Relacionar tabelas (reduz consultas)
- Colocar em determinada ordem (reduz processamento local)
- Filtrar dados (reduz tráfego de dados)
Essa é só uma pequena parte das diferenças entre os DBFs e os bancos de dados relacionais.
Ficar preso ao estilo xbase não é interessante.
Ahhh... o fonte modificado... bom, depende da LIB ou linguagem.
Como o ADO é padrão, e no xHarbour fica igual, vai um simbólico meio xHarbour/VB...
Set Rs = Conexao.Execute("SELECT CODCLIENTE, NOME, SUM(VALOR) SOMA FROM NOTAS GROUP BY CODCLIENTE WHERE SOMA > 5000 ORDER BY NOME")
Rs.MoveFirst
Do While Not Rs.Eof()
? rs.Fields("NUMERO").Value
? rs.Fields("CODCLIENTE").Value
? rs.Fields("NOME").Value
? rs.Fields("DATAEMISSAO").Value
? rs.Fields("VALOR").Value
Rs.MoveNext
Loop
Rs.Close
Obs. Uso o ADS no VB, e tudo isso também é permitido. Tudo bem, ADS usa DBF/CDX , mas ADS é um servidor de banco de dados, e não apenas DBF/CDX.