Muchas gracias,
Ya tengo estos manuales y con estos he podido programar muchas aplicaciones, sin embargo, tengo este problema:
:
En la pantalla que adjunto, pretendo que el programa sólo me acepte datos en las celdas marcadas con colores y que, cuando el usuario introduzca datos en alguna celda o presione TAB, mandarlo directamente a la siguiente celda válida..
Para ello les muestro algunas líneas del programa:
25000 GEVENT: REPEAT
25020 READ RECORD(G,SIZ=GEVENT,ERR=GEVENT_LOOP_END)GEVENT$
25030 IF GEVENT.CONTEXT<>GCONTEXT THEN GOTO 25020
25040 IF GEVENT.CODE$="N" THEN LET GGENERIC$=NOTICE(G,GEVENT.X%); DIM GNOTICE$
25040::NOTICETPL(GGENERIC.OBJTYPE%,GEVENT.FLAGS%); LET GNOTICE$=GGENERIC$
25050 IF GEVENT.CODE$="N" AND GNOTICE.OBJTYPE%=107 THEN GOSUB GRID_MANAGER; IF
25050: GML.SET THEN CONTINUE
25060 LET GWIN_ID$=$$,GPOPUP_ID=GEVENT.X*(GEVENT.CODE$="P")
25070 IF GPOPUP_ID=0 THEN LET GWIN_ID$=FNGWIN_ID$(GEVENT.CONTEXT)
25080 LET GEH=0
25090 WHILE GWIN_ID$="10101"
38000 GRID_MANAGER:
38010 CALL "GML_M",G,GEVENT$,GNOTICE$,GML_SET$,GML_TPL$,GML$,GML_GM$[ALL],GML_
38010:GC$[ALL],GML_GR$[ALL]
38020 REM "Aqui lo mando a la siguiente celda válida
38030 LET TIPCOL=GML_TPL.COL_N%; IF TIPCOL>5 THEN LET TIPCOL=6
38035 REM "Aqui evito que introduzcan datos en las primeras 5 columnas
38040 IF GML_TPL.COL_N%<5 THEN LET GML_TPL.COL_N%=GML_TPL.COL_N%+1; CALL "gml:
38040::goto_cell"; RETURN
38050 REM "Aqui verifica que el renglon tenga datos y sea válido
38055 REM "CADACT contiene la 1a. columna vàlida para el renglon actual y CADA
38055:CT2, la 1ra. para el renglón siguiente
38060 IF GML_TPL.ROW_N%>0 THEN LET CADACT=NUM(CAD$(GML_TPL.ROW_N%,1)),VALIDOS=
38060:LEN(CVS(CAD$,2)),CADACT2=NUM(CAD$(GML_TPL.ROW_N%+1,1))
38070 SWITCH GML.NOTIFY%
38080 CASE 2; REM TAB
38085 REM "aqui veo en que renglon y columna se encuentra
38090 LET COL=GML_TPL.COL_N%,ROW=GML_TPL.ROW_N%
38110 REM "Aqui realizo el cambio de celda a una celda válida
38120 IF COL>5 AND (COL<>CADACT AND COL<>CADACT+2) THEN LET COL=COL+1; GOTO 38
38120:140
38125 REM "Si la columna es válida, continua su proceso
38130 IF COL<=CADACT+2 THEN BREAK
38135 REM "Si ya no hay más columnas válidas en el renglón, lo paso a la 1ra.
38135:columna válida del siguiente renglón.
38138 LET COL=CADACT2,ROW=ROW+1
38140 LET GML_TPL.COL_N%=COL,GML_TPL.ROW_N%=ROW
38150 CALL "gml::goto_cell"
38160 BREAK
38170 CASE 9
38180 SWITCH GML_TPL.FLAG%
38190 CASE 3
38200 CASE 9
38210 CASE 12
38220 CALL "GML::START_EDIT"
38240 BREAK
38250 SWEND
38270 CASE 6
38280 LET TEXTO$=GML_TPL.TEXT$
38520 LET TEXTO=NUM(TEXTO$,ERR=38580)
38540 CALL "GML::END_EDIT"
38550 LET GML_TPL.COL$[COL]=STR(TEXTO:MASK$)
38570 CALL "GML::UPDATE"; CALL "GML::REFRESH"
38580 BREAK
38600 SWEND
38610 RETURN
Mi problema es que, cuando lo mando a la siguiente celda válida (con GOTO_CELL) , al regresar a aceptar el dato siguiente y volver al [GML_M) de la 38010, me cambia a columna 1, renglón 1, sin respetar la celda a la que lo envíe.
Ojalá me puedan ayudar a encontrar en donde me estoy equivocando.
Gracias
Ing. Enrique Solís