Buscar en el Blog

domingo, 31 de enero de 2016

martes, 26 de enero de 2016

Pilas C++

Una pila es un tipo especial de lista en la que sólo se pueden insertar y eliminar nodos en uno de los extremos de la lista. Estas operaciones se conocen como "push" y "pop",
Estas características implican un comportamiento de lista LIFO (Last In First Out), el último en entrar es el primero en salir.
 




  Estructura Nodo.


typedef struct _nodo
{
    int valor;
    struct _nodo *siguiente;
}tiponodo;
 
 
la variable valor es la razon de ser de la estructura(nodo). 
Aqui se almacena el valor del nodo.

struct _nodo sirve para almacenar la direccion del siguiente nodo. Al inicio este 
valor el nulo.


typedef tiponodo *pNodo; Nodo para poder crear los nuevos nodos.
typedef tiponodo *cima; Sirve para almacenar el nodo que esta en la cima de todos
los elementos. 

 Funciones

Push(Insertar)
 En las lineas

    pNodo nuevoNodo;//declarando
    /*creando*/
    nuevoNodo=(pNodo)malloc(sizeof(tiponodo ));
 
Se crea un nodo con valores nulos.
 
 

En la linea nuevoNodo->valor=valor;
Aqui recien se esta almacenando un valor a la variable "valor". Ejemplo el numero 10.

En  nuevoNodo->siguiente=*l;

El nuevo nodo apunto a la direccion de memoria del elemento que estaba en la cima. Si es este "nuevo nodo" el primero elemento y como cima al iniciar es nulo, entonces "siguente"  almacenará NULL.


En  *l=nuevoNodo;

Aqui decimos que el nuevo nodo es la nueva cima.  




 void Push(cima *l, int valor)
{
    pNodo nuevoNodo;//declarando
    /*creando*/
    nuevoNodo=(pNodo)malloc(sizeof(tiponodo ));
    nuevoNodo->valor=valor;
    /*Añadimos la cima a la continuacion del nuevo nodo*/
    nuevoNodo->siguiente=*l;
    *l=nuevoNodo;
}






Esto pasa si es el primero elemento. Caso contrario en lugar de apuntar a null, el nuevo elemento y/o la cima  apuntaria al elemento anterior.





Ahora el Pop
Para el eliminar un elemento de la pila, simplemente obtenemos el elemento siguiente de la pila y hacemos q cima apunto a ese siguiente elemento. En cuanto al elemento que estaba en la cima(el elemento a eliminar), simplemente se libera de la memoria.










int Pop(cima *l)
{
    pNodo nodo;//variable auxiliar
    int r;
    nodo=*l;//apuntando el primer elemento de la cima;
    if(!nodo) return 0;
    *l=nodo->siguiente;
    r=nodo->valor;
    free(nodo);//libera la memoria
    return r;
}
 
 

Codigo Completo



#include <iostream>

using namespace std;
typedef struct _nodo
{
    int valor;
    struct _nodo *siguiente;
}tiponodo;
typedef tiponodo *pNodo;
typedef tiponodo *cima;

/*Protipos de funciones con las cimas*/
void Push(cima *l ,int valor);
int Pop(cima *l);
int main()
{

    cima micima=NULL;
    Push(&micima,10);
    Push(&micima,20);
    Push(&micima,30);


 
      cout<<Pop($micima);
      cout<<Pop($micima);
      cout<<Pop($micima); 

    return 0;
}

void Push(cima *l, int valor)
{
    pNodo nuevoNodo;//declarando
    /*creando*/
    nuevoNodo=(pNodo)malloc(sizeof(tiponodo ));
    nuevoNodo->valor=valor;
    /*Añadimos la cima a la continuacion del nuevo nodo*/
    nuevoNodo->siguiente=*l;
    *l=nuevoNodo;
}

int Pop(cima *l)
{
    pNodo nodo;//variable auxiliar
    int r;
    nodo=*l;//apuntando el primer elemento de la cima;
    if(!nodo) return 0;
    *l=nodo->siguiente;
    r=nodo->valor;
    free(nodo);
    return r;


}

viernes, 22 de enero de 2016

PowerBuilder: Trabajando con columna identidad - Sql Server


Tomando como referencia la aplicacion desarrollada en el post anterior, modificaremos el codigo y nuestra base de datos para generar el codigo de una columna que esta como llave primaria, espeficando dicho campo como identidad.

Primer paso.
Asignar el campo como identidad.




Segundo paso.
Seleccionamos nuestro datawindow cabecera, clic derecho y seleccionamos modificar.
En el menu Rows seleccionamos update properties.




Seleccionamos la columna identidad y le damos clic en ok. Guardamos los cambios en el datawindow.

Tercer paso.
Modificar el script del agregar producto.
En el evento doublecliced colocaremos como comentario.

Cuarto paso.
En el boton nuevo, colocamos como comentario la linea en donde generamos el codigo.
Quinto paso.
En el boton guardar debemos agregar y modificar algunas lineas del sccript.

integer i,j,li_codproducto, li_cantidad,li_codmovimiento
string ls_movimiento
dw_cabecera.accepttext( )
ls_movimiento=trim(dw_cabecera.getitemstring(1,3))
if dw_cabecera.update()=1 then    
    j=dw_detalle.rowcount( )
    li_codmovimiento=dw_cabecera.getitemnumber( 1,1)
        for i=1 to j
                dw_detalle.setitem( i, 1,li_codmovimiento)
        next
    if dw_detalle.update( )=1 then
        for i=1 to j
            li_codproducto=dw_detalle.getitemnumber( i,2)
            li_cantidad=dw_detalle.getitemnumber( i,3)
            uf_actualizarstock(li_codproducto,ls_movimiento,li_cantidad)
        next
        commit using sqlca;
        messagebox("Exito","Se guardaron los datos")
    else
        messagebox("error","No se guardaron los datos")
        rollback using sqlca;
    end if
else
    messagebox("error","No se guardaron los datos")
end if

Por tanto, el boton nuevo, deberia verse así.






miércoles, 20 de enero de 2016

Sending Key Press


Primero declaramos el API Win32
Subroutine keybd_event( int bVk, int bScan, int dwFlags, int dwExtraInfo) Library "user32.dll"


Luego ingresamos el codigo en el boton

integer li_tecla
li_tecla= 65 // caracter A en ascii. Revisar el codigo Ascii
sle_1.setfocus() // foco en el control sle_1
keybd_event( li_tecla, 1, 0, 0)


 

ejecutar VBScript desde PowerBuilder - Microsoft Script Control (msscript.ocx)



OleObject ole_wsh
Integer li_rc, i, j, k

ole_wsh = Create OleObject
li_rc = ole_wsh.ConnectToNewObject ("MSScriptControl.ScriptControl")
ole_wsh.language = "vbscript"
ole_wsh.addcode("function nombre_funcion(parametro) nombre_funcion = parametro end function")
ole_wsh.executestatement ('if 2 > 1 then msgbox nombre_funcion("true") else msgbox nombre_funcion("false") end if')

martes, 19 de enero de 2016

Abrir una aplicacion desde PowerBuilder

integer li_rc
OleObject ole_wsh

ole_wsh = CREATE OleObject
li_rc = ole_wsh.ConnectToNewObject ( "WScript.Shell" )
ole_wsh.Run ("Notepad")
ole_wsh.AppActivate("Untitled - Notepad")
Sleep (500)
ole_wsh.SendKeys ("Hola mundo") 
Pero primero debe declarar la subroutina Sleep
 
 Subroutine Sleep (Long dwMilliseconds) Library "kernel32" Alias for "Sleep"

PowerBuilder : Obtener el dominio - Nombre de usuario y el nombre de la computadora.

 
 
integer li_rc
OleObject ole_wsh

ole_wsh = CREATE OleObject
li_rc = ole_wsh.ConnectToNewObject ( "WScript.Network" )
IF li_rc = 0 THEN
     MessageBox ("Dominio", string( ole_wsh.UserDomain ))
     MessageBox ("Usuario", string( ole_wsh.UserName ))
     MessageBox ("Nombre de la computadora", string( ole_wsh.ComputerName ))
END IF

viernes, 15 de enero de 2016

PowerBuilder: Aplicacion Maestro- Detalle usando Datawindow con conexion a SQL Server





PowerBuilder


Aplicación Maestro Detalle


1.      Lo primero que haremos es diseñar e implementar nuestra base de datos. En este caso usaré Microsoft SQL Server 2008.



2.      Crearemos nuestra aplicación en PowerBuilder 

Como hemos visto en el diagrama de nuestra base de datos, contamos con tres tablas. La tabla cabecera, será la tabla maestro y la detalle será (valga la redundancia) el detalle. Con respecto a la tabla producto, los datos los llenaremos desde la misma base de datos. Nos centraremos en la implementación de la ventana maestro detalle.

3.      Creación de la conexión con la base de datos.
Crearemos la conexión a través de ODBC.
Nos dirigimos al panel de control y elegimos herramientas administrativas.

Luego elegimos orígenes de datos ODBC.( Si ya conoces como realizar la conexion, puedes saltarte la seccion)
 

Al usar autenticacion integrada de windows, debemos verificar nuestra configuracion en Nuestro Gestor de Base de Datos.


 

 

Al hacer clic en el botón test data source, les debe aparecer otra ventana indicando que la prueba de conexión fue exitosa. Con esto ya tenemos nuestra configuración ODBC.

Podemos crear el perfil de conexión de la base de datos a través del Database Profile  o a través de Database.

 










Clic en el botón copy para copiar el script generado para la conexión, el cual pegaremos en nuestra aplicación. Finalmente clic en ok para cerrar y guardar nuestro perfil de conexión a la base de datos.

Nos dirigimos a nuestra aplicación y en el evento open pegamos el código de conexión.



4.      Diseño de la ventana
Para estar sección solo usaremos datawindows para la cabecera y detalle. También podríamos usar los controles comunes, instrucciones sql y cursores.
La ventana se llamará w_maestro_detalle.
  


Nota: Los nombres de los controles están separados por un guion bajo “_”.


5.      Creación de los objetos datawindows
Crearemos tres objetos datawindows:
·         1 del tipo freeform para la cabecera.
·         2 del tipo grid. Uno para la búsqueda de los productos y otro para el detalle.
Antes de continuar, verificar si estamos conectados a la base de datos correcta. El perfil que hemos creado debe estar con un check verde, indicando que es la conexión activa.


 

  • Dw_cabecera





En esta venta podríamos haber escogido Quick Select, pero escogeremos SQL Select.






En la siguiente ventana tenemos los parámetros de diseño de nuestro datawindows. Lo dejaremos con los valores por defecto.





Aquí ya tenemos nuestro objeto datawindow creado. Por un lado están los nombres de las columnas (etiquetas) y por el otro los valores de las columnas. En esta parte podemos diseñar nuestro datawindow dándole una mejor presentación. 


En este datawindow agregaremos un argumento.





En la siguiente ventana, en la sección column escogemos el campo idmovimiento. En el operador lo dejamos con “=” y en value realizamos clic derecho y seleccionamos arguments y seleccionamos cod, el cual es el argumento que acabamos de crear.




Después de darle un poco de formato, grabaremos nuestro datawindow con el nombre de dw_cabecera.


  • Dw_producto
 
Guardamos nuestro datawindow con el nombre de dw_producto.

  • Dw_detalle

   








Guardamos nuestro datawindow con el nombre de dw_detalle.



6.      Implementando la aplicación

Ahora en cada control datawindow en el evento contructor, agregamos lo siguiente.
This.settransobject(sql). Este es el objeto transacción con el cual trabajaremos.


Si deseamos ver cómo está quedando nuestra aplicación en tiempo de ejecución, debemos agregar el siguiente código en el evento de la aplicación.
connect using sqlca;//Nos conectamos a nuestra base de datos usando el objeto de transacción por defecto llamado sqlca.
open(w_maestro_detalle)//indicamos que se abra nuestra ventana.
 




Si ejecutamos nuevamente nuestra aplicación, se verá de la siguiente manera. 


 La búsqueda de productos.
Dentro del sle_buscar, en el evento modified agregamos el siguiente código.

if this.text="" then//si esta vacio
      dw_buscar.setfilter( "")//limpia el filtro para que se muestren todos los datos
else
      dw_buscar.setfilter( " descripcion like '%"+ this.text+"%'")//de caso contrario asigna un filtro comparando el campo descripción con el texto ingresado.
end if
dw_buscar.filter( )//aplica el filtro.





Validar para que no se agregue el mismo producto más de una vez en el detalle.





Generar código correlativo.
Para generar el código correlativo crearemos una función. Esta función estará implementada en la aplicación. También podríamos usar  un procedimiento almacenado o colocar la columna como identidad.


Botones


 




7.      La aplicación en ejecución.



Si se ingresaron los datos correctamente, aparecerá un mensaje indicando que los datos se guardaron correctamente.


8.      Agregando otras funcionalidades.
Creación la función actualizar stock





La fucion se llamará uf_actualizarstock. Tendra como argumentos o parámetros Idproducto, movimiento y cantidad. Si el movimiento es Salida “S” se restara del stock, de caso contrario se sumara la cantidad al stock existente.

No se ha realizado ninguna validación si la cantidad supera al stock permitido.

Actualizamos el botón guardar.



Por cada producto ingresado en el detalle, debemos llamar a la función actualizar pasándole los parámetros correspondientes obtenidos del detalle.

Dando formato al datawindow cabecera.
Seleccionamos el campo fecha.