Update

Hola Agdsys!
¿Qué te parece ahora?
boolean lb_commit
string ls_error
integer rc
string err
//actualiza arbol
rc=dw_1.update(true, false)
If rc= 1 then
// actualiza mediciones
lb_commit=(dw_1.update()=1)
if lb_commit then
update mediciones
set 'id_campo' = :id_campo,
'parcela'=:parcela,
'id_arbol' =:id_arbol,
'anio'=:anio,
'id_empleado'=:id_empleado,
'dap'=:dap,
'alt_fuste'=:alt_fuste
'alt_tot'=:alt_tot,
'id_rectitud'=:id_rectitud,
'id_ramificacion'=:id_ramificacion,
'id_calidad'=:id_calidad,
'id_sanidad'=:id_sanidad,
'observaciones'=:observaciones
where 'id_campo'=:id_campo and 'parcela'=:parcela and 'id_arbol'= :id_arbol
using sqlca
lb_commit=((sqlca.sqlcode=0)and(sqlca.sqlcode=0))//aqui me sale syntax error
end if
If lb_commit then
commit using sqlca;
else
ls_error=sqlca.sqlerrtext
rollback using sqlca;
messagebox('error', ls_error)
end if
end if
Las variables que tienen dos puntos adelante tengo entendido que se delaran en el
formulario, ¿pero qué son exactamente y como funcionan?
yo las declare algo asi en declare:
integer id_campo
string parcela
integer id_arbol, anio, id_empleado
long dap,alt_fuste, alt_tot
integer id_rectitud, id_ramificacion,id_calidad,id_sanidad
long observaciones
dap, alt_fuste, alt_tot en realidad son numeros que admiten decimales,
como las puedo declarar?
¿Esta muy errado lo que estoy haciendo?
Marcela

1 Respuesta

Respuesta
1
La declaración del update, no tiene ningún problema, siempre y cuando, los valores integrados en las variables indicadas luego del dos puntos, existan como tal, y sean del mismo tipo,
power builder reconoce como variables de asignación en un stript de tipo SQL, dos puntos antepuestos para determinar que se trata de una variable externa y no de un campo o un valor constante, lastimosamente las variables constantes no son bien recibidas en este tipo de scripts, tanto para la asignación de columnas, como para la selección de datos indicados en un where.
Power builder utiliza la tecnica de lo que en programacion se conoce como PUNTUACION HUNGARA, o NOTACION HUNGARA., la cual viene de la programacion con lenguaje C, esta tecnica son realmente normas de programacion standard, dichas normas van desde el reconocimiento de una variable simplemente con verla, lo cual puede ser dado por la o las letras antepuestas a ella. Por ejemplo,
Una variable tipo integer que contiene un código podría ser definida de 2 formas
Si es privada
INTEGER li_codigo
l = local
i = integer
_ = separacion entre la informacion propia y el nombre
codigo = un nombre con relacion y evidencia.
y por ejemplo si es publica.
pi_codigo
Personalmente he adoptado esta técnica y créeme que me ha servido de mucho, primero porque simplemente con ver un programa antiguo ya reconozco muchas cosas y entiendo con más rapidez.
Además mi equipo de programadores, también han adoptado esta técnica, de tal forma que todos nos entendemos y cualquiera puede modificar o actualizar un programa, independientemente de quien fue el programador, y si este aun trabaja con nosotros o no.
Mi propuesta entonces es que busques información de esta técnica, la evalúes, y si crees que es valida, la adoptes, o simplemente inicies por adoptar algo e incrementar poco a poco.
Como te comento en mi ultima respuesta falto que indicaras el cierre del script con punto y coma, es recomendable que utilices siempre el nombre del objeto de transacción, en este caso veo que es SQLCA, siempre existe la posibilidad que tu instancies uno propio y efectúes cualquier actualización, y sino indicas el nombre el sistema asume que es el dado por omisión, SQLCA.
Para finalizar podrías hacer una comparación entre el script que me enviaste y el que yo te devuelvo, y veras que las diferencias son mínimas, claro siempre tomando en cuenta el que las variables dados después de los dos puntos, ya están declaradas en algún lado, y que contienen valores y tipos iguales a los que recibe cada columna
Por cualquier otra cosa, estoy a tus ordenes, ya sabes donde contactarme.
Estudiare más tu explicación, pero quisiera que me confirmes si estuve haciendo bien la declaración de variables, y saber un poco más sobre estas que tienen dos punos adelante.
Gracias
Marcela
Ok, Marcela, en principio veo que incluyes unas comillas en cada columna del update, eso realmente no lo necesitas, a excepción del datawindow object que es donde se genera, (normalmente lo hace cuando utilizas una base de datos local como anywhere)
Y una condición que aun no esta bien definida, sin embargo permite modificar un poco tu script a ver que pasa.
boolean lb_commit
string ls_error
integer rc
string err
//actualiza arbol
rc = dw_1.update()
If (rc = 1) then
// actualiza mediciones
update mediciones
set id_campo = :id_campo,
parcela=:parcela,
id_arbol =:id_arbol,
anio=:anio,
id_empleado=:id_empleado,
dap=:dap,
alt_fuste=:alt_fuste
alt_tot=:alt_tot,
id_rectitud=:id_rectitud,
id_ramificacion=:id_ramificacion,
id_calidad=:id_calidad,
id_sanidad=:id_sanidad,
observaciones=:observaciones
where (id_campo=:id_campo)
and (parcela =:parcela)
and (id_arbol= :id_arbol )
using sqlca; --> aqui te falto el punto y coma
lb_commit = ((sqlca.sqlcode = 0) and (sqlca.sqlcode=0)) //aqui me sale syntax error --> era por el punto y coma faltante
If lb_commit then
commit using sqlca;
else
ls_error=sqlca.sqlerrtext
rollback using sqlca;
messagebox(error, ls_error)
end if
end if
EXPLICANDO UN POCO:
la funcion UPDATE() del datawindow, ciertamente recibe 2 argumentos
El primero --> obliga o no a hacer un ACCEPTTEXT() antes del update.
El segundo --> inicializa las banderas de actualización internas o no depende del valor, esta es utilizada por el datawindow simplemente para reconocer un registro modificado, o nuevo, según sea el caso.
Por lo que veo esto en tu caso no es necesario hacerlo, ya que estas obligando a que el propio registro no sea actualizado como tal dentro del propio datawindow.
Ademas por si a caso, utiliza un ACCEPTTEXT() antes de efectuar cualquier operación de actualización, esta función forzá a asignar el valor pendiente en el ultimo control editado, de tal manera que este aunque en pantalla veas que existe un valor internamente no se quede sin el,
Como todas las funciones del datawindow, ACCEPTTEXT() devuelve un valor numérico 1 cuando todo esta ok, y -1 cuando ha ocurrido un error, es más en el caso que ocurra un error, es por que el evento ITEMCHANGED(), provoco un error (claro esto si estas usando este evento.)
Algunos errores pueden ocurrir, como incompatibilidad de datos, o sea intentar asignar un entero a un decimal, o un numérico a un string.
Pero esas cosas ya son más cencillas de resolver.
Por cierto, para declarar una variable tipo DECIMAL, lo haces de la siguiente forma.
DECIMAL{2} ldc_valor
Esto declara una variable tipo decimal que permite 2 decimales, como veras el valor descrito dentro de las llaves es el numero máximo de decimales permitidos, en caso el valor supere los decimales entonces el valor es aproximado. Si colocas 0 a este la variable no recibirá ningún decimal.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas