Modify

Creo que estoy cayendo con lo que me escribiste. Hice todo dentro de un solo DW. Estuve probando, me salen todavía algunos errores, pero me distraje con otra parte del programa. Como ya conoces más o menos del tema(ojala te acuerdes el tema de campos, parcelas y árboles), te sigo contando. Tengo dos tablas muy importantes: Árbol y
Mediciones.
La tabla árbol :Id_campo, Parcela, Id_arbol, distanciamiento, especie etc .
Donde: Id_campo+ Parcela+ Id_arbol forman una clave compuesta que me va a identificar unívocamente a cada arbol. Debe ser compuesta pues los nombres de parcelas pueden repetirse en cada campo, y los arboles van de 1 a 25 en cada parcela.
La tabla Mediciones: Id_campo, Parcela, Id_arbol, Anio_medicion, diámetro, alt_fuste etc.
Donde: : Id_campo+ Parcela+ Id_arbol+Anio_medicion forman clave compuesta. Así las identifico pues cada año se toman mediciones de lo árboles muestreados.
Ahora bien: Cuando se miden arboles por primera vez, en ese momento se incorporan nuevos árboles a la base de datos. Esto quiere decir que debo hacer la actualización de dos tablas a la vez, o sea de la tabla Árbol y de la tabla Mediciones. Me encuentro entonces con el problema de actualizar dos tablas en un DW. Así que he buscado en la ayuda la sintaxis de Modify, siguiendo un ejemplo que esta allí.
Al crear el DW puse a árbol como updatable. Escribí el código que creo correspondiente, hice unas pruebas y me salio este error:
SQLSTATE = S0022
[Microsoft][Controlador ODBC Microsoft Access] La instrucción INSERT INTO contiene el siguiente nombre de campo desconocido: 'distanciamiento'. Asegúrese de que ha escrito correctamente el nombre y vuelva a intentar la operación.
Distanciameiento es de la tabla Árbol! ¿Qué paso? Te resumo un poco el código, solo quito algunos campos para que no sea tan extenso:
integer rc
string err
//actualiza arbol
rc=dw_1.update(true, false)
If rc= 1 then
//deshabilita actualizacion de las columnas de arbol
dw_1.Modify("arbol_id_campo.update =no")
dw_1.Modify("arbol_parcela.update=no")
dw_1.Modify("arbol_id_arbol.update=no")
dw_1.Modify("arbol_id_campo.key =no")
dw_1.Modify("arbol_parcela.key=no")
dw_1.Modify("arbol_id_arbol.key=no")
dw_1.Modify("arbol_distanciamiento=no") // y asi con mas campos de arbol
//Hace updatable mediciones
dw_1.Modify("Datawindow.Table.UpdateTable=~"mediciones~"")
//Habilita la actualizacon de las columnas deseadas de mediciones
dw_1.Modify("mediciones_id_campo.UPDATE=yes")
dw_1.Modify("mediciones_parcela.UPDATE=yes")
dw_1.Modify("mediciones_id_arbol.UPDATE=yes")
dw_1.Modify("mediciones_anio.UPDATE=yes")
dw_1.Modify("mediciones_id_campo.key=yes")
dw_1.Modify("mediciones_parcela.key=yes")
dw_1.Modify("mediciones_id_arbol.key=yes")
dw_1.Modify("mediciones_anio.key=yes")
dw_1.Modify("mediciones_id_empleado.update=yes")// y asi con mas campos de mediciones
//Actualiza la tabla mediciones
rc=dw_1.update()
If rc=1 then
commit using sqlca;
Messagebox("Estado", +"Grabación correcta")
else
rollback using sqlca;
Messagebox("Estado", +"Falla en la actualización de la tala mediciones.")
end if
else
rollback using sqlca;
Messagebox("Estado", +"Falla en actualización de la tabla arbol.")
end if
¿Qué te parece?. ¿Podes ver el error?
De nuevo gracias por la paciencia. Mis consultas son interminables!
Marcela

1 Respuesta

Respuesta
1
Estimada colega Marcela, creo que el problema no esta en el código, sino en la forma de plantear la situación, como ya sabrás, el motor SQL, no permite la actualización de más de una tabla, esto lastimosamente limita desde cualquier punto. Pero así es,
Imagino que el código que me enviaste lo tienes inscrito en un botón, esto significa que utilizas una acción condicionada por el usuario para la inserción o actualización de un registro.
Bien.
Si me permites te voy a recomendar lo siguiente:
Primero:
En el datawindow object, en donde integras tus datos, en el editor gráfico encontraras en el menu ROWS, la opción UPDATE PROPERTIES, aquí seleccionas los campos que vas a actualizar ya sea para input o para update, al igual que la forma de actualizarlos, en la clausula KEY MODIFICATIONS (te recomiendo que elijas USE UPDATE), esto que te comento esrá utilizado por el datawindow object para componer sus propios scripts que permitirán hacer inserts, updates, deletes, etc.
Sin embargo aun te queda la parte de la segunda o segundas tablas.
Actualizando tablas alternas:
Como la actualización la tienes integrada en un botón, entonces utilizas siempre la función update() del datawindow control, este como ya te habrás dado cuenta, devuelve un valor numérico 1 si todo fue bien, y -1 si hubo un error, la situación entonces es muy simple,
por un lado integras los datos en la ventana correspondiente, y luego cuando indiques la actualización preguntas siempre por el valor devuelto de la función update() si esta devuelve 1 significa que todo fue bien con la tabla principal, entonces solo queda actualizar las alternas.
Un ejemplo podría ser más o menos así.
BOOLEAN lb_commit
STRING ls_error
lb_commit = (dw_1.update() = 1)
IF lb_commit THEN
UPDATE <tabla>
SET <columna> = :<valor>,
<columna> = :<valor>,
....
WHERE (<condicion>)
USING SQLCA;
lb_commit = ((SQLCA.SQLCODE = 0) AND (SQLCA.SQLDBCODE = 0))
END IF
IF lb_commit THEN
COMMIT USING SQLCA;
ELSE
ls_error = SQLCA.SQLERRTEXT
ROLLBACK USING SQLCA;
MESSAGEBOX('Error', ls_error)
END IF
Esto igualmente cuando utilices un insert, la ventaja es que estas trabajando con una base de datos transaccional y la transacción completa solo es acentada cuando se provoca un COMMIT, esto te da la libertad de condicionar un numero de acciones para cumplir una transacción, si alguna de estas falla, la transacción no se completa y proteges tu integridad referencial.
Finalizando:
Por cierto todas las instrucciones MIDIFY() ya no tienen función en mi propuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas