{ ========================================================================== PROGRAMA : VEPRMT032 OBJETIVO : ADMINISTRAR LOS KIT DE LOS PRODUCTOS TERMINADOS DESARROLLADO POR : ING. JUAN SOTO FECHA : 17/10/2014 ========================================================================== } GLOBALS "veprgb000.4gl" DEFINE dproducto DYNAMIC ARRAY OF RECORD pcodn SMALLINT, pcodgrupo SMALLINT, pcodtipo SMALLINT, pcodsec SMALLINT, descripcion_p1 VARCHAR(100), cantidad DEC(12,5), precio DEC(12,2), porc_desc DEC(12,2), valor DEC(12,2) END RECORD DEFINE x1 RECORD kit_id INT, descripcion VARCHAR(100), disponible VARCHAR(10), cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion_p VARCHAR(100), factor,cantidad_kit DEC(12,5), valor_total DEC(12,2), porc_Desc1 DEC(12,2), costeo_orden CHAR(2) END RECORD , pkit int,pdescripcion VARCHAR(100), cuenta_reg SMALLINT DEFINE arr_producto DYNAMIC ARRAY OF RECORD pcodn SMALLINT, pcodgrupo SMALLINT, pcodtipo SMALLINT, pcodsec SMALLINT, descripcion_p1 VARCHAR(100), factor_d,unidades DEC(12,5), cantidad DEC(12,5), precio DEC(12,2), porc_desc DEC(12,2), valor DEC(12,2) END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(4) RETURNING impresor CALL STARTLOG("veprmt32.txt") CONNECT to "smarmotech" AS "MSSQL" USER usuarios USING clave CALL veprmt032() END MAIN FUNCTION veprmt032() DEFINE mproducto RECORD kit_id INT, descripcion VARCHAR(100), disponible VARCHAR(10), cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion_p VARCHAR(100), factor,cantidad_kit DEC(12,5), valor_total DEC(12,2), porc_Desc1 DEC(12,2), costeo_orden CHAR(2) END RECORD, exito BOOLEAN, modifica VARCHAR(3), pprecio DEC(12,2) OPEN FORM w1 FROM "vefmmt032" DISPLAY FORM w1 DIALOG ATTRIBUTES(UNBUFFERED) INPUT BY NAME mproducto.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT LET p_vetb50.ventas = 3 LET p_vetb50.tipo_cliente = NULL LET p_vetb50.sec_cliente=NULL LET mproducto.disponible='SI' # IF mproducto.costeo_orden IS NULL THEN LET mproducto.costeo_orden = "NO" # END IF ON ACTION copiar CALL copia_kit() AFTER FIELD cod_sec IF mproducto.cod_sec IS NOT NULL THEN CALL producto(mproducto.cod_n,mproducto.cod_grupo,mproducto.cod_tipo,mproducto.cod_sec) RETURNING pdescripcion,mproducto.factor IF pdescripcion IS NULL THEN CALL msg(3) NEXT FIELD cod_n END IF LET modifica ="NO" SELECT COUNT(*) INTO cuenta_reg FROM vetb00029 a WHERE a.cod_n = mproducto.cod_n AND a.cod_grupo = mproducto.cod_grupo AND a.cod_tipo = mproducto.cod_tipo AND a.cod_sec = mproducto.cod_sec IF cuenta_reg > 1 THEN LET opt = fgl_winquestion("ADICIONA","DESEA MODIFICAR KIT EXISTENTE?","NO","YES|NO","QUESTION",0) IF opt = "YES" THEN LET modifica = 'SI' CALL visualiza_kit(mproducto.cod_n,mproducto.cod_grupo,mproducto.cod_tipo,mproducto.cod_sec,pkit,"'SI','NO'") RETURNING pkit,mproducto.valor_total,mproducto.descripcion #CALL visualiza_detalle_kit(pkit) RETURNING arr_producto LET mproducto.kit_id = pkit # SELECT DISTINCT a.id_kit FROM prtb00013 a WHERE a.id_kit = mproducto.kit_id # IF STATUS <> NOTFOUND THEN # CALL FGL_WINMESSAGE("ERROR","KIT TIENE ORDEN, DEBES ADICIONAR UNO NUEVO","INFO") # NEXT FIELD cod_Sec # END IF CALL consulta(mproducto.*) RETURNING mproducto.kit_id ELSE LET modifica = 'NO' END IF ELSE LET modifica = 'NO' SELECT a.id_kit,a.disponible,a.descripcion,a.porc_desc,a.factor_conv,a.cantidad_Venta INTO mproducto.kit_id,mproducto.disponible,mproducto.descripcion,mproducto.porc_desc1, mproducto.factor,mproducto.cantidad_kit FROM vetb00029 a WHERE a.cod_n = mproducto.cod_n AND a.cod_grupo = mproducto.cod_grupo AND a.cod_tipo = mproducto.cod_tipo AND a.cod_sec = mproducto.cod_sec IF STATUS <> NOTFOUND THEN LET opt = fgl_winquestion("ADICIONA","DESEA MODIFICAR KIT EXISTENTE?","NO","YES|NO","QUESTION",0) IF opt = "YES" THEN LET modifica = 'SI' # SELECT DISTINCT a.id_kit FROM prtb00013 a WHERE a.id_kit = mproducto.kit_id # IF STATUS <> NOTFOUND THEN # CALL FGL_WINMESSAGE("ERROR","KIT TIENE ORDEN, DEBES ADICIONAR UNO NUEVO","INFO") # NEXT FIELD cod_Sec # END IF ELSE LET modifica = 'NO' END IF END IF END IF LET mproducto.descripcion_p = pdescripcion DISPLAY BY NAME mproducto.descripcion_p DISPLAY BY NAME mproducto.* END IF AFTER INPUT IF mproducto.cod_sec IS NOT NULL THEN CALL producto(mproducto.cod_n,mproducto.cod_grupo,mproducto.cod_tipo,mproducto.cod_sec) RETURNING pdescripcion,mproducto.factor IF pdescripcion IS NULL THEN CALL msg(3) NEXT FIELD cod_n END IF DECLARE buscate CURSOR FOR SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.descrip_esp,b.cantidad,b.precio,b.porc_desc FROM iptb00002 a LEFT OUTER join vetb00030 b ON a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_Sec WHERE b.id_kit = mproducto.kit_id AND a.status_t IS NULL LET idx = 1 FOREACH buscate INTO arr_producto[idx].pcodn,arr_producto[idx].pcodgrupo, arr_producto[idx].pcodtipo,arr_producto[idx].pcodsec, arr_producto[idx].descripcion_p1, arr_producto[idx].cantidad,arr_producto[idx].precio, arr_producto[idx].porc_desc IF arr_producto[idx].porc_desc IS NULL THEN LET arr_producto[idx].porc_desc=0 END IF LET arr_producto[idx].valor = arr_producto[idx].cantidad * (arr_producto[idx].precio- (arr_producto[idx].porc_desc * arr_producto[idx].precio)/100) LET idx = idx + 1 END FOREACH END IF END INPUT INPUT ARRAY arr_producto FROM sproducto.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT IF modifica ="NO" THEN CALL arr_producto.clear() END IF AFTER FIELD pcodsec LET idx = arr_curr() LET scr_l = scr_line() IF arr_producto[idx].pcodsec IS NOT NULL THEN IF arr_producto[idx].pcodn = mproducto.cod_n AND arr_producto[idx].pcodgrupo = mproducto.cod_grupo AND arr_producto[idx].pcodtipo = mproducto.cod_tipo AND arr_producto[idx].pcodsec = mproducto.cod_sec THEN CALL fgl_Winmessage("ERROR","ESTE CODIGO NO PUEDE SER IGUAL QUE EL CODIGO PRINCIPAL","INFO") NEXT FIELD pcodsec END IF CALL producto(arr_producto[idx].pcodn,arr_producto[idx].pcodgrupo, arr_producto[idx].pcodtipo,arr_producto[idx].pcodsec) RETURNING pdescripcion,arr_producto[idx].factor_d IF pdescripcion IS NULL THEN CALL msg(3) NEXT FIELD pcodn END IF END IF LET arr_producto[idx].descripcion_p1 = pdescripcion DISPLAY arr_producto[idx].descripcion_p1 TO sproducto[scr_l].descripcion_p1 SELECT a.precio INTO pprecio FROM vetb00025 a,seg0009 b WHERE a.cod_n = arr_producto[idx].pcodn AND a.cod_grupo = arr_producto[idx].pcodgrupo AND a.cod_tipo = arr_producto[idx].pcodtipo AND a.cod_sec = arr_producto[idx].pcodsec AND a.ventas = 3 AND b.usuario = usuarios AND a.cod_lista = b.cod_lista IF STATUS = NOTFOUND THEN CALL fgl_winmessage("ERROR","PRODUCTO NO TIENE PRECIO, NO PUEDES VENDERLO","INFO") LET pprecio = 0 # NEXT FIELD pcodn END IF IF mproducto.porc_Desc1 IS NOT NULL THEN LET arr_producto[idx].porc_desc = mproducto.porc_Desc1 DISPLAY arr_producto[idx].porc_desc TO sproducto[scr_line()].porc_desc END IF LET arr_producto[idx].precio = pprecio DISPLAY arr_producto[idx].precio TO sproducto[scr_l].precio AFTER FIELD porc_desc IF arr_producto[idx].porc_desc IS NULL THEN LET arr_producto[idx].porc_desc=0 END IF LET arr_producto[idx].valor = arr_producto[idx].cantidad * (arr_producto[idx].precio- (arr_producto[idx].porc_desc * arr_producto[idx].precio)/100) DISPLAY arr_producto[idx].valor TO sproducto[scr_l].valor AFTER ROW IF arr_producto[idx].porc_desc IS NULL THEN LET arr_producto[idx].porc_desc=0 END IF LET arr_producto[idx].valor = arr_producto[idx].cantidad * (arr_producto[idx].precio- (arr_producto[idx].porc_desc * arr_producto[idx].precio)/100) DISPLAY arr_producto[idx].valor TO sproducto[scr_l].valor CALL calcula_valor(arr_producto) RETURNING mproducto.valor_total,mproducto.factor DISPLAY BY NAME mproducto.valor_total # AFTER INPUT # IF INT_FLAG THEN # CALL msg(2) # LET INT_FLAG = FALSE # EXIT PROGRAM # END IF END INPUT ON ACTION guardar IF arr_producto.getLength()<= 0 THEN CALL fgl_winmessage("ERROR","NO PUEDE GUARDAR KIT SIN ELEMENTOS","INFO") CONTINUE DIALOG END IF CALL inserta(mproducto.*,arr_producto,modifica) RETURNING exito,mproducto.kit_id IF exito THEN COMMIT WORK DISPLAY BY NAME mproducto.kit_id CALL fgl_winmessage("ERROR","ADICION EXITOSA","INFO") CALL arr_producto.clear() CLEAR FORM ELSE ROLLBACK WORK CALL fgl_winmessage("ERROR","LA TRANSACCION NO SE ACTUALIZO CON EXITO","INFO") END IF CONTINUE DIALOG # ON ACTION buscar # CALL buscar_kit() ON ACTION CANCEL LET INT_FLAG = FALSE EXIT PROGRAM END DIALOG END FUNCTION FUNCTION inserta(x,z,modificacion) DEFINE x RECORD kit_id INT, descripcion VARCHAR(100), disponible VARCHAR(10), cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion_p VARCHAR(100), factor,cantidad_kit DEC(12,5), valor_total DEC(12,2), porc_Desc1 DEC(12,2), costeo_orden CHAR(2) END RECORD DEFINE z DYNAMIC ARRAY OF RECORD pcodn SMALLINT, pcodgrupo SMALLINT, pcodtipo SMALLINT, pcodsec SMALLINT, descripcion_p1 VARCHAR(100), factor_d,unidades DEC(12,5), cantidad DEC(12,5), precio DEC(12,2), porc_desc DEC(12,2), valor DEC(12,2) END RECORD, modificacion VARCHAR(3), x_exito BOOLEAN LET x_exito = TRUE BEGIN WORK IF x.costeo_orden IS NULL THEN LET x.costeo_orden = "NO" END IF IF modificacion = "NO" THEN SELECT MAX(a.id_kit) INTO x.kit_id FROM vetb00029 a IF x.kit_id IS NULL THEN LET x.kit_id = 1 END IF LET x.kit_id = x.kit_id +1 # WHENEVER ERROR CONTINUE IF x.costeo_orden IS NULL THEN LET x.costeo_orden = "NO" END IF INSERT INTO vetb00029 (id_kit, descripcion, disponible, cod_n, cod_grupo, cod_tipo, cod_sec, valor_total, us_crea, fech_crea, porc_desc, costeo_orden, factor_conv ,cantidad_venta) VALUES (x.kit_id, x.descripcion, x.disponible, x.cod_n, x.cod_grupo, x.cod_tipo, x.cod_sec, x.valor_total, usuarios, getdate(), x.porc_Desc1, x.costeo_orden, x.factor ,x.cantidad_kit) IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","SE PRODUJO UN ERROR EN LA TABLA vetb00029","INFO") LET x_exito = FALSE RETURN x_exito END IF FOR curr = 1 TO z.getLength() IF z[curr].pcodsec IS NOT NULL THEN INSERT INTO vetb00030 (id_kit, cod_n, cod_grupo, cod_tipo, cod_sec, cantidad, porc_desc, precio) VALUES (x.kit_id, z[curr].pcodn, z[curr].pcodgrupo, z[curr].pcodtipo, z[curr].pcodsec, z[curr].cantidad, z[curr].porc_desc, z[curr].precio) IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","SE PRODUJO UN ERROR EN LA TABLA vetb00030","INFO") LET x_exito = FALSE EXIT FOR END IF END IF END FOR ELSE UPDATE vetb00029 SET disponible = x.disponible, descripcion = x.descripcion, valor_total = x.valor_total, porc_desc = x.porc_Desc1, costeo_orden = x.costeo_orden WHERE id_kit = x.kit_id IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","SE PRODUJO UN ERROR EN LA TABLA vetb00029","INFO") LET x_exito = FALSE RETURN x_exito END IF DELETE FROM vetb00030 WHERE id_kit = x.kit_id IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","SE PRODUJO UN ERROR EN LA TABLA vetb00030","INFO") LET x_exito = FALSE RETURN x_exito END IF LET x_exito = TRUE FOR curr = 1 TO z.getLength() IF z[curr].pcodsec IS NOT NULL THEN INSERT INTO vetb00030 (id_kit, cod_n, cod_grupo, cod_tipo, cod_sec, cantidad, porc_desc, precio) VALUES (x.kit_id, z[curr].pcodn, z[curr].pcodgrupo, z[curr].pcodtipo, z[curr].pcodsec, z[curr].cantidad, z[curr].porc_desc, z[curr].precio) IF STATUS < 0 THEN ROLLBACK WORK CALL fgl_winmessage("ERROR","SE PRODUJO UN ERROR EN LA TABLA vetb00030","INFO") LET x_exito = FALSE EXIT FOR END IF END IF END FOR END IF RETURN x_exito,x.kit_id END FUNCTION FUNCTION calcula_valor(z) DEFINE z DYNAMIC ARRAY OF RECORD pcodn SMALLINT, pcodgrupo SMALLINT, pcodtipo SMALLINT, pcodsec SMALLINT, descripcion_p1 VARCHAR(100), factor_d,unidades DEC(12,5), cantidad DEC(12,5), precio DEC(12,2), porc_desc DEC(12,2), valor DEC(12,2) END RECORD, valor1,valor DEC(12,2), cantidad_k,factor DEC(12,5) LET valor1 = 0 LET valor = 0 FOR curr = 1 TO z.getLength() IF z[curr].pcodsec IS NOT NULL THEN LET factor = z[curr].factor_d LET z[curr].cantidad = z[curr].factor_d * z[curr].unidades LET valor1 = z[curr].cantidad * (z[curr].precio-(z[curr].precio*(z[curr].porc_desc/100))) LET valor = valor + valor1 END IF END FOR RETURN valor,factor END FUNCTION FUNCTION producto(x) DEFINE x RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT END RECORD, xdescripcion VARCHAR(100), xfactor DEC(12,5) SELECT a.descrip_esp,b.factor_conv INTO xdescripcion,xfactor FROM iptb00002 a LEFT OUTER JOIN iptb00001 b ON a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND a.cod_tipo = b.cod_tipo AND a.cod_Sec = b.cod_sec WHERE a.cod_n = x.cod_n AND a.cod_grupo = x.cod_grupo AND a.cod_tipo = x.cod_tipo AND a.cod_sec = x.cod_sec AND a.status_t IS NULL RETURN xdescripcion,xfactor END FUNCTION FUNCTION consulta(x) DEFINE x RECORD kit_id INT, descripcion VARCHAR(100), disponible VARCHAR(10), cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion_p VARCHAR(100), factor,cantidad_kit DEC(12,5), valor_total DEC(12,2), porc_desc1 DEC(12,2), costeo_orden CHAR(2) END RECORD DECLARE busca SCROLL CURSOR FOR SELECT a.id_kit,a.disponible,a.descripcion,a.valor_total,b.descrip_esp,a.costeo_orden FROM vetb00029 a,iptb00002 b WHERE a.cod_n = x.cod_n AND a.cod_grupo = x.cod_grupo AND a.cod_tipo = x.cod_tipo AND a.cod_sec = x.cod_sec AND a.id_kit = x.kit_id AND a.cod_n = b.cod_n AND a.cod_grupo = b.cod_grupo AND a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_sec OPEN busca FETCH FIRST busca INTO x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden LET x1.* = x.* CALL desplega() MENU "NAVEGACION" COMMAND "Siguiente" FETCH NEXT busca INTO x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden LET x1.* = x.* COMMAND "Anterior" FETCH PREVIOUS busca INTO x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden DISPLAY BY NAME x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden COMMAND "Primero" FETCH FIRST busca INTO x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden DISPLAY BY NAME x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden COMMAND "Ultimo" FETCH LAST busca INTO x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden DISPLAY BY NAME x.kit_id,x.disponible,x.descripcion,x.valor_total,x.descripcion_p,x.costeo_orden COMMAND "Actualiza" RETURN x.kit_id COMMAND "Salir" EXIT MENU END MENU RETURN x.kit_id END FUNCTION FUNCTION desplega() DEFINE xkit INT, mensaje STRING DECLARE busca1 CURSOR FOR SELECT a.cod_n,a.cod_Grupo,a.cod_tipo,a.cod_sec,a.cantidad,a.precio,a.porc_Desc, b.descrip_esp FROM vetb00030 a,iptb00002 b WHERE a.cod_n = b.cod_n AND a.cod_Grupo = b.cod_grupo AND a.cod_tipo = b.cod_tipo AND a.cod_sec = b.cod_Sec AND a.id_kit =x1.kit_id LET idx = 1 FOREACH busca1 INTO dproducto[idx].pcodn,dproducto[idx].pcodgrupo, dproducto[idx].pcodtipo,dproducto[idx].pcodsec, dproducto[idx].cantidad,dproducto[idx].precio, dproducto[idx].porc_desc,dproducto[idx].descripcion_p1 LET idx = idx + 1 END FOREACH DISPLAY ARRAY dproducto TO sproducto.* ON ACTION DUPLICA CALL duplica_kit(x1.kit_id) RETURNING xkit LET mensaje = "COPIA KIT ",xkit USING "&&&&&"," EXITOSA" CALL fgl_winmessage("INFO",mensaje,"INFO") EXIT PROGRAM BEFORE DISPLAY DISPLAY BY NAME x1.kit_id,x1.disponible,x1.descripcion,x1.valor_total,x1.descripcion_p AFTER DISPLAY END DISPLAY END FUNCTION { FUNCTION busar_kit() CONSTRUCT criterio ON a.id_kit,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec FROM kit_id,cod_n,cod_grupo,cod_tipo,cod_Sec LET selec = " SELECT a.id_kit,a.descripcion,a.disponible,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec" kit_id INT, descripcion VARCHAR(100), disponible VARCHAR(10), cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion_p VARCHAR(100), valor_total DEC(12,2) END FUNCTION } FUNCTION copia_kit() DEFINE codn2,codgrupo2,codtipo2,codsec2 SMALLINT, valor_total DEC(12,2) DEFINE arr_d DYNAMIC ARRAY OF RECORD area SMALLINT, cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion VARCHAR(100), cantidad DEC(12,5), precio DEC(12,2), porc_desc DEC(12,2) END RECORD INPUT BY NAME codn2,codgrupo2,codtipo2,codsec2 AFTER FIELD codsec2 IF codsec2 IS NOT NULL THEN CALL producto(codn2,codgrupo2,codtipo2,codsec2) RETURNING pdescripcion,x1.factor IF pdescripcion IS NULL THEN CALL msg(3) NEXT FIELD cod_n END IF DISPLAY pdescripcion TO descripcion_p SELECT DISTINCT a.cod_n FROM vetb00029 a WHERE a.cod_n = codn2 AND a.cod_grupo = codgrupo2 AND a.cod_tipo = codtipo2 AND a.cod_sec = codsec2 IF STATUS = NOTFOUND THEN CALL fgl_winmessage("INFO","NO EXISTEN KIT CON ESTE CODIGO","INFO") NEXT FIELD codn2 ELSE CALL visualiza_kit(codn2,codgrupo2,codtipo2,codsec2,pkit,"'SI','NO'") RETURNING pkit,valor_total,pdescripcion CALL visualiza_detalle_kit(pkit) RETURNING arr_d END IF END IF AFTER INPUT IF INT_FLAG THEN EXIT INPUT END IF FOR idx = 1 TO arr_d.getLength() LET arr_producto[idx].pcodn = arr_d[idx].cod_n LET arr_producto[idx].pcodgrupo = arr_d[idx].cod_grupo LET arr_producto[idx].pcodtipo = arr_d[idx].cod_tipo LET arr_producto[idx].pcodsec = arr_d[idx].cod_sec LET arr_producto[idx].descripcion_p1 = arr_d[idx].descripcion LET arr_producto[idx].cantidad = arr_d[idx].cantidad LET arr_producto[idx].precio = arr_d[idx].precio LET arr_producto[idx].porc_desc = arr_d[idx].porc_desc END FOR END INPUT IF INT_FLAG THEN LET INT_FLAG = FALSE RETURN END IF END FUNCTION