It is currently Mon Dec 11, 2017 5:55 am

All times are UTC




 Page 1 of 1 [ 1 post ] 
Author Message
 Post subject: Clase genérica de mantenimiento. 1 Parte
PostPosted: Fri May 06, 2011 8:12 pm 

Joined: Thu Dec 30, 2010 8:46 pm
Posts: 92
Estoy trabajando en un prototipo de clase genérica de mantenimiento.
La idea es permitirnos realizar mantenimientos típicos , sin muchas complicaciones lo más rápido posible.

No es nada del otro mundo, además, no quiero dotar dicha clase de "grandes" posibilidades.
La idea principal , creo, que debe de ser lo más simple y sencilla posible.

Este es el comando sobre el cual estoy trabajando, que expongo a continuación, más las explicaciones
pertinentes de dicho comando.

  1. #define df_ADD   1
  2. #define df_EDIT  2
  3. #define df_DEL   3
  4.  
  5. //TODO: USER falta hasta tener la clase realizada
  6. #xcommand DEFINE MANTENIMIENTO [ <oMante> ];
  7.                                [ TITLE <cTitle> ] ;
  8.                                [ QUERY <cQuery>];
  9.                                [ DOLPHIN <oDolphin>];
  10.                                [ ROW ACTION <uRowAction>];
  11.                                [ BUTTON ADD <uAdd> ] ;
  12.                                [ BUTTON DEL <uDel> ] ;
  13.                                [ BUTTON EDIT <uEdit> ] ;
  14.                                [ COLUMN VALUE <nGetColumnValue> ] ;
  15.                                [ VIEW COLUMNS  <aViewColumns,...> ] ;
  16.                                [ USER <oUser> ] ;
  17.                                [ SIZE <nWidth>, <nHeigth> ] ;
  18.       => ;
  19.       [ <oMante> := ] GMante():NewWindow( <cTitle>, <cQuery>, <oDolphin>, [ \{|self,path,col| <uRowAction> \} ] ,;
  20.                                           [ \{|Self| <uAdd> \} ],[ \{|Self| <uEdit> \} ], [ \{|Self| <uDel> \} ],;
  21.                                            <nGetColumnValue>, \{<aViewColumns>\}, <nWidth> ,<nHeigth> )
  22.  


En esta primera parte, expongo las diferentes opciones, para en un segundo mensaje, publicar la clase.
Dicho sea de paso, esta clase está pensaba, aunque no limitada, a usarse con TDolphin.

  1.  DEFINE MANTENIMIENTO oMante  ;
  2.       TITLE "Mantenimiento de Cadenas" ;
  3.       QUERY "SELECT id, nombre FROM cliente order by id" ;
  4.       COLUMN VALUE 1 ;
  5.       VIEW COLUMNS 2 ;
  6.       DOLPHIN oServer ;
  7.       ROW ACTION  CreateCadena( Self, df_EDIT ) ;
  8.       BUTTON ADD  CreateCadena( Self, df_ADD ) ;
  9.       BUTTON EDIT CreateCadena( Self, df_EDIT ) ;
  10.       BUTTON DEL  CreateCadena( Self, df_DEL ) ;
  11.  

TITLE. Determina el titulo de la ventana
QUERY. Sentencia MySql
COLUMN VALUE x. Que valor de la columna X queremos que devuelva de retorno.
VIEW COLUMNS. Muestra SOLO las columnas 2 y 3 de la sentencia Query.
Es util porque despues, podemos coger del modelo de datos la columna 1 , aunque no la tengamos en la vista.
DOLPHIN. Objeto TDolphin.
ROW ACTION. Que accion a ejecutar en el dobleclick de la vista.
BUTTON ADD,EDIT,DEL. Acciones de los diferentes botones.

El parámetro Self, es el propio objeto oMante, que es enviado por la propia clase a la función CreateCadena()
Con muy poco, tenemos grandes resultados prácticos.

Coloco aquí el código fuente de la función CreateCadena() para que podáis observar que básicamente este será el patron a todos los mantenimientos;
  1. static function CreateCadena( oMante, uMode )
  2.     Local aIter := Array( 4 ), pPath, oLbx, pReference
  3.     Local oDlg, cVar, oBox, oEntry, nId, oData
  4.     Local lOK := .T., lSelect := .F.
  5.     Local cQryAlta := "SELECT id, nombre FROM cadena LIMIT 1"
  6.     Local cQryEdit := "SELECT id, nombre FROM cadena where id = "
  7.  
  8.     if uMode != df_ADD .and. ( lSelect := oMante:oTreeView:IsGetSelected( aIter ) ) // Si fue posible seleccionarlo
  9.        lOk := .T.
  10.     else
  11.        lOk := .F.
  12.     endif
  13.  
  14.     if !lOk .and. uMode != df_ADD
  15.        return nil
  16.     endif
  17.  
  18.     if lSelect
  19.        pPath := oMante:oTreeView:GetPath( aIter )                      // Obtengo el camino donde estoy
  20.        pReference := gtk_tree_row_reference_new( oMante:oTreeView:GetModel(), pPath )
  21.     endif
  22.  
  23.     do case
  24.       case uMode = df_ADD
  25.            oData = oServer:Query( cQryAlta )
  26.            oData:GetBlankRow( .F. )
  27.       case uMode = df_EDIT
  28.            nId   := oMante:oTreeView:GetAutoValue( 1 )
  29.            oData := oServer:Query( cQryEdit + CStr( nId ) )
  30.       case uMode = df_DEL
  31.            nId   := oMante:oTreeView:GetAutoValue( 1 )
  32.            oData := oServer:Query( cQryEdit + CStr( nId ) )
  33.            if MsgNoYes( "¿ Realmente quieres borrar la cadena: " +;
  34.                        CRLF+  alltrim( oData:Nombre ) +"  ? "  , "Atención" )
  35.               if oData:Delete()
  36.                  oMante:oTreeView:oModel:Remove( aIter )
  37.                  gtk_tree_view_set_cursor( oMante:oTreeView:pWidget, pPath, 1, .F. )  // Nos posicionamos donde estabamos
  38.                  gtk_tree_path_free( pPath )
  39.               endif
  40.            endif
  41.            return nil
  42.    endcase
  43.  
  44.    // --------  PARTE GUI -----------------------------------------------
  45.    DEFINE DIALOG oDlg TITLE "Cadenas" SIZE 250,100
  46.  
  47.        DEFINE BOX oBox OF oDlg
  48.           DEFINE LABEL TEXT "Cadena"         OF oBox
  49.           DEFINE ENTRY oEntry VAR oData:Nombre  OF oBox EXPAND FILL
  50.  
  51.    ACTIVATE DIALOG oDlg CENTER RUN ;
  52.             ON CANCEL .T. ;
  53.             ON APPLY  .T.
  54.    // -------- PARTE GUI -----------------------------------------------
  55.  
  56.    if oDlg:nID = GTK_RESPONSE_APPLY
  57.       if oData:Save()         // Si hemos podido guardar los datos
  58.          if uMode = df_EDIT   // En una modificacion, SOLAMANTE refrescamos la linea
  59.             oMante:oTreeView:oModel:Set( aIter, 2, alltrim( oData:Nombre ) )
  60.          else
  61.             // Atentos, obtemos el ultimo ID y seleccionamos con un select para obtener los valores correctos
  62.             // para poner adecuadamente en el modelo de datos.
  63.             nId   := oServer:GetAutoIncrement( "cadena" ) - 1
  64.             oData := oServer:Query( "SELECT id, nombre FROM cadena where id = " + CStr( nId ) )
  65.             APPEND LIST_STORE oMante:oTreeView:oModel VALUES oData:Id, oData:Nombre
  66.          endif
  67.       endif
  68.    endif
  69.  
  70.    if lSelect
  71.       if uMode = df_EDIT   // Obtenemos el path nuevo según la nueva referencia de la fila
  72.          gtk_tree_path_free( pPath )
  73.          pPath := gtk_tree_row_reference_get_path( pReference )
  74.       endif
  75.       gtk_tree_view_set_cursor( oMante:oTreeView:pWidget, pPath, 1, .F. )  // Nos posicionamos donde estabamos
  76.       gtk_tree_row_reference_free( pReference )
  77.       gtk_tree_path_free( pPath )
  78.    endif
  79.  
  80. return nil



En otro post, publicaré la clase y su funcionamiento en un mantenimiento simple.
Ese código luce de esta manera;


Attachments:
File comment: Pantallazo de Mantenimiento
Mantenimiento de Tipos de conexión.png
Mantenimiento de Tipos de conexión.png [ 18.9 KiB | Viewed 16199 times ]
Offline
 Profile Send private message  
 
Display posts from previous:  Sort by  
 Page 1 of 1 [ 1 post ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  

cron