xharbour + ado + oracle
Moderador: Moderadores
xharbour + ado + oracle
Algum dos amigos do forum já fez acesso ao Oracle usando ADO?
Poderia postar um exemplo?
Poderia postar um exemplo?
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
Procure aqui (http://fivetechsoft.com/forums/index.php) por ADORDD ... tb sei q é possivel usar ADO no xHB usando as funções disponiveis no mesmo, mas eu nunca usei.
O ADORDD do Linares é atrelado ao uso com o compilador e nao lib gráfica ou seja, pode ser usado por qqer soft...
Espero q ajude!
O ADORDD do Linares é atrelado ao uso com o compilador e nao lib gráfica ou seja, pode ser usado por qqer soft...
Espero q ajude!
Anderson
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
Dá pra usar ado sem essa lib, procurando pelo drive ole db usado pelo banco que se pretende usar...
A diferença é que não dá pra usar como se fosse um dbf, e sim, sómente através de comandos sql.
Se houver interessados, posso postar exemplos.
Facil de implementar se vc usar minigui, hwgui ou fivewin.
Um pouco mais complicado, no caso de interface caracter.
A diferença é que não dá pra usar como se fosse um dbf, e sim, sómente através de comandos sql.
Se houver interessados, posso postar exemplos.
Facil de implementar se vc usar minigui, hwgui ou fivewin.
Um pouco mais complicado, no caso de interface caracter.
Este exemplo foi tirado da lista da Minigui Brasil, os créditos constam no fonte...
Com ele vc inclui exclui altera....
Está feito com a minigui, mas nada impede de ser usado numa aplicação console.
/*
* Agenda de Contatos (2)
* Humberto Fornazier - Março/2003
* hfornazier@brfree.com.br
*
* xHarbour Compiler Build 0.73.26 (SimpLex )
* Copyright 1999-2002, http://www.xharbour.org http://www.harbour-project.org/
*
* MINIGUI - Harbour Win32 GUI library - Release 60
* Copyright 2002 Roberto Lopez <roblez@ciudad.com.ar>
* http://www.geocities.com/harbour_minigui/
*
*/
/*
Conversao para utilizacao de banco de dados,utilizando a tecnologia ADO
ivanil Marcelino
ivanilm@ig.com.br
Minigui x Xharbour
*/
#Include "minigui.ch"
#Include "winprint.ch"
#define BLUE { 0, 0, 128 }
Function Main()
Local i := 0
****Criar a Conexao
Public CNN
Try
CNN:=CreateObject("ADODB.Connection")
CNN:Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Agenda.mdb")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
ExitProcess(0)
End
****
SET CENTURY ON
Private lNovo := .F.
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 450 ;
HEIGHT 470 ;
TITLE "Agenda de Contatos";
MAIN ;
ICON "AGENDA" ;
NOMAXIMIZE ;
NOSIZE ;
ON RELEASE Finaliza_Sistema() ;
BACKCOLOR BLUE
@ 010,415 Grid GIndice Of Form_1 WIDTH 20 HEIGHT 360 HEADERS {""} WIDTHS { 16 } ;
FONT "Arial" SIZE 07.5 ;
TOOLTIP "Click na Letra Desejada" ;
ON DBLCLICK Pesquisa_Agenda()
@ 010,010 GRID Grid_Agenda ;
WIDTH 398 ;
HEIGHT 360 ;
HEADERS {"Código","Nome"} ;
WIDTHS {53,324} ;
FONT "Arial" SIZE 09 ;
ON DBLCLICK Novo_Registro(.F.)
@ 385,010 BUTTON Btn_Novo Of Form_1 ;
CAPTION '&Novo' ;
ACTION Novo_Registro(.T.) ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Novo Registro" ;
FLAT
@ 385,165 BUTTON Btn_Imprimir Of Form_1 ;
CAPTION '&Imprimir' ;
ACTION Imprimir() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Imprime Contatos" ;
FLAT
@ 385,318 BUTTON Btn_Sair Of Form_1 ;
CAPTION '&Sair' ;
ACTION Form_1.Release ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Finalizar Sistema" ;
FLAT
@415,18 ANIMATEBOX mensagem ;
WIDTH 360 ;
HEIGHT 20 ;
FILE 'MSG02' AUTOPLAY
END WINDOW
For i := 1 To 26
ADD ITEM { CHR(i+64) } TO GIndice OF Form_1
Next
MODIFY CONTROL GIndice OF Form_1 VALUE 1
Pesquisa_Agenda()
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Pesquisa_Agenda()
Local oCursor,cPesq
cPesq:=ValorDaColuna("GIndice","Form_1",1)
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
cPesq := IIf( Empty(cPesq), "A" , cPesq )
oCursor:Open("Select * from agenda where nome like '"+cPesq+"%'"+" order by nome",CNN,2,3)
DELETE ITEM ALL FROM Grid_Agenda OF Form_1
Do While ! oCursor:Eof()
ADD ITEM {oCursor:Fields["Codigo"]:Value,oCursor:Fields["Nome"]:Value} TO Grid_Agenda OF Form_1
oCursor:MoveNext()
EndDo
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Novo_Registro( lNovo_Registro )
Local cCodigo := ""
Local cNome := ""
Local cEndereco := ""
Local cBairro := ""
Local cCep := ""
Local cCidade := ""
Local cEstado := ""
Local cFone1 := ""
Local cFone2 := ""
Local cEmail := ""
Local oCursor
cCodigo := ValorDaColuna( "Grid_Agenda" , "Form_1" , 1 )
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
Form_1.Btn_Novo.Enabled := .F.
Form_1.Btn_Sair.Enabled := .F.
lNovo := lNovo_Registro
If ! lNovo
oCursor:Open("Select * from agenda where codigo='"+cCodigo+"'",CNN,2,3)
if oCursor:Eof()
Release Window ALL
Return
endif
cNome := oCursor:Fields["Nome"]:value
cEndereco := oCursor:Fields["Endereco"]:Value
cBairro := oCursor:Fields["Bairro"]:value
cCep := oCursor:Fields["Cep"]:value
cCidade := oCursor:Fields["Cidade"]:value
cEstado := oCursor:Fields["Estado"]:value
cFone1 := oCursor:Fields["Fone1"]:value
cFone2 := oCursor:Fields["Fone2"]:value
cEmail := oCursor:Fields["EMail"]:value
EndIf
DECLARE WINDOW FORM_1
DECLARE WINDOW FORM_2
DEFINE WINDOW Form_2 ;
AT 0,0 ;
WIDTH 490 ;
HEIGHT 300 ;
TITLE "Agenda de Contatos - "+Iif( lNovo , "Novo Registro" , "Alterando Registro");
ICON "AGENDA" ;
MODAL ;
NOSIZE ;
ON RELEASE {|| Form_1.Btn_Novo.Enabled := .T. , Form_1.Btn_Sair.Enabled := .T. , Form_2.Btn_Excluir.Enabled := .T. , Pesquisa_Agenda() , Form_1.Grid_Agenda.SetFocus() } ;
BACKCOLOR WHITE
@ 10,10 LABEL Label_Codigo ;
VALUE 'Código' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 40,10 LABEL Label_Nome ;
VALUE 'Nome' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 70,10 LABEL Label_Endereco ;
VALUE 'Endereço' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,10 LABEL Label_Bairro ;
VALUE 'Bairro' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,360 LABEL Label_Cep ;
VALUE 'Cep' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,10 LABEL Label_Cidade ;
VALUE 'Cidade' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,345 LABEL Label_Estado ;
VALUE 'Estado' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,10 LABEL Label_Fone1 ;
VALUE 'Fone 1' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,346 LABEL Label_Fone2 ;
VALUE 'Fone 2' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@190,10 LABEL Label_Email ;
VALUE 'e-mail' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 13,70 TEXTBOX T_Codigo ;
WIDTH 40 ;
VALUE cCodigo ;
TOOLTIP 'Código do Contato'
@ 43,70 TEXTBOX T_Nome ;
OF Form_2 ;
WIDTH 400 ;
VALUE cNome ;
TOOLTIP 'Nome do Contato' ;
MAXLENGTH 40 ;
UPPERCASE ;
ON ENTER Iif( ! Empty( Form_2.T_Nome.Value ) , Form_2.T_Endereco.SetFocus , Form_2.T_Nome.SetFocus )
@ 73,70 TEXTBOX T_Endereco ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEndereco ;
TOOLTIP 'Endereço do Contato';
MAXLENGTH 40 ;
UPPERCASE ;
ON GOTFOCUS Form_2.Btn_Salvar.Enabled := .T. ;
ON ENTER Form_2.T_Bairro.SetFocus
@103,70 TEXTBOX T_Bairro ;
OF Form_2 ;
WIDTH 250 ;
VALUE cBairro ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Cep.SetFocus
@103,390 TEXTBOX T_Cep ;
OF Form_2 ;
WIDTH 80 ;
VALUE cCep ;
TOOLTIP 'Cep do Contato' ;
MAXLENGTH 08 ;
UPPERCASE ;
ON ENTER Form_2.T_Cidade.SetFocus
@133,70 TEXTBOX T_Cidade ;
OF Form_2 ;
WIDTH 250 ;
VALUE cCidade ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Estado.SetFocus
@133,390 TEXTBOX T_Estado ;
OF Form_2 ;
WIDTH 30 ;
VALUE cEstado ;
TOOLTIP 'Estado do Contato';
MAXLENGTH 02 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone1.SetFocus
@163,70 TEXTBOX T_Fone1 ;
OF Form_2 ;
WIDTH 110 ;
VALUE cFone1 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone2.SetFocus
@163,390 TEXTBOX T_Fone2 ;
OF Form_2 ;
WIDTH 80 ;
VALUE cFone2 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Email.SetFocus
@193,70 TEXTBOX T_Email ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEmail ;
TOOLTIP 'E-mail do Contato' ;
MAXLENGTH 40 ;
LOWERCASE ;
ON ENTER Form_2.Btn_Salvar.SetFocus
@ 232,70 BUTTON Btn_Salvar Of Form_2 ;
CAPTION '&Salvar' ;
ACTION Salvar_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Salvar Registro" ;
FLAT
@ 232,210 BUTTON Btn_Excluir Of Form_2 ;
CAPTION '&Deletar' ;
ACTION Excluir_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Excluir Registro" ;
FLAT
@ 232,346 BUTTON Btn_Cancelar Of Form_2 ;
CAPTION '&Cancelar' ;
ACTION Sair_do_Form2() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Cancelar Operação" ;
FLAT
END WINDOW
Form_2.T_Codigo.Enabled := .F.
If lNovo
Form_2.Btn_Salvar.Enabled := .F.
Form_2.Btn_Excluir.Enabled := .F.
EndIf
CENTER WINDOW Form_2
ACTIVATE WINDOW Form_2
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Salvar_Registro()
Local ProximoCodigo := "",oCursor,cSQL
Local cCodigo := ""
If Empty( Form_2.T_Nome.Value )
MsgINFO( "Nome não foi Informado!!" , "Agenda" )
Form_2.T_Nome.SetFocus
Return Nil
EndIf
If lNovo
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
oCursor:Open("Select top 1 Codigo from agenda order by codigo desc",CNN,2,3)
if oCursor:Eof()
ProximoCodigo:="0001"
else
ProximoCodigo := StrZero( Val( oCursor:Fields["Codigo"]:Value) + 1 , 4 )
endif
cSql:="INSERT INTO AGENDA (Codigo,Nome,Endereco,Bairro,Cep,Cidade,Estado,Fone1,Fone2,EMail) VALUES ('"
cSql+=ProximoCodigo +"','"
cSql+=Form_2.T_Nome.Value +"','"
cSql+=Form_2.T_Endereco.Value +"','"
cSql+=Form_2.T_Bairro.Value +"','"
cSql+=Form_2.T_Cep.Value +"','"
cSql+=Form_2.T_Cidade.Value +"','"
cSql+=Form_2.T_Estado.Value +"','"
cSql+=Form_2.T_Fone1.Value +"','"
cSql+=Form_2.T_Fone2.Value +"','"
cSql+=Form_2.T_Email.Value +"')"
Else
cSql:="UPDATE AGENDA SET "
cSql+="Nome='"+Form_2.T_Nome.Value +"',"
cSql+="Endereco='"+Form_2.T_Endereco.Value +"',"
cSql+="Bairro='"+Form_2.T_Bairro.Value +"',"
cSql+="CEP='"+Form_2.T_Cep.Value +"',"
cSql+="Cidade='"+Form_2.T_Cidade.Value +"',"
cSql+="Estado='"+Form_2.T_Estado.Value +"',"
cSql+="Fone1='"+Form_2.T_Fone1.Value +"',"
cSql+="Fone2='"+Form_2.T_Fone2.Value +"',"
cSql+="Email='"+Form_2.T_Email.Value +"'"
cSql+= " Where codigo='"+Form_2.T_Codigo.Value+"'"
Endif
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
MsgInfo( "Registo "+Iif( lNovo , "Incluído" ,"Alterado!!" ) )
PosicionaIndice( Left(Form_2.T_Nome.Value,1) )
Pesquisa_Agenda()
Form_2.Release
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Sair_do_Form2()
Form_1.Btn_Novo.Enabled := .T.
Form_1.Btn_Sair.Enabled := .T.
Form_2.Btn_Excluir.Enabled := .T.
Form_2.Release
Pesquisa_Agenda()
Form_1.Grid_Agenda.SetFocus()
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Excluir_Registro()
Local cCodigo:=Form_2.T_Codigo.Value,cSql
If MsgOkCancel ("Confirma Exclusão do Registro??", "Excluir "+cCodigo)
cSql:="DELETE FROM AGENDA WHERE CODIGO='"+cCodigo+"'"
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
EndIf
Form_1.Grid_Agenda.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Finaliza_Sistema()
Return .t.
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ValorDaColuna( ControlName, ParentForm , nCol )
Local aRet := {}
If GetControlType (ControlName,ParentForm) != "GRID"
MsgBox( "Objeto não é um Grid!!")
Return( aRet )
EndIf
nCol := Iif( nCol == Nil .Or. nCol == 0 , 1 , nCol )
aRet := GetProperty ( ParentForm , ControlName , 'Item' , GetProperty( ParentForm , ControlName , 'Value' ) )
Return( aRet[ nCol ] )
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function PosicionaIndice(cLetra)
Local i := 0
For i := 1 To 26
If CHR(i+64) == cLetra
MODIFY CONTROL GIndice OF Form_1 VALUE i
EndIf
Next
Form_1.GIndice.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Imprimir()
Local nLinha:=i:=nReg:=0,cLetra:="",oCursor,Handle,cLinha,Cr:=Chr(13)+chr(10)
Private nFont := 11
Private cArquivo := ""
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+cr+vMat(e:Args))
Return
end
Handle:=fCreate("Rel.tmp")
if Handle<=0
Return
endif
cLetra := ValorDaColuna( "GIndice" , "Form_1" , 1 )
oCursor:Open("Select * from agenda where nome like '"+cLetra+"%'"+" order by nome",CNN,2,3)
Do While ! oCursor:Eof()
If nLinha == 0.or.nLinha>55
cLinha := PadC(" Agenda de Contatos",78)+Cr
cLinha += PadC("Contatos Cadastrados com letra "+cLetra,78)+Cr
cLinha += "Código Nome"+Cr
cLinha += Replicate("-",78)+cr
Fwrite(Handle,cLinha)
nLinha:=5
EndIf
nLinha += 1
nReg += 1
Fwrite(Handle," "+oCursor:Fields["Codigo"]:Value +" "+oCursor:Fields["Nome"]:Value+Cr)
oCursor:MoveNext()
EndDo
cLinha:=Replicate("-",78)+cr
cLinha+="Registros Impressos: "+StrZero(nReg,4)
Fwrite(Handle,cLinha)
fClose(Handle)
cArquivo :=memoRead("REL.TMP")
Define Window Form_3;
At 0,0 ;
Width 450 ;
Height 500 ;
Title "Contatos Cadastrados com Letra "+cLetra;
ICON "AGENDA";
CHILD ;
NOSYSMENU;
NOSIZE ;
BACKCOLOR WHITE
@20,-1 EDITBOX Edit_1 ;
WIDTH 460 ;
HEIGHT 510 ;
VALUE cArquivo ;
TOOLTIP "Contatos Cadastrados com Letra "+cLetra ;
MAXLENGTH 255
@ 01,01 BUTTON Bt_Zoom_Mais ;
CAPTION '&Zoom(+)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(1);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,125 BUTTON Bt_Zoom_menos ;
CAPTION '&Zoom(-)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(2);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,321 BUTTON Sair_1 ;
CAPTION '&Sair' ;
WIDTH 120 HEIGHT 17 ;
ACTION Form_3.Release;
FONT "MS Sans Serif" SIZE 09 FLAT
End window
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Center Window Form_3
Activate Window Form_3
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ZoomLabel(nmm)
If nmm == 1
nFont++
Else
nFont--
Endif
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Static function vMat(a)
Local cMsg:="",I
if valtype(a)="A"
For i=1 to len(a)
if valtype(a)="N"
cMsg += Str(a)+" "
elseif valtype(a)="L"
cMsg += if(a,".T.",".F.")+" "
elseif valtype(a)="D"
cMsg += Dtoc(a)+" "
else
cMsg += a+" "
endif
Next
Endif
Return cMsg
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Com ele vc inclui exclui altera....
Está feito com a minigui, mas nada impede de ser usado numa aplicação console.
/*
* Agenda de Contatos (2)
* Humberto Fornazier - Março/2003
* hfornazier@brfree.com.br
*
* xHarbour Compiler Build 0.73.26 (SimpLex )
* Copyright 1999-2002, http://www.xharbour.org http://www.harbour-project.org/
*
* MINIGUI - Harbour Win32 GUI library - Release 60
* Copyright 2002 Roberto Lopez <roblez@ciudad.com.ar>
* http://www.geocities.com/harbour_minigui/
*
*/
/*
Conversao para utilizacao de banco de dados,utilizando a tecnologia ADO
ivanil Marcelino
ivanilm@ig.com.br
Minigui x Xharbour
*/
#Include "minigui.ch"
#Include "winprint.ch"
#define BLUE { 0, 0, 128 }
Function Main()
Local i := 0
****Criar a Conexao
Public CNN
Try
CNN:=CreateObject("ADODB.Connection")
CNN:Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Agenda.mdb")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
ExitProcess(0)
End
****
SET CENTURY ON
Private lNovo := .F.
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 450 ;
HEIGHT 470 ;
TITLE "Agenda de Contatos";
MAIN ;
ICON "AGENDA" ;
NOMAXIMIZE ;
NOSIZE ;
ON RELEASE Finaliza_Sistema() ;
BACKCOLOR BLUE
@ 010,415 Grid GIndice Of Form_1 WIDTH 20 HEIGHT 360 HEADERS {""} WIDTHS { 16 } ;
FONT "Arial" SIZE 07.5 ;
TOOLTIP "Click na Letra Desejada" ;
ON DBLCLICK Pesquisa_Agenda()
@ 010,010 GRID Grid_Agenda ;
WIDTH 398 ;
HEIGHT 360 ;
HEADERS {"Código","Nome"} ;
WIDTHS {53,324} ;
FONT "Arial" SIZE 09 ;
ON DBLCLICK Novo_Registro(.F.)
@ 385,010 BUTTON Btn_Novo Of Form_1 ;
CAPTION '&Novo' ;
ACTION Novo_Registro(.T.) ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Novo Registro" ;
FLAT
@ 385,165 BUTTON Btn_Imprimir Of Form_1 ;
CAPTION '&Imprimir' ;
ACTION Imprimir() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Imprime Contatos" ;
FLAT
@ 385,318 BUTTON Btn_Sair Of Form_1 ;
CAPTION '&Sair' ;
ACTION Form_1.Release ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Finalizar Sistema" ;
FLAT
@415,18 ANIMATEBOX mensagem ;
WIDTH 360 ;
HEIGHT 20 ;
FILE 'MSG02' AUTOPLAY
END WINDOW
For i := 1 To 26
ADD ITEM { CHR(i+64) } TO GIndice OF Form_1
Next
MODIFY CONTROL GIndice OF Form_1 VALUE 1
Pesquisa_Agenda()
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Pesquisa_Agenda()
Local oCursor,cPesq
cPesq:=ValorDaColuna("GIndice","Form_1",1)
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
cPesq := IIf( Empty(cPesq), "A" , cPesq )
oCursor:Open("Select * from agenda where nome like '"+cPesq+"%'"+" order by nome",CNN,2,3)
DELETE ITEM ALL FROM Grid_Agenda OF Form_1
Do While ! oCursor:Eof()
ADD ITEM {oCursor:Fields["Codigo"]:Value,oCursor:Fields["Nome"]:Value} TO Grid_Agenda OF Form_1
oCursor:MoveNext()
EndDo
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Novo_Registro( lNovo_Registro )
Local cCodigo := ""
Local cNome := ""
Local cEndereco := ""
Local cBairro := ""
Local cCep := ""
Local cCidade := ""
Local cEstado := ""
Local cFone1 := ""
Local cFone2 := ""
Local cEmail := ""
Local oCursor
cCodigo := ValorDaColuna( "Grid_Agenda" , "Form_1" , 1 )
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
Form_1.Btn_Novo.Enabled := .F.
Form_1.Btn_Sair.Enabled := .F.
lNovo := lNovo_Registro
If ! lNovo
oCursor:Open("Select * from agenda where codigo='"+cCodigo+"'",CNN,2,3)
if oCursor:Eof()
Release Window ALL
Return
endif
cNome := oCursor:Fields["Nome"]:value
cEndereco := oCursor:Fields["Endereco"]:Value
cBairro := oCursor:Fields["Bairro"]:value
cCep := oCursor:Fields["Cep"]:value
cCidade := oCursor:Fields["Cidade"]:value
cEstado := oCursor:Fields["Estado"]:value
cFone1 := oCursor:Fields["Fone1"]:value
cFone2 := oCursor:Fields["Fone2"]:value
cEmail := oCursor:Fields["EMail"]:value
EndIf
DECLARE WINDOW FORM_1
DECLARE WINDOW FORM_2
DEFINE WINDOW Form_2 ;
AT 0,0 ;
WIDTH 490 ;
HEIGHT 300 ;
TITLE "Agenda de Contatos - "+Iif( lNovo , "Novo Registro" , "Alterando Registro");
ICON "AGENDA" ;
MODAL ;
NOSIZE ;
ON RELEASE {|| Form_1.Btn_Novo.Enabled := .T. , Form_1.Btn_Sair.Enabled := .T. , Form_2.Btn_Excluir.Enabled := .T. , Pesquisa_Agenda() , Form_1.Grid_Agenda.SetFocus() } ;
BACKCOLOR WHITE
@ 10,10 LABEL Label_Codigo ;
VALUE 'Código' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 40,10 LABEL Label_Nome ;
VALUE 'Nome' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 70,10 LABEL Label_Endereco ;
VALUE 'Endereço' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,10 LABEL Label_Bairro ;
VALUE 'Bairro' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,360 LABEL Label_Cep ;
VALUE 'Cep' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,10 LABEL Label_Cidade ;
VALUE 'Cidade' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,345 LABEL Label_Estado ;
VALUE 'Estado' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,10 LABEL Label_Fone1 ;
VALUE 'Fone 1' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,346 LABEL Label_Fone2 ;
VALUE 'Fone 2' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@190,10 LABEL Label_Email ;
VALUE 'e-mail' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 13,70 TEXTBOX T_Codigo ;
WIDTH 40 ;
VALUE cCodigo ;
TOOLTIP 'Código do Contato'
@ 43,70 TEXTBOX T_Nome ;
OF Form_2 ;
WIDTH 400 ;
VALUE cNome ;
TOOLTIP 'Nome do Contato' ;
MAXLENGTH 40 ;
UPPERCASE ;
ON ENTER Iif( ! Empty( Form_2.T_Nome.Value ) , Form_2.T_Endereco.SetFocus , Form_2.T_Nome.SetFocus )
@ 73,70 TEXTBOX T_Endereco ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEndereco ;
TOOLTIP 'Endereço do Contato';
MAXLENGTH 40 ;
UPPERCASE ;
ON GOTFOCUS Form_2.Btn_Salvar.Enabled := .T. ;
ON ENTER Form_2.T_Bairro.SetFocus
@103,70 TEXTBOX T_Bairro ;
OF Form_2 ;
WIDTH 250 ;
VALUE cBairro ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Cep.SetFocus
@103,390 TEXTBOX T_Cep ;
OF Form_2 ;
WIDTH 80 ;
VALUE cCep ;
TOOLTIP 'Cep do Contato' ;
MAXLENGTH 08 ;
UPPERCASE ;
ON ENTER Form_2.T_Cidade.SetFocus
@133,70 TEXTBOX T_Cidade ;
OF Form_2 ;
WIDTH 250 ;
VALUE cCidade ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Estado.SetFocus
@133,390 TEXTBOX T_Estado ;
OF Form_2 ;
WIDTH 30 ;
VALUE cEstado ;
TOOLTIP 'Estado do Contato';
MAXLENGTH 02 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone1.SetFocus
@163,70 TEXTBOX T_Fone1 ;
OF Form_2 ;
WIDTH 110 ;
VALUE cFone1 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone2.SetFocus
@163,390 TEXTBOX T_Fone2 ;
OF Form_2 ;
WIDTH 80 ;
VALUE cFone2 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Email.SetFocus
@193,70 TEXTBOX T_Email ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEmail ;
TOOLTIP 'E-mail do Contato' ;
MAXLENGTH 40 ;
LOWERCASE ;
ON ENTER Form_2.Btn_Salvar.SetFocus
@ 232,70 BUTTON Btn_Salvar Of Form_2 ;
CAPTION '&Salvar' ;
ACTION Salvar_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Salvar Registro" ;
FLAT
@ 232,210 BUTTON Btn_Excluir Of Form_2 ;
CAPTION '&Deletar' ;
ACTION Excluir_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Excluir Registro" ;
FLAT
@ 232,346 BUTTON Btn_Cancelar Of Form_2 ;
CAPTION '&Cancelar' ;
ACTION Sair_do_Form2() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Cancelar Operação" ;
FLAT
END WINDOW
Form_2.T_Codigo.Enabled := .F.
If lNovo
Form_2.Btn_Salvar.Enabled := .F.
Form_2.Btn_Excluir.Enabled := .F.
EndIf
CENTER WINDOW Form_2
ACTIVATE WINDOW Form_2
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Salvar_Registro()
Local ProximoCodigo := "",oCursor,cSQL
Local cCodigo := ""
If Empty( Form_2.T_Nome.Value )
MsgINFO( "Nome não foi Informado!!" , "Agenda" )
Form_2.T_Nome.SetFocus
Return Nil
EndIf
If lNovo
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
oCursor:Open("Select top 1 Codigo from agenda order by codigo desc",CNN,2,3)
if oCursor:Eof()
ProximoCodigo:="0001"
else
ProximoCodigo := StrZero( Val( oCursor:Fields["Codigo"]:Value) + 1 , 4 )
endif
cSql:="INSERT INTO AGENDA (Codigo,Nome,Endereco,Bairro,Cep,Cidade,Estado,Fone1,Fone2,EMail) VALUES ('"
cSql+=ProximoCodigo +"','"
cSql+=Form_2.T_Nome.Value +"','"
cSql+=Form_2.T_Endereco.Value +"','"
cSql+=Form_2.T_Bairro.Value +"','"
cSql+=Form_2.T_Cep.Value +"','"
cSql+=Form_2.T_Cidade.Value +"','"
cSql+=Form_2.T_Estado.Value +"','"
cSql+=Form_2.T_Fone1.Value +"','"
cSql+=Form_2.T_Fone2.Value +"','"
cSql+=Form_2.T_Email.Value +"')"
Else
cSql:="UPDATE AGENDA SET "
cSql+="Nome='"+Form_2.T_Nome.Value +"',"
cSql+="Endereco='"+Form_2.T_Endereco.Value +"',"
cSql+="Bairro='"+Form_2.T_Bairro.Value +"',"
cSql+="CEP='"+Form_2.T_Cep.Value +"',"
cSql+="Cidade='"+Form_2.T_Cidade.Value +"',"
cSql+="Estado='"+Form_2.T_Estado.Value +"',"
cSql+="Fone1='"+Form_2.T_Fone1.Value +"',"
cSql+="Fone2='"+Form_2.T_Fone2.Value +"',"
cSql+="Email='"+Form_2.T_Email.Value +"'"
cSql+= " Where codigo='"+Form_2.T_Codigo.Value+"'"
Endif
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
MsgInfo( "Registo "+Iif( lNovo , "Incluído" ,"Alterado!!" ) )
PosicionaIndice( Left(Form_2.T_Nome.Value,1) )
Pesquisa_Agenda()
Form_2.Release
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Sair_do_Form2()
Form_1.Btn_Novo.Enabled := .T.
Form_1.Btn_Sair.Enabled := .T.
Form_2.Btn_Excluir.Enabled := .T.
Form_2.Release
Pesquisa_Agenda()
Form_1.Grid_Agenda.SetFocus()
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Excluir_Registro()
Local cCodigo:=Form_2.T_Codigo.Value,cSql
If MsgOkCancel ("Confirma Exclusão do Registro??", "Excluir "+cCodigo)
cSql:="DELETE FROM AGENDA WHERE CODIGO='"+cCodigo+"'"
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
EndIf
Form_1.Grid_Agenda.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Finaliza_Sistema()
Return .t.
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ValorDaColuna( ControlName, ParentForm , nCol )
Local aRet := {}
If GetControlType (ControlName,ParentForm) != "GRID"
MsgBox( "Objeto não é um Grid!!")
Return( aRet )
EndIf
nCol := Iif( nCol == Nil .Or. nCol == 0 , 1 , nCol )
aRet := GetProperty ( ParentForm , ControlName , 'Item' , GetProperty( ParentForm , ControlName , 'Value' ) )
Return( aRet[ nCol ] )
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function PosicionaIndice(cLetra)
Local i := 0
For i := 1 To 26
If CHR(i+64) == cLetra
MODIFY CONTROL GIndice OF Form_1 VALUE i
EndIf
Next
Form_1.GIndice.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Imprimir()
Local nLinha:=i:=nReg:=0,cLetra:="",oCursor,Handle,cLinha,Cr:=Chr(13)+chr(10)
Private nFont := 11
Private cArquivo := ""
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+cr+vMat(e:Args))
Return
end
Handle:=fCreate("Rel.tmp")
if Handle<=0
Return
endif
cLetra := ValorDaColuna( "GIndice" , "Form_1" , 1 )
oCursor:Open("Select * from agenda where nome like '"+cLetra+"%'"+" order by nome",CNN,2,3)
Do While ! oCursor:Eof()
If nLinha == 0.or.nLinha>55
cLinha := PadC(" Agenda de Contatos",78)+Cr
cLinha += PadC("Contatos Cadastrados com letra "+cLetra,78)+Cr
cLinha += "Código Nome"+Cr
cLinha += Replicate("-",78)+cr
Fwrite(Handle,cLinha)
nLinha:=5
EndIf
nLinha += 1
nReg += 1
Fwrite(Handle," "+oCursor:Fields["Codigo"]:Value +" "+oCursor:Fields["Nome"]:Value+Cr)
oCursor:MoveNext()
EndDo
cLinha:=Replicate("-",78)+cr
cLinha+="Registros Impressos: "+StrZero(nReg,4)
Fwrite(Handle,cLinha)
fClose(Handle)
cArquivo :=memoRead("REL.TMP")
Define Window Form_3;
At 0,0 ;
Width 450 ;
Height 500 ;
Title "Contatos Cadastrados com Letra "+cLetra;
ICON "AGENDA";
CHILD ;
NOSYSMENU;
NOSIZE ;
BACKCOLOR WHITE
@20,-1 EDITBOX Edit_1 ;
WIDTH 460 ;
HEIGHT 510 ;
VALUE cArquivo ;
TOOLTIP "Contatos Cadastrados com Letra "+cLetra ;
MAXLENGTH 255
@ 01,01 BUTTON Bt_Zoom_Mais ;
CAPTION '&Zoom(+)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(1);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,125 BUTTON Bt_Zoom_menos ;
CAPTION '&Zoom(-)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(2);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,321 BUTTON Sair_1 ;
CAPTION '&Sair' ;
WIDTH 120 HEIGHT 17 ;
ACTION Form_3.Release;
FONT "MS Sans Serif" SIZE 09 FLAT
End window
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Center Window Form_3
Activate Window Form_3
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ZoomLabel(nmm)
If nmm == 1
nFont++
Else
nFont--
Endif
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Static function vMat(a)
Local cMsg:="",I
if valtype(a)="A"
For i=1 to len(a)
if valtype(a)="N"
cMsg += Str(a)+" "
elseif valtype(a)="L"
cMsg += if(a,".T.",".F.")+" "
elseif valtype(a)="D"
cMsg += Dtoc(a)+" "
else
cMsg += a+" "
endif
Next
Endif
Return cMsg
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Antes que alguem diga alguma coisa por estar usando o MS-Access, isto é só para testes, nada impede de usar firebird, mssqlserver, postgre, mysql, oracle, sybase, ou qualquer outro banco, só precisa ter o provider correto.
Usando bd´s SQL, vc pode usar inclusive pra conexão remota, onde, é claro, não se usa grids carregados com todos os clientes e outros macetes....
Imagine uma consulta retornando mil registros retornando numa conexão meio lenta...
Mas que funciona, isso funciona mesmo !
Usando bd´s SQL, vc pode usar inclusive pra conexão remota, onde, é claro, não se usa grids carregados com todos os clientes e outros macetes....
Imagine uma consulta retornando mil registros retornando numa conexão meio lenta...
Mas que funciona, isso funciona mesmo !
Outra coisa, o pessoal que tá usando as libs nativas, podem querer me crucificar.....
hehehe....
Mas usando esse tipo de conexão, possibilita a troca do banco com facilidade, pois vc pode migrar do firebird pro mysql ou postgre, simplesmente migrando a base e fazendo pequenos acerto, tipo o modo como o banco trata datas, e etc...
No caso das libs nativas, vc não poderá fazer isso.
no exemplo que passei, pode-se simlesmente importar o arquivo access no MS-SqlServer, trocar o provider e sair usando o banco sql da microsoft sem traumas...
Meu msn tá a disposição ramon15061959@hotmail.com
Eu acho que o uso de sql, independente do meio usado, como a sqllib do Vailton, otima por sinal, ou as libs do contrib, tudo é valido, desde que passemos a usar o poder e a estabilidade dos bancos sql.
Esse é o meu recado...
hehehe....
Mas usando esse tipo de conexão, possibilita a troca do banco com facilidade, pois vc pode migrar do firebird pro mysql ou postgre, simplesmente migrando a base e fazendo pequenos acerto, tipo o modo como o banco trata datas, e etc...
No caso das libs nativas, vc não poderá fazer isso.
no exemplo que passei, pode-se simlesmente importar o arquivo access no MS-SqlServer, trocar o provider e sair usando o banco sql da microsoft sem traumas...
Meu msn tá a disposição ramon15061959@hotmail.com
Eu acho que o uso de sql, independente do meio usado, como a sqllib do Vailton, otima por sinal, ou as libs do contrib, tudo é valido, desde que passemos a usar o poder e a estabilidade dos bancos sql.
Esse é o meu recado...
Legal a postagem do nosso amigo RamonXHB.
Mas sendo o chato, eu gostaria de um exemplo usando acesso ao Oracle.
Eu gostaria de saber se alguem já esteve trabalhando nisso.
Já peguei material de acesso ao MySQL tb.
Mas sendo o chato, eu gostaria de um exemplo usando acesso ao Oracle.
Eu gostaria de saber se alguem já esteve trabalhando nisso.
Já peguei material de acesso ao MySQL tb.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Ramon:
Tche, legal seu exemplo...mas tem que linkar alguma LIB....no começo vc diz que não é nescessario usa a LIB do Antonio Linares...como faço ? outra coisa onde consigo uma documentação sobre isso ou mais exemplos usando o MYSQL ?
Abraços
Leonardo Machado
Tche, legal seu exemplo...mas tem que linkar alguma LIB....no começo vc diz que não é nescessario usa a LIB do Antonio Linares...como faço ? outra coisa onde consigo uma documentação sobre isso ou mais exemplos usando o MYSQL ?
Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql

