Dudas con los componentes de las tablas que gestiono con el programa Power Builder

Tengo que hacer mantenedores para tablas que están relacionadas
Mi pregunta es si por ejemplo actualizo la tabla personal ese dato se agrega solo en las otras tablas relacionadas o hay que hacerlo a mano como lo haces tu, me podrías dar un ejemplo. Estoy muy complicado
Muchas gracias
*********************************
Otra duda es en una datawindows muestro todos los datos de una tabla por y en esa datawindows creo un campo computado llamado dato1 este dato1 me sirve para que el usuario ingrese una descripción.
Bueno lo que necesito hacer es de los datos mostrados en la datawindows necesito gravar ciertos de esos datos en otra tabla incluyendo el campo dato1.
Como puedo manejar los campos de las datawindows por separado.
Agradezco tu ayuda muchas gracias
********************************
Necesito hacer un informe con varia tablas pero todo va bien hasta que
Distribuyo los datos por ejemplo nombre edad dirección teléfono numero de equipo correctamente hasta ahí no hay problema
Pero los campos
nombre_modelo marca modelo
Necesito que aparezcan todos hacia abajo
Por ejemplo
Disco duro data 100 un giga
ram pc 133 king ton etc, etc
Lo que pasa es que al distribuir todos estos datos
los campos anteriores me los va mostrando 1 por uno y cuando imprimo me los imprime uno en cada hoja y yo necesito que me aprescan los datos del usuario más los datos de su equipo en una pura datawindows pero que estén ordenados muchas gracias por tu tiempo adiós.
**********************************
Tengo una datawindows de ingreso necesito que cuando el usuario se equivoque en un campo le borre el contenido de ese campo automaticamnente.
A como puedo manejar los errores en power por ejemplo tengo una dw de ingreso con los campos
código que llave primaria
y descripción
Al ser llave primaria el usuario ingesa un código que existe y presiona gravar entonce power arroga un error de que en la llave primaria no pueden existir datos dupliocados entonces yo necesito que cuando el usuario presione gravar me salga un mensaje mio y no el de el power, o me aconsejas otra forma de hacerlo
Muchas gracias.
Respuesta
1
Cuando hay tablas relacionadas, toca crea el registro en cada una de ellas, primero en la tabla maestra y luego en las de detalle o las dependientes de la primera. Para eliminar se hace al revés: Primero en las de detalle y luego en la maestra.
Los campos computados solo como salida de información. Lo que puedes hacer es que el campo computado no sea del DW sino de la BD, es decir, por el SQL en la tableta COMPUTE. De esta forma lo puedes utilizar como si fuera un campo de la tabla, pero que no actualiza la misma.
Para que en un informe te aparezca el detalle como lo describes, debes agrupar los campos comunes a ese detalle y estos te quedan como una especie de títulos y bajo ellos quedaría el detalle que requieres. La agrupación la debes hacer de acuerdo al ordenamiento o jerarquía de los datos para que te quede bien.
Para que en un DW se borre el valor erróneo, lo primero que debes es indicarle al DW que no abandone el campo en cuestión, esto lo hacer retornando 1 (Return 1) en el evento itemchanged del DW justo después de detectar el error. Luego de esto le puedes eliminar los datos al campo. Para evitar que PB despliegue los errores debes hacer un Return 1 en el evento ItemError.
Si desear aclarar algo, no dudes en indicármelo.

3 respuestas más de otros expertos

Respuesta
1
Otra vez privatte:
Creo que de todas estas preguntas sólo me falta por responderte a "como borrar un campo"
Vamos a ver...
En el datawindow existe un evento que es el itemchanged, este salta cuando cambias un valor de un campo del datawindow y sales del campo.
Bien,... a ese evento le llega un parámetro llamado "data" que puedes utilizar dentro del evento y comprobar si el dato es correcto o no.
Bien,... si el dato no es correcto puedes desestimarlo haciendo "Return 1" o "Return 2". Ambas sentencias ignoran el nuevo dato y se quedan con el antiguo.
Pero si además quieres poner el campo a nulo deberás hacer bien un datawindow. SetText(row,"") bien un datawindow. SetItem(row, dwo. Name,"")
Donde 'row' es otro parámetro del evento
Donde 'dwo' es otro parámetro del evento que junnto a 'name' (dwo. Name) nos dice el nombre de la columna que se está tratando
Y donde '""' es el valor nulo que le queremos dar.
Respuesta
1
Te ruego que hagas cada pregunta por aparte para que puedas calificar cada una de las respuestas por aparte. Desafortunadamente solamente entendí la segunda pregunta, que a continuación la resuelvo.
Te ruego seas más claro al formular las preguntas.
En cuanto a la segunda pregunta lo que debes hacer es tomar los datos que necesita del datawindow, y leerlos en variables usando las funciones getitemstring, getitemnumber, o getitemdate, etc. Con estos datos puedes hacer un insert directo a la base de datos, con sql embebido. O si lo prefiere puede crear otro datawindow e insertar esos datos usando setitem.
Como le quede más fácil. Bueno espero luego poder aclararle el resto de inquietudes.
Saludos
Te invito a visitar
www.powerbuilder.org
El portal de Power Builder en español
Respuesta
1
1)No se bien el caso que se te plantea para actualizar varias tablas, así que te doy varias opciones:
Los datos por lo general no se agregan/modifican solos (a menos que sea una clave primaria y tengas actualizar en cascada).
Depende del dato y el motivo por el que lo quieras actualizar, si son datos de seguridad/diseño se puede poner un trigger en la BD
Desde PB podes hacer que cuando realices el update de la dw correspondiente, si el update anduvo OK actualices el dato en la otra tabla con una sentencia update de sql embebido.
Necesitaría saber bien tu caso para darte un ejemplo claro porque los datos no suelen estar en más de una tabla porque es difícil de mantener.
----------
2) Si tenés que guardar esos datos en otra tabla podes usar un sql embebido. Si es un solo registro es muy simple, si son varios también es simple pero tenés que recorrer la dw e ir actualizando.
Para obtener un dato particular de una dw:
ll_numero = dwcontrol.GetItemNumber ( row, column {, dwbuffer, originalvalue } )
ll_numero = variable del programa
row = fila de la dw
Column = columna//el nombre entre "" o el número (te recomiendo el nombre para claridad del código)
Dwbuffer = el buffer de la dw (tiene 3: primario, borrado, filtrado)
originalvalue = si true es el que había en la BD cuando hizo el retrieve, si false es el que hay al momento de hacer el getitem
ll_numero = dwcontrol.GetItemNumber ( 11, "nro_documento")
Hay un getitem para cada tipo de dato (long, string etc) y tenés que usar el correspondiente
Otra forma de obtener es con el object: dwcontrol. object. Columna[fila]
Columna es el nombre del campo SIN comillas
acá no diferencia por tipo de dato
ll_numero = dwcontrol.object.nro_documento[11]
------------
3)
Cuando haces un reporte con varias tablas todos los datos seleccionados aparecen en cada fila de la DW. Lo que tienes que hacer es crear grupos en la DW y pones en cada grupo los datos que correspondan.
Ej:
Group1 = codigo_persona >> Nombre direccion tel etc van en el encabezado
despues en el detalle pones los datos de la PC.
Te quedaria así:
Juan perez 4402899
Datos PC1
Datos PC2
Jose martinez 456987
Datos PC1
Datos PC2
------------
4)Si lo que quieres evitar son códigos repetidos y el código es un número NO significativo entonces No dejes que el usuario lo ingrese y que lo genere el sistema antes de guardar
Si es significativo (ej: TUERCA_01x50) podes hacer un select antes de guardar y si existe avisarle al usuario
Los mensajes que saca PB son los del DBMS (la base de datos).
Si querés capturar los errores y poner tu propio mensaje tienes que conocer los códigos de error del DBMS para saber que decir en cada caso
(Para esto conviene tener una tabla de mensajes comunes traducidos)
*Los errores de BD pasan siempre por el evento DBerror() de la DW, acá los podés capturar y mostrar el tuyo
*Los errores de otro tipo pasan por el evento error() de la DW
*Los errores de tipo de dato (ej: poner una letra en un campo numerico) pasan por el itemError() de la DW
Debieras familiarizarte con estos eventos.
**********
Cuando tengas varias preguntas mandalas separadas, por claridad y por como se cuentan en este servicio :-)
Mira te pando el query para que comprendas como están relacionadas mis tablas para que me muestre la relacios que necesito ok.
*****************************
SELECT "area"."are_nombre_area",
"equipo"."eq_n_equipo",
"marca"."mar_nombre_marca",
"modelo"."mod_nombre_modelo",
"personal"."per_nombre1",
"personal"."per_apellido_paterno",
"sucursal"."suc_nombre_sucursal",
"componente"."com_nombre_componente",
per_nombre1+' '+per_apellido_paterno
FROM "area",
"equipo",
"marca",
"modelo",
"personal",
"sucursal",
"componente",
"componente_de_equipo"
WHERE ( "modelo"."mod_cod_marca" = "marca"."mar_cod_marca" ) and
( "personal"."per_n_equipo" = "equipo"."eq_n_equipo" ) and
( "personal"."per_cod_area" = "area"."are_cod_area" ) and
( "sucursal"."suc_cod_sucursal" = "personal"."per_cod_sucursal" ) and
( "componente"."com_cod_componente" = "modelo"."mod_cod_componente" ) and
( "componente_de_equipo"."comeq_cod_modelo" = "modelo"."mod_cod_modelo" ) and
( "componente_de_equipo"."comeq_n_equipo" = "equipo"."eq_n_equipo" )
*************
Ojala te sirva y me puedas responder si necesitas más detalles me avisas .
Todavía no termino de entender bien.
Este select que me mandás lo usás para mostrar la información, esto está OK.
¿Cuándo me decís los de actualizar te referías a que querés que se actualicen los datos de la tabla personal solamente, desde la dw que tiene esta consulta?
Si es así en las update properties selecciona esta tabla, su clave primaria y los campos que quieres que se actualicen.
--
Lo que no me queda claro es eso de que los mismos datos se actualicen en las tablas relacionadas ya que si tenés una BD normalizada no debieras tener datos duplicados (salvo algunos de diseño).
Si me detallas un poco más tu caso seguimos probando.
Bueno ya resolví esa duda pero tengo otra
En una datawindows muestro dos campo es today() uno con formato de fecha
y el otro con la hora del sistema
Cuando despliego la información en la datawindows me muestra la fecha y hora actual del sistema.
Lo que necesito es que al apretar un botón me guarde esos datos en otra tabla en un campo fecha y otro hora
Estaba probando con el getitemdatetime pero me muestra la fecha y hora juntos y yo los necesito separados
Como lo puedo hacer.
Gracias
1. Te recuerdo que si haces una nueva pregunta tenés que finalizar la anterior.
2. Lo que podes hacer es:
declarás una variable datetime, una date y una time
ld_dateime = dw.getitemdateTime(fila, col)
ld_date = Date(ld_dateTime)
ld_time = Time(ld_dateTime)
Y listo.
Las funciones Date() y Time() permiten extraer las porciones correspondientes a la fecha y la hora de un datetime
Cualquier cosa INICIA otra pregunta :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas