• Jueves 28 de Marzo de 2024, 22:22

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - davidmolina1

Páginas: 1 [2] 3
26
Power Builder / Re: Modificar posicion de columna en dw
« en: Martes 23 de Febrero de 2010, 23:14 »
Pues si dices que funciona no veo donde está el problema.

27
Power Builder / Re: Modificar posicion de columna en dw
« en: Martes 23 de Febrero de 2010, 22:39 »
¿Lo que quiero decir es si has comprobado lo que devuelve el método Modify?

¿Estás seguro de que el método modify se ha ejecutado correctamente?

28
Power Builder / Re: Modificar posicion de columna en dw
« en: Martes 23 de Febrero de 2010, 21:57 »
¿Y has probado a pone un messagebox para ver lo que devuelve la función modify?

29
Power Builder / Re: Modificar posicion de columna en dw
« en: Martes 23 de Febrero de 2010, 21:47 »
No entiendo un par de cosas del código que has puesto:

1.- ¿Porqué pones space(1)?, ¿no es mejor ' ' o incluso dw_1.modify('idempleado.visible '  ?
2.- Si ls_cod puede contener '1' ó '0' la expresión del modify puede ser 'idempleado.visible 1' o 'idempleado.visible 0' En cualquier caso no va a ejecutarse bien.

Piénsalo un poquito más.

30
Power Builder / Re: imprimir 2 data windows
« en: Lunes 15 de Febrero de 2010, 17:17 »
Hola.

Para eso necesitas crear una datawindow nueva de tipo composite.

Una datawindow composite es una datawindow que está compuesta por varias datawindow.

En tu caso dos datawindows . Cada una de estas dos datawindow las puedes referenciar haciendo uso del método GetChild . Por ejemplo, dw_composite.GetChild ("dw_rpt1", ldwc_list1) y dw_composite.GetChild ("dw_rpt2", ldwc_list2)

Sobre estas dos datawindowschild (ldwc_list1 y ldwc_list2) puede hacer lo que necesites, Retrieves, filtros, RowsCopy, etc...

Espero haberte ayudado.

Un saludo.

31
Power Builder / Re: Guardar dw external
« en: Viernes 12 de Febrero de 2010, 23:04 »
Pues si los datos los tienes en una datawindow external lo único que puedes hacer es leer de la datawindow external e ir grabando usando una datastore, por ejemplo.

Un saludo.

32
Power Builder / Re: Saber que dato modifico usuario
« en: Viernes 12 de Febrero de 2010, 23:01 »
Para saber el campo que ha sido modificado debes utilizar el método GetItemStatus

Algo así:
For ll_for = 1 to ll_filas
   if ldw_datos.GetItemStatus (ll_for, 'campo1', Primary!) <> NotModified! then
      // Campo1 Modificado
   end if
   if ldw_datos.GetItemStatus (ll_for, 'campo2', Primary!) <> NotModified! then
      // Campo2 Modificado
   end if
   ...
   ...
next


Eso mismo lo puedes hacer para el buffer Filter! y Delete! si es el caso.

Un saludo

33
Power Builder / Re: Ventana de Presentacion
« en: Viernes 22 de Enero de 2010, 17:54 »
La ventana de presentación se suele usar para dar tiempo a la aplicación principal a realizar otras tareas que tardan algún tiempo en hacerse (conexiones a la base de datos, lectura de ficheros INI, registro de LOG, etc..), mientras tanto con el contenido de la ventana principal se entretiene al usuario.

Si lo que deseas es una ventana del estilo de PB la ventana debe ser child, y le quitas todas las propiedades menos la de visible y enable, es decir, sin borde. sin título, sin menús, solo con el contenido que desees mostrar.


Si lo que quieres es esperar x segundos sin más pon esto en el open de la aplicación.

open (w_splash) // Ventana de presentación

// Pon aquí las tareas que tengas que hacer antes de abrir la ventana principal.

do until CPU () - ll_tiempo >= 5000 // Esperamos como máximo 5 segundos
loop

close (w_splash)
   
open (w_principal)

Si te interesa que la ventana de presentación se cierre después de abrir la ventana principal, puedes poner al final del open de w_principal la sentencia close (w_splash) y ya no tienes que esperar los 5 segundos (o si lo prefieres puedes mezclar las dos cosas). Ojo : que si el close de w_splash lo haces en w_principal la ventana w_splash no debe ser más grande que w_principal, queda un poco feo que mientras se abre w_principal estén las dos visibles. También debes tener cuidado con que el open de la ventana se abra sí o sí, porque si no el usuario tendrá que cerrar la ventana w_splash usando alt+F4 ya que le has quitado los menús

Espero haberte ayudado.

34
Power Builder / Re: Validar Dw
« en: Miércoles 20 de Enero de 2010, 10:40 »
Es tan sencillo como leer el/los valores

ls_valor = Trim (dw_1.GetItemString (...))

luego hacer las comprobaciones y grabar

if isNull (ls_valor) and len ls_valor <> '' then
ll_update = dw_1.Update ()
else
ll_update = -1
end if

y finalmente si todo ha ido bien terminar la transacción

if ll_update > 0 then
gf_commit ()
end if

35
Power Builder / Re: Ejecutar en tiempo determinado
« en: Domingo 17 de Enero de 2010, 09:37 »
Efectivamente, el método timer() sirve para que el evento timer se ejecute periodicamente, pero, a mi entender,  los dos ejemplos que has puesto no son adecuados.

1.- Cuando una aplicación se conecta a la base de datos, lo normal es que siga conectada, y en el caso de que se produzca una desconexión ya te darás cuenta cuanda hagas alguna operación, ¿para qué vas a mirar cada x minutos si sigues conectado?

2.- Grabar datos cada x minutos. ¿Qué pasa si la grabación se hace cuando el registro está a medio terminar, o con datos incompletos? Lo normal es que el usuario decida cuando grabe y antes de grabar se haga algunas comprobaciones (ya sabes rango de fechas, datos obligatorios, etc)

Un saludo.

36
Power Builder / Re: consulta
« en: Sábado 9 de Enero de 2010, 19:28 »
Cita de: "darksito"
Me podrias dar algunos ejemplos porfis :D :oops:


Te explico como debes usar un dropdown:

Un dropdown es una datawindow que con al menos dos campos uno el código del registro y otro la descripción.

Solo suele estar visible la descripción. (aunque si quieres mostrar el código no hay problema)

El nombre que yo le suele dar es dddw_xxxxx, esto es para saber que es un dropdowndatawindow.

Una vez que lo has hecho, debes tener una datawindow por ejemplo tipo form en la que tendrás un campo también código sobre el que debes indicar que de ese campo se mostrará un dropdown. Esto se hace en una propiedad llamada Style. aquí debes indicar la datawindow que hará de dropdown (la que has llamado dddw_xxxx) y después debes indicar el displayColumn y el dataColumn, es decir cual es el código y cual la descripción.

una vez que lo has hecho grabas la datawindow form y listo.

cuando ejecutes se te desplegará el dropdown sin tener que hacer nada más. ni retrieve a la dropdown, ni  settransobject.

Espero haberte ayudado.

37
Power Builder / Re: Uso de hand help
« en: Sábado 9 de Enero de 2010, 10:46 »
¿Qué es un convertidor de Power Builder a Visual Basic?

No sé que es Hand Help, pero si es un periférico, lo que se suele hacer es que el periférico tenga algún tipo de interfaz de comunicación con el exterior, ya sea para leer o para escribir.

Lo único que tendrías que hacer es ver el formato que usar y pedir una ampliación del programa en PB.

Un saludo.

38
Power Builder / Re: consulta
« en: Sábado 9 de Enero de 2010, 10:38 »
No es ni bueno, ni malo, pero para qué complicarte la vida.

Si lo que usas es un dropdowndatawindow tienes datawindowchild que hacen lo mismo
Si lo que usas es un dropdownlistbox, listview, treeview, o similares, tienes datastores para traerte los datos de la base de datos.

Los cursores, lo mismo que las SQL embebidas en código son poco mantenibles.

Un saludo

39
Power Builder / Re: Fecha de lanzamiento de PB 11.5
« en: Martes 15 de Diciembre de 2009, 01:38 »
como veo que nadie lo ¡¡¿sabe?!! :brickwall: , me respondo a mi mismo.

La vesión 11.5 se lanzó el 5 de septiembre de 2008
La versión 11.5.2 se lazó el 14 de mayo de 2009


Saludos

40
Power Builder / Re: Modificacion masiva
« en: Viernes 27 de Noviembre de 2009, 21:29 »
Bueno, creo que con una sentencia SQL no vas a poder obtener todos los códigos de una categoría. El motivo es que la SQL te devolverá un solo registro.

Si quieres que te devuelva varios registros tienes dos opciones

1. Usar una elegante y a la vez fácil de usar datawindow/datastore ó
2. Utilizar un engorroso cursor que recorra las filas de la sql.


Saludos.

41
Power Builder / Re: Numeros aleatorios
« en: Viernes 27 de Noviembre de 2009, 21:13 »
Bueno no sé que explicar más..

Seguramente se puede mejorar, porque fue lo primero que se me ocurrió.

Randomize (0) sirve para sembrar una semilla diferente cada ejecución. La semilla se usa para obtener número aleatorios partiendo de esta.

Haz la prueba a quitarla instrucción y verá como los números aleatorios se repiten en sucesivas ejecuciones.

El rand debe ser de 10 porque los número que genera van desde 1 hasta 10 al restarle 1 se obtiene número desde 0 a 9.

do
ll_valor = Rand (10) - 1 // Rand debe ser de 10 no de 9

lb_nuevo = true
for ll_for = 0 to 9
if lla_texto [ll_for] = ll_valor then
lb_nuevo = false
end if
next
if lb_nuevo then
ll_index ++
end if
loop until lb_nuevo

sirve para ejecutar hasta que se obtenga un número que antes no se haya producido, para eso se almacenan los valores en lla_texto[ll_index]

Esto...
if ll_index <= 9 then
lla_texto[ll_index] = ll_valor
end if

Es para registrar en lla_texto el valor que ha hecho salir del bucle do interno.

y por último el
do
...
loop until ll_index = 9
sirve para salir cuando se hayan rellenado las 10 posiciones del array lla_texto. Recuerda que el array va de 0 a 9.

saludos.

42
Power Builder / Re: Métodos filter() y setfilter()
« en: Viernes 27 de Noviembre de 2009, 21:03 »
Hola.

No tienes que usar los mismos datawindows, puedes usar tantas datawindows como desees, todas traerán datos de la misma base de datos pero cada una presentará los datos según necesites.

Sobre lo que planteas no hay ningún problema en que uses la misma datawindow, en un sitio selecciona y actualiza datos y en otro solo selecciona datos.

La actualización de datos la programas tú, así que si no haces el update () no hay problemas, no bloqueará los registros traídos, ni los modificará ya que tú no le harás el update.

Otra cosa es que el la segunda datawindow (la que seleccionas y no actualizas) permitas editar los campos. Realmente no pasa nada , solo que queda feo que el usuario pueda editar algo que no puede grabar.

Saludos.

43
Power Builder / Fecha de lanzamiento de PB 11.5
« en: Miércoles 25 de Noviembre de 2009, 20:33 »
Hola.

Necesito saber cuando fue el lanzamiento de PB 11.5.

No necesito exactamente la de esa versión, me bastaría saber la de la versión 11.

Gracias.

44
Power Builder / Re: Numeros aleatorios
« en: Miércoles 25 de Noviembre de 2009, 19:27 »
Prueba esto.


boolean lb_nuevo
Long lla_texto[0 to 9]
long ll_valor
long ll_index
long ll_for
// Inicialización de variables
ll_index = -1
for ll_for = 0 to 9
   lla_texto [ll_for] = -1
next
Randomize (0) // Muy importante. Establece una semilla distinta cada ejecución
do

   do
      ll_valor = Rand (10) - 1 // Rand debe ser de 10 no de 9
      
      lb_nuevo = true
      for ll_for = 0 to 9
         if lla_texto [ll_for] = ll_valor then
            lb_nuevo = false
         end if
      next
      if lb_nuevo then
         ll_index ++
      end if
   loop until lb_nuevo
   if ll_index <= 9 then
      lla_texto[ll_index] = ll_valor
   end if

                              
loop until ll_index = 9

cb_0.text = String (lla_texto
  • )

...
cb_9.text = String (lla_texto [9])

45
Power Builder / Re: Actualizacion de stock
« en: Miércoles 25 de Noviembre de 2009, 01:18 »
Hola.

Lo que necesitas es una datawindow (ldw_producto)

Haces un retrieve por ejemplo ldw_producto (...) para mostrar el producto con el que vas a trabajar.

Luego supongo que tendrás un objeto con los detalles del detalle del comprobante y una cantidad que vas a restar al stock del producto.

Lo que tienes que hacer es lo siguiente.

ll_cantidad = Long (sle_cantidad.Text)
ll_cantidad_producto =  ldw_producto.GetItemNumber (ll_fila, 'stock')
ll_cantidad_producto -= ll_cantidad

Y después de hacer los controles necesarios, ... que ll_cantidad no sea negativo, que ll_cantidad_producto no sea negativo, que no haya nulos, etc... haces

ldw_producto.SetItem ('stock', ll_cantidad_producto)
ll_update = ldw_producto.Update ()
if ll_upadte > 0 then
gf_commit (ll_update, sqlca) // Haría commit o rollback ç
end if

Esto te funcionará si vas a trabajar con una sola aplicación contra la base de datos. Si la aplicación se va a ejecutar con varios usuarios hay que hacer alguna modificación en la datawindow de producto para evitar que dos usuarios al mismo tiempo actualicen un mismo registro.

Espero haberte ayudado.

46
Power Builder / Re: Métodos filter() y setfilter()
« en: Lunes 23 de Noviembre de 2009, 17:31 »
Buenas...

El método SetFilter (ExpresionLógica) sirve para establecer un filtro en la datawindow o datastore. Lo que devuelve es 1 ó 0 para indicar si se ha registrado el cambio.
El método Filter lo que hace es ejecutar el filtro que has puesto.

Otros métodos que puedes consultar son .

FilteredCount () -> Te da el número de registros que se han filtrado. No han desaparecido sino que están ocultos
ldw_loquesea.Describe ("Datawindow.Table.Filter") -> Esto te da el filtro que tiene actualmente la datawindow. La que se ha puesto con el SetFilter. o "!" si no hay nada o "?" si te has equivocado en la sintáxis.

Si la consulta que haces de los libros no es muy grande y la conexión a la base de datos no es lenta, no está mal traerse todos los registros y luego hacer una búsqueda, pero si no es el caso te recomiendo que afines la localización del registro usando los argumentos del Retrieve.


Otra cosa que puedes hacer es hacer una búsqueda sobre los datos en pantalla usando Find. La sintáxis es ldw_loquese.Find (ExpresionLógica, ll_FilaInicio, ll_FilaFin). Lo que devuelve es si es > 0 la fila de la primera coincidencia, si es -1 que no hay coincidencia y -5 si hay un error sintáctico.

Si lo que devuelve el Find es > 0 puedes hacer un
ldw_loquesea.ScrollToRow (ll_filaEncontrada) // Fuerza un scroll de la datawindow si fuese necesario
ldw_loquesea.Setrow (0, false) // Borra los registros seleccionados
ldw_loquesea.SetRow (ll_filaEncontrada, true) // Selecciona el encontrado.
Esto lo puedes al mismo tiempo que escribes sobre el sle_busqueda y es bastante vistoso.

En los dos casos (El del SetFilter y el del Find) se pueden usar sixtáxis propia de PowerBuilder para las expresiones booleanas.
Por ejemplo:

Upper(Genero) like '%FICIÓN%'

Precio <= 50

FechaPublicacion >= Date ('01/01/2009')

ISBN = 123456

Espero haberte ayudado.

47
Power Builder / Re: actualizacion de campos
« en: Jueves 12 de Noviembre de 2009, 21:02 »
El problema lo tienes en que el la clausula where de la sentencia update que hay dentro del for  usas venta.

Esta variable siempre tiene el mismo valor dentro del for, Por tanto siempre le estás haciendo el update sobre la misma fila de detalle_comprobante.

Si no te importa te voy ha hacer algunas recomendaciones:

- Anteponle a las variables el tipo y al ambito, por ejemplo
   ll_venta en lugar de venta (con esto indicas que es local y long)
   ld_fecha en lugar de fecha (con esto indicas que es local y fecha)
   Cualquier persona que lea tu código en un futuro te lo agradecerá

- En lugar de la sintáxis .object. usa GetItemXXXX
   El motivo es que da más juego tener el nombre del campo en un string que dentro de una sentencia.

- Evita las sentencias SQL en código Updates, Commit, SQLCA.SQLCode, etc...
   En lugar del update usa el método update () de la datawindow/datastore.
   El commit/Rollback es mejor centralizarlo en una función global. Nunca se sabe cuanto te hará falta hacer hacer algo después de un commit/rollback. Esto te lo digo por experiencia. Por ejemplo registrar en un fichero el error rollback para posteriormente consultarlo.
   Haz un solo commit/Rollback al final del proceso. En el ejemplo que haz puesto se puede dar el caso de que hagas el commit de comprobante y el rollback de venta_comprobante. Esto hace que la operación no sea atómica.

-   Cuando hagas un .object.campo[1] o GetItemNumber (1, 'campo') asegurarte de que esa fila existe.
   Este es un error que siempre cometemos, Aquí me incluyo yo también.

48
Power Builder / Re: ultimo dia del mes
« en: Lunes 9 de Noviembre de 2009, 01:17 »
El truco consiste en componer una fecha con el día 1 del mes siguiente al que deseas saber el número de días. Hay que tener cuidado con el mes de diciembre que pasa a ser enero del año siguiente.

A esa fecha le restas un día y ya tienes el número de días.

Esto te soluciona el tema de los bisiestos ya que no solo hay que tener en cuenta los múltiplos de 4 sino que además cada 400 años hay excepciones.

Por ejemplo los meses de febrero del año 2100, 2200, 2300, 2500, 2600, 2700, ... no serán bisiestos.
mientras que los meses de febrero de 1600, 2000, 2400, 2800, ... si lo son.

Bueno al grano, el método:

Date ld_dia, ld_dia_sigte
Long  ll_dia, ll_mes, ll_anio

if not isDate (String (ld_dia)) then return -1

ll_mes = Month (ld_dia)
ll_anio = Year (ld_dia)

if ll_mes = 12 then
   ll_anio ++
   ll_mes = 1
else
   ll_mes ++
end if

ld_dia_sigte = Date ('01/'+ String (ll_mes) + '/'+ String (ll_anio))

Return Day (RelativeDate (ld_dia_sigte, -1))

49
Power Builder / ClassDefinition
« en: Miércoles 30 de Septiembre de 2009, 23:30 »
Hola.

¿Alguien ha usado la clase ClassDefinition de PB?

En el código que viene de ejemplo en PB no funciona porque sd toma un valor nulo cuando se ejecuta c_obj.FindMatchingFunction( "Find", ls_args)

¿Alguna sugerencia?

Gracias de antemano

Citar
string ls_args[]
string s, lineend
integer li
ScriptDefinition sd
ClassDefinition c_obj

ls_args[1] = "string"
ls_args[2] = "long"
ls_args[3] = "long"

c_obj = CREATE classDefinition
sd = CREATE ScriptDefinition

sd = c_obj.FindMatchingFunction( "Find", ls_args)

IF NOT IsValid(sd) or isnull (sd) THEN
   messagebox ("", "No matching script")
ELSE

   //The uf_scriptinfo function gets information about the function that matched the signature and builds a string. Scriptobj is the ScriptDefinition object passed to the function:
   lineend = "~r~n"
   
   // Script name
   s = s + sd.Name + lineend
   // Data type of the return value
   
   s = s + String (sd.ReturnType) + lineend
   //.DataTypeOf
   // List argument names
   
   s = s + "Arguments:" + lineend
   
   FOR li = 1 to UpperBound(sd.ArgumentList)
      s = s + sd.ArgumentList[li].Name + lineend
   
   NEXT
   
   // List local variables
   
   s = s + "Local variables:" + lineend
   
   FOR li = 1 to UpperBound(sd.LocalVariableList)
      s = s + sd.LocalVariableList[li].Name + lineend
   
   NEXT
   
   messagebox ('', s)

END IF


50
Power Builder / Re: Pasan y Vienen
« en: Martes 15 de Septiembre de 2009, 17:46 »
Lo que necesitas es usar las funciones

CumulativeSum (Campo, FOR grupo)

Esta expresión la pones en un campo computado en la banda de footer o detail dependiendo de lo que quieras mostrar 'Pasa ' o 'Vienen'

El problema lo tendrás cuando
1. solo tengas una página
2. en la última página

En ambos casos lo que se suele hacer es añadir un tercer campo computado (superpuesto al del footer) con la expresión sum (campo)

Y haces visible unos computados y otros. El criterio para mostrar unos u otros es el número de páginas y si la página es igual a la última. Los métodos son Page () y PageCount ().

Saludos

Páginas: 1 [2] 3