Borrar Registros si esta ckequeado

Estoy necesitando una vez más de ayuda de ser posible por favor. Mi caso es el siguiente:
Estoy teniendo un dw del tipo grid. Mediante un cursor carga los registros en el DW, uno de los campos del DW es del tipo CheckBox, por lo que dependiendo de la necesidad los registros se ckequean o no. Lo que estoy necesitando es que solamente los registros ckekeados sean guardados, es decir si se cargaron 5 registros y solamente se ckequearon dos, al presionar mi botón guardar solamente esos dos registros chequeados se guarden. Inente haciendo este comando.
for I=1 to dw_1.rowcount() 
 if dw_1.getitemstring(l,"campo") = 'N' then 
  dw_1.deleterown(l)
end if.
Lo que quise hacer es borrar los registros que no fueron chequeados, hacer esto antes de guardar. Pero no me esta saliendo. Por favor me podrían ayudar estoy necesitando mucho resolver esto y creo que con la ayuda de uds. Lo conseguiré

2 respuestas

Respuesta
1
Si haces de esa forma vas a borrar incluso los que están marcados, todas vez que al eliminar las filas estas cambian de posición.
Te recomiendo que mejor lo grabes en un datastore es decir, que pases del dw_1. Al datastore los que están marcados.
for k=dw_1.rowcount() to 1 step -1
if dw_1.getitemstring(k,'codigo') = 'S' then
ll_fila = ids_datos.InsertRow(0)
ids_datos.SetItem(ll_fila,'campo1',dw_1.getitemstring(k,'campo1')
ids_datos.SetItem(ll_fila,'campo2',dw_1.getitemstring(k,'campo2')
ids_datos.SetItem(ll_fila,'campo3',dw_1.getitemsNumber(k,'campo3')
end if
next
//y al final haces un update al datastore
if ids_datos.update() = -1 then
messagebox('error','error al grabar la informacion',stopsign!)
rollback using sqlca;
end if
Sinceramente no tengo idea de como hacer un datastore, con el código que detallo más abajo, ahora me borra, según estuve viendo no borraba los que no estaba marcados porque por defecto tenían valor nulo. Pregunto, ¿acaso haciendo un rowcount del dw y guardando en una variable ya no se kedaria la cantidad de filas existentes en el DW y de esta manera saber cuantas veces va recorrer en el ciclo? Ahora de ser cierto esto, el problema que estoy teniendo es que me borra dos de los tres registros que tiene que borrar, pero luego al llegar al tercer registro me sale el error que el nombre de mi columna es invalida No entiendo porque me sale este error ya que para borrar las primeras dos no tuvo problemas
long J, aux
string xu
aux = dw_2.rowcount()
for J= 1 to aux
xu= dw_2.getitemstring (J,"pdoc_trajo" )
If xu = 'N' or IsNull(xu) then
dw_2.deleterow(J);
end If
next
El problema del código que estas usando es el siguiente, recuperas el total de las filas por decir que sean 3, luego haces un for recorriendo las 3 filas por decir que la segunda tienes que eliminar entonces lo elimina y ahora te queda 2 filas pero el for sigue el correlativo es decir se va a la tercera fila el cual ya no existe, por eso te dije que debes hacer un datastore.
Respuesta

Quizás sea un poco tarde para responder esto, pero yo hasta hace un rato tenía el mismo problema y gracias a tu pregunta y las respuestas pude resolver el inconveniente.

Cree una función que hiciera esto (como para que quedara mas bonito), sin mas preámbulos la solución:

long ll_row, ll_row2 //ll_row sería la primera fila, ll_row2 el total de las filas
string ls_valor //el valor de la columna CheckBox (en mi caso se llama 'elegir')
boolean lb_terminar 

ll_row = 1
ll_row2 = dw_3.rowcount()
lb_terminar = false

Do While lb_terminar = false
ls_valor = dw_3.getitemstring (ll_row,'elegir') 
If ls_valor = 'N' or IsNull(trim(ls_valor)) or ls_valor = '' or ls_valor = ' ' then //redundante, lo sé.
dw_3.deleterow(ll_row)
ll_row = ll_row - 1
end If

ll_row2 = dw_3.rowcount()
if ll_row >= ll_row2 then
lb_terminar = true
else
ll_row = ll_row + 1
end if

loop

dw_3.SetRedraw(true)
return 0

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas