{ PROGRAMA : ubicacionH.4gl FECHA DESARROLLO: 10/01/2024 DESARROLLADO POR: ELVIS OBJETIVO : CONTROLAR LA GESTION DE LAS TRANSACCIONES EN LAS UBICACIONES NO HACE TRANSFERENCIA DE UBICACIONES, ES EL ubicacionDH.4gl } GLOBALS "ipprgb000.4gl" DEFINE medida DECIMAL(12,5) FUNCTION insertaUbicacion(moviD,num_doc_tmp) DEFINE moviD RECORD area,cod_n,cod_Grupo,cod_tipo,cod_sec, descripcion,observacion STRING, book varchar(50) ,tipos varchar(50) ,lado_1 decimal(12,5) ,lado_2 decimal(12,5) ,lado_3 decimal(12,5) ,id_bodega, id_seccion1 INT ,d_seccion1 VARCHAR(50) ,id_tramo1 INT ,d_tramo1 VARCHAR(50), id_fila,id_pos INT, id_producto VARCHAR(25), tipo_material VARCHAR(30) ,cantidad1,cantidad2,factor_conv DECIMAL(12,5), cod_mov INT, control_transferencia_ubicaciones VARCHAR(2), cod_mov_transferencia INT, codigo STRING END RECORD, idz,num_doc_tmp,p_arr1,idx10 SMALLINT, tmp_cantidad2,tmp_cantidad DEC(12,5), producto,mensaje CHAR(50) DEFINE movi10 DYNAMIC ARRAY OF RECORD area,cod_n,cod_Grupo,cod_tipo,cod_sec INT, descripcion,observacion STRING, book varchar(50) ,tipos varchar(50) ,lado_1 decimal(12,5) ,lado_2 decimal(12,5) ,lado_3 decimal(12,5) ,id_bodega, id_seccion1 INT ,d_seccion1 VARCHAR(50) ,id_tramo1 INT ,d_tramo1 VARCHAR(50), id_fila,id_pos INT, id_producto VARCHAR(25), tipo_material VARCHAR(30), cantidad1,cantidad2,factor_conv DECIMAL(12,5), cod_mov INT, de_seccion,de_tramo INT, codigo STRING END RECORD, control_exis STRING DEFINE movi DYNAMIC ARRAY OF RECORD cod_n LIKE iptb00006.cod_n, cod_grupo LIKE iptb00006.cod_grupo, cod_tipo LIKE iptb00006.cod_tipo, cod_sec LIKE iptb00006.cod_sec, cantidad_1 DECIMAL(12,3), cantidad_2 DECIMAL(12,3), cod_mov SMALLINT, no_embarque CHAR(08), pendiente DECIMAL(12,3), desglose CHAR(1), descrip_esp VARCHAR(180) END RECORD DEFINE movi4 DYNAMIC ARRAY OF RECORD seccion INT, tramo,fila,posicion INT, disponible DECIMAL(12,5), cantidad_1,cantidad_2 DECIMAL(12,5), factor_conv DECIMAL(12,5) END RECORD, u ui.Dialog, lleneArray BOOLEAN OPEN WINDOW w1 WITH FORM "ipfmmt045" DIALOG ATTRIBUTE(UNBUFFERED) INPUT BY NAME descripcion BEFORE INPUT DISPLAY "en before input: ",moviD.cantidad1 LET medida = moviD.cantidad1 LET tmp_cantidad=0 LET tmp_cantidad2=0 LET producto = moviD.cod_n USING "<<<&", "-",moviD.cod_grupo USING "<<<<&", "-",moviD.cod_tipo USING "<<<<&", "-",moviD.cod_sec USING "<<<<&" LET descripcion = moviD.descripcion CLIPPED,"-(",producto CLIPPED,")" SELECT a.status_mov INTO status_m FROM iptb00005 a WHERE a.cod_mov = moviD.cod_mov IF status_m = "2" THEN SELECT control_existencia INTO control_exis FROM iptb00002 WHERE cod_n = moviD.cod_n AND cod_grupo = moviD.cod_Grupo AND cod_tipo = moviD.cod_tipo AND cod_sec = moviD.cod_sec CALL existenciaTramos(moviD.cod_n,moviD.cod_grupo,moviD.cod_tipo,moviD.cod_sec,moviD.id_bodega, num_doc_tmp) RETURNING movi4 IF control_exis = "SI" THEN IF movi4.getLength() IS NULL OR movi4.getLength() =1 THEN CALL fgl_winmessage("INFO","ESTE PRODUCTO NO TIENE EXISTENCIA EN EL ALMACEN ESPECIFICADO","INFO") EXIT DIALOG END IF END IF ELSE SELECT a.cod_seccion,a.cod_tramo,a.cod_fila,a.cod_pos INTO movi4[1].seccion,movi4[1].tramo,movi4[1].fila,movi4[1].posicion FROM companias a LET movi4[1].cantidad_1=movid.cantidad1 END IF LET movi4[1].cantidad_1=movid.cantidad1 LET movi[1].cantidad_2 = movi4[1].cantidad_1 * movi4[1].factor_conv END INPUT INPUT ARRAY movi4 FROM recordd.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT LET movi4[arr_curr()].cantidad_1 = moviD.cantidad1 LET movi4[arr_curr()].cantidad_2 = movi4[arr_curr()].cantidad_1 * movi4[arr_curr()].factor_conv CALL init_seccion(moviD.id_bodega) IF status_m = "2" THEN CALL Dialog.setFieldActive("seccion",FALSE) CALL Dialog.setFieldActive("tramo",FALSE) CALL Dialog.setFieldActive("fila",FALSE) CALL Dialog.setFieldActive("posicion",FALSE) ELSE CALL Dialog.setFieldActive("seccion",TRUE) CALL Dialog.setFieldActive("tramo",TRUE) CALL Dialog.setFieldActive("fila",TRUE) CALL Dialog.setFieldActive("posicion",TRUE) END IF BEFORE ROW LET p_arr1 = arr_curr() LET scr_l = scr_line() LET movi4[p_arr1].factor_conv = movid.factor_conv CALL init_tramo(moviD.id_bodega,movi4[p_arr1].seccion) CALL init_fila(moviD.id_bodega,movi4[p_arr1].seccion,movi4[p_arr1].tramo) CALL init_posicion(moviD.id_bodega,movi4[p_arr1].seccion,movi4[p_arr1].tramo,movi4[p_arr1].fila) AFTER FIELD seccion IF movi4[p_arr1].tramo IS NOT NULL THEN CALL init_tramo(moviD.id_bodega,movi4[p_arr1].seccion) END IF AFTER FIELD tramo IF movi4[p_arr1].fila IS NOT NULL THEN CALL init_fila(moviD.id_bodega,movi4[p_arr1].seccion,movi4[p_arr1].tramo) END IF AFTER FIELD fila IF movi4[p_arr1].posicion IS NOT NULL THEN CALL init_posicion(moviD.id_bodega,movi4[p_arr1].seccion,movi4[p_arr1].tramo,movi4[p_arr1].fila) END IF AFTER FIELD cantidad_1 LET movi4[p_arr1].cantidad_2 = movi4[p_arr1].cantidad_1 * movi4[p_arr1].factor_conv DISPLAY movi4[p_arr1].cantidad_2 TO recordd[scr_l].cantidad_2 IF status_m = "2" THEN IF movi4[p_arr1].cantidad_1 > 0 AND movi4[p_arr1].tramo IS NOT NULL THEN SELECT a.control_existencia INTO control_exis FROM iptb00002 a WHERE a.cod_n = moviD.cod_n AND a.cod_grupo = moviD.cod_Grupo AND a.cod_tipo = moviD.cod_tipo AND a.cod_sec = moviD.cod_sec IF control_exis = 'SI' THEN IF movi4[p_arr1].disponible < 0 THEN CALL fgl_winmessage("EXISTENCIA","EXISTENCIA ESTA EN NEGATIVO, NO PUEDES AFECTAR UBICACION","INFO") NEXT FIELD cantidad_1 END IF IF movi4[p_arr1].cantidad_2 > movi4[p_arr1].disponible THEN CALL fgl_winmessage("EXISTENCIA","CANTIDAD A SOLICITAR ES MAYOR A LA DISPONIBLE EN EL TRAMO DE ORIGEN","INFO") NEXT FIELD cantidad_1 END IF END IF END IF END IF {AFTER ROW FOR idx = 1 TO movi4.getLength() IF movi4[idx].cantidad_1 > 0 THEN LET tmp_cantidad2 = tmp_cantidad2 +movi4[idx].cantidad_2 CALL insertTemporal(moviD.cod_n,moviD.cod_grupo,moviD.cod_tipo,moviD.cod_sec,moviD.cod_mov, moviD.id_bodega,movi4[idx].cantidad_1,movi4[idx].cantidad_2, movi4[idx].seccion, movi4[idx].tramo, '0','0',movi4[idx].disponible,num_doc_tmp) COMMIT WORK END IF END FOR } AFTER INPUT IF int_flag THEN LET int_flag = FALSE CALL fgl_winmessage("ATENCION", "SALIO SIN GUARDAR LA UBICACION. EL ITEM QUEDARA SIN UBICACION ASIGNADA.", "INFO") CLOSE WINDOW w1 LET tmp_cantidad =0 LET tmp_cantidad2 =0 INITIALIZE movi10 TO NULL RETURN tmp_cantidad,tmp_cantidad2,num_doc_tmp,movi10 END IF FOR idx = 1 TO movi4.getLength() IF movi4[idx].cantidad_1 IS NOT NULL THEN IF movi4[idx].seccion IS NULL THEN CALL msg(1022) NEXT FIELD cantidad_1 END IF END IF END FOR IF tmp_cantidad2 <> movid.cantidad2 THEN CALL msg(16) NEXT FIELD cantidad_1 END IF END INPUT ON ACTION solicitar ATTRIBUTE(TEXT="Guardar",IMAGE="save") LET tmp_cantidad = 0 LET tmp_cantidad2 =0 LET lleneArray = TRUE FOR idx = 1 TO movi4.getLength() IF movi4[idx].cantidad_2 >0 THEN LET tmp_cantidad = tmp_cantidad + movi4[idx].cantidad_1 LET tmp_cantidad2 = tmp_cantidad2 + movi4[idx].cantidad_2 LET movi4[idx].cantidad_2 = movi4[idx].cantidad_1 * movi4[idx].factor_conv IF status_m = "2" THEN SELECT a.control_existencia INTO control_exis FROM iptb00002 a WHERE a.cod_n = moviD.cod_n AND a.cod_grupo = moviD.cod_Grupo AND a.cod_tipo = moviD.cod_tipo AND a.cod_sec = moviD.cod_sec DISPLAY "control: ",movid.cod_sec," disponible: ",movi4[idx].disponible IF control_exis = 'SI' THEN IF movi4[idx].disponible < 0 THEN DISPLAY "disponible: ",movi4[idx].disponible CALL fgl_winmessage("EXISTENCIA","EXISTENCIA ESTA EN NEGATIVO, NO PUEDES AFECTAR UBICACION","INFO") NEXT FIELD cantidad_1 END IF IF movi4[idx].cantidad_2 > movi4[idx].disponible THEN CALL fgl_winmessage("EXISTENCIA","CANTIDAD A SOLICITAR ES MAYOR A LA DISPONIBLE EN EL TRAMO DE ORIGEN","INFO") NEXT FIELD cantidad_1 END IF END IF END IF END IF IF movi4[idx].cantidad_2 IS NOT NULL THEN DISPLAY "seccion: ",movi4[idx].seccion," tramo: ",movi4[idx].tramo, " pos: ",movi4[idx].posicion," fila:",movi4[idx].fila," llene: ",lleneArray IF movi4[idx].seccion IS NULL OR movi4[idx].tramo IS NULL OR movi4[idx].posicion IS NULL OR movi4[idx].fila IS NULL THEN LET lleneArray = FALSE EXIT FOR END IF END IF END FOR IF lleneArray = FALSE THEN CALL msg(1668) CONTINUE DIALOG END IF LET idx10 = 1 FOR idx =1 TO movi4.getLength() IF movi4[idx].cantidad_1 IS NOT NULL THEN LET movi10[idx10].area = moviD.area LET movi10[idx10].cod_n = moviD.cod_n LET movi10[idx10].cod_grupo = moviD.cod_grupo LET movi10[idx10].cod_tipo = moviD.cod_tipo LET movi10[idx10].cod_sec = moviD.cod_sec LET movi10[idx10].id_bodega = moviD.id_bodega LET movi10[idx10].cod_mov = moviD.cod_mov LET movi10[idx10].codigo = moviD.area USING "<<<","-", moviD.cod_n USING "<<<<","-", moviD.cod_grupo USING "<<<<<","-", moviD.cod_tipo USING "<<<<<<","-", moviD.cod_sec USING "<<<<<<","-" LET movi10[idx10].id_seccion1 = movi4[idx].seccion LET movi10[idx10].id_tramo1 = movi4[idx].tramo LET movi10[idx10].id_fila = movi4[idx].fila LET movi10[idx10].id_pos = movi4[idx].posicion LET movi10[idx10].de_seccion = 0 LET movi10[idx10].de_tramo = 0 LET movi10[idx10].cantidad1 = movi4[idx].cantidad_1 LET movi10[idx10].cantidad2 = movi4[idx].cantidad_2 LET idx10 = idx10 + 1 END IF END FOR EXIT DIALOG ON ACTION CANCEL LET tmp_cantidad=0 LET tmp_cantidad2=0 EXIT DIALOG CLOSE WINDOW w1 END DIALOG CLOSE WINDOW w1 RETURN tmp_cantidad,tmp_cantidad2,num_doc_tmp,movi10 END FUNCTION FUNCTION existenciaTramos(pcodn,pcodgrupo,pcodtipo,pcodsec,xbodega,num_doc_tmp) DEFINE num_doc_tmp,pcodn,pcodgrupo,pcodtipo,pcodsec,xbodega INT DEFINE movi4 DYNAMIC ARRAY OF RECORD seccion INT, tramo,fila,posicion INT, disponible DECIMAL(12,5), cantidad_1,cantidad_2 DECIMAL(12,5), factor_conv DECIMAL(12,5) END RECORD, i INT DISPLAY "datos: ",xbodega," ",pcodn," ",pcodgrupo," ",pcodtipo," ",pcodsec DECLARE busca_ex CURSOR FOR SELECT a.cod_seccion,a.cod_tramo,a.cod_fila,a.cod_pos,ISNULL(SUM(a.cantidad2),0),ISNULL(SUM(a.cantidad),0),ISNULL(SUM(a.cantidad2),0),ISNULL(AVG(b.factor_conv),0) FROM iptb00062 a INNER JOIN iptb00001 b on (a.bodega = xbodega AND a.cod_n = pcodn AND a.cod_grupo = pcodgrupo AND a.cod_tipo = pcodtipo AND a.cod_sec = pcodsec 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 GROUP BY a.cod_seccion,a.cod_tramo,a.cod_fila,a.cod_pos # HAVING SUM(a.cantidad2) >= 0 LET i = 1 FOREACH busca_ex INTO movi4[i].seccion,movi4[i].tramo,movi4[i].fila,movi4[i].posicion,movi4[i].disponible, movi4[i].cantidad_1,movi4[i].cantidad_2, movi4[i].factor_conv LET movi4[i].cantidad_1 = medida LET movi4[i].cantidad_2 = medida * movi4[i].factor_conv LET i = i + 1 END FOREACH RETURN movi4 END FUNCTION