ainda, segue aà meu "caminho das pedras"...
Abraços...
a) Descrição do ambiente
Servidor
Asus, Pentium 4 1.6, 512mb hd 80gb 7200rpm
XP SP2
Antivirus: Avira
Firewall do Windows: ativado; exceções (entre outras): 3306
MySQL 5027
ODBC 3.51
BDE Borland Database Engine (desnecessária nesse caso)
Internet: rádio, 300k (média, 256k)
Estação: PCChips AMD K6 II 500 128mb
Windows98Se
Antivirus: -
Firewall: Não
Internet: discada, 33600
b) Instalado, no servidor, o OTC Mediator v.4.2.6.0 for MySQL
Nenhuma configuração especÃfica foi feita, ou seja, instalei
o Mediator ("free, para 100conexões"), reiniciei a máquina
e iniciei o mediador desktop; o Firewall do XP imediatamente
me perguntou se eu queria mantê-lo bloqueado, ao que respondi
não... (posteriormente, ativei o Mediator como serviço mas
assim não funcionou, então, por enquanto, o "mediator service"
fica na geladeira e sigo com o mediator desktop mesmo...)
c) Criação de uma aplicação teste.
Instalei o Mediator Cliente; ele criou várias subpastas na
pasta "medcl", para xharbour, clipper, oracle, etc...
Foi preciso copiar LIBs e OBJs para as respectivas pastas
do xHarbour.
A versão do XHarbour que eu uso é a 997
- Copiados para a pasta XHarbour\lib: medntxmt.lib, cmnnet32.lib,
medntx.lib, a partir da pasta C:\medcl\Xharbour\lib\build997\b32
- Copiado, para a pasta-fonte da aplicação teste, o arquivo
noautlog.obj, também a partir da pasta C:\medcl\Xharbour\lib\build997\b32
- Criado um arquivo simples de teste:
No Servidor, dentre vários bancos de dados (catálogos) no MySQL, criei uma
query, testada no MySQL Administrator e no DBExplorer (Borland, Delphi 3 a 6),
para visualizar os produtos vendidos em um determinado perÃodo.
Os itens vendidos, com data, quantidade e código de barras, no banco do
Caixa ("siapos02" é o "alias" do caixa02), relacionados à tabela de produtos,
em outro banco ("siafat" que é o alias da "retaguarda").
Criei um arquivo .ini com as configurações para acesso ao MySQL.
Apesar de informar no arquivo ".ini" apenas o banco "siapos02", o Mediator,
do lado do servidor, através do ODBC, acessou os dois bancos e retornou
o que eu realmente queria. O arquivo medapp.ini está descrito mais abaixo.
O programa fonte:
// ******** teste.prg
Function Main()
Param mpcodi, mpauto, mpuser, str_path
// #include 'rddsys.ch'
// REQUEST RDDSYS
#include 'button.ch' // Menu definitions
#include 'inkey.ch' // Key definitions
#include "mediator.ch"
request medntx
RDDSETDEFAULT("MEDNTX")
* Usando comando SQL para visualizar dados de uma tabela...
? "**********************************************************"
? "Usando comandos SQL para visualizar os resultados de uma consulta"
?
sQuery := "select sp_cod, sp_data, sp_qtd, estnome "+;
"from `siapos02`.`term` "+;
"inner join `siafat`.`estcada` "+;
" on (term.sp_cod=estcada.estcodb) "+;
" order by sp_data limit 100"
? sQuery
? "**********************************************************"
Use query AS sQuery
? " Código EAN Nome/Descrição/Identificação do Produto Data Quantidade"
? "------------- ---------------------------------------- ---------- ------- "
While .Not. Eof()
? PadL(sp_cod, 14)+" "+estnome+" "+Dtoc(sp_data)+" "+Str(sp_qtd, 7, 3)
Skip
EndDo
? "**********************************************************"
Use
- Criado um arquivo para fazer a compilação; na definição
LIBFILES foi preciso incluir medntx.lib cmnnet32.lib medntxmt.lib:
#BCC
VERSION=BCB.01
!ifndef CC_DIR
CC_DIR = $(MAKE_DIR)
!endif
!ifndef HB_DIR
HB_DIR = $(HARBOUR_DIR)
!endif
RECURSE= NO
SHELL =
COMPRESS = NO
EXTERNALLIB = NO
XFWH = NO
FILESTOADD = 5
WARNINGLEVEL = 0
USERDEFINE =
USERINCLUDE =
GUI = NO
MT = NO
PROJECT = c:\projetos\fatntx32\teste.exe $(PR)
OBJFILES = teste.obj $(OB)
PRGFILES = teste.prg $(PS)
OBJCFILES = $(OBC)
CFILES = $(CF)
RESFILES =
RESDEPEN =
TOPMODULE = teste.prg
LIBFILES = medntx.lib cmnnet32.lib medntxmt.lib lang.lib vm.lib rtl.lib rdd.lib macro.lib pp.lib dbfntx.lib dbfcdx.lib dbffpt.lib common.lib gtwin.lib codepage.lib ct.lib tip.lib pcrepos.lib hsx.lib hbsix.lib
EXTLIBFILES =
DEFFILE =
HARBOURFLAGS = -w0
CFLAG1 = -OS $(SHELL) $(CFLAGS) -d -c -L$(HB_DIR)\lib
CFLAG2 = -I$(HB_DIR)\include;$(CC_DIR)\include
RFLAGS =
LFLAGS = -L$(CC_DIR)\lib\obj;$(CC_DIR)\lib;$(HB_DIR)\lib -Gn -M -m -s -Tpe -x -ap
IFLAGS =
LINKER = ilink32
ALLOBJ = c0x32.obj $(OBJFILES) $(OBJCFILES)
ALLRES = $(RESDEPEN)
ALLLIB = $(LIBFILES) import32.lib cw32.lib
.autodepend
#DEPENDS
#COMMANDS
.cpp.obj:
$(CC_DIR)\BIN\bcc32 $(CFLAG1) $(CFLAG2) -o$* $**
.c.obj:
$(CC_DIR)\BIN\bcc32 -I$(HB_DIR)\include $(CFLAG1) $(CFLAG2) -o$* $**
.prg.obj:
$(HB_DIR)\bin\harbour -D__EXPORT__ -n -go -I$(HB_DIR)\include $(HARBOURFLAGS) -o$* $**
.rc.res:
$(CC_DIR)\BIN\brcc32 $(RFLAGS) $<
#BUILD
$(PROJECT): $(CFILES) $(OBJFILES) $(RESDEPEN) $(DEFFILE)
$(CC_DIR)\BIN\$(LINKER) @&&!
$(LFLAGS) +
$(ALLOBJ), +
$(PROJECT),, +
$(ALLLIB), +
$(DEFFILE), +
$(ALLRES)
!
**********
- Criada a aplicação, fiz uma cópia do arquivo de configuração da
conexão a ser usada, para a pasta do executável. O arquivo
medapp.ini recebeu os parâmetros para acesso ao banco de dados:
MEDNODEADDR=sampa.homeip.net
medsocket=19c8
medcs=siapos02
meduser=root
medpasswd=adoroklb
d) Executando a aplicação, obtive este resultado:
**********************************************************
Usando comandos SQL para visualizar os resultados de uma consulta
select sp_cod, sp_data, sp_qtd, estnome from `siapos02`.`term` inner join `siafa
t`.`estcada` on (term.sp_cod=estcada.estcodb) order by sp_data limit 100
**********************************************************
C¾digo EAN Nome/DescriþÒo/IdentificaþÒo do Produto Data Quantidade
------------- ---------------------------------------- ---------- -------
0000000159074 SAP.COIOTE 357 07/14/07 1.000
0000000100052 CAMISA POOL 19458 07/26/07 1.000
0000000010207 PICANHA SUINA TEMPERADA CX9 07/31/07 1.000
0000000100052 CAMISA POOL 19458 08/03/07 1.000
0000000149044 CHUCHU 06/05/08 1.000
0000000149044 CHUCHU 06/24/08 0.250
0000000149044 CHUCHU 06/24/08 1.000
0000001210019 CARAMELO UN 06/24/08 2.000
0000000149044 CHUCHU 06/24/08 0.500
0000000149044 CHUCHU 06/24/08 1.000
0000000149044 CHUCHU 06/24/08 0.250
0000001810042 FITA INCOLOR 06/24/08 1.500
0000003940020 MILHO DE PIPOCA PACOTE 100G 06/24/08 1.000
0000003940020 MILHO DE PIPOCA PACOTE 100G 06/24/08 0.500
0000001810042 FITA INCOLOR 06/24/08 1.500
0000001810042 FITA INCOLOR 06/24/08 1.000
0000000149044 CHUCHU 06/24/08 1.000
0000000149044 CHUCHU 06/24/08 0.500
0000000149044 CHUCHU 06/24/08 1.000
0000000149044 CHUCHU 06/24/08 1.250
0000001810042 FITA INCOLOR 06/24/08 1.250
0000001810042 FITA INCOLOR 06/24/08 1.000
**********************************************************
C:\Projetos\fatntx32>
e) Para quem não conhece ainda um comando select do SQL, na lista
acima código, data e quantidade vieram de uma tabela, relacionada
a outra, de onde veio o nome do produto.
f) Bom... e qual a vantagem disso? atualmente, minhas aplicações
xHarbour acessando as tabelas MySQL via DLL desenvolvida no
Delphi são muito mais lentas, uma vez que precisam dos componentes
e DLLs da ZeusLib para acesso ao MySQL.
g) E, finalmente, porque migrar dos DBFs Ntx, CDX, IDX, MDX para
MySQL (ou outro SQL)?
Bom... comecei a "migração" a partir de 2003... de lá prá cá, nunca
mais tive problemas de corrupção de Ãndices, dados corrompidos,
travamentos, etc... pude desenvolver aplicações web rodando
em conjunto com as desktop em Delphi e Clipper (xHarbour)...
A segurança do esquema cliente-servidor, então, não tem
comparação... toda gravação, leitura, acesso é feito no servidor;
Com a Internet então, os avanços são incrÃveis... não preciso de
vpn, pastas compartilhadas, nada de complicado...
Espero ter colaborado...
Abraços!