Formato de columna

Tengo una bd. En mysql, un datawindow crosstab, el cual me muestra una de las columnas con un formato erróneo. Yo se que ese dato esta en blanco, pero debería mostrar la columna en '0', ya que el formato del campo es ##0.00,, pero en cambio me devuelve otras cosas como '0000000000000000000.00',
'578450000000000.00', etc,, pero las demas columnas me salen bien. Incluive he duplicado un datawindow que funciona bien,,,y al retocarlo,,me pasa lo mismo.

1 respuesta

Respuesta
1
Da la impresión que tu problema esta referido a los valores iniciales, recuerda que power builder maneja el tipo NULL, esto en algunos casos puede ser beneficioso pero en otros negativo, mi recomendación es que indiques en la casilla de valor inicial, dentro de tu datawindow, en las especificaciones de cada una de las columnas, un valor inicial degamos CERO, en este caso, de esa forma cada vez que sea insertada una tupla o registro dentro de tu datawindow, esta columna toma el valor 0, sin embargo puede que el problema no se centralice unicamente en el datawindow, sino que en tu base de datos, por lo que asegurate que el valor que recibes no sea NULL, sino que un valor especifico, siempre puedes advertir este problema desde el select incluido en tu datawindow, utilizando la función ISNULL() la cual permite colocar un valor alterno en caso de que el valor leído sea nulo.
Hola experto. Te agradezco la atención. Te comento que este campo (decimal) lo pongo como columna en un crosstab, de acuerdo a la clase de vehículo. Solamente me ocurre con la ultima o penúltima columna, las demás, me salen bien y respetan el formato. Como dato adicional te comento que las colmnas que dan problemas no tienen dato.
En la b.d. la tabla tiene un valor x default = 0.0000, y en el datawindow crosstab, no se donde se coloca un valor inicial. Me podrias explicar por favor??
Saludos
La situación que me cuentas es muy similar a lo que ya en su momento te explicaba en mi ultima respuesta, recuerda que los datos se dividen en tipos, ya sabes cadenas, numéricos, lógicos, fecha, etc. pero la similitud entre todos es la ubicación de un tipo de dato en común, el cual es el famoso NULO, o NULL, este valor es compatible con cualquier tipo de dato, sin embargo este valor puede perjudicar en un momento determinado la situación de cálculos, vistas, etc. el caso que me cuentas es típico, y por supuesto es generado por un valor numérico que integra un NULL, lo más acertado en este caso es colocar un valor inicial en cualquier caso, sea variable, o campo de una tabla, o bien un valor en un datawindow, en los dos anteriores es fácil determinar la forma del valor inicial, sin embargo en el datawindow puedes hacerlo por medio de 2 formas, por medios programáticos, utilizando la función SETITEM() la cual seguramente te lleva a un tedioooooso escribir y escribir, y la otra es colocar dicho valor en la columna del datawindow object que permite el valor inicial, me refiero a INITIAL VALUE, esta columna la puedes ver en las especificaciones de los campos que contiene el datawindow el valor es colocado al momento de provocar una instrucción INSERT(), la cual puede provenir de cualquier lado, manual o automática según sea el caso, sin embargo el proteger dicho valor con un valor inicial desde el punto de vista visual por medio del datawindow, no determina que en la tabla o base de datos se encuentre así, esto solo pasara si dicho valor es trasladado a los campos correspondientes, con sus valores correspondientes, de otra forma aunque en pantalla visualices un CERO, por ejemplo, seguramente en la tabla continuara un NULO.
Hola experto. Disculpa que insista en el tema, pero aun no hay solución. Resulta que en un dw. crostab, los resultados se muestran en filas y columnas. Algunos registros tienen datos en todas las columnas, otros registros no. Obviamente, en los registros que no tienen datos en las columnas, es porque dichos datos no están en la bd. El crosstab crea las columnas en forma dinámica, dependiendo de los datos que contenga. No encuentro un lugar donde colocar valores iniciales en un dw. crosstab. El campo que se muestra en las columnas es decimal y tiene valor por defecto como 0.
¿Alguna idea?
Saludos
Ahora la pregunta tiene sentido.
El problema es muy simple, y ademas ya lo has detectado, lo que realmente quieres o necesitas conocer es la forma de agregarle datos, a un datawindow, independientemente de si esta como crosstab o dropdowndatawindow, en los dos casos la situación es muy similar.
Para esto necesitas de una función llamada GETCHILD(), esta función tiene la capacidad de extraer el datawindow que se encuentra en un segundo plano, e instanciarlo hacia un área de trabajo, por lo que una vez instanciada lo demás es muy simple, pues a partir de este momento simplemente utilizas las funciones como Setitem(), retrieve() etc.
Ejemplo.
Digamos que tienes una columna llamada cliente, la cual esta determinada como un dropdatawindow, detrás de esta columna se encuentra un datawindow object, dentro de este datawindow object, se integran 2 columnas, código y nombre, las cuales provienen de la tabla clientes, la información que debe aparecer, es unicamente la que corresponda al agente de ventas que tiene en su cartera a un determinado grupo de clientes. Significa pues que los clientes que debe desplegar el dddw, es solo los que se relacionan con el agente de ventas,
Para solucionar este problema utilizas la función GETCHILD()
Digamos en el evento itemchanged(), el cual es disparado cada vez que cambia un valor, y haciendo mención a la columna del código del agente de ventas, más o menos así.
DATAWINDOWCHILD ldwc_clientes
CHOOSE CASE LOWER(dwo.name)
CASE 'agente_ventas'
IF (THIS.GetChild('cliente', ldwc_clientes) = 1) THEN
ldwc_clientes.SetTransObject(SQLCA)
ldwc_clientes.Retrieve(data)
END IF
END CHOOSE
En el script anterior presento un ejemplo del como puedo instanciar un datawindow object que se encuentra en un tercer plano, y como puedo manipular dicho datawindow dando como resultado el efecto esperado.
Existe una segunda forma, la cual tiene la finalidad de implantar datos en un registro del datawindow que ya existe, sin embargo esta alternativa tiene la penalidad de degradar en algunos casos, la velocidad de despliegue.
La forma es la siguiente.
En el ejemplo según tu pregunta, tienes una columna que esta incializada con un valor por ejemplo cero. El cual siempre va a tener esta valor hasta que por algún medio sea cambiado.
Esta columna, creo entender, es creada en el mismo select del datawindow object, instanciando un nombre por medio del pronombre AS, y colocando un valor constante como 0,
POR EJMP.
SELECT 0 as valor
...
..
..
Esto crea una columna en el datawindow del tipo numérico y la inicializa con 0, el nombre sera VALOR.
De igual forma hay 2 maneras de hacer esto sin embargo por estar en un 3er. Plano solo queda una de las dos,
sigue estos pasos y seguramente tu problema se resolverá.
1. Tienes que declarar una función del tipo publica, la cual reciba 1 argumento del tipo numérico, y al mismo tiempo retorne un valor cualquiera, digamos un string en blanco.
2. Dentro de la función ahora, tienes dinámicamente el numero de la fila en la que se encuentra el datawindow, por lo que puedes aprovechar dicho numero para asignar un valor a una columna cualquiera, digamos en nuestro caso VALOR. La cual podría servir para integrar el monto de las facturas pendientes de pago.
3. Ahora que ya tienes una función, dentro de esta puedes hacer lo que quieras. Por ejemplo hacer un select sum(), buscando las facturas de tu cliente. El resultado lo asignas a la columna VALOR
4. Ahora solo queda hacer la conexión entre el datawindow y la función, para ello utilizas un objeto del tipo computed field, o campo computado, dentro de este como ya habrás a divinado, colocas el nombre de la función publica que acabas de crear, y como argumento le envías el numero de la fila en que te encuentras
4. Grabas y pruebas.
El efecto sera el que buscas.
Por ultimo, ten encuenta que el campo computado es uno más en tu pantalla, no necesariamente debe desplegar un dato, por lo que puedes minimizar su tamaño, o simplemente colocarlo debajo de la banda del detalle (por ejemplo), NO DEBES COLOCAR LA PROPIEDAD VISIBLE EN FALSE, pues esto anula totalmente la operatividad del objeto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas