It is currently Tue Oct 17, 2017 2:58 pm

All times are UTC




 Page 1 of 1 [ 1 post ] 
Author Message
 Post subject: Clase genérica de mantenimiento. 2 Parte
PostPosted: Sat May 14, 2011 5:19 pm 

Joined: Thu Dec 30, 2010 8:46 pm
Posts: 92
Vamos a publicar la clase Mantenimiento básica.

  1.  
  2. #include "gclass.ch"
  3. #include "hbclass.ch"
  4. #include "tdolphin.ch"
  5.  
  6. #ifdef __HARBOUR__
  7. //   #include "hbcompat.ch"  // Bajo Windows hay que poner esto.
  8. #endif
  9.  
  10. //-----------------------------------------------------------------------------
  11. /*
  12.   CLASE GENERICA DE MANTENIMIENTO
  13.   (c) 2011 Rafa Carmona
  14.  */
  15. //-----------------------------------------------------------------------------
  16. CLASS gMante
  17.       DATA oBoxV                   // BOX Vertical
  18.       DATA oToolBar                // Toolbar
  19.       DATA oBtnAdd , oBtnEdit , oBtnDel, oBtnRefresh, oBtnGet
  20.       DATA oTreeView
  21.       DATA oDolphin, cQuery
  22.       DATA oWnd
  23.       DATA oBar
  24.       DATA cValue   INIT ""
  25.       DATA oUser                   // TODO: Clase Usuario para permitir activar/desactivar distintas opciones.
  26.       DATA bActivated
  27.       DATA bFalseActivated
  28.       DATA nGetColumnValue INIT 1  // Obtener el valor por defecto de la columna 1
  29.       DATA oAccel
  30.       DATA oTreeView
  31.       DATA oScroll
  32.       DATA aViewColumns            // Columnas a mostrar del modelo de datos en la vista. NIL = ALL
  33.  
  34.       METHOD New( oWnd, oServer )
  35.       METHOD NewWindow( cTitle, cQuery, oServer )
  36.       METHOD AddBtn( cType )
  37.       METHOD BtnAction( cType, bAction )
  38.       METHOD SetQuery( cQuery )
  39.       METHOD GetValue( nColumn )  // Devuelve el valor de una columna
  40.       METHOD SetRowActivated( bActivated )
  41.       /* Methods usados para retonar al codeblock pasado, el primer parametro es Self */
  42.       METHOD Comprueba( path, col )
  43.       METHOD Add( bAdd )
  44.       METHOD Del( bDel )
  45.       METHOD Edit( bEdit)
  46.  
  47. ENDCLASS
  48.  
  49.  
  50. /*
  51.   oWnd : Objeto Ventana donde incrustar los controles
  52.   oDolphin : Clase para acceso a MySql de Daniel
  53.   cQuery : Opcional , si queremos establecer una query
  54.   lAdd   : .T. Show toolbutton Add
  55.   lEdit  : .T. Show toolbutton Edit
  56.   lDel   : .T. Show toolbutton Del
  57.   nGetColumnValue : Valor de la columna que queremos obtener
  58. */
  59.  
  60. //-----------------------------------------------------------------------------
  61. //-----------------------------------------------------------------------------
  62. METHOD New( oWnd, oDolphin, cQuery, lAdd, lEdit, lDel, nGetColumnValue, aViewColumns ) CLASS GMANTE
  63.     Local oToolMenu
  64.  
  65.     DEFAULT nGetColumnValue := 1
  66.  
  67.     ::oWnd     := oWnd
  68.     ::oDolphin := oDolphin
  69.     ::cQuery   := cQuery
  70.     ::nGetColumnValue := nGetColumnValue
  71.     ::aViewColumns := aViewColumns
  72.  
  73.     DEFAULT lAdd := .T., lEdit := .T., lDel := .T.
  74.  
  75.     DEFINE BOX ::oBoxV VERTICAL OF ::oWnd
  76.       DEFINE TOOLBAR ::oToolbar OF ::oBoxV
  77.  
  78.         if lAdd ; ::AddBtn( "add" )  ; endif
  79.         if lEdit; ::AddBtn( "edit" ) ; endif
  80.         if lDel;  ::AddBtn( "del" )  ; endif
  81.  
  82.         DEFINE TOOLBUTTON ::oBtnGet      TEXT "Get"      STOCK_ID GTK_STOCK_JUMP_TO ACTION ( ::GetValue( nGetColumnValue ), ::oWnd:End() )    OF ::oToolBar
  83.         DEFINE TOOLBUTTON ::oBtnRefresh  TEXT "Refresh"  STOCK_ID GTK_STOCK_REFRESH ACTION ( ::SetQuery( ::cQuery ), ::oTreeView:SetFocus() ) OF ::oToolBar
  84.  
  85.         DEFINE SCROLLEDWINDOW ::oScroll  OF ::oBoxV EXPAND FILL
  86.         ::oScroll:SetPolicy( GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC )
  87.  
  88.            DEFINE TREEVIEW ::oTreeView  OF ::oScroll  CONTAINER
  89.            ::oTreeView:SetRules( .T. )
  90.  
  91.        DEFINE STATUSBAR ::oBar TEXT "(c)2011 Rafa Carmona" OF ::oBoxV
  92.  
  93. RETURN Self
  94.  
  95. //-----------------------------------------------------------------------------
  96. //-----------------------------------------------------------------------------
  97. METHOD NewWindow( cTitle, cQuery, oServer , bRowActivated, bAdd, bEdit, bDel, nGetColumnValue, aViewColumns, nWidth, nHeigth ) CLASS GMANTE
  98.        Local lAdd := !empty( bAdd ), lEdit := !empty( bEdit ), lDel := !empty( bDel )
  99.  
  100.        DEFAULT cTitle := "T-HELPDESK", ::bFalseActivated := bRowActivated
  101.        DEFAULT nHeigth := 500, nWidth := 400
  102.  
  103.        DEFINE WINDOW ::oWnd TITLE cTitle SIZE nWidth,nHeigth
  104.  
  105.              ::New( ::oWnd, oServer, cQuery, lAdd, lEdit, lDel, nGetColumnValue, aViewColumns )
  106.  
  107.              if lAdd
  108.                 ::BtnAction( "add",  {|| ::Add( bAdd ) } )
  109.              endif
  110.              if lEdit
  111.                 ::BtnAction( "edit", {|| ::Edit( bEdit ) } )
  112.              endif
  113.              if lDel
  114.                 ::BtnAction( "del",  {|| ::Del( bDel ) } )
  115.              endif
  116.  
  117.              ::SetQuery( cQuery )
  118.  
  119.              if !empty( ::bFalseActivated )  // Si queremos llamar
  120.                 ::SetRowActivated( { |path,col| ::Comprueba( path, col) } )
  121.              endif
  122.  
  123.              // Vamos a definir teclas de aceleracion
  124.              DEFINE ACCEL_GROUP ::oAccel OF ::oWnd
  125.                     ADD ACCELGROUP ::oAccel OF ::oBtnAdd     SIGNAL "clicked"  KEY GDK_INSERT
  126.                     ADD ACCELGROUP ::oAccel OF ::oBtnDel     SIGNAL "clicked"  KEY GDK_Delete
  127.                     ADD ACCELGROUP ::oAccel OF ::oBtnRefresh SIGNAL "clicked"  KEY "F5"
  128.                     ADD ACCELGROUP ::oAccel OF ::oBtnGet     SIGNAL "clicked"  KEY "F2"
  129.  
  130.              ::oTreeView:SetFocus()
  131.        
  132.        ::oWnd:lUseEsc := .T. // Permitimos salir de la ventana con ESC
  133.  
  134.        ACTIVATE WINDOW ::oWnd CENTER MODAL
  135.  
  136. RETURN Self
  137.  
  138. //-----------------------------------------------------------------------------
  139. //-----------------------------------------------------------------------------
  140. METHOD Add( bAdd ) CLASS GMANTE
  141.     Eval( bAdd, Self )
  142. RETURN Nil
  143.  
  144. METHOD Del( bDel ) CLASS GMANTE
  145.     Eval( bDel, Self )
  146. RETURN Nil
  147.  
  148. METHOD Edit( bEdit) CLASS GMANTE
  149.     Eval( bEdit, Self )
  150. RETURN Nil
  151.  
  152.  
  153. //-----------------------------------------------------------------------------
  154. // Add buton a la toolbar
  155. //-----------------------------------------------------------------------------
  156. METHOD AddBtn( cType ) CLASS GMANTE
  157.  
  158.    do case
  159.       case cType = "add"
  160.            DEFINE TOOLBUTTON ::oBtnAdd  TEXT "Add"  STOCK_ID GTK_STOCK_ADD    ACTION NIL OF ::oToolBar
  161.       case cType = "edit"
  162.            DEFINE TOOLBUTTON ::oBtnEdit TEXT "Edit" STOCK_ID GTK_STOCK_EDIT   ACTION NIL OF ::oToolBar
  163.       case cType = "del"
  164.            DEFINE TOOLBUTTON ::oBtnDel  TEXT "Del"  STOCK_ID GTK_STOCK_DELETE ACTION NIL OF ::oToolBar
  165.  
  166.    end case
  167.  
  168. RETURN NIL
  169.  
  170. //-----------------------------------------------------------------------------
  171. // Asigna codeblock al toolbutton.
  172. //-----------------------------------------------------------------------------
  173.  
  174. METHOD BtnAction( cType, bAction ) CLASS GMANTE
  175.  
  176.    do case
  177.       case cType = "add"
  178.            ::oBtnAdd:bAction := bAction
  179.       case cType = "edit"
  180.            ::oBtnEdit:bAction := bAction
  181.       case cType = "del"
  182.            ::oBtnDel:bAction := bAction
  183.    end case
  184.  
  185. RETURN NIL
  186.  
  187. //-----------------------------------------------------------------------------
  188. //-----------------------------------------------------------------------------
  189. METHOD SetQuery( cQuery ) CLASS GMANTE
  190.   Local n , oLbx, x , y , oCol , aIter := Array( 4 ), j , nLen
  191.   Local nOld_Fields := ::oTreeView:GetTotalColumns() // Informa del numero de columnas
  192.   Local oQry, aRes, nFld, Atmp, oError, cValue
  193.  
  194.   if !empty( cQuery )
  195.      ::cQuery := cQuery
  196.   endif
  197.  
  198.  
  199.   if empty( ::oDolphin:cDBName ) .or. empty( ::cQuery )
  200.      return .f.
  201.   endif
  202.  
  203. TRY
  204.     oQry := TDolphinQry():New( ::cQuery, ::oDolphin )
  205. CATCH oError
  206.     MsgStop( oError:Description, "Alerta" )
  207.     return .f.
  208. END
  209.  
  210.   if nOld_Fields != 0  // Si hay columnas, las matamos
  211.      for j :=  nOld_Fields TO 1 STEP -1
  212.          ::oTreeView:RemoveColumn( j )
  213.      next
  214.      ::oTreeView:oModel:Clear()   // Quitamos MODELO DE DATOS antiguo.
  215.      ::oTreeView:SetModel( NIL )  // Se lo quitamos a la vista
  216.   endif
  217.  
  218.   if ( nLen := oQry:RecCount() ) < 1 // Comprobamos que hay registros
  219.      return .F.
  220.   endif
  221.  
  222.  
  223.   nFld := oQry:FCount() // Total de campos
  224.   aRes := { } ;  Atmp := {}
  225.   For n := 1 to nFld
  226.       AADD( aRes, oQry:FieldGet( n ) )
  227.   Next
  228.   AADD( aTmp, aRes )
  229.  
  230.   // Modelo de Datos AUTOMATICO.
  231.   DEFINE LIST_STORE oLbx AUTO aTmp
  232.  
  233.   WHILE !oQry:Eof()
  234.       APPEND LIST_STORE oLbx ITER aIter
  235.       for n := 1 to nFld
  236.           cValue := oQry:FieldGet( n )
  237.           if Valtype( cValue ) = "C"
  238.              cValue := Alltrim( cValue )
  239.           endif
  240.           SET LIST_STORE oLbx ITER aIter POS n VALUE cValue
  241.       next
  242.       oQry:Skip()
  243.   END WHILE
  244.  
  245.   ::oTreeView:SetModel( oLbx ) // Asignamos nuevo modelo de datos a la vista
  246.  
  247.   FOR n := 1 TO nFld
  248.     // Si no hay columnas o si esta definida la columna, la mostramos
  249.     if empty( ::aViewColumns ) .OR. ( ASCAN( ::aViewColumns, n ) > 0 )
  250.       if oQry:FieldType( n ) == "L"  // Si el tipo es LOGICO, ponemos la columna como CHECK
  251.          DEFINE TREEVIEWCOLUMN oCol COLUMN n TITLE alltrim( oQry:FieldName( n ) )  TYPE "active" OF ::oTreeView
  252.       else
  253.          // Para que se los numericos se pongan a la derecha, tienes que poner la clausula EXPAND
  254.          DEFINE TREEVIEWCOLUMN oCol COLUMN n TITLE alltrim( oQry:FieldName( n ) ) TYPE "text" OF ::oTreeView EXPAND SORT
  255.          if oQry:FieldType( n ) == "N"  //Si el tipo es NUMERICO, lo centramos a la derecha
  256.             oCol:SetAlign( GTK_RIGHT )             // Alineacion del header
  257.             oCol:oRenderer:SetAlign_H( GTK_RIGHT ) // Alineacion del contenido Horizontal.
  258.          endif
  259.          // Ejemplo de como podemos hacer que al pulsar la columna sea la de busquedas.
  260.          oCol:Connect( "clicked" )
  261.          oCol:bAction := { |o| ::oTreeView:SetSearchColumn( o:GetSort() ) }
  262.       endif
  263.       oCol:SetResizable( .T. ) //TODOS van a ser resimensionables
  264.     endif
  265.   NEXT
  266.  
  267.   // Liberamos el objeto Query
  268.   oQry:End()
  269.  
  270. RETURN NIL
  271.  
  272. //-----------------------------------------------------------------------------
  273. /* Devuelve el valor de una columna */
  274. //-----------------------------------------------------------------------------
  275. METHOD GetValue( nColumn ) CLASS GMANTE
  276.  
  277.     DEFAULT nColumn := 1
  278.     ::cValue  := ::oTreeView:GetAutoValue( nColumn )
  279.  
  280. RETURN ::cValue
  281.  
  282. //-----------------------------------------------------------------------------
  283. /* Codeblock a evaluar cuando se pulse en la fila*/
  284. //-----------------------------------------------------------------------------
  285. METHOD SetRowActivated( bActivated )  CLASS GMANTE
  286.    ::bActivated := bActivated
  287.    ::oTreeView:bRow_Activated := ::bActivated
  288. RETURN NIL
  289.  
  290. //-----------------------------------------------------------------------------
  291. // El rowactived salta a este method y de ahi , evaluamos el codeblock pasado en NewWindow
  292. //-----------------------------------------------------------------------------
  293. METHOD Comprueba( path, col ) CLASS GMANTE
  294.   Eval( ::bFalseActivated , Self, path, col )
  295. RETURN NIL
  296.  


Esta clase nos permite hacer un en momento , y sin grandes alardes, mantenimientos básicos muy rápidos.

Saludos


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