{ ------------------------------------------------------------------------- PROGRAMA : COPRCS011 OBJETIVO : Programa Estatus Ordenes De Compras PROGRAMADOR : Ing. Juan F. Soto FECHA REALIZACION : Marzo 18, 1997. -------------------------------------------------------------------------- } GLOBALS "coprgb000.4gl" DEFINE st_orden RECORD num_oc LIKE cotb00014.num_oc, tipo LIKE cotb00014.tipo, fech_oc LIKE cotb00014.fech_oc, cod_sp LIKE cotb00014.cod_sp, cod_sp_sec LIKE cotb00014.cod_sp_sec, cierre LIKE cotb00014.cierre, cod_pt LIKE cotb00014.cod_pt, cod_mon LIKE cotb00015.cod_mon END RECORD DEFINE detalles ARRAY[70] OF CHAR(70) DEFINE st_emb ARRAY[50] OF RECORD cod_emb LIKE cotb00037.cod_emb, cod_st LIKE cotb00037.cod_st, nomb_st CHAR(20), fecha_salida LIKE cotb00037.fecha_salida END RECORD, s_idx SMALLINT, descrip_st CHAR(20) DEFINE nombre_mon CHAR(30) DEFINE p_cod_emb,dias_tran,cod_mon INTEGER DEFINE dia_faltan,fecha_con,fech_s_pa,fech_pa,fecha_e_salida,fecha_e DATE DEFINE dia_planta,emb_rec,emb_no INTEGER, usuario LIKE cotb00037.us_crea, fecha_c LIKE cotb00037.fech_crea, base_m,cif,p_fletes,p_impuesto,p_acarreo,recibir DECIMAL(12,2), ch_fecha CHAR(8), numero_pr,numero_ft CHAR(15) DEFINE informe ARRAY[20] OF RECORD cod_n SMALLINT, cod_grupo SMALLINT, cod_tipo SMALLINT, cod_sec SMALLINT, descripcion CHAR(30), unidad CHAR(4), cantidad DECIMAL(12,2), recibido DECIMAL(12,2) END RECORD FUNCTION coprcs011() CLEAR SCREEN OPTIONS FORM LINE 8, COMMENT LINE 23, MESSAGE LINE 23, ERROR LINE 24 LET formulario = formulario CLIPPED,"cofmcs011" OPEN FORM cofmcs011 FROM formulario DISPLAY FORM cofmcs011 CALL pantalla() DISPLAY "coprcs011" AT 4,3 DISPLAY "Estatus Ordenes De Compras" AT 6,26 SELECT dia INTO dia_aduana FROM cotb00028 MENU "OPCIONES" COMMAND "Consultar" " Busca Registro Cancela Operacion" CLEAR FORM LET opc = "S" LET int_flag = FALSE CALL copcmf025() COMMAND "Salir" "Retorna Menu Anterior" EXIT MENU END MENU END FUNCTION FUNCTION copcmf025() #WHENEVER ERROR CONTINUE # Aqui se prepara para la captura del criterio de seleccion CONSTRUCT BY NAME criterio ON a.num_oc, a.tipo,a.fech_oc, a.cod_sp, a.cod_sp_sec, a.cierre IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET selec = " SELECT UNIQUE a.num_oc,a.tipo,a.fech_oc,", " a.cod_sp,a.cod_sp_sec,", " a.cierre, ", " a.cod_pt,b.cod_mon ", " FROM cotb00014 a,cotb00015 b ", " WHERE ", " a.num_oc = b.num_oc AND ", " a.status_t is null AND ",criterio clipped," ORDER BY 1" PREPARE busca FROM selec CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF DECLARE datos SCROLL CURSOR FOR busca OPEN datos CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF FETCH FIRST datos INTO st_orden.* IF status >= 0 THEN IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF END IF # Funcion para la busqueda de lo suplidores, Terminos ded pago, # descripcion del puesto y la via CALL escoge25() DISPLAY BY NAME st_orden.*,suplidor.nom_sp, nombre_p,st_orden.cod_mon,nombre_mon, st_orden.fech_oc IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF # Menu para la busqueda de las informaciones en forma direccional MENU "OPCIONES " COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO st_orden.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF CALL escoge25() DISPLAY BY NAME st_orden.*,suplidor.nom_sp, nombre_p,st_orden.cod_mon,nombre_mon, st_orden.fech_oc CALL busca_detalle() COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO st_orden.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF CALL escoge25() DISPLAY BY NAME st_orden.*,suplidor.nom_sp, nombre_p,st_orden.cod_mon,nombre_mon, st_orden.fech_oc CALL busca_detalle() COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO st_orden.* CALL escoge25() DISPLAY BY NAME st_orden.*,suplidor.nom_sp, nombre_p,st_orden.cod_mon,nombre_mon, st_orden.fech_oc CALL busca_detalle() LET numero_msg = 5 CALL msg(numero_msg) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO st_orden.* CALL escoge25() DISPLAY BY NAME st_orden.*,suplidor.nom_sp, nombre_p,st_orden.cod_mon,nombre_mon, st_orden.fech_oc CALL busca_detalle() LET numero_msg = 4 CALL msg(numero_msg) COMMAND "Detalles" " Cancela Operacion" MESSAGE " Busca Embarques Busca Descripcion Items" CALL busca_detalle() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE EXIT MENU END IF CALL set_count(idx -1) DISPLAY ARRAY arr_ordenes2 TO consart.* ON KEY (CONTROL-B) LET curr = arr_curr() SELECT a.descrip_esp,a.unidad_med INTO articulos.descrip_esp,articulos.unidad_med FROM intb00001 a WHERE a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec IF STATUS = NOTFOUND THEN LET articulos.descrip_esp = "ITEM NO EXISTE" LET numero_msg = 13 CALL msg(numero_msg) END IF DISPLAY BY NAME articulos.descrip_esp,articulos.unidad_med ON KEY (CONTROL-P) LET curr = arr_curr() # BUSCA NUMERO DE EMBARQUES DE LA ORDEN DECLARE busca_no CURSOR FOR SELECT COUNT(*),a.FECH_EMB FROM cotb00025 a WHERE a.num_oc = st_orden.num_oc AND a.tipo = st_orden.tipo AND a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec GROUP BY 2 LET emb_no = 0 LET emb_rec = 0 FOREACH busca_no INTO emb_no,fecha_e LET emb_no = emb_no + 1 LET ch_fecha = fecha_e LET p_cod_emb = ch_fecha[1,6] SELECT UNIQUE cod_n FROM cotb00038 a WHERE a.num_oc = st_orden.num_oc AND a.cod_emb = p_cod_emb AND a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec IF STATUS != NOTFOUND THEN LET emb_rec= emb_rec + 1 END IF END FOREACH DISPLAY BY NAME emb_no,emb_rec IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT DISPLAY END IF # BUSCA LOS EMBARQUES DECLARE busca_emb CURSOR FOR SELECT a.cod_emb,a.cod_st,b.descripcion,a.fecha_salida,a.us_crea, a.fech_crea FROM cotb00037 a, OUTER cotb00041 b WHERE a.cod_st = b.cod_st AND a.num_oc = st_orden.num_oc AND a.tipo = st_orden.tipo AND a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec ORDER BY 1 LET idx = 1 FOREACH busca_emb INTO st_emb[idx].*,usuario,fecha_c LET idx = idx + 1 LET st_emb[idx].nomb_st = NULL END FOREACH CALL set_count(idx -1) INPUT ARRAY st_emb WITHOUT DEFAULTS FROM emb.* ON KEY (CONTROL-N) LET idx = arr_curr() IF st_emb[idx].cod_emb IS NOT NULL THEN LET p_cod_emb = st_emb[idx].cod_emb CALL inform_emb() END IF IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT DISPLAY END IF AFTER FIELD cod_st LET idx = arr_curr() LET s_idx = scr_line() IF st_emb[idx].cod_st IS NOT NULL THEN SELECT a.descripcion INTO descrip_st FROM cotb00041 a WHERE a.cod_st = st_emb[idx].cod_st AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_st END IF LET st_emb[idx].nomb_st = descrip_st DISPLAY st_emb[idx].nomb_st TO emb[s_idx].nomb_st END IF AFTER INPUT END INPUT # ACTUALIZACION TABLA DE EMBARQUES IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF FOR idx = 1 TO arr_count() IF st_emb[idx].cod_emb IS NOT NULL THEN UPDATE cotb00037 SET cod_st = st_emb[idx].cod_st, fecha_salida = st_emb[idx].fecha_salida, us_mod = USER, fech_mod = CURRENT WHERE num_oc = st_orden.num_oc AND cod_n = arr_ordenes2[curr].cod_n AND cod_grupo = arr_ordenes2[curr].cod_grupo AND cod_tipo = arr_ordenes2[curr].cod_tipo AND cod_sec = arr_ordenes2[curr].cod_sec AND cod_emb = st_emb[idx].cod_emb LET numero_msg = 13 CALL msg(numero_msg) END IF END FOR MESSAGE " Busca Embarques Busca Descripcion Items" LET numero_msg = 13 CALL msg(numero_msg) END DISPLAY IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false EXIT MENU END IF COMMAND "Retornar" "Retorna al menu anterior" CLEAR FORM EXIT MENU END MENU END FUNCTION FUNCTION escoge25() SELECT nom_sp INTO suplidor.nom_sp FROM cotb00001 WHERE cod_sp = st_orden.cod_sp AND cod_sp_sec = st_orden.cod_sp_sec AND status_t is null IF st_orden.cod_pt IS NOT NULL THEN SELECT nom_pt INTO nombre_p FROM cotb00019 WHERE cod_pt = st_orden.cod_pt AND status_t is null END IF IF st_orden.cod_mon IS NOT NULL THEN LET nombre_mon = "MONEDA NO EXISTE" SELECT descrip_mon INTO nombre_mon FROM cotb00031 WHERE cod_mon = st_orden.cod_mon AND status_t is null END IF END FUNCTION FUNCTION inform_emb() OPEN WINDOW informa AT 3,3 WITH FORM "cofmwd018" ATTRIBUTE ( BORDER,COMMENT LINE LAST ,FORM LINE FIRST,MESSAGE LINE LAST -1) DISPLAY BY NAME p_cod_emb DECLARE busca_inf CURSOR FOR SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_sec,b.descrip_esp,b.unidad_med, a.cantidad,c.cantidad FROM cotb00037 a,intb00001 b,OUTER cotb00038 c WHERE a.cod_emb = p_cod_emb AND a.num_oc = st_orden.num_oc 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 AND a.status_t IS NULL AND a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec AND a.status_t IS NULL AND c.cod_n = a.cod_n AND c.cod_grupo = b.cod_grupo AND c.cod_tipo = b.cod_tipo AND c.cod_sec = b.cod_sec AND c.num_oc = a.num_oc AND c.cod_emb = a.cod_emb ORDER BY 1,2,3,4 LET idx = 1 FOREACH busca_inf INTO informe[idx].* LET idx = idx + 1 END FOREACH IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF IF idx = 1 THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF MESSAGE " Se Dirige A Datos Generales Del Embarque" DISPLAY ARRAY informe TO informa.* MESSAGE " " IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false GOTO sale END IF LET ch_fecha = p_cod_emb USING "&&&&&&" LET ch_fecha = ch_fecha CLIPPED LET fecha_e_salida = ch_fecha CLIPPED DISPLAY BY NAME fecha_e_salida SELECT UNIQUE a.fecha_confirm INTO fecha_con FROM cotb00037 a WHERE a.cod_emb = p_cod_emb AND a.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec INPUT BY NAME fecha_con WITHOUT DEFAULTS AFTER FIELD fecha_con IF fecha_con < fecha_e_salida THEN LET numero_msg = 365 CALL msg(numero_msg) NEXT FIELD fecha_con END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false GOTO sale END IF # ACTUALIZACION FECHA CONFIRMADA UPDATE cotb00037 SET fecha_confirm = fecha_con, us_crea = user, fech_mod = current WHERE cod_emb = p_cod_emb # BUSCA EL DIA DE LLEGADA MAYOR EN LOS ITEMS QUE TIENE LA ORDEN SELECT MAX(a.dia_llegada),MAX(a.base) INTO m_articulos.dia_llegada,base_m FROM intb00002 a, cotb00037 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.cod_n = arr_ordenes2[curr].cod_n AND a.cod_grupo = arr_ordenes2[curr].cod_grupo AND a.cod_tipo = arr_ordenes2[curr].cod_tipo AND a.cod_sec = arr_ordenes2[curr].cod_sec AND b.cod_emb = p_cod_emb # BUSCA LOS DIAS QUE DURA UN ITEM EN ADUANA SELECT dia INTO dia_aduana FROM cotb00028 LET dias_tran = m_articulos.dia_llegada LET dia_faltan = fecha_con + m_articulos.dia_llegada LET dia_planta = dia_faltan - TODAY + dia_aduana DISPLAY BY NAME dias_tran,dia_planta,fecha_con,dia_faltan # BUSCA EL NUMERO DE LA PROFORMA EN LA ORDEN SELECT UNIQUE a.num_pr INTO numero_pr FROM cotb00014 a,cotb00037 b WHERE a.num_oc = b.num_oc AND a.num_oc = st_orden.num_oc AND b.cod_emb = p_cod_emb DISPLAY BY NAME numero_pr # CALCULA EL VALOR FOB,CIF,IMPUESTO ADUANA,FLETE SELECT a.c_flete,SUM(c.cantidad*c.precio) INTO cif,fob FROM cotb00014 a,cotb00037 b,cotb00015 c WHERE b.cod_n = c.cod_n AND b.cod_grupo = c.cod_grupo AND b.cod_tipo = c.cod_tipo AND b.cod_sec = c.cod_sec AND a.num_oc = c.num_oc AND a.num_oc = b.num_oc AND b.cod_emb = p_cod_emb AND a.num_oc = st_orden.num_oc GROUP BY 1 IF base_m IS NULL OR base_m = 0 THEN LET base_m = 1 END IF LET fob = fob / base_m DISPLAY BY NAME fob,cif SELECT a.num_fact,a.num_pr,a.fletes,a.impuesto,a.acarreo,a.fech_sol_pa, a.fecha_pago INTO numero_ft,numero_pr,p_fletes,p_impuesto,p_acarreo,fech_s_pa, fech_pa FROM cotb00039 a WHERE a.cod_emb = p_cod_emb AND a.num_oc = st_orden.num_oc AND a.tipo = st_orden.tipo INPUT BY NAME numero_pr,numero_ft,p_fletes,p_impuesto,p_acarreo,fech_s_pa, fech_pa WITHOUT DEFAULTS AFTER FIELD fech_s_pa IF fech_s_pa < st_orden.fech_oc THEN LET numero_msg = 366 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF IF fech_s_pa < fecha_con THEN LET numero_msg = 367 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF IF fech_s_pa < fecha_e_salida THEN LET numero_msg = 367 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF AFTER FIELD fech_pa IF fech_pa < st_orden.fech_oc THEN LET numero_msg = 366 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF IF fech_pa < fecha_con THEN LET numero_msg = 367 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF IF fech_pa < fecha_e_salida THEN LET numero_msg = 367 CALL msg(numero_msg) NEXT FIELD fech_s_pa END IF AFTER INPUT END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF DECLARE busca_de CURSOR FOR SELECT a.detalle,a.us_crea,a.fech_crea,a.no_linea FROM cotb00040 a WHERE a.cod_emb = p_cod_emb AND a.num_oc = st_orden.num_oc ORDER BY 4 LET idx = 1 FOREACH busca_de INTO detalles[idx],usuario,fecha_c LET idx = idx + 1 END FOREACH CALL set_count(idx-1) INPUT ARRAY detalles WITHOUT DEFAULTS FROM detalla.* IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF # Actualizacion de la Tabla - Comentarios Del Estatus De La Oren - DELETE FROM cotb00040 WHERE cod_emb = p_cod_emb AND num_oc = st_orden.num_oc FOR idx = 1 TO arr_count() IF detalles[idx] IS NOT NULL THEN IF usuario IS NULL THEN INSERT INTO cotb00040 VALUES (idx,p_cod_emb,st_orden.num_oc, detalles[idx], user,current,NULL,NULL) ELSE INSERT INTO cotb00040 VALUES (idx,p_cod_emb,st_orden.num_oc, detalles[idx], usuario,fecha_c,user,current) END IF END IF END FOR SELECT UNIQUE a.cod_emb FROM cotb00039 a WHERE a.cod_emb = p_cod_emb IF STATUS = NOTFOUND THEN INSERT INTO cotb00039 VALUES (st_orden.num_oc,st_orden.tipo,p_cod_emb,numero_ft,numero_pr, p_fletes,p_impuesto,p_acarreo,fech_s_pa,fech_pa, user,current,null,null) ELSE UPDATE cotb00039 SET num_fact = numero_ft, num_pr = numero_pr, fletes = p_fletes, impuesto = p_impuesto, acarreo = p_acarreo, fech_sol_pa = fech_s_pa, fecha_pago = fech_pa, us_mod = user, fech_mod = current WHERE cod_emb = p_cod_emb AND num_oc = st_orden.num_oc AND tipo = st_orden.tipo END IF LET numero_msg = 13 CALL msg(numero_msg) LABEL sale: CLOSE WINDOW informa END FUNCTION FUNCTION busca_detalle() FOR idx = 1 TO 3 LET arr_ordenes2[idx].num_req = NULL LET arr_ordenes2[idx].cod_n = NULL LET arr_ordenes2[idx].cod_grupo = NULL LET arr_ordenes2[idx].cod_tipo = NULL LET arr_ordenes2[idx].cod_sec = NULL LET arr_ordenes2[idx].cantidad = NULL LET arr_ordenes2[idx].precio = NULL LET arr_ordenes2[idx].valor = NULL END FOR DECLARE busca20 CURSOR FOR SELECT a.num_req,a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cantidad, a.precio FROM cotb00015 a WHERE (a.num_oc = st_orden.num_oc AND a.tipo = st_orden.tipo) AND a.status_t is null LET idx = 1 FOREACH busca20 INTO arr_ordenes2[idx].* LET recibir = 0 SELECT SUM(a.cantidad) INTO recibir FROM cotb00038 a WHERE a.cod_n = arr_ordenes2[idx].cod_n AND a.cod_grupo = arr_ordenes2[idx].cod_grupo AND a.cod_tipo = arr_ordenes2[idx].cod_tipo AND a.cod_sec = arr_ordenes2[idx].cod_sec AND a.num_oc = st_orden.num_oc AND a.status_t IS NULL SELECT a.base INTO m_articulos.base FROM intb00002 a WHERE a.cod_n = arr_ordenes2[idx].cod_n AND a.cod_grupo = arr_ordenes2[idx].cod_grupo AND a.cod_tipo = arr_ordenes2[idx].cod_tipo AND a.cod_sec = arr_ordenes2[idx].cod_sec AND a.status_t IS NULL IF m_articulos.base IS NULL OR m_articulos.base = 0 THEN LET m_articulos.base = 1 END IF LET arr_ordenes2[idx].valor=(arr_ordenes2[idx].cantidad/m_articulos.base) * arr_ordenes2[idx].precio IF recibir IS NULL THEN LET recibir = 0 END IF LET arr_ordenes2[idx].recibido = recibir LET idx = idx + 1 END FOREACH FOR idx = 1 TO 3 DISPLAY arr_ordenes2[idx].num_req TO consart[idx].num_req DISPLAY arr_ordenes2[idx].cod_n TO consart[idx].cod_n DISPLAY arr_ordenes2[idx].cod_grupo TO consart[idx].cod_grupo DISPLAY arr_ordenes2[idx].cod_tipo TO consart[idx].cod_tipo DISPLAY arr_ordenes2[idx].cod_sec TO consart[idx].cod_sec DISPLAY arr_ordenes2[idx].cantidad TO consart[idx].cantidad DISPLAY arr_ordenes2[idx].precio TO consart[idx].precio DISPLAY arr_ordenes2[idx].valor TO consart[idx].valor END FOR END FUNCTION