Hola experto, mi consulta es la siguiente : Tengo una data windows, en la cual pido todos los datos, pero tengo uno que debe ser llenado con una variable publica cuyo valor obtengo al ingresar la clave del usuario, ¿cómo debe ser la sintaxis del botón GRABAR? Yo la tengo así, pero hay algo que falta, porque me reclama que no están todos los datos llenos : Sera algo como us SetItem, ¿me indicas la sintaxis por favor?
dw_1.update()
1 Respuesta
Respuesta de Antonio Garcia
1
1
Antonio Garcia, clipper todas sus versiones (manejo total) power builder todas...
Es posible que tu problema primero se encuentre en la falta de actualización de las columnas. Me explico. Power builder en su datawindow maneja buffers de edición, uno de ellos se encuentra visualmente cuando el usuario esta digitando la información, otro cuando el usuario presiona enter o tab. Este es el buffer de recepción o integración, uno es separado del otro. Si por ejemplo tu ingresas un valor y luego presionas return, no hay problema porque el valor que ves ahora se encuentra en la columna. Sin embargo si ingresas un valor y luego con el ratón haces click en el botón actualizar, entonces hay un desfacé lo que ves no es lo que integras. El campo ahora no tiene valor o un valor anterior que generalmente es null. Para evitar esto utiliza la función dw_1.AcceptText() antes de hacer el update() si aun tienes el problema. entonces deberas ir a el datawindow object. Cuando lo tengas a la vista entonces busca la opción en el menu superior llamada ROWS. Y selecciona la opción UDATE PROPERTIES, Aquí determinas como debe ser actualizada la información en el datawindow. Las características son. ALLOW UPDATES: --> esta casilla simplemente indica si el datawindow tiene la capacidad de actualizar o no, si esta casilla no estuviece marcada entonces todas las opciones de la ventana no estarán disponibles, ni la capacidad de actualizar por medio de la función UPDATE(). TABLE TO UPDATE: --> indica el nombre de la tabla a la que afectará en acciones de actualización. Where Clause for Update/Delete. KEY COLUMNS --> esta opcion esta descrita para ser utilizada cuando unicamente un usuario utiliza la tabla, o igualmente cuando la tabla es actualizada de forma LOCK o bloqueada. KEY AND UPDATEABLE COLUMNS --> actualiza basado en las columnas que pueden serlo. KEY AND MODIFIED COLUMNS --> genera un script tipo SQL utilizando como base las columnas descritas en la parte de columnas unicas o llave unica. Key Modification USE DELETE THEN INSERT --> genera 2 scripts tipo SQL al momento de hacer un update en la tabla, el primero esta basado en un DELETE y el segundo utiliza unobasado en un INSERT. (personalmente no recomiendo esta opcion) USE UPDATE --> este actualiza la tabla basado en un script SQL que genera un UPDATE UNIQUE KEY COLUMN(S) --> aqui despliega las columnas que en un principio deberian estar relacionadas con una llave primaria, o en otras palabras en columnas que deberían ser tratadas como unicas, adicionalmente a esta llave primaria, el usuario puede seleccionar columnas adicionales, para ser tratadas como unicas. El boton PRIMARY KEY, incluye directamente las columnas que componen la llave primaria de la tabla, de no existir limpia todas las columnas seleccionadas. IDENTITY COLUMN --> incluye una columna tipo identity o auto-incremental. Con todo lo anterior expuesto determinas la forma en que el datawindow deberá insertar, actualizar o incluso borrar cualquier numero de filas o datos de una tabla. Y por supuesto esto va a ser reflejado en el momento del update del datawindow. Por ultimo es bueno que utilices las características de una base de datos transaccional. Esta ventaja permite determinar que la transacción es totalmente asentada, o de lo contrario es abortada. Por ejemplo La función update() devuelve un valor 1 si todo fue bien y -1 si hay un error. Igualmente este mensaje lo puedes utilizar para acentar la transacción o rechazarla Por ejem. INTEGER li_ret li_ret = dw_1.UPDATE() IF (li_ret = 1) THEN COMMIT USING SQLCA; ELSE ROLLBACK USING SQLCA; MESSAGEBOX('ERROR', 'ha ocurrido un error en la actualizacion') END IF Como veras el concepto es simple si todo fue bien o permitido, simplemente con la instrucción COMMIT, acepto la transacción, de lo contrario esta es rechazada.
Tu problema es muy simple, lo que sucede es que estas tratando: Primero de asignar un valor a la columna "id_usuario", con un valor constante en este caso 0 (cero), y por otro lado, no puedes grabar un valor en la fila 0 (cero) porque un datawindow no maneja posiciones 0 (cero), Mi recomendación es más simple aun. LONG ll_row ll_row = dw_1.GetRow() IF (ll_row > 0) THEN IF (dw_1.accepttext() = 1) THEN dw_1.SetItem(0,"id_usuario",xuser) IF (dw_1.Update() = 1) THEN COMMIT USING SQLCA; ELSE ROLLBACK USING SQLCA; MESSAGEBOX('ERROR', 'HA SUCEDIDO UN ERROR AL GRABAR') END IF END IF ELSE MESSAGEBOX('ERROR', 'FILA DE GRABACION NO VALIDA') END IF