Polimorfismo en PowerBuilder

477 views
Skip to first unread message

Alberto Cuevas

unread,
Dec 30, 2010, 10:32:40 PM12/30/10
to powerbui...@googlegroups.com
Hola a todos como se aplica el Polimorfismo en PowerBuilder

Edward López Garbanzo

unread,
Dec 30, 2010, 11:18:47 PM12/30/10
to powerbui...@googlegroups.com
Buenas mi estimado amigo, el poliformismo no es más que sobreescritura de métodos heredados.
En PB se puede crear un formulario que herede de otro, una clase que herede de otra. Con el asistente se puede observar que el método que tiene ese objeto es igual al método del padre. Ese es el comportamiento por omisión.
Si se tiene por ejemplo la clase padreX con un metodoX y se crea otra clase HijoX que herede de PadreX, en HijoX voy a encontrar el método metodoX. El comportamiento por omisión para una clase heredada en PB es la ejecución del código del padre. Si se sobre escribe el métodoX de la clase HijoX. la ejjecución por omisión es primero el código del padre y luego el código del hijo.
Para cambiar el comportamiento para que solo se ejecute el código del método metodoX del hijoX. Se hace click derecho sobre el código del método metodoX de HijoX y se desmarca una opción que en este momento no recuerdo el nómbre pero es la única marcada.


Saludos.
Ed

El 30 de diciembre de 2010 21:32, Alberto Cuevas <betocuevas.net@gmail.com> escribió:
Hola a todos como se aplica el Polimorfismo en PowerBuilder

--
Has recibido este mensaje porque estás suscrito al grupo "PowerBuilder - Ica" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a powerbui...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a powerbuilder-i...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/powerbuilder-ica?hl=es.

Alberto Cuevas

unread,
Dec 31, 2010, 7:42:18 AM12/31/10
to powerbui...@googlegroups.com
Gracias Edward por la explicacion tengo las cosas mas claras.

Jorge Barzola Rosadio

unread,
Dec 31, 2010, 7:45:22 AM12/31/10
to powerbui...@googlegroups.com
Este link te puede servir:

--
Jorge Barzola Rosadio
Analista, Desarrollador de Sistemas
Lima - Perú

Móvil  : (511) 987-043211
Skype : jorge.barzola.rosadio 

Alberto Cuevas

unread,
Jan 12, 2011, 10:56:54 AM1/12/11
to powerbui...@googlegroups.com
Ya estoy usando objetos no visuales gracias por su apoyo, cualquier inquietud seguire preguntando

Micaela Caceres

unread,
Jan 24, 2011, 6:21:17 PM1/24/11
to powerbui...@googlegroups.com
Aprovechando el hilo tengo un select que lo uso en muchos eventos y bueno pense en colocarlo en una funcion y llamarlo cuando lo necesite le coloque el tipo de retorno None y me trabaja OK esto es un buen uso?


Funcion.JPG

Edward López Garbanzo

unread,
Feb 2, 2011, 1:45:21 PM2/2/11
to powerbui...@googlegroups.com
El problema con tú función es cuando se produce un error como lo atrapas?
Por buenas prácticas se recomienda:
-No usar variables globales
-Usar una capa de acceso a la base de datos

La última es en resumen: Creas una clase que accese a la base de datos, todas las consultas, insersiones y actualizaciones. Dentro de la clase puedes manejar internamente los errores, de preferencia dos esquemas uno con log para programadores y mensajes amistosos para los usuarios finales.
La instancias al inicio de la aplicación y cargas los objetos dw o textos

También es recomendable, aunque PB tenga capacidades de ejecución de consultas el crear procedimientos almacenados en la base de datos de insersión, consulta y actualización, desde la aplicación solo se llaman dichos procedimientos. Así es posible crear N capas y la aplicación puede ser migrada a otra base de datos más fácilmente, además se administra mejor la seguridad ya que los accesos solo se limitan a la ejecución de procedimientos.

Saludos.
Ed

El 24 de enero de 2011 17:21, Micaela Caceres <caceres...@gmail.com> escribió:
Aprovechando el hilo tengo un select que lo uso en muchos eventos y bueno pense en colocarlo en una funcion y llamarlo cuando lo necesite le coloque el tipo de retorno None y me trabaja OK esto es un buen uso?


Damián Angaroni

unread,
Feb 2, 2011, 4:05:22 PM2/2/11
to powerbui...@googlegroups.com
Hola Edward!! una consulta???? si ejecuto un procedimiento si o si lo debo cargar a un cursor, ya que solamente encontre ejemplos de código con esto y no tengo mucha experiencia.

Giorgio

unread,
Feb 2, 2011, 6:10:16 PM2/2/11
to powerbui...@googlegroups.com

Y tendria que crear un sp insert, sp delete, etc por cada tabla que necesite hacer mantenimiento.?

Edward López Garbanzo

unread,
Feb 2, 2011, 6:11:06 PM2/2/11
to powerbui...@googlegroups.com
El uso de cursores en procedimientos almacenados de base de datos llena la memoria, si la cantidad de consultas simultáneas es alta se recomienda no usarlos. Se puede hacer lo mismo sin usar cursores y con ciclos while/for.
Ejemplo, supongase que la tabla tabla_usuarios tiene un llave primaria id


set rowcount 1
select @estado=estado, @id=id
from tabla_usuarios
order by id asc
set rowcount 0

while @rowcount > 0
begin
  if @estado = 1
  begin
    insert into tabla_prueba values(@id)
  end
 
  selet @estadoAnt=@estado,
          @idAnt=@id
  --Nuevo registro
  set rowcount 1
  select @estado=estado, @id=id
  from tabla_usuarios
  where id > @idAnt
  order by id asc
  set rowcount 0
end

El elemento insert into tabla_prueba values(@id) es la instrucción a ejecutar por cada registro en la otra tabla.

Saludos.
Edward López Garbanzo
(506)88121453

Edward López Garbanzo

unread,
Feb 3, 2011, 8:36:46 AM2/3/11
to powerbui...@googlegroups.com
Si, aunque a veces se usa un parámetro para hacer un insert, update o delete en una tabla y se reciben parámetros para completar la instrucción. Así, se pueden hacer servicios web (en PB 12) o en .net que accesen la base de datos y la parte de interfase (pantallas) solo se limitaría a consumir los servicios.

Toda esa es con el fin de cuando se necesite hacer un cambio por error o por cambio de las necesidades de negocio sea muy muy fácil.  Además si se desea eventualmente hacer una interfase web es muy transparente ya que la lógica está en la base de datos. Igual si se tiene que cambiar de base de datos, solo basta con migrar los procedimientos almacenados tablas y cambiar la conexión

Saludos.
Ed

Giorgio

unread,
Feb 3, 2011, 8:55:26 AM2/3/11
to powerbui...@googlegroups.com
Si tengo por dar un ejemplo 50 tablas entre ellas:
 
tabla_empleados a esta le tendria que crear sp_insert, sp_update, sp_delete, sp_consulta y asi en cada tabla de mantenimiento? porque hay tablas que se llenan con sp pero que son procesos internos desde la aplicacion.. bueno como preguntaba por cada mantenimiento tendria que tener esos sp ?

Edward López Garbanzo

unread,
Feb 3, 2011, 9:09:17 PM2/3/11
to powerbui...@googlegroups.com
no necesariamente sp_insert y .... para la tabla, habrá algunas que no necesitarán. Puede por ejemplo: sp_usuario_agregar, sp_usuario_modificar, sp_usurio_eliminar, sp_usuario_consultar. En el caso de la primera "usuario" no necesariamente implica insertar en la tabla de "usuario" exclusivamente, se puede insertar en esa tabla y llevar un log de base de datos de quien lo insertó y a qué hora. Y que existan 50 tablas no quiere decir que en cada una va a necesitar insertar o modificar o consultar algo, generalmente hay muchas que son solo de parámetros internos.

Le digo que es mejor hacerlo así con procedimientos, es más trabajo, pero a la larga es más flexible. Uno como profesional propone la mejor opción, puedes proponer los cronogramas con la mejor opción y luego con la tradicional ejecutando directamente desde el código (eso sí, usa capas de clases para separar la parte de la base de datos de la interfase siempre). En resumen: propones las dos opciones, la mejor y la no tan mejor, ambas son funcionales, una tiene más costo en tiempo en la creación y la otra tiene un costo menor en la creación, sin embargo es más costosa en mantenimiento y posibles cambios de hardware o tecnología. Dependiendo de la aplicación, si va a tener mucho mantenimiento es más rentable a la larga la primer opción.



Saludos.
Ed


El 3 de febrero de 2011 07:55, Giorgio <giorgi...@gmail.com> escribió:
Si tengo por dar un ejemplo 50 tablas entre ellas:
 
tabla_empleados a esta le tendria que crear sp_insert, sp_update, sp_delete, sp_consulta y asi en cada tabla de mantenimiento? porque hay tablas que se llenan con sp pero que son procesos internos desde la aplicacion.. bueno como preguntaba por cada mantenimiento tendria que tener esos sp ?

--

Giorgio

unread,
Feb 4, 2011, 11:07:25 AM2/4/11
to powerbui...@googlegroups.com
Gracias por tu tiempo me quedo claro.

Micaela Caceres

unread,
Feb 5, 2011, 9:13:31 AM2/5/11
to powerbui...@googlegroups.com
Hola las respuesta del amigo Edward me parecen muy interesantes gracias una vez mas por compartir tu experiencia siempre es bueno aplicar las buenas practicas para trabajar de manera mas profesional. Amigo comentabas que <<No usar variables globales>> tengo una duda sobre el uso de variables, donde trabajo existe un aplicativo que tiene un ventana padre llamada w_ancestro y tiene muchas variables instancias y que son usadas como propiedades en las ventanas hijas eso es una buena practica tener variables instancias en el padre como se debe maneja el tema de variables, lei en un foro que se debe encapsular las variables en un objeto no visual y simplemente llamarlas cuando se necesite bueno estoy confundida

Edward López Garbanzo

unread,
Feb 6, 2011, 4:23:38 PM2/6/11
to powerbui...@googlegroups.com
Eso de variables de instancia es lo mismo que las globales. Usar un
objeto tipo lista y meterle las variables que voy a ocupar en la
ventana por abrir y luego hacer un open(ventana,objparámetros) así no
usas variables globales. El peligro de las variables globales es
controlar que un cambio afecte algo en otra parte. Si son valores que
no cambian mejor usa constantes.

El 05/02/11, Micaela Caceres <caceres...@gmail.com> escribió:

> --
> Has recibido este mensaje porque estás suscrito al grupo "PowerBuilder -
> Ica" de Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> powerbui...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> powerbuilder-i...@googlegroups.com
> Para tener acceso a más opciones, visita el grupo en
> http://groups.google.com/group/powerbuilder-ica?hl=es.
>
>


--

Alberto Cuevas

unread,
Feb 6, 2011, 5:32:23 PM2/6/11
to powerbui...@googlegroups.com

Saludos a todos he tenido la oportunidad de ver aplicaciones que tienen variables instancia tipo boolean ejemplo ib_activar que en los hijos estan como propiedades y al estar activos cumplen con ciertas condiciones como dice Micaela como tambien variables string que en los hijos tienen un texto para cumplir cierta condicion es recomendable es uso de variables instancia en los ancestros que se recomienda

Damián Angaroni

unread,
Feb 6, 2011, 5:48:05 PM2/6/11
to powerbui...@googlegroups.com
Muy bueno los aportes Edward el tema es el siguiente en mi trabajo hacemos sistemas en 4 capas
1- Presentacion
2- Servicio
3- Negocio
4- Datos
todo lo hacemos con C#, aspx y SQLServer la capa 2 es la que nos permite la independecia de sistemas web a escritorio y no permite tener la misma logica de negocio, para todo, el tema es que no me doy cuenta como hacer una capa 3 con PW, como hacer las clases y llamarlas.

Si tienes alguna ayuda desde ya gracias....   o alguna idea lo que fuera... gracias.

Saludos a todos.

El 6 de febrero de 2011 19:32, Alberto Cuevas <betocuevas.net@gmail.com> escribió:

Saludos a todos he tenido la oportunidad de ver aplicaciones que tienen variables instancia tipo boolean ejemplo ib_activar que en los hijos estan como propiedades y al estar activos cumplen con ciertas condiciones como dice Micaela como tambien variables string que en los hijos tienen un texto para cumplir cierta condicion es recomendable es uso de variables instancia en los ancestros que se recomienda

--

Edward López Garbanzo

unread,
Feb 7, 2011, 10:11:05 AM2/7/11
to powerbui...@googlegroups.com
Considero que el uso de variables de instancia ya sea en el padre o en cualquier lugar debe ser limitado. El problema es el mantenimiento de aplicaciones con muchas variables de instancia y/o globales. No digo que no se usen, per debe usarse con cautela. En el mercado se encuentran muchos programas que se realizaron bajo la lógica original de Power builder, sin embargo, la experiencia demostró que dichas prácticas no son las mejores. Encontré un artículo que hace referencia a lo que se llama refactoring. Eso puede ser aplicado no solo a power builder, en general se debe aplicar a todo.
 
 
Cuando uno programa en cualquier lenguaje, debe pensar que el código va a ser leido en 5 años por otra persona que no sabe nada del tema y que debe modificar el programa para que se amolde a nuevos requerimientos. Si se programa usando las mejores prácticas y uno aún está en la compañía no recibirá quejas de compañeros que se estén dando a palitos por hacer un cambio que conseptualmente es sencillo, pero por una estructura monolítica del código es muy complicada de entender y modificar.
 
Saludos.
Ed

El 6 de febrero de 2011 16:32, Alberto Cuevas <betocuevas.net@gmail.com> escribió:

Saludos a todos he tenido la oportunidad de ver aplicaciones que tienen variables instancia tipo boolean ejemplo ib_activar que en los hijos estan como propiedades y al estar activos cumplen con ciertas condiciones como dice Micaela como tambien variables string que en los hijos tienen un texto para cumplir cierta condicion es recomendable es uso de variables instancia en los ancestros que se recomienda

--

Giorgio

unread,
Feb 8, 2011, 7:39:02 PM2/8/11
to powerbui...@googlegroups.com
Muy interesante gracias Edward por compartir tu experiencia con el grupo.

Alberto Cuevas

unread,
Feb 12, 2011, 2:07:38 PM2/12/11
to powerbui...@googlegroups.com
Estimado tienes ejemplo de programacion en capas con PB?

Micaela Caceres

unread,
Feb 13, 2011, 5:10:18 PM2/13/11
to powerbui...@googlegroups.com
Alguien modela desde PowerDesigner objetos PowerBuilder? en una charla a la cual asisti dieron un ejemplo breve quizas alguno de ustedes tenga experiencia con estas 2 herramientas.

Giorgio

unread,
Feb 14, 2011, 9:20:31 AM2/14/11
to powerbui...@googlegroups.com
En los ejemplos de PD hay un modelo de objetos de PFC muy interesante siempre me llamo la atención cada libreria PFC estan separadas por package y en cada una estan los objetos, hace mucho encontre este ppt que adjunto en la web, me gustaria tambien saber de la experiencia de algunos compañeros.

pb10_pdplugin.ppt

Giorgio

unread,
Feb 14, 2011, 9:44:08 AM2/14/11
to powerbui...@googlegroups.com
Adjunto el modelo que comentaba esta en PD 15.
PB10_PFC.rar

Giorgio

unread,
Feb 15, 2011, 4:40:07 PM2/15/11
to powerbui...@googlegroups.com
Estimados empece a poner en practica las buenas practicas del amigo Edward y empece con esta prueba:

1 - He creado un Procedimiento Almacenado llamado usp_alm_movimiento_insert (BD SQL Server 2005)

CREATE PROCEDURE usp_alm_movimiento_insert

           @cod_movimiento char(6),
           @tipo_movimiento char(1),
           @fec_registro datetime,
           @cod_documento char(2),
           @nro_serie varchar(6),
           @nro_documento varchar(15),
           @cod_tipo_operacion char(2),
           @cod_moneda int,
           @tipo_cambio numeric,
           @tipo_cuenta char(1),
           @cod_cuenta char(3)
AS

INSERT INTO alm_movimiento
           (cod_movimiento,
           tipo_movimiento,
           fec_registro,
           cod_documento,
           nro_serie,
           nro_documento,
           cod_tipo_operacion,
           cod_moneda,
           tipo_cambio,
           tipo_cuenta,
           cod_cuenta)
     VALUES
           (@cod_movimiento,
           @tipo_movimiento,
           @fec_registro,
           @cod_documento,
           @nro_serie,
           @nro_documento,
           @cod_tipo_operacion,
           @cod_moneda,
           @tipo_cambio,
           @tipo_cuenta,
           @cod_cuenta)

Luego al momento de guardar (Evento ue_guardar) me inserte el nuevo registro:

DECLARE InsertarMovimiento PROCEDURE FOR usp_alm_movimiento_insert 

@cod_movimiento     = :ls_cod_movimiento,
@tipo_movimiento     = :ls_tipo_movimiento,
@fec_registro           = :ldt_fec_registro,
@cod_documento      = :ls_cod_documento,
@nro_serie               = :ls_nro_serie,
@nro_documento      = :ls_nro_documento,
@cod_tipo_operacion = :ls_cod_tipo_operacion,
@cod_moneda          = :li_cod_moneda,
@tipo_cambio           =  :ldc_tipo_cambio,
@tipo_cuenta            = :ls_tipo_cuenta,
@cod_cuenta            = :ls_cod_cuenta;

EXECUTE InsertarMovimiento;

COMMIT;

Hasta aca todo bien, pero si el mantenimiento no es de una tabla simple o cabecera y mas bien de una tabla detalle?

Oscar Camargo Rodriguez

unread,
Feb 15, 2011, 5:05:58 PM2/15/11
to powerbui...@googlegroups.com
Supongo que tienes que recorrer cada item del dw detalle y empezar a insertar en la tabla detalle valor por valor...
Yo no he usado muchos SP, he sido hincha del poderoso DW

--
338.gif
Reply all
Reply to author
Forward
0 new messages