Pasar datos de una ventana a otra usando objeto estructura


Pasar datos de una ventana a otra, se puede realizar de muchas maneras, una de ellas es usando estructura de datos.

Para el ejemplo pasaremos datos de un trabajador de la Ventana 1 a la Ventana 2.

Para ello creamos previamente la estructura a utilizar.

La estructura a crear es st_trabajador, el cual tendrá código, nombre y sueldo mensuales recibidos por el trabajador, el cual se almacenara en el array sueldos_anno.

Objeto Estructura

Ventana 1

Creamos la Ventana 1 y agregamos los siguientes objetos:

  • sle_codigo
  • sle_nombre
  • sle_enero
  • sle_febrero
  • sle_marzo
  • cb_pasar_datos
      El diseño quedaría de la siguiente manera:

Ventana 1
En el evento clicked del botón cb_pasar_datos ingresamos el siguiente código:

//Instanciamos estructura st_trabajador
st_trabajador st_trabajador_parametro
//cargamos los datos para las variables de la estructura
st_trabajador_parametro.codigo=sle_codigo.text
st_trabajador_parametro.nombre=sle_nombre.text
//Carga variable array
st_trabajador_parametro.sueldos_anno[1]=dec(sle_enero.text)//Enero
st_trabajador_parametro.sueldos_anno[2]=dec(sle_febrero.text)//Febrero
st_trabajador_parametro.sueldos_anno[3]=dec(sle_marzo.text)//Marzo
//Abrimos Ventana 2 enviando como parametro la estructura
OpenWithParm(w_ventana2,st_trabajador_parametro)


Evento Clicked - cb_pasar_datos


Ventana 2 

Creamos la Ventana 2  y agregamos los siguientes objetos:

  • sle_codigo
  • sle_nombre
  • sle_suma_sueldos 
Ventana 2

En el evento open de la Ventana 2 ingresamos el siguiente código:

//Instanciamos estructura st_trabajador
st_trabajador lst_trabajador_parametro
/*message.powerobjectparm => almacena la referencia del objeto pasado como parametro.
Usamos message.powerobjectparm porque el parametro pasado es un objeto.*/
//Cargamos el paramatro a la instancia lst_trabajador_parametro
lst_trabajador_parametro=message.powerobjectparm
//Obtenemos los datos
sle_codigo.text=lst_trabajador_parametro.codigo
sle_nombre.text=lst_trabajador_parametro.nombre
//Obtenemos los datos del array
sle_suma_sueldos.text=string lst_trabajador_parametro.sueldos_anno[1] & + lst_trabajador_parametro.sueldos_anno[2] & + lst_trabajador_parametro.sueldos_anno[3],"###,##0.00")


Evento open Ventana 2


Objeto Application 

En el evento open del objeto application ingresamos el siguiente código

open(w_ventana1)

Ejecución


 Ejecutamos la aplicación.

Ventana 1


Ventana 2




Tutorial PowerBuilder Fundation Class - Parte 3


Nuestra Primera aplicación en PowerBuilder PFC.
 
En las siguientes partes de este tutorial de PowerBuilder Fundation Class veremos los pasos para configurar, ejecutar y crear una aplicación usando PFC.

Para poder seguir el tutorial y usar ejemplos prácticos, se desarrollara un pequeño sistema de ventas de artículos, el cual contara con mantenimiento de tablas maestras, cliente, artículos; Generación de comprobante de venta, Boleta o Factura y creación de reportes de ventas. Para ello haremos uso intensivo de los servicios que nos brinda PFC.

Primeros Pasos:
  1. Creamos nuestro Workspace y nuestro objeto Application.
  2. Para efectos del tutorial se creara el Workspace y el objeto Application con el nombre demoventas.
  3. Añadimos las librerías PFC a nuestro target:

    PFCAPSRV.PBL

    PFCDWSRV.PBL

    PFCMAIN.PBL

    PFCUTIL.PBL

    PFCWNSRV.PBL

    PFEAPSRV.PBL

    PFEDWSRV.PBL

    PFEMAIN.PBL

     PFEUTIL.PBL 

Objeto de usuario n_cst_appmanager

n_cst_appmanager es el gestor de la aplicación y funciona como sustituto del objeto Application. Este objeto contiene muchas funciones útiles así como referencia a variables para los servicios de aplicación.

n_cst_appmanager entre otras cosas nos permite conectarnos a la Base de Datos y definir los servicios que tendrá nuestra aplicación. Este objeto lo encontramos en la librería PFEAPSRV.PBL, la cual contiene los servicios de Aplicación.

n_cst_appmanager

La clase ancestro de n_cst_appmanager es pfc_ncst_app_manager, en la siguiente imagen se puede apreciar la jerarquía de herencia para la clase n_cst_appmanager.



Instanciando n_cst_appmanager

La mejor manera de hacer uso de la clase n_cst_appmanager  es creando un objeto descendiente del mismo, en el cual se agregara el código para personalizar nuestra aplicación.

Para efectos del tutorial  usaremos y modificaremos directamente la clase n_cst_appmanager, pero ¡cuidado!, no modificar la clase ancestro pfc_n_cst_appmanager.
  1. Definimos una variable global llamada gnv_app, que se lee Global No Visual Application, esta variable será del tipo n_cst_appmanager.

    n_cst_appmanager   gnv_app


  2. En el evento Open de nuestro objeto Application instanciamos la clase n_cst_appmanager e invocamos al evento pfc_Open.

    gnv_app = CREATE n_cst_appmanager
    gnv_app.Event pfc_Open(commandline)


  3. En nuestro objeto Application, en la pestaña General, abrimos la ventana de preferencias Additional Properties y modificamos el valor de SQLCA, por n_tr, y el de Message, por n_msg.


Configurando nuestra aplicación.

Ahora codificamos el objeto n_cst_ appmanager para que se ajuste a nuestro propósito, para ello haremos uso de las variables de instancia e inicializaremos algunos servicios.
  1. En el evento constructor de n_cst_appmanager agregamos el siguiente código.
     
  2. /*El objeto ContextInformation, provee de informacion referente a la aplicacion que esta ejecutandose
    como Numero de Versión, Nombre de la Compania, Nombre del Ejecutable, etc.*/
    ContextInformation lcx_Aplicacion

    int   li_version_mayor,li_version_menor
    date ld_ahora

    ld_ahora = Today()

    /*Obtiene la version*/
    GetContextService ( 'ContextInformation', lcx_Aplicacion )
    lcx_Aplicacion.GetMajorVersion(li_version_mayor)
    lcx_Aplicacion.GetMinorVersion(li_version_menor)

    /*Establece el nombre de la aplicación*/
    iapp_object.displayname = 'Demo Sistema Ventas - Tutorial PFC'

    /*Activa el servicio Microhelp*/
    of_SetMicroHelp ( True )

    /* Establece el nombre del archivo de ayuda. Poner esto solo si se dispone de la ayuda correspondiente.*/
    of_SetHelpFile ( 'ayuda.hlp' )

    /* Establece la versión  de la aplicacion*/
    of_SetVersion ( 'Version ' + String ( li_version_mayor ) + '.' + String ( li_version_menor ) + '.00' )

    /* Establece el logo de la aplicacion*/
    of_SetLogo ( 'DemoVentas.bmp' )

    /* Establece el mensaje de copyright*/
    of_SetCopyRight ( 'Copyright (c) 2011-' + String ( Year ( ld_ahora ), '0000' ) + ' Demo Sistema Ventas' )

    /*Activa el servicio de preferencia de la aplicacion*/
    of_SetAppPreference ( True )

    If IsValid ( inv_apppref ) Then
          inv_apppref.of_SetRestoreApp ( False )
          inv_apppref.of_SetRestoreUser ( True )
          inv_apppref.of_SetUserKey ( of_GetUserKey (  ) )
    End If

    /*Establece el nombre del archivo INI*/
    of_SetAppIniFile('conexion.ini')
  3. Creamos la ventana principal, el cual será heredado del objeto w_frame, que se encuentra en la librería PFEMAIN.PBL. A esta nueva ventana la llamaremos w_principal_ventas.

  4. Codificamos el evento pfc_open del objeto n_cst_appmanager. En este evento mostraremos una venta splash, y activaremos los servicios de registro de transacciones y de mensajes de error. Seguidamente abriremos la ventana principal de nuestra aplicación.



    //Muestra el la ventana Splash
    of_Splash(1)

    /*Este servicio es util cuando se utiliza más de un objeto de transaccion, al usar el servicio se consigue que al cerrar la aplicacion todos los objetos transaction se cierren y
    destruyan*/
    of_SetTrRegistration(TRUE)

    //Inicia el servicio de mensajes de error.
    of_SetError(TRUE)

    //Abrimos la ventana principal
    Open(w_principal_ventas)
     

  5. Al invocar la ventana  w_principal_ventas, en el evento open invocaremos la función gnv_app.of_logondlg() , la cual mostrara la ventana de Login para ingresar el usuario y contraseña, para conectarnos a la Base de Datos.

    En el evento open de la ventana w_principal_ventas ingresamos el siguiente código.



    integer li_return

    //Invocamos la ventana de Login para la validacion de Ingreso
    li_return= gnv_app.of_logondlg()

    If li_return=1 Then
          SetMicroHelp("Validación de Ingreso Correcta")
    Else
          messagebox(gnv_app.iapp_object.DisplayName,"Validación de Ingreso Incorrecta", StopSign!)
          Close(This)
          Return
    End If

     El código invoca la ventana de Login para el ingreso de las credenciales de conexión, seguidamente al hacer clic en aceptar invoca al evento pfc_logon del objeto n_cst_appmanager.


  6. En el evento pfc_logon del objeto n_cst_appmanager ingresamos el siguiente código.


    String ls_inifile

    //Recupera el nombre del archivo INI
    ls_inifile = gnv_app.of_GetAppIniFile()

    //SQLCA.of_Init, inicia los valores registrados en el archivo INI, como el DBMS, SERVERNAME, DATABASE,
    If SQLCA.of_Init(ls_inifile, "Login") = -1 Then
          This.inv_error.of_message(gnv_app.iapp_object.DisplayName, + &
                      "Error iniciando los valores de conexión, .INI no encontrado.")
          Return -1
    Else
          //Setea los datos del usuario y contraseña ingresados
          SQLCA.of_setlogidandpassword(as_userid,as_password) 
         
          If SQLCA.of_Connect() = -1 Then
                This.inv_error.of_message(gnv_app.iapp_object.DisplayName, + &
                            "Error conectando a la Base Datos.", StopSign!, OK!)
                Return -1                   
          Else
                Return 1
          End If
    End If




    El código obtiene los datos de conexión del archivo INI, y seguidamente realiza la conexión usando las credenciales ingresadas en la ventana de Login.

Llegado a este punto, tenemos nuestra aplicación con su respectiva ventana Login y su ventana principal.

Como se puede observar las librerías PFC nos ahorran mucho trabajo de codificación para construir herramientas de calidad.

Si desea puede descargar las fuentes de la aplicación con lo avanzado hasta el presente tutorial.




Función para encriptar y desencriptar cadena de texto


Dejo el código para encriptar y desencriptar una cadena de texto.

Para esto creamos dos funciones, una que encripta y otra que desencripta el texto.

Función 1: f_encripta(as_origen)

String vls_char, vls_result
String vls_str1, vls_str2
int    j

vls_str1 = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz1234567890/"
vls_str2 = "zaq1xsw2cde3vfr4bgt5nhy6mju7ki8lo9ñp0ZAQXSWCDEVFRBGTNHYMJUKILOÑP&"
vls_result = ""

FOR j=1 TO len(a_origen)
     
      vls_char = mid(a_origen,j,1)
      vls_result += mid(vls_str2, pos(vls_str1, vls_char), 1)

NEXT
RETURN vls_result

f_encripta



Función 2: f_des_encripta(a_origen)

String vls_char, vls_result

String vls_str1, vls_str2
int    j

vls_str2 = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz1234567890/"
vls_str1 = "zaq1xsw2cde3vfr4bgt5nhy6mju7ki8lo9ñp0ZAQXSWCDEVFRBGTNHYMJUKILOÑP&"
vls_result = ""

FOR j=1 TO len(a_origen)
     
      vls_char = mid(a_origen,j,1)
      vls_result += mid(vls_str2, pos(vls_str1, vls_char), 1)

NEXT
RETURN vls_result

f_desencripta






Obtener el espacio usado por tablas, vistas e indices en base de datos SQL Server


Para visualizar el espacio usado por las tablas,indices y vistas, hacemos uso del procedimiento almacenado sp_spaceused, el cual muestra la cantidad de filas, la cantidad de espacio reservado en KB, el tamaño de datos en KB, el espacio usado por los indices de la tabla en KB y el espacio no utilizado en KB.

Para visualizar el espacio utilizado por la tabla clientes.


EXEC sp_spaceused 'clientes'


Si se omite el parámetro, el procedimiento almacenado muestra el espacio utilizado por la base de datos actual.


EXEC sp_spaceused


Para optimizar el proceso dejo el procedimiento almacenado que lista todas las tablas y vistas.



CREATE  PROCEDURE USP_OBTENER_ESTADISTICA_TABLAS
AS
BEGIN

/*===============================*/
/* Estadistica Tablas            */
/*===============================*/
       DECLARE @SQL AS VARCHAR(255)
       DECLARE @TOTAL DECIMAL(18,0)

       --Cursor que contiene todos los objetos que ocupan espacio
       DECLARE objects_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
      
             SELECT NAME FROM sysobjects o
             WHERE  o.xtype = 'U' or
                    o.xtype = 'V'
      
      
       --Tabla temporal para albergar los resultados
       CREATE TABLE #results
       (     Nombre SYSNAME,
             Filas CHAR(11),
             Reservado VARCHAR(18),
             Datos VARCHAR(18),
             Tamano_Indice VARCHAR(18),
             Libre VARCHAR(18)
       )
       --Recorremos el cursor obteniendo la información de espacio ocupado
       DECLARE @object_name AS SYSNAME
      
       OPEN objects_cursor
      
       FETCH NEXT FROM objects_cursor INTO @object_name;
       WHILE @@FETCH_STATUS = 0
       BEGIN
             INSERT INTO #results (Nombre,Filas,Reservado,Datos,Tamano_Indice,Libre)
             EXEC sp_spaceused @object_name
      
             FETCH NEXT FROM objects_cursor INTO @object_name;
       END
      
       CLOSE objects_cursor;
       DEALLOCATE objects_cursor;
      
       -- Quitamos "KB" para poder ordenar
       UPDATE #results 
       SET    Reservado = LEFT(Reservado,LEN(Reservado)-3),
              Datos = LEFT(Datos,LEN(Datos)-3),
              Tamano_Indice = LEFT(Tamano_Indice,LEN(Tamano_Indice)-3),
              Libre = LEFT(Libre,LEN(Libre)-3)
      
       --Ordenamos la información por el tamaño ocupado
       SELECT      
             Nombre,
             Reservado AS [Tamaño en Disco (KB)],
             Datos AS [Datos (KB)],    
             Tamano_Indice AS [Indices (KB)],
             Filas AS Filas_Total
       FROM #results
       ORDER BY CONVERT(bigint, Reservado) DESC
      
       --Eliminar la tabla temporal
       DROP TABLE #results
END






Monitor de procesos SQL Server 2000


Estuve buscando en la red un Monitor de procesos de SQL Server para poder monitorear los procesos que se ejecutan en mi servidor SQL Server 2000, encontré un software llamado Embarcadero Artisan, el cual tenia la funcionalidad que buscaba, pero desafortunadamente el software era de prueba, así que seguí buscando otra solución pero ninguna satisfacía mis expectativas. Así que decidí crear mi propio Monitor de procesos para mi Base de Datos.

El monitor es bastante simple, tiene las siguientes funcionalidades.
  • Permite ver todas las conexiones en el servidor de Base de Datos.
     
  • Permite visualizar el estado de la conexión; si esta en espera, ejecutando alguna consulta, procedimiento almacenado, etc.

  • Permite ver los procesos que están generando bloqueos, así como la instrucción SQL que esta ejecutando, y los recursos que bloquea, como, tablas, indice, pagina, etc.

  • Permite ver los procesos que están en modo espera a que un recurso se libere para continuar con su ejecución.

  • Permite eliminar un proceso mediante un KILL.

  • Para aquellos que deseen descargar las fuentes, aquí les dejo el enlace y espero me dejen sus comentarios para ver puntos a mejorar.


Descargar Fuente Monitor SQL Server


Monitor SQL - Lista Procesos

Monitor SQL - Lista Bloqueo

Las fuentes están desarrolladas en PowerBuilder 9.0, y el monitor solo es compatible con SQL Server 2000.