en Ejemplos

Agenda de Contactos MySQL

En esta oportunidad mostraremos el código para gestionar una agenda de contactos que utiliza una base de datos MySQL, se usa como recursos OOHG y TMySQL que viene como contribución por defecto, con Harbour.

2015-06-06_131341
2015-06-06_131412
2015-06-06_131435
2015-06-06_131456

/*
 *  Agenda de Contactos 2
 *  Humberto Fornazier - Marzo 2003 <[email protected]>
 *
 *  Agenda de Contactos 2 ADO
 *  Adapted by Ivanil Marcelino <[email protected]>
 *
 *  Agenda de Contactos 2 MySQL
 *  Adapted and Enhanced by MigSoft - 2015 <migsoft at oohg.org>
 *
 */

#Include "oohg.ch"

#define DARKCYAN   { 0,139,139 }

*------------------------------------------------------------*
Function Main()
*------------------------------------------------------------*
    Local i := 0
    PUBLIC cServer := "localhost"
    PUBLIC cUser   := "root"
    PUBLIC cPaswd  := ""

    oServer := TMySQLServer():New( cServer, cUser, cPaswd )
    if oServer:NetErr()
        oServer := Nil
        msgstop( "Conexión no establecida","Error !!! ONE")
        Return Nil
    ENDIF

    Prepare_Data( oServer )

    SET CENTURY ON
    Private lNuevo := .F.
    DEFINE WINDOW Form_1   ;
        AT 0,0               ;
        WIDTH 450  ;
        HEIGHT 470 ;
        TITLE "Agenda de Contactos MySQL";
        MAIN                 ;
        ICON "AGENDA"  ;
        NOMAXIMIZE ;
        NOSIZE     ;
        ON RELEASE Finaliza_Sistema(oServer) ;
        BACKCOLOR DARKCYAN

        @ 010,415 Grid GIndice Of Form_1 WIDTH 20 ;
            HEIGHT 360 HEADERS {""} WIDTHS { 16 } ;
            FONT "Arial" SIZE 07.5 ;
            TOOLTIP "Click en Letra Deseada"  ;
            ON DBLCLICK captura_Agenda()

        @ 010,010 GRID Grid_Agenda        ;
            WIDTH  398           ;
            HEIGHT 360           ;
            HEADERS {"Código","Nombre"}    ;
            WIDTHS  {53,324}     ;
            FONT "Arial" SIZE 09     ;
            ON DBLCLICK Nuevo_Registro(.F.)

        @ 385,010  BUTTON Btn_Nuevo Of Form_1  ;
            CAPTION '&Nuevo'       ;
            ACTION Nuevo_Registro(.T.)       ;
            WIDTH 120 HEIGHT 27     ;
            FONT "Arial" SIZE 09      ;
            TOOLTIP "Nuevo Registro"       ;
            FLAT

        @ 385,165  BUTTON Btn_Imprimir Of Form_1  ;
            CAPTION '&Imprimir'       ;
            ACTION Imprimir()       ;
            WIDTH 120 HEIGHT 27     ;
            FONT "Arial" SIZE 09      ;
            TOOLTIP "Imprime Contactos"    ;
            FLAT

        @ 385,318  BUTTON Btn_Salir Of Form_1  ;
            CAPTION '&Salir'       ;
            ACTION  Finaliza_Sistema( oServer )   ;
            WIDTH 120 HEIGHT 27     ;
            FONT "Arial" SIZE 09      ;
            TOOLTIP "Finalizar Sistema"   ;
            FLAT

    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
    captura_Agenda()
    CENTER WINDOW   Form_1
    ACTIVATE WINDOW Form_1
Return
*------------------------------------------------------------*
Function Finaliza_Sistema(oServer)
*------------------------------------------------------------*
    oServer := Nil
    Form_1.Release
Return .t.
*------------------------------------------------------------*
Function captura_Agenda()
*------------------------------------------------------------*
    Local cPesq

    cPesq  := ValorDeColumna("GIndice","Form_1",1)
    cPesq  := IIf( Empty(cPesq), "A" , cPesq )
    oQuery := oServer:Query("Select * from agenda where nombre like '"+;
              cPesq+"%'"+" order by nombre")
    IF !(oQuery:Neterr())
        DELETE ITEM ALL FROM Grid_Agenda OF Form_1
        Do While ! oQuery:Eof()
            ADD ITEM {oQuery:FieldGet("codigo"),oQuery:FieldGet("nombre")} ;
                     TO Grid_Agenda OF Form_1
            oQuery:Skip()
        EndDo
    ELSE
        msgstop( "Conexión no establecida","Error!!! TWO")
    ENDIF

Return Nil
*------------------------------------------------------------*
Function Nuevo_Registro( lNuevo_Registro  )
*------------------------------------------------------------*
    Local cCodigo	:= ""
    Local cNombre       := ""
    Local cFone1	:= ""
    Local cFone2	:= ""
    Local cFone3        := ""
    Local cFone4	:= ""
    Local cEmpresa	:= ""
    Local cDireccion	:= ""
    Local cPais	        := ""
    Local cEmail	:= ""

    cCodigo := ValorDeColumna( "Grid_Agenda" ,  "Form_1" , 1 )

    IF  oServer  != NIL
        Form_1.Btn_Nuevo.Enabled	:= .F.
        Form_1.Btn_Salir.Enabled	:= .F.

        lNuevo := lNuevo_Registro

        If ! lNuevo
            oQuery := oServer:Query("Select * from agenda where codigo='"+cCodigo+"'")
            if oQuery:Eof()
                Release Window ALL
                Return
            endif
            cNombre      := oQuery:FieldGet("Nombre")
            cFone1       := oQuery:FieldGet("Fono1")
            cFone2       := oQuery:FieldGet("Fono2")
            cFone3       := oQuery:FieldGet("Fono3")
            cFone4       := oQuery:FieldGet("Fono4")
            cEmpresa     := oQuery:FieldGet("Empresa")
            cDireccion   := oQuery:FieldGet("Direccion")
            cEmail       := oQuery:FieldGet("Email")
            cPais        := oQuery:FieldGet("Pais")
        EndIf

        DEFINE WINDOW Form_2   ;
            AT 0,0	              ;
            WIDTH 528	;
            HEIGHT 344	;
            TITLE "Agenda de Contactos - " + ;
                   Iif( lNuevo , "Nuevo Registro" , "Modificando Registro");
            ICON "AGENDA"	       ;
            MODAL		       ;
            NOSIZE		       ;
            ON RELEASE  Salida_F2()    ;
            BACKCOLOR WHITE

            DEFINE FRAME Frame_1
            ROW    10
            COL    10
            WIDTH  500
            HEIGHT 250
            OPAQUE .T.
            END FRAME

            @ 30,20 LABEL Label_Codigo	;
                VALUE 'Código'		;
                WIDTH 140		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @ 60,20 LABEL Label_Nombre	;
                VALUE 'Nombre'		;
                WIDTH 80		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @ 90,20 LABEL Label_Fone1	;
                VALUE 'Teléfono 1'		;
                WIDTH 80		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @120,20 LABEL Label_Fone2	;
                VALUE 'Teléfono 2'		;
                WIDTH 80		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @90,270 LABEL Label_Fone3       ;
                VALUE 'Teléfono 3'		;
                WIDTH 80			;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @120,270 LABEL Label_Fone4	;
                VALUE 'Teléfono 4'		;
                WIDTH 80		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @150,20 LABEL Label_Empresa	;
                VALUE 'Empresa'		;
                WIDTH 80			;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @180,20 LABEL Label_Direccion ;
                VALUE 'Dirección'		;
                WIDTH 80			;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @210,20 LABEL Label_Email ;
                VALUE 'E-Mail'		;
                WIDTH 80			;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @210,325 LABEL Label_Estado	;
                VALUE 'País'		;
                WIDTH 50		;
                HEIGHT 30		;
                FONT 'Arial' SIZE 09      ;
                BACKCOLOR WHITE   ;
                FONTCOLOR DARKCYAN BOLD

            @ 30,120 TEXTBOX T_Codigo		;
                WIDTH 80			;
                VALUE cCodigo      ;
                TOOLTIP 'Código de Contacto'

            @ 60,120 TEXTBOX T_Nombre      ;
                OF Form_2		;
                WIDTH 370		;
                VALUE cNombre		;
                TOOLTIP 'Nombre de Contacto'	;
                MAXLENGTH 40		;
                UPPERCASE		;
                ON ENTER Iif( ! Empty( Form_2.T_Nombre.Value ) , ;
                   Form_2.T_Direccion.SetFocus , Form_2.T_Nombre.SetFocus )

            @ 90,120 TEXTBOX T_Fone1   ;
                OF Form_2      ;
                WIDTH 120        ;
                VALUE cFone1      ;
                TOOLTIP 'Teléfono de Contacto';
                MAXLENGTH 10     ;
                UPPERCASE        ;
                ON GOTFOCUS Form_2.Btn_Salvar.Enabled := .T.  ;
                ON ENTER Form_2.T_Fone2.SetFocus

            @120,120 TEXTBOX T_Fone2     ;
                OF Form_2      ;
                WIDTH 120		;
                VALUE cFone2		;
                TOOLTIP 'Teléfono de Contacto'	;
                MAXLENGTH 10		;
                UPPERCASE		;
                ON ENTER Form_2.T_Fone3.SetFocus

            @90,370 TEXTBOX T_Fone3       ;
                OF Form_2     ;
                WIDTH 120      ;
                VALUE cFone3		;
                TOOLTIP 'Teléfono de Contacto'	;
                MAXLENGTH 10		;
                UPPERCASE		;
                ON ENTER Form_2.T_Empresa.SetFocus

            @120,370 TEXTBOX T_Fone4     ;
                OF Form_2     ;
                WIDTH 120		;
                VALUE cFone4		;
                TOOLTIP 'Teléfono de Contacto'	;
                MAXLENGTH 10		;
                UPPERCASE		;
                ON ENTER Form_2.T_Empresa.SetFocus

            @150,120 TEXTBOX T_Empresa    ;
                OF Form_2     ;
                WIDTH 370		;
                VALUE cEmpresa		;
                TOOLTIP 'Empresa';
                MAXLENGTH 40		;
                UPPERCASE		;
                ON ENTER Form_2.T_Direccion.SetFocus

            @180,120 TEXTBOX T_Direccion      ;
                OF Form_2       ;
                WIDTH 370		;
                VALUE cDireccion		;
                TOOLTIP 'Dirección de Contacto';
                MAXLENGTH 40		;
                UPPERCASE		;
                ON ENTER Form_2.T_Email.SetFocus

            @210,120 TEXTBOX T_Email ;
                OF Form_2     ;
                WIDTH 180		;
                VALUE cEmail		;
                TOOLTIP 'E-Mail de Contacto';
                MAXLENGTH 30		;
                ON ENTER Form_2.T_Pais.SetFocus

            @210,370 TEXTBOX T_Pais      ;
                OF Form_2       ;
                WIDTH 120		;
                VALUE cPais		;
                TOOLTIP 'País de Contacto'	;
                MAXLENGTH 02		;
                UPPERCASE		;
                ON ENTER Form_2.Btn_Salvar.SetFocus

            @ 270,150 BUTTON Btn_Salvar Of Form_2	;
                CAPTION '&Salvar'     ;
                ACTION Salvar_Registro()        ;
                WIDTH 100 HEIGHT 28     ;
                FONT "Arial" SIZE 09      ;
                TOOLTIP "Salvar Registro" ;
                FLAT

            @ 270,280  BUTTON Btn_Excluir Of Form_2   ;
                CAPTION '&Eliminar'        ;
                ACTION Excluir_Registro()   ;
                WIDTH 100 HEIGHT 28     ;
                FONT "Arial" SIZE 09      ;
                TOOLTIP "Excluir Registro"    ;
                FLAT

            @ 270,410  BUTTON Btn_Cancelar Of Form_2  ;
                CAPTION '&Cancelar'       ;
                ACTION Salir_do_Form2()      ;
                WIDTH 100 HEIGHT 28     ;
                FONT "Arial" SIZE 09      ;
                TOOLTIP "Cancelar Operación"   ;
                FLAT

        END WINDOW
        Form_2.T_Codigo.Enabled := .F.

        If lNuevo
            Form_2.Btn_Salvar.Enabled := .F.
            Form_2.Btn_Excluir.Enabled := .F.
        EndIf

        CENTER WINDOW   Form_2
        ACTIVATE WINDOW Form_2

    ELSE
        msgstop( "Conexión no establecida","Error!!! NUEVO")
    ENDIF
Return Nil
*------------------------------------------------------------*
Procedure Salida_F2
*------------------------------------------------------------*
    Form_1.Btn_Nuevo.Enabled    := .T.
    Form_1.Btn_Salir.Enabled    := .T.
    Form_2.Btn_Excluir.Enabled := .T.
    captura_Agenda()
    Form_1.Grid_Agenda.SetFocus()
Return
*------------------------------------------------------------*
Function Salvar_Registro()
*------------------------------------------------------------*
    Local ProximoCodigo := "", cSQL
    Local cCodigo := ""

    If Empty( Form_2.T_Nombre.Value )
        MsgINFO( "Se debe Indicar Nombre!!!" , "Agenda" )
        Form_2.T_Nombre.SetFocus
        Return Nil
    EndIf

    oQuery := oServer:Query("Select Codigo from agenda order by codigo desc")
    oQuery:GoTop()

    IF !(oQuery:Neterr())

        If  lNuevo

            if oQuery:Eof()
                ProximoCodigo:="0001"
            else
                ProximoCodigo := StrZero( Val(oQuery:FieldGet("Codigo")) + 1 , 4 )
            endif

            Form_2.T_Codigo.Value := ProximoCodigo

            cSql:="INSERT INTO AGENDA (Codigo,Nombre,Fono1,Fono2,Fono3,Fono4,";
                  +"Empresa,Direccion,Email,Pais) VALUES ('"
            cSql+=ProximoCodigo             +"','"
            cSql+=Form_2.T_Nombre.Value     +"','"
            cSql+=Form_2.T_Fone1.Value      +"','"
            cSql+=Form_2.T_Fone2.Value      +"','"
            cSql+=Form_2.T_Fone3.Value      +"','"
            cSql+=Form_2.T_Fone4.Value      +"','"
            cSql+=Form_2.T_Empresa.Value    +"','"
            cSql+=Form_2.T_Direccion.Value  +"','"
            cSql+=Form_2.T_Email.Value      +"','"
            cSql+=Form_2.T_Pais.Value       +"')"
        Else
            cSql:="UPDATE AGENDA SET "
            cSql+="Nombre='"+Form_2.T_Nombre.Value        +"',"
            cSql+="Fono1='"+Form_2.T_Fone1.Value          +"',"
            cSql+="Fono2='"+Form_2.T_Fone2.Value          +"',"
            cSql+="Fono3='"+Form_2.T_Fone3.Value          +"',"
            cSql+="Fono4='"+Form_2.T_Fone4.Value          +"',"
            cSql+="Empresa='"+Form_2.T_Empresa.Value      +"',"
            cSql+="Direccion='"+Form_2.T_Direccion.Value  +"',"
            cSql+="Email='"+Form_2.T_Email.Value          +"',"
            cSql+="Pais='"+Form_2.T_Pais.Value            +"'"
            cSql+=" Where codigo='"+Form_2.T_Codigo.Value +"'"
        Endif

        oServer:Query( cSQL )

        If !( oServer:NetErr() )
            MsgInfo( "Registo "+Iif( lNuevo , "Incluído" ,"Modificado!!" )  )
        Endif

    ELSE
        msgstop( "Conexión no establecida","Error!!! SAVE")
    ENDIF

    PosicionaIndice( Left(Form_2.T_Nombre.Value,1) )
    captura_Agenda()
    Form_2.Release

Return Nil
*------------------------------------------------------------*
Function Salir_do_Form2()
*------------------------------------------------------------*
    Form_1.Btn_Nuevo.Enabled	:= .T.
    Form_1.Btn_Salir.Enabled	:= .T.
    Form_2.Btn_Excluir.Enabled := .T.
    Form_2.Release
    captura_Agenda()
    Form_1.Grid_Agenda.SetFocus()
Return Nil
*------------------------------------------------------------*
Function Excluir_Registro()
*------------------------------------------------------------*
    Local cCodigo:=Form_2.T_Codigo.Value,cSql
    If MsgOkCancel ("Confirma Exclusión de Registro??", "Excluir "+cCodigo)
        cSql:="DELETE FROM AGENDA WHERE CODIGO='"+cCodigo+"'"
        oServer:Query( cSQL )
    EndIf
    PosicionaIndice( Left(Form_2.T_Nombre.Value,1) )
    captura_Agenda()
    Form_2.Release
    Form_1.Grid_Agenda.SetFocus
Return Nil
*------------------------------------------------------------*
Function ValorDeColumna( ControlName, ParentForm , nCol )
*------------------------------------------------------------*
    Local aRet := {}
    If GetControlType (ControlName,ParentForm) != "GRID"
        MsgBox( "Objeto no esta en un 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 nLinea:=i:=nReg:=0,cLetra:="",oQuery,Handle,cLinea,Cr:=Chr(13)+chr(10)
    Private nFont := 11
    Private cArquivo := ""

    IF  oServer != NIL
        Handle:=fCreate("Rel.tmp")
        if Handle<=0
            Return
        endif
        cLetra := ValorDeColumna( "GIndice" ,  "Form_1" , 1 )
        oQuery := oServer:Query("Select * from agenda where nombre like '"+;
                  cLetra+"%'"+" order by nombre")
        Do While ! oQuery:Eof()
            If nLinea == 0.or.nLinea>55
                cLinea := PadC(" Agenda de Contactos",78)+Cr
                cLinea += PadC("Contactos por letra "+cLetra,78)+Cr
                cLinea += "Código  Nombre"+Cr
                cLinea += Replicate("-",78)+cr
                Fwrite(Handle,cLinea)
                nLinea:=5
            EndIf
            nLinea += 1
            nReg   += 1
            Fwrite(Handle,"  "+oQuery:FieldGet("Codigo") +;
                     "   "+oQuery:FieldGet("Nombre")+Cr)
            oQuery:Skip()
        EndDo
        cLinea := Replicate("-",78)+cr
        cLinea+="Registros Impresos: "+StrZero(nReg,4)
        Fwrite(Handle,cLinea)
        fClose(Handle)
        cArquivo :=memoRead("REL.TMP")
        Define Window Form_3;
            At 0,0              ;
            Width 450        ;
            Height 500       ;
            Title "Contactos por Letra "+cLetra;
            ICON "AGENDA";
            CHILD ;
            NOSYSMENU;
            NOSIZE       ;
            BACKCOLOR WHITE

            @20,-1 EDITBOX Edit_1 ;
                WIDTH 460 ;
                HEIGHT 510 ;
                VALUE cArquivo ;
                TOOLTIP "Contactos por Letra "+cLetra ;
                MAXLENGTH 255

            @ 01,01 BUTTON Bt_Zoom_mas  ;
                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 Salir_1  ;
                CAPTION '&Salir'             ;
                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
    ELSE
        msgstop( "Conexión no establecida", "Error!!! IMPRIMIR")
    ENDIF

Return Nil
*------------------------------------------------------------*
Function ZoomLabel(nmm)
*------------------------------------------------------------*
    If nmm == 1
        nFont++
    Else
        nFont--
    Endif
    MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Return Nil
*------------------------------------------------------------*
Function Prepare_data( oServer )
*------------------------------------------------------------*
    Local lResp1 := .F., lResp2 := .F.

    Database_Create( "test", oServer )
    Database_Connect( "test", oServer )
    Table_Create( "agenda", oServer )

Return Nil
*------------------------------------------------------------*
Function Database_Connect( cDatabase, oServer )
*------------------------------------------------------------*
    Local i:= 0
    Local aDatabaseList:= {}

    cDatabase:= Lower(cDatabase)
    If oServer == Nil
        MsgInfo("No conectado con Servidor MySQL!")
        Return Nil
    EndIf

    aDatabaseList:= oServer:ListDBs()
    If oServer:NetErr()
        MsgInfo("Error verificando lista de bases de datos: " + oServer:Error())
        Return Nil
    Endif

    If AScan( aDatabaseList, Lower(cDatabase) ) == 0
        MsgInfo( "Base de Datos "+cDatabase+" no existe!")
        Return Nil
    EndIf

    oServer:SelectDB( cDatabase )
    If oServer:NetErr()
        MsgInfo("Error conectando con base de datos "+cDatabase+": "+oServer:Error() )
        Return Nil
    Endif

Return Nil
*------------------------------------------------------------*
Function  Database_Create( cDatabase, oServer )
*------------------------------------------------------------*
    Local aDatabaseList := {}, lResp := .F.

    cDatabase := Lower( cDatabase )

    If oServer == Nil
        MsgInfo("No conectado con Servidor MySQL!")
        lResp := .F.
        Return lResp
    EndIf

    aDatabaseList := oServer:ListDBs()

    If oServer:NetErr()
        MsgInfo("Error verificando lista de base de datos: " + oServer:Error())
        lResp := .F.
        Return lResp
    Endif

    If AScan( aDatabaseList, Lower(cDatabase) ) != 0
        //MsgInfo( "Base de Datos ya existe!")
        lResp := .F.
        aDatabaseList := {}
        Return lResp
    EndIf

    oServer:CreateDatabase( cDatabase )

    If oServer:NetErr()
        MsgInfo("Error creando Base de Datos: " + oServer:Error() )
        lResp := .F.
    Else
        lResp := .T.
    Endif

Return( lResp )
*------------------------------------------------------------*
Function Table_Create( cTable, oServer )
*------------------------------------------------------------*
    Local aTableList := {}
    Local cQuery, lResp := .F.

    If oServer == Nil
        MsgStop("No conectado con Servidor MySQL...")
        lResp := .F.
        Return lResp
    EndIf

    aTableList := oServer:ListTables()
    If oServer:NetErr()
        MsgStop("Error verificando lista de tablas: " + oServer:Error() )
        lResp := .F.
        Return lResp
    Endif

    If AScan( aTableList, Lower(cTable) ) != 0
        //MsgStop( "Tabla "+cTable+" ya existe!")
        lResp := .F.
        Return lResp
    EndIf

    cQuery:= "CREATE TABLE "+cTable+" ( CODIGO Char(4), NOMBRE Char(40),"+ ;
             "FONO1 Char(10), FONO2 Char(10), FONO3 Char(10), FONO4 Char(10),"+ ;
             "EMPRESA Char(40), DIRECCION Char(40), EMAIL Char(30), PAIS Char(2) ) "

    oQuery := oServer:Query( cQuery )

    If oServer:NetErr()
        MsgStop("Error creando tabla "+cTable+": "+oServer:Error() )
        lResp := .F.
    Else
        lResp := .T.
    Endif

    oQuery:Destroy()

Return lResp