Mysql ABM

Mysql ABM

Postby juan carlos bellucci » Fri Jul 26, 2013 10:00 am

Buenos días Foro. Sigo tratando de hacer un programa para actualizar alguna tabla de una base de datos creada con Mysql. esta en el server y se maneja para consultas con php que desde ya es muy rápido. el sistema corre vía Intranet por la red local.

Pero por el tipo de trabajo que debo hacer se me torna muy engorroso programar jquery,css etc para crear un modulo de actualización. Que con Fivewin puedo hacerlo muy funcional y obviamente de muy buena presentación.

Que le pido al Foro si son tan amables.
1 como conectarme y leer datos de las tablas ya que el sistema esta en la red. probé varias formas ja ja soy un tronco total.
2 algún ejemplo sencillo de un abm , para poder comenzar. se que alguna vez he visto algún ejemplo pero cuando compre el nuevo fw. quite la versión anterior del disco rígido y no he sabido mas de aquel ejemplo.

Por favor si alguien cree que debo abonar las molestias . pues no hay ningún problema me envían una propuesta a mi correo personal y listo. juanca252@yahoo.com.ar bueno espero que alguien tenga alguna experiencia con esto. yo en php programo sin problemas pero no queda bonito, ya que como dije antes debo usar otras cosas para poder ver imagenes sobre imagenes, lo cual no es muy funcional.


Desde ya como siempre muchas gracias. Ing. Bellucci Juan Carlos.
juan carlos bellucci
 
Posts: 115
Joined: Sat Mar 07, 2009 9:36 pm
Location: Argentina

Re: Mysql ABM

Postby joseluisysturiz » Fri Jul 26, 2013 2:48 pm

Para ello tienes 2 ocpiones que yo sepa, TDolphin de Daniel y TMysql de Willian, aca en el foro esta toda la ayuda y ejemplos de ambos, solo decidete por alguno para poder ayudarte mas, saludos...
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Mysql ABM

Postby xmanuel » Fri Jul 26, 2013 10:30 pm

Aunque esté mal el decirlo yo porque soy parte, también tienes Eagle1, mira aquí http://es.groups.yahoo.com/group/eagle1/

Te dejo un ejemplo de mantenimiento completo ABM con alguna cosa más:

Code: Select all  Expand view

//---------------------------------------------------------------------------//

#include "Eagle1.ch"
#include "FiveWin.ch"
#include "dtpicker.ch"
#include "calendar.ch"

//---------------------------------------------------------------------------//
// Son estaticas para que sean visibles desde todo el PRG un poco por
// comodidad

static oConnect     // Objeto conexion
static oDS          // Objeto DataSet

static oWnd         // Objetos de FWH

//---------------------------------------------------------------------------//

function main()

    SET DATE FORMAT TO "DD/MM/YYYY"

    if AbrirTodo()

        DEFINE WINDOW oWnd FROM 4, 4 TO 40, 120 ;
            TITLE "Ejemplo de manteniento de una tabla con Eagle1 y FWH" ;
            MENU BuildMenu()

            SET MESSAGE OF oWnd NOINSET;
                TO oDS:cVersion + " por " + oDS:cAuthor CLOCK DATE

        ACTIVATE WINDOW oWnd

    else

        Salir()

    endif

return( nil )

//----------------------------------------------------------------------------//

function BuildMenu()

   local oMenu

   MENU oMenu

      MENUITEM "&Mantenimiento" ACTION Mantenimiento()

      MENUITEM "&Utilities"
      MENU
         MENUITEM "&Calculadora" ACTION WinExec( "Calc" ) ;
            MESSAGE "Lamando a la calculadora de Windows"

         SEPARATOR

         MENUITEM "&Escribir"    ACTION WinExec( "Write" ) ;
            MESSAGE "Llamando a Write de Windows"
      ENDMENU

      MENUITEM "&Salir"
      MENU
         MENUITEM "&Acerca de..." ;
            ACTION MsgAbout( oDS:cAuthor, oDS:cVersion ) ;
            MESSAGE "Informa sobre la versión de Eagle1"
         SEPARATOR
         MENUITEM "&Salir";
            ACTION Salir();
            MESSAGE "Salir del ejemplo de Eagle1 y FWH"
      ENDMENU


   ENDMENU

return oMenu

//----------------------------------------------------------------------------//
//

static function AbrirTodo()

    local cHost :=      "127.0.0.1           "
    local cUser :=      "root                "
    local cPassword :=  "root                "
    local cDbName :=    "E1Prueba            "
    local cTabla := "Test"
    local lRet
    local oDlg

    DEFINE DIALOG oDlg FROM 2, 2 TO 14, 35;
        TITLE "Datos de conexión" ;
        STYLE nOr( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, 4 )

        @ 01, 01 SAY "Host:" OF oDlg
        @ 01, 05 GET cHost PICTURE "@K" UPDATE OF oDlg

        @ 1.8, 01 SAY "Usuario:" OF oDlg
        @ 02, 05 GET cUser PICTURE "@K" UPDATE OF oDlg

        @ 2.6, 01 SAY "Password:" OF oDlg
        @ 03, 05 GET cPassword PICTURE "@K" UPDATE OF oDlg

        @ 3.4, 01 SAY "Base datos:" OF oDlg
        @ 04, 05 GET cDbName PICTURE "@K" UPDATE OF oDlg

        @ 4, 7 BUTTON "&Acptar" ACTION oDlg:End() OF oDlg

    ACTIVATE DIALOG oDlg CENTERED

    cHost := trim( cHost )
    cUser := trim( cUser )
    cPassword := trim( cPassword )
    cDbName := trim( cDbName )

    // Creamos el objeto "connexion"
    oConnect := TMSConnect():New()

    // Nos conectamos al servidor
    lRet := oConnect:Connect( cHost, cUser, cPassword, cDbName )
    if !lRet
        MsgInfo( "No hay conexión con el servidor", "Operación Cancelada" )
    else
        oDS := TMyTable():New( oConnect, cTabla )
        oDS:SetReadPADAll( .t. )
        oDS:SetTinyAsLogical( .t. )
        // Abrimos la tabla, traemos el resultado a nuestro cliente
        lRet := oDS:Open()
        if !lRet
            MsgInfo( "No se puede abrir la tabla: " + cTabla, "Operación Cancelada" )
        endif
    endif

return( lRet )

//----------------------------------------------------------------------------//
//

static procedure Salir()

    if ValType( oDS ) == "O"
        oDS:Free()
    endif

    if ValType( oConnect ) == "O"
        oConnect:Free()
    endif

    if ValType( oWnd ) == "O"
        oWnd:End()
    endif

return

//----------------------------------------------------------------------------//

static procedure Mantenimiento()

    local oDlg, oLbx

    DEFINE DIALOG oDlg FROM 3, 3 TO 40, 100 TITLE "Mantenimiento tabla TEST"

        @ 00, 01 SAY " &Datos tabla..."  OF oDlg

        @ 01,01 LISTBOX oLbx ;
            FIELDS  ;
                PadL( oDS:FieldGet( 1 ), 6, " " ),;
                oDS:FieldGet( 2 ), ;
                oDS:FieldGet( 3 ), ;
                oDS:FieldGet( 4 ), ;
                oDS:FieldGet( 5 ), ;
                oDS:FieldGet( 6 ), ;
                oDS:FieldGet( 7 ), ;
                oDS:FieldGet( 9 ), ;
                oDS:FieldGet( 8 )  ;
            HEADERS ;
                oDS:FieldName( 1 ), ;
                oDS:FieldName( 2 ), ;
                oDS:FieldName( 3 ), ;
                oDS:FieldName( 4 ), ;
                oDS:FieldName( 5 ), ;
                oDS:FieldName( 6 ), ;
                oDS:FieldName( 7 ), ;
                oDS:FieldName( 9 ), ;
                oDS:FieldName( 8 )  ;
            SIZE 365, 220 OF oDlg

        MySetBrowse( oLbx, oDS ) // Asigna los codeBlock de movimiento

        oLbx:cAlias := "ARRAY" // Para que el gestor de listados no de error
        oLbx:lCellStyle := .t.

        @ 14, 01 BUTTON "&Añadir"       OF oDlg SIZE 35, 12;
                    ACTION CtrDatos( oLbx, .t. )
        @ 14, 08 BUTTON "&Modificar"    OF oDlg SIZE 35, 12;
                    ACTION CtrDatos( oLbx, .f. )
        @ 14, 15 BUTTON "&Borrar"       OF oDlg SIZE 35, 12;
                    ACTION Borrar( oLbx )
        @ 14, 22 BUTTON "&Ordenar"      OF oDlg SIZE 35, 12;
                    ACTION Ordernar( oLbx )
        @ 14, 29 BUTTON "B&uscar"       OF oDlg SIZE 35, 12;
                    ACTION Buscar( oLbx )
        @ 14, 36 BUTTON "Listar"        OF oDlg SIZE 35, 12;
                    ACTION ( oLbx:Report( "Listado de la tabla", .t. ), oDS:GoTop() )
        @ 14, 57 BUTTON "&Salir"        OF oDlg ;
                    ACTION oDlg:End() SIZE 35, 12

   ACTIVATE DIALOG oDlg CENTERED

return

//----------------------------------------------------------------------------//
// Borra la fila actual

static procedure Borrar( oBrw )

    local nRecNo := oDS:RecNo()

    if MsgYesNo( "Realmente quiere borrar el registro " + StrNum( oDS:RecNo() ) + "?" )
        if oDS:Delete( , 1 )
            MyMsgInfo( "Borrado en el servidor" )
            if MsgYesNo( "Refresca la lista?" )
                oDS:Refresh()
                oDS:GoTo( nRecNo )
                oBrw:Refresh()
            endif
        endif
    else
        MyMsgInfo( "No se ha borrado..." )
    endif

return

//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion

static procedure Ordernar( oLbxPrincipal )

    local oDlg, oLbx
    local i := oDS:FieldCount()
    local aFld := Array( i )
    local n, cValue

    FOR n := 1 TO i
        aFld[ n ] := oDS:FieldName( n )
    NEXT

    n := 0

    DEFINE DIALOG oDlg FROM 2, 2 TO 18, 30;
        TITLE "Eagle1, FW y ListBox" ;
        STYLE nOr( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, 4 )

    @ 1, 02 LISTBOX oLbx;
            VAR cValue;
            ITEMS aFld;
            SIZE 80, 70;
            OF oDlg

    @ 5, 02 BUTTON "&Seleccionar";
            OF oDlg;
            SIZE 40, 12;
            DEFAULT;
            ACTION ( MyMsgInfo( "Orden: " + Str( n := oLbx:GetPos() ) + ;
                                 + CRLF + "Nombre del campo: " + cValue, "Has elegido" ), ;
                     oDlg:End() )

    @ 5, 10 BUTTON "&Salir";
            OF oDlg;
            SIZE 40, 12;
            ACTION oDlg:End()

    ACTIVATE DIALOG oDlg CENTERED

    if n != 0 .and. oDS:SetOrderBy( n,, .t. )
        oLbxPrincipal:GoTop()
        oLbxPrincipal:Refresh()
    else
        MyMsgInfo( "No se ha establacido otro orden..." )
    endif

return

//----------------------------------------------------------------------------//

static procedure Buscar( oLb )

    local oDlg
    local i := oDS:FieldCount()
    local n := 1
    local oSay, cSay := "&Valor campo "
    local oGet, uVal

    DEFINE DIALOG oDlg FROM 2, 2 TO 12, 70;
        TITLE "Búsqueda de valores en el DataSet" ;
        STYLE nOr( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, 4 )

        @ 01, 01 SAY "&Numero de columna ( 1 - " + StrNum( i ) + " ):" OF oDlg
        @ 01, 10 GET n PICTURE "999" ;
                 VALID ( uVal := oDS:FieldGet( n ), oGet:Refresh(), ;
                 oSay:SetText( cSay + oDS:FieldName( n ) ), n > 0 .and. n <= i ) ;
                 OF oDlg

        @ 02, 01 SAY oSay VAR cSay OF oDlg
        @ 02, 10 GET oGet VAR uVal SIZE 160, 13 OF oDlg


    @ 3, 02 BUTTON "&Buscar";
            OF oDlg;
            SIZE 40, 12;
            ACTION ( if( oDS:Find( n, uVal, .t. ), ;
                        MyMsgInfo( "Valor encontrado" ), ;
                        MyMsgInfo( "Valor no encontrado" ) ), oLb:Refresh() )

    @ 3, 10 BUTTON "S&iguiente";
            OF oDlg;
            SIZE 40, 12;
            ACTION ( if( !oDS:FindNext(), MyMsgInfo( "No hay más. Se llegó al final" ), ), ;
                     oLb:Refresh() )

    @ 3, 18 BUTTON "&Salir";
            OF oDlg;
            SIZE 40, 12;
            ACTION oDlg:End()

    ACTIVATE DIALOG oDlg

return

//----------------------------------------------------------------------------//

static procedure CtrDatos( oLb, lNuevo )

    local oDlg
    local cQueHago
    local nRec := oDS:RecNo()

    if lNuevo
        cQueHago := "Altas"
        oDS:Blank()
    else
        cQueHago := "Modificación"
        oDS:Load()
    endif

    DEFINE DIALOG oDlg FROM 2, 2 TO 30, 77;
        TITLE "Mantenimiento de la tabla Test - " + cQueHago;
        STYLE nOr( DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU, 4 )

        @ 01, 02 SAY "First"        OF oDlg
        @ 02, 1.5 GET oDS:First     PICTURE "@K" UPDATE OF oDlg

        @ 01, 26.6 SAY "Last"         OF oDlg
        @ 02, 20 GET oDS:Last       PICTURE "@K" UPDATE OF oDlg

        @ 2.8, 02 SAY "Street"      OF oDlg
        @ 4, 1.5 GET oDS:Street     PICTURE "@K" UPDATE OF oDlg

        @ 2.8, 26.6 SAY "City"        OF oDlg
        @ 4, 20 GET oDS:City       PICTURE "@K" UPDATE OF oDlg

        @ 4.6, 02 SAY "State"       OF oDlg
        @ 6, 1.5 GET oDS:State      PICTURE "@K XX" UPDATE OF oDlg

        @ 4.6, 5.5 SAY "Zip"         OF oDlg
        @ 6, 4 GET oDS:Zip        PICTURE "@K 99999-9999" UPDATE OF oDlg

        @ 4.6, 13.9 SAY "Hiredate"    OF oDlg
        @ 78, 83 DTPICKER oDS:Hiredate UPDATE  PIXEL SIZE 50, 11 OF oDlg
//        @ 6, 10 GET oDS:Hiredate   PICTURE "@K" UPDATE OF oDlg

        @ 5.7, 22 CHECKBOX oDS:Married PROMPT "Married"  UPDATE OF oDlg

        @ 4.6, 33 SAY "Age"         OF oDlg
        @ 6, 24.5 GET oDS:Age PICTURE "@K 999"        UPDATE OF oDlg

        @ 4.6, 37.5 SAY "Salary"      OF oDlg
        @ 6, 28 GET oDS:Salary  PICTURE "@KE 9,999,999.999"   UPDATE OF oDlg

//..................... El campo MEMO...............................................
        @ 6.4, 02 SAY "Notes"       OF oDlg
        @ 8.1, 1.5 GET oDS:Notes      MEMO         UPDATE OF oDlg SIZE 270, 65
//..................................................................................

        @ 10.5, 02 BUTTON "&Guardar";
                 OF oDlg;
                 SIZE 40, 12;
                 ACTION ( FuncVale( lNuevo ), oLb:Refresh(), oDlg:End() )

        @ 10.5, 10 BUTTON "&Cancelar";
                 OF oDlg;
                 SIZE 40, 12;
                 ACTION ( if( lNuevo, oDS:Blank(), oDS:Load() ), oDlg:Update() )

        @ 10.5, 18 BUTTON "&Salir";
                 OF oDlg;
                 SIZE 40, 12;
                 ACTION oDlg:End()

    ACTIVATE DIALOG oDlg

return

//----------------------------------------------------------------------------//

static procedure FuncVale( lNuevo )

    local nRec

    if lNuevo
        oDS:insert( .t. )
        oDS:GoBottom()
    else
        nRec := oDS:RecNo()
        oDS:Update( .t. )
        oDS:GoTo( nRec )
    endif

return

//----------------------------------------------------------------------------//



 
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Mysql ABM

Postby xmanuel » Fri Jul 26, 2013 10:37 pm

Ah, se me olvidaba, Eagle1 también tiene un RDD, o sea, la posibilidad de usar MySQL como una DBF:

Code: Select all  Expand view

//----------------------------------------------------------------------------//

//-- Definiciones ------------------------------------------------------------//

#define B_BOX ( CHR( 218 ) + CHR( 196 ) + CHR( 191 ) + CHR( 179 ) + ;
                CHR( 217 ) + CHR( 196 ) + CHR( 192 ) + CHR( 179 ) + " " )

#define ID_CONSUTA  0
#define ID_MODIFICA 1
#define ID_ALTA     2
#define ID_BORRA    3

//-- Includes ----------------------------------------------------------------//

#include "InKey.ch"
#include "Eagle1.ch"

//-- Fuerza el enlazado -----------------------------------------------------//

REQUEST HB_GT_WIN

//-- Modulo principal --------------------------------------------------------//

procedure main()

    local cDb := "E1Prueba"
    local cTable := "Test"
    local cHost := "127.0.0.1"
    local cUser := "root"
    local cPwd := "root"
    local oCon := TMSConnect():New()
    local nWA

    SET DATE FORMAT TO "DD/MM/YYYY"

    cls

    oCon:Connect( cHost, cUser, cPwd, cDb )

    if oCon:lConnected
        // Se inicia el sistema E1RDD
        InitE1RDD( oCon )

        // A partir de aquí como una DBF
        USE test NEW ALIAS test VIA "E1RDD"

        nWA := Select( "test" )

        GestBrw( nWA )
    else
        Alert( "No se pudo conectar..." )
    endif

    // Liberamos la memoria de la conexion
    oCon:Free()

return

//-- Modulos auxiliares ------------------------------------------------------//

//----------------------------------------------------------------------------//
// Gestion completa de una tabla MySQL

static procedure GestBrw( nWA )

    local oBrw, oCol
    local lEnd := .f.
    local nKey, n, nFld

    local oTb := GetTableObject( nWA )

    oTb:SetTinyAsLogical( .t. )

    oBrw := TBrowseNew( 1, 0, MaxRow() - 1, MaxCol() )

    oBrw:goTopBlock := { || ( nWA )->( DbGoTop() ) }
    oBrw:goBottomBlock := { || ( nWA )->( DbGoBottom() ) }
    oBrw:SkipBlock := { | n | ( nWA )->( E1DbSkipper( n ) ) }

    oBrw:colorSpec := "W+/B, N/BG"
    oBrw:ColSep    := " ³ "
    oBrw:HeadSep   := "ÄÅÄ"
    oBrw:FootSep   := "ÄÁÄ"

    nFld := ( nWA )->( FCount() )

    FOR n := 1 TO nFld
        oBrw:AddColumn( TBColumnNew( PADL( n, 2, "0" ) + "-" + ;
                        ( nWA )->( FieldType( n ) ) + "-" + ;
                        ( nWA )->( FieldName( n ) ), ;
                        GenCB( nWA, n ) ) )
    NEXT

    cls

    @ 0, 0 SAY PadC( "Ojeando la tabla: " + ;
                        upper( Alias( nWA ) ), MaxCol() + 1, " " ) COLOR "W+/G+"

    @ MaxRow(),         0 SAY "INS"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Altas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ENTER"               COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Mod."                COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "SUPR"                COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Bajas"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F1"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Ayuda"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F4"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Orden"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F5"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca"               COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "F6"                  COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Busca ->"            COLOR "W+/R+"
    @ MaxRow(), Col() + 1 SAY "ESC"                 COLOR "GR+/R+"
    @ MaxRow(), Col() + 1 SAY "Salir"               COLOR "W+/R+"

    while !lEnd

        oBrw:ForceStable()

        nKey = InKey( 0 )

        do case
            case nKey == K_ESC             // Salir
                SetPos( MaxRow(), 0 )
                lEnd = .t.

            case nKey == K_F3               // Activa o desactiva forzar ancho columna
                oTb:SetReadPADAll( !oTb:SetReadPADAll() )
                oBrw:Configure()

            case nKey == K_F4              // Establece el orden
                if ElOrden( oTb )
                    oBrw:goTop()
                endif

            case nKey == K_F5              // Busca valor en columna
                if !BuscaValor( oTb )
                    Alert( "Valor no encontrado..." )
                endif
                oBrw:RefreshAll()

            case nKey == K_F6              // Busca siguiente columna
                if !oTb:FindLikeNext()
                    Alert( "Valor no encontrado..." )
                endif
                oBrw:RefreshAll()

            case nKey == K_UP              // Fila anterior
                oBrw:Up()

            case nKey == K_DOWN            // Fila siguiente
                oBrw:Down()

            case nKey == K_LEFT            // Va a la columna antrior
                oBrw:Left()

            case nKey == K_RIGHT           // Va a la columna siguiente
                oBrw:Right()

            case nKey = K_PGDN             // Va a la pagina siguiente
                oBrw:pageDown()

            case nKey = K_PGUP             // Va a la pagina antrior
                oBrw:pageUp()

            case nKey = K_CTRL_PGUP        // Va al principio
                oBrw:goTop()

            case nKey = K_CTRL_PGDN        // Va al final
                oBrw:goBottom()

            case nKey = K_HOME             // Va a la primera columna visible
                oBrw:home()

            case nKey = K_END              // Va a la ultima columna visible
                oBrw:end()

            case nKey = K_CTRL_LEFT        // Va a la primera columna
                oBrw:panLeft()

            case nKey = K_CTRL_RIGHT       // Va a la ultima columna
                oBrw:panRight()

            case nKey = K_CTRL_HOME        // Va a la primera página
                oBrw:panHome()

            case nKey = K_CTRL_END         // Va a la última página
                oBrw:panEnd()

            case nKey = K_DEL              // Borra fila
                Borrar( nWA, oBrw )

            case nKey = K_INS              // Inserta columna
                Insertar( nWA, oBrw )

            case nKey = K_ENTER            // Modifica columna
                Modificar( nWA, oBrw )

            case nKey == K_F1              // Algunos datos
                Alert( "Datos de la tabla " + Alias( nWA ) + ";" + ;
                       ";Registro actual......: " + Str( ( nWA )->( RecNo() ) ) + ;
                       ";Total de registros...: " + Str( ( nWA )->( RecCount() ) ) + ;
                       ";Total de columnas....: " + Str( ( nWA )->( FCount() ) ) )

        endcase
    end
return

//----------------------------------------------------------------------------//
// Crea los codeblock SETGET de las columnas del browse

static function GenCB( nWA, n ) ; return( { || ( nWA )->( FieldGet( n ) ) } )

//----------------------------------------------------------------------------//
// Pantalla de datos de la tabla

static function PantMuestra( nWA, nTipo )

    local GetList := {}
    local cTipo, cId

    do case
        case nTipo == ID_ALTA
            cTipo := "Insertando"
            cId := "nuevo"
        case nTipo == ID_BORRA
        case nTipo == ID_CONSUTA
        case nTipo == ID_MODIFICA
            cTipo := "Modificando"
            cId := StrNum( ( nWA )->Id )
    end

    SET CURSOR ON

    DispBox( 3, 2, 18, 74, B_BOX )

    @ 04, 03 SAY cTipo + " registro en tabla " + Alias( nWA ) + " - Numero: " + cId

    @ 06, 03 SAY "First....:" GET ( nWA )->First     PICTURE "@K"
    @ 07, 03 SAY "Last.....:" GET ( nWA )->Last      PICTURE "@K"
    @ 08, 03 SAY "Street...:" GET ( nWA )->Street    PICTURE "@K"
    @ 09, 03 SAY "City.....:" GET ( nWA )->City      PICTURE "@K"
    @ 10, 03 SAY "State....:" GET ( nWA )->State     PICTURE "@K"
    @ 11, 03 SAY "Zip......:" GET ( nWA )->Zip       PICTURE "@K"
    @ 12, 03 SAY "Hiredate.:" GET ( nWA )->Hiredate  PICTURE "@K"
    @ 13, 03 SAY "Married..:" GET ( nWA )->Married   PICTURE "@K"
    @ 14, 03 SAY "Age......:" GET ( nWA )->Age       PICTURE "@K"
    @ 15, 03 SAY "Salary...:" GET ( nWA )->Salary    PICTURE "@K"
    @ 16, 03 SAY "Notes:"
    @ 17, 03                  GET ( nWA )->Notes     PICTURE "@K"

return( GetList )

//----------------------------------------------------------------------------//
// Inserta una fila

static procedure Insertar( nWA, oBrw )

    local GetList := {}
    local cPant := SaveScreen( 3, 2, 18, 74 )

    ( nWA )->( DbAppend() )

    GetList := PantMuestra( nWA, ID_ALTA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        ( nWA )->( DbCommit() )
        Alert( "Tupla insertada" )
        oBrw:goBottom()
        oBrw:RefreshAll()
    endif

return

//----------------------------------------------------------------------------//
// Modifica la fila actual

static procedure Modificar( nWA, oBrw )

    local GetList := {}
    local nRecNo := ( nWA )->( RecNo() )
    local cPant := SaveScreen( 3, 2, 18, 74 )

    GetList := PantMuestra( nWA, ID_MODIFICA )
    READ

    set cursor off

    RestScreen( 3, 2, 18, 74, cPant )

    if LastKey() != K_ESC .and. Updated()
        ( nWA )->( DbCommit() )
        ( nWA )->( DbGoTo( nRecNo ) )
        oBrw:RefreshAll()
    endif

return

//----------------------------------------------------------------------------//
// Borra la fila actual

static procedure Borrar( nWA, oBrw )

    local nRecNo := ( nWA )->( RecNo() )

    if Alert( "Realmente quieres borrar el registro?", { "Si", "No" } ) == 1
        ( nWA )->( DbDelete() )
        Alert( "Borrado en el servidor" )
        ( nWA )->( DbGoTo( nRecNo ) )
        oBrw:RefreshAll()
    else
        Alert( "No se ha borrado..." )
    endif

return

//----------------------------------------------------------------------------//
// Establece un nuevo orden de visualizacion

static function ElOrden( oTb )

    local i := oTb:FieldCount()
    local aFld := Array( i )
    local n, lRet

    FOR n := 1 TO i
        aFld[ n ] := oTb:FieldName( n )
    NEXT

    DispBox( 5, 9, 10, 25, B_BOX )

    i := 0
    i := AChoice( 6, 10, 9, 24, aFld )

    if lRet := ( i > 0 )
        Alert( "Ordenado por la columna: " + StrNum( i ) + " " + oTb:FieldName( i ) )
        oTb:SetOrderBy( i,, .t. )
    endif

return( lRet )

//----------------------------------------------------------------------------//
// Busca un valor de una columna

static function BuscaValor( oTb )

    local GetList := {}
    local nCol := 0
    local lRet, uVal

    DispBox( 5, 5, 8, 75, B_BOX )

    @ 6, 10 SAY "Entre numero de columna:" GET nCol PICTURE "@K"
    READ
    if nCol > 0 .and. nCol <= oTb:FieldCount()
        uVal := oTb:FieldGet( nCol )

        @ 7, 10 SAY "Entre valor buscado:" GET uVal PICTURE "@K"
        READ

        // Ojo cuando es tipo caracter (x)Harbour mete espacios hasta el final
        // del ancho del campo
        uVal := if( ValType( uVal ) == "C", AllTrim( uVal ), uVal )

        lRet := oTb:FindLike( nCol, uVal, .t. )
    else
        lRet := .f.
        Alert( "Emtre un número de columna correcto" )
    endif

return( lRet )

//----------------------------------------------------------------------------//


 
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Mysql ABM

Postby cmsoft » Sun Jul 28, 2013 8:16 pm

Te dejo un ejemplo básico con Dolphin
Code: Select all  Expand view
#include "Fivewin.ch"
#include "xbrowse.ch"
#include "Tdolphin.ch"
*************************************************
** Codigos de descuento
*************************************************
STATIC oQry, oWnd1, oBrw, oDlg
PROCEDURE Codigo(oServer)
LOCAL oGet, cBuscar := SPACE(50), oBar, hHand, oFol
   oQry  := oServer:Query( "SELECT * FROM codigos ORDER BY nombre")
   // Defino el dialogo tomado del recurso ABMCAJA
   DEFINE ICON M->oIco RESOURCE "cmsoft"
   DEFINE WINDOW oWnd1 MDICHILD TITLE "A/B/M de Codigos de descuento" ;
          OF M->oWnd NOZOOM ICON M->oIco
         DEFINE BUTTONBAR oBar  SIZE 60,60 OF oWnd1 2010
         DEFINE BUTTON RESOURCE "ALTA" OF oBar  TOOLTIP "Agregar Registro"  ;
            ACTION (Formu( oServer,.t. ),oBrw:Refresh()) PROMPT "Alta" TOP
         DEFINE BUTTON RESOURCE "MODI" OF oBar TOOLTIP "Modificar Registro"  ;
            ACTION (Formu( oServer,.f. ),oBrw:Refresh()) PROMPT "Modifica" TOP WHEN(oQry:RecCount()>0)
         DEFINE BUTTON RESOURCE "BAJA" OF oBar TOOLTIP "Eliminar Registro"  ;
            ACTION (Baja( ),oBrw:Refresh())  PROMPT "Baja" TOP WHEN(oQry:RecCount()>0)
         DEFINE BUTTON RESOURCE "EXCE" OF oBar TOOLTIP "Exportar a Excel" ;
            ACTION oBrw:ToExcel() WHEN(oQry:RecCount()>0)  PROMPT "Exporta" TOP
         DEFINE BUTTON RESOURCE "IMPR" OF oBar TOOLTIP "Imprimir Planilla"  ;
            ACTION oBrw:Report("Reporte de Codigos",.T.,.F.)  PROMPT "Reporte" TOP WHEN(oQry:RecCount()>0)
         DEFINE BUTTON RESOURCE "SALE" OF oBar TOOLTIP "Cerrar Ventana" ACTION oWnd1:End();
            PROMPT "Cerrar" TOP
   oWnd1:bGotFocus := { || oDlg:SetFocus}
   oWnd1:bResized := { || Incrusta( oWnd1, oDlg, .t.) } //Incrusta es una funcion propia que pone un dialogo ajustado a una ventana
     DEFINE DIALOG oDlg RESOURCE "ABMS" OF oWnd1
     REDEFINE XBROWSE oBrw DATASOURCE oQry;
              COLUMNS "Codigo","Nombre" SIZES 100,500;
              ID 111 OF oDlg AUTOSORT ON DBLCLICK Formu( oServer, .f.)
     REDEFINE SAY oBrw:oSeek PROMPT "" ID 113 OF oDlg
     oQry:bOnChangePage := {|| oBrw:Refresh() }
     ACTIVATE DIALOG oDlg NOWAIT ON INIT oDlg:Move(0,0)
   ACTIVATE WINDOW oWnd1 ON INIT Incrusta( oWnd1, oDlg, .T.) VALID(cerrar(oQry))
RETURN

***************************************
** Formulario de altas y modificaciones
STATIC FUNCTION Formu ( oServer,lAlta)
LOCAL oGet := ARRAY(7), oBot := ARRAY(2), oForm, lRta := .f., aCor, base, aSobre := {"Bruto","BAE","Turismo","Prestamo"}, oError
IF lAlta
   base := oQry:GetBlankRow()
   ELSE
   base := oQry:GetRowObj()
ENDIF
DEFINE DIALOG oForm TITLE IF(lAlta,"Alta","Modificacion") + " de Codigos" FROM 05,15 TO 24,65 OF oWnd1
   acor := AcepCanc(oForm) // Esta funcion me da las coordenadas para poner los botones de grabar y cancelar justo debajo del dialog creado
   @ 05, 05 SAY "Codigo:"            OF oForm PIXEL SIZE 60,20 RIGHT
   @ 20, 05 SAY "Descripcion:"       OF oForm PIXEL SIZE 60,20 RIGHT
   @ 35, 05 SAY "Indice:"            OF oForm PIXEL SIZE 60,20 RIGHT
   @ 50, 05 SAY "Sobre:"             OF oForm PIXEL SIZE 60,20 RIGHT
   @ 65, 05 SAY "Tipo Cuenta:"       OF oForm PIXEL SIZE 60,20 RIGHT
   @ 80, 05 SAY "Suma/Resta:"        OF oForm PIXEL SIZE 60,20 RIGHT
   @ 95, 05 SAY "Tipo empleado(ACJF):"  OF oForm PIXEL SIZE 60,20 RIGHT
   @ 05, 70 GET oGet[1] VAR base:codigo   OF oForm PIXEL RIGHT WHEN(lAlta) VALID(base:codigo>0) PICTURE "9999"
   @ 20, 70 GET oGet[2] VAR base:nombre   PICTURE "@!" OF oForm PIXEL VALID(base:nombre<>SPACE(30))
   @ 35, 70 GET oGet[3] VAR base:indice   OF oForm PIXEL RIGHT PICTURE "99.999999"
   @ 50, 70 COMBOBOX oGet[4] VAR base:sobre ITEMS aSobre OF oForm PIXEL
   @ 65, 70 GET oGet[5] VAR base:cta      OF oForm PIXEL RIGHT PICTURE "9"
   @ 80, 70 GET oGet[6] VAR base:tipo     OF oForm PIXEL PICTURE "@!" VALID(base:tipo$"SR")
   @ 95, 70 GET oGet[7] VAR base:tipoemp  OF oForm PIXEL PICTURE "@!" VALID(base:tipoemp$"ACJF")
   @ acor[1],acor[2] BUTTON oBot[1] PROMPT "&Grabar" OF oForm SIZE 30,10 ACTION ((lRta := .t.), oForm:End() ) PIXEL
   @ acor[3],acor[4] BUTTON oBot[2] PROMPT "&Cancelar" OF oForm SIZE 30,10 ACTION ((lRta := .f.), oForm:End() ) PIXEL CANCEL
ACTIVATE DIALOG oForm CENTER
IF !lRta
   RETURN nil
ENDIF
IF lAlta
   oQry:GetBlankRow()
ENDIF
oQry:oRow := base
TRY
  oQry:Save()
CATCH oError
  MsgStop("Error al grabar"+CHR(10)+oError:description,"Error")
END TRY
oBrw:Refresh()
RETURN nil

*************************************
** Cerrar la consulta
STATIC FUNCTION cerrar ( oQry )
LOCAL aNueva := {}, i, j
oQry:End()
RELEASE oQry
RETURN .t.

***********************************
** Baja de registro
STATIC FUNCTION Baja (  )
LOCAL mrta := .f.
IF oQry:codigo = 0
   RETURN nil
ENDIF
mrta := MsgNoYes("Seguro de eliminar","Atencion")
IF !mrta
   RETURN nil
ENDIF
oQry:Delete()
RETURN nil


La funcion recibe la coneccion al servidor (oServer) que conecto al principio del programa con esta funcion:
(Los paramentros para conectar estan en un archivo .ini (Viene con los ejemplos de Dolphin
Code: Select all  Expand view
FUNCTION Conectar()
LOCAL oServer
   D_SetCaseSensitive( .T. )
   Set_MyLang( "esp" )
   
   IF ( oServer := ConnectTo() ) == NIL
      MsgStop("El programa no ha podido establecer la conexion"+CHR(10)+;
              "con el servidor de base de datos MySql. Por favor"+CHR(10)+;
              "verifique que dicho servidor se encuentra habilitado"+CHR(10)+;
              "o que posee los permisos de red para acceder al mismo.",;
              "Error de conexion")
      QUIT
      *ELSE
      *MsgInfo("Conectado")
   ENDIF
   
RETURN oServer

FUNCTION ConnectTo( n )
   LOCAL c
   LOCAL hIni      
   LOCAL oServer  
   LOCAL cServer, cUser, cPassword, nPort, cDBName,nFlags    
   LOCAL oErr

   c = "mysql"
   
   if n != NIL
      c = "mysql" + AllTrim( Str( n ) )
   endif
   
   hIni      := HB_ReadIni( "connect.ini" )
   oServer   := NIL
   cServer   := hIni[ c ]["host"]
   cUser     := hIni[ c ]["user"]
   cPassword := hIni[ c ]["psw"]
   nPort     := val(hIni[ c ]["port"])
   cDBName   := hIni[ c ]["dbname"]
   nFlags    := val(hIni[ c ]["flags"])
     
   TRY
      CONNECT oServer HOST cServer ;
                      USER cUser ;
                      PASSWORD cPassword ;
                      PORT nPort ;
                      FLAGS nFlags;
                      DATABASE cDBName
                               
   CATCH oErr
     RETURN NIL
   END
   
RETURN oServer
 

Espero te sea de utilidad.
Saludos
User avatar
cmsoft
 
Posts: 1189
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Mysql ABM

Postby elvira » Mon Jul 29, 2013 3:13 pm

Manuel,

El RDD de EagleOne, ¿tiene todas las mismas funcionalidades que el DBFCX?.

En caso que no, ¿qué es lo qué le falta?.

Muchas gracias.Un saludo
elvira
 
Posts: 515
Joined: Fri Jun 29, 2012 12:49 pm

Re: Mysql ABM

Postby sysctrl2 » Mon Jul 29, 2013 7:46 pm

nomas como aclarativo, Eagle, es de paga,

dolphin de Daniel, es free y vienen los fuentes para mirar como esta,
hecha la class.
yo he abandonado las DBF gracias a dolphin.
saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Mysql ABM

Postby elvira » Tue Jul 30, 2013 9:05 pm

Manuel,

Por favor, ¿podrías aclarar lo de EAGLERDD?.

Muy agradecida.
elvira
 
Posts: 515
Joined: Fri Jun 29, 2012 12:49 pm

Re: Mysql ABM

Postby xmanuel » Wed Jul 31, 2013 11:59 am

Efectivamente Cesar, Eagle1 es de paga, muy poco pero lo es. Lo puse porque creo que es otra alternativa. Hay ya funcionando en el mundo muchas aplicaciones que usan Eagle1 y van muy bien según me comentan sus desarrolladores. Es bueno que haya competencia y disparidad de opiniones. Animo a que useis TDolphin, sé que Daniel seguirá con su desarrollo cada vez que se necesite. :D
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Mysql ABM

Postby xmanuel » Wed Jul 31, 2013 12:08 pm

Hola Elvira, cómo estás?

Te comento, E1RDD es un complemento más de Eagle1 y se pueden usar conjuntamente.
E1RDD implementa navegación por las tablas (DbGoTo(), DbGoBotton(), DbGoTop(), DbSkipper(), etc), Altas, bajas y modificaciones, aceso a registros y sus campos etc en definitiva está implementado todo el RDD DBF... pero no hay nada del tema de índices al estilo CDX. Los indices para DBF no tienen nada que ver con los índices para SQL.
Si te intersa hablar más profundamente del tema sigue ne este hilo y con gusto te responderé a todas las dudas que tengas. Pero yo haría lo que dice Cesar, abandonar definitivamente las DBF y usar SQL. Ojo hay proyectos que están mucho mejor en DBF!!!
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 756
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla

Re: Mysql ABM

Postby sysctrl2 » Thu Aug 01, 2013 3:15 pm

Al dejar las dbf, también tuve que dejar las funciones de un rdd:
dbappen, rlock, dbunlock, dbdelete, dbcreate, etc.

las cambie por secuencias de sql.

INSERT TO CLIENTES
UPDATE CLIENTES SET
ALTER TABLE
CREATE TABLE
ETC.
el seguir usando funciones de un rdd es como volver al pasado.
es mi humilde opinión, habrá colegas que se van a morir con las rdd, jeje
Saludos.
Cesar Cortes Cruz
SysCtrl Software
Mexico

' Sin +- FWH es mejor "
User avatar
sysctrl2
 
Posts: 951
Joined: Mon Feb 05, 2007 7:15 pm

Re: Mysql ABM

Postby Marcelo Via Giglio » Thu Aug 01, 2013 3:41 pm

César,

la verdad es que SQL es una gran herramienta que te simplifica la vida, es segura, clara y te permite hacer las cosas muy rápidamente, pero como todo en la vida nada es absoluto, según yo las dos técnica de acceso a los dato como son SQL e ISAM (rdd) combinadas son la mejor opción, por qué? si tenemos mucha información con SQL el despliegue es lento si queremos hacer filtros como una búsqueda incremental, en función a la cantidad de información con SQL es lento, si por ejemplo trabajas con MDI o Dialogos no modales y existe interdepencia de información entre ellos, con SQL es más complicado, esto por darte algunos ejemplos.

Por eso a mi me agrada trabajar con ADS que tiene de ambos mundos, lo malo que no es barato, pero supongo cuando tienes un proyecto comercial el cliente deberá asumir el costo por tener un sistema con las funcionalidades que ADS puede ofrecer.

Ahora también es verdad que en redes WAN RDD no va muy bien, principalmente por el tema de los excesivos refrescamientos de la GUI, para ese caso SQL es mejor tomando en cuenta que manejas un buffer local de datos que solo se refresca bajo demanda

Solo es una opinión

Saludos

Marcelo
Marcelo Via Giglio
 
Posts: 1050
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Mysql ABM

Postby csincuir » Fri Aug 02, 2013 9:58 am

Hola,
Yo utilizo Eagle1 de Manu, hace ya mucho años atras (como desde el 2004 si no estoy mal), y desde que la utilizo, deje de utilizar las Dbf's, y todos mis desarrollos los hago con MySQL.
Es cierto que venimos del mundo xBase, donde se utilizan las DBF's, y queremos seguir utilizando RDD's para trabajar con una sintaxis SQL, pero realmente es mucho mejor utilizar SQL, son solo 4 instrucciones básicas que hay que aprender (SELECT, INSERT, DELETE, UPDATE), y no es muy difícil hacerlo, y esto nos abre la posibilidad de poder utilizar otras opciones como PHP.

Con la ayuda de Manu, y su trabajo con Eagle1, yo logre pasarme totalmente a MySQL, utilizando totalmente el lenguaje SQL sin RDD's, y no me arrepiento, al contrario, lo recomiendo bastante, pero cada quien puede utilizar la herramienta que mejor se adecue a sus necesidades.

Saludos.

Carlos.
csincuir
 
Posts: 396
Joined: Sat Feb 03, 2007 6:36 am
Location: Guatemala

Re: Mysql ABM

Postby cnavarro » Fri Aug 02, 2013 10:46 am

Manu
Que version es la actual de Eagle1
Yo me quede en la V303
Saludos
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 72 guests