{ ------------------------------------------------------------------------- PROGRAMA : ALPRMT006 OBJETIVO : Programa Captura Documento Movimiento:REPORTE ENTRADA Nota: No utilice los PREPARE porque utilizaria todas las tablas de los sistemas de inventarios. PROGRAMADOR : Juan Fco. Soto (Johnny) FECHA REALIZACION : Octubre 21,1993. ------------------------------------------------------------------------- } IMPORT util SCHEMA smarmotech GLOBALS DEFINE cerrada CHAR(1) # Variable para actualizar el cierre de una orden DEFINE total_cantidad, porciento, ordenada, r_cantidad1, r_cantidad, mp_recibida, is_recibida, ip_recibida, ir_recibida, ih_recibida DECIMAL(12, 3) DEFINE etiqueta CHAR(20), selec, criterio, scodigo STRING, opt CHAR(10), recepTodas SMALLINT, verdad1 BOOLEAN DEFINE descrip_espa CHAR(100) DEFINE fecha, p_fechas, fecha_c DATE DEFINE ip_ultimo, ir_ultimo, ih_ultimo, is_ultimo, in_ultimo, l, bandera, numero_msg INTEGER DEFINE documento DYNAMIC ARRAY OF INTEGER DEFINE dia, idx, idx1, p_act, scr_l, cod_mov_ant SMALLINT DEFINE primera, opc1, verdad, opc, estado_mov CHAR(1) DEFINE unidad CHAR(4) DEFINE inv1, inv2, inv3, inv4, inv5 CHAR(500) DEFINE tipo1, tipo2, tipo3, tipo4, tipo5 CHAR(200) DEFINE tasa, precio_compra, recibida, f_cantidad, factor, cantidad, cantidad2 DECIMAL(12, 3), descripcion_f CHAR(100), nombre_m CHAR(20), descrip CHAR(15), USUARIOS, CLAVE, descripcion_bodega CHAR(50), i, x2 INT, xcod_mov SMALLINT, xcantidad1, xcantidad2 DEC(12, 5) DEFINE normal, negrilla_on, negrillas_of, comp_on, comp_off, doce, doble_on, doble_off CHAR(3) DEFINE cmd, imprime, copia CHAR(150), archivo CHAR(80), impresor, xcod_mov SMALLINT, tmp_cantidad, num_doc_tmp DEC(12, 5) DEFINE datos_gen RECORD num_doc LIKE iptb00006.num_doc, tipo CHAR(2), orden_compra LIKE iptb00006.orden_compra, cod_sp LIKE iptb00006.cod_sp, cod_sp_sec LIKE iptb00006.cod_sp_sec, conduce_no LIKE iptb00006.conduce_no, tipo_recepcion_entrada INT, num_cont VARCHAR(100), fecha_recepcion_entrada DATE, fact_no LIKE iptb00006.fact_no, fecha LIKE iptb00006.fecha, bodega LIKE iptb00006.bodega, nom_sp LIKE cotb00001.nom_sp, descrip_mov LIKE intb00005.descrip_mov END RECORD 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, p_companias RECORD LIKE companias.*, att DYNAMIC ARRAY OF RECORD col1 STRING, col2 STRING, col3 STRING, col4 STRING, col5 STRING, col6 STRING, col7 STRING END RECORD 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 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, tmpnumero INT DEFINE movi10Dest 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 DEFINE kdatos DYNAMIC ARRAY OF RECORD lado_2 DEC(8, 5), lado_1 DEC(8, 5), lado_3 DEC(8, 5), cantidad FLOAT, cantidad2 FLOAT, tono VARCHAR(100), calidad VARCHAR(100), xobservacion VARCHAR(200), id_producto CHAR(25), seccion INT, tramo INT END RECORD DEFINE container DECIMAL(12, 5) END GLOBALS MAIN DEFINE fecha CHAR(8) DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(3) RETURNING impresor CONNECT TO "smarmotech" USER usuarios USING clave SELECT cod_seccion, cod_tramo, cod_fila, cod_pos, nombre INTO moviD.id_seccion1, moviD.id_tramo1, moviD.id_fila, moviD.id_pos, p_companias.nombre FROM companias SELECT ISNULL(a.num_doc, 0) INTO tmpnumero FROM iptb00043 a WHERE a.usuario = usuarios IF tmpnumero = 0 THEN LET tmpnumero = 1 INSERT INTO iptb00043(num_doc, usuario) VALUES(tmpnumero, usuarios) ELSE LET tmpnumero = tmpnumero + 1 UPDATE iptb00043 SET num_doc = tmpnumero, usuario = usuarios WHERE usuario = usuarios END IF CLEAR SCREEN OPTIONS ERROR LINE 24, FORM LINE 4, COMMENT LINE 22, PROMPT LINE 23 SELECT * INTO p_companias.* FROM companias LET l = (80 - LENGTH(p_companias.nombre CLIPPED)) / 2 LET fecha = TODAY USING "dd/mm/yyyy" OPEN FORM alfmmt006 FROM "alfmmt006" DISPLAY FORM alfmmt006 MENU ON ACTION nuevo CALL inpcad006() ON ACTION buscar CALL inpcmf006() ON ACTION salir EXIT MENU END MENU END MAIN FUNCTION inpcad006() # WHENEVER ERROR CONTINUE LET int_flag = FALSE INITIALIZE datos_gen.* TO NULL LET datos_gen.fecha = TODAY USING "dd/mm/yy" LABEL otra_vez: IF (OPC = "S" OR OPC = "s") OR opc IS NULL THEN INITIALIZE datos_gen.* TO NULL END IF LET cerrada = "N" LET total_cantidad = 0 LET is_ultimo = NULL LET ir_ultimo = NULL LET ip_ultimo = NULL LET ih_ultimo = NULL LET in_ultimo = NULL DIALOG ATTRIBUTES(UNBUFFERED) # Captura de informacion del reporte de entrada INPUT BY NAME datos_gen.tipo, datos_gen.orden_compra, datos_gen.conduce_no, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fact_no, datos_Gen.bodega, datos_Gen.fecha, recepTodas, datos_gen.fecha_recepcion_entrada ATTRIBUTE(WITHOUT DEFAULTS) ON ACTION Procesar INFIELD recepTodas NEXT FIELD cod_b BEFORE INPUT CALL bodegas('1') CALL tipoorden() SELECT a.bodega INTO datos_gen.bodega FROM seg0001 a WHERE a.usuario = usuarios LET datos_gen.fecha = TODAY DISPLAY BY NAME datos_gen.bodega, datos_gen.fecha LET is_ultimo = datos_gen.num_doc LET ir_ultimo = datos_gen.num_doc LET ip_ultimo = datos_gen.num_doc LET ih_ultimo = datos_gen.num_doc LET in_ultimo = datos_gen.num_doc # PREPARACION INSTRUCCIONES PARA EL INSERT AL DESGLOSE LET selec = "INSERT INTO iptb00052 (cod_n,cod_grupo,cod_tipo,cod_Sec,tipo_material,cantidad_minima,us_crea,fech_crea, cantidadorden,num_doc,cod_mov,fecha,bookmatch,tipos) SELECT cod_n,cod_grupo,cod_tipo,cod_Sec,tipo_material,cantidad_minima, us_crea,fech_crea,cantidadorden,?,cod_mov,fecha,bookmatch,tipos FROM tmpdesglose_master WHERE num_doc = ? AND cod_mov = ? AND us_crea = ? AND cod_n = ? AND cod_grupo = ? AND cod_tipo = ? AND cod_sec = ? " PREPARE inst1 FROM selec LET selec = "INSERT INTO iptb00050 (cod_n,cod_grupo,cod_tipo,cod_Sec,imagen,observacion, lado_1,lado_2,lado_3,cantidad, nombre_file,us_crea,fech_crea,id_producto, cantidad2,cod_bodega,cod_seccion,cod_tramo,tono,calidad,num_doc,cod_mov) SELECT cod_n,cod_grupo,cod_tipo,cod_Sec,imagen,observacion, lado_1,lado_2,lado_3,cantidad, nombre_file,us_crea,fech_crea,id_producto, cantidad2,cod_bodega,cod_seccion,cod_tramo,tono,calidad,?,cod_mov FROM tmpdesglose WHERE num_doc = ? AND cod_mov = ? AND us_crea = ? AND cod_n = ? AND cod_grupo = ? AND cod_tipo = ? AND cod_sec = ? " PREPARE inst2 FROM selec NEXT FIELD tipo AFTER FIELD fecha IF datos_gen.fecha IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha END IF IF datos_gen.fecha > TODAY THEN LET numero_msg = 160 CALL msg(numero_msg) NEXT FIELD fecha END IF LET p_fechas = datos_gen.fecha USING "ddmmyy" SELECT MIN(fecha_corte) INTO fecha_c FROM prdtable WHERE fecha_corte >= p_fechas IF STATUS = NOTFOUND THEN LET numero_msg = 58 CALL msg(numero_msg) RETURN END IF LET dia = 0 SELECT MIN(dias_gracia) INTO dia FROM prdtable WHERE fecha_corte = fecha_c IF dia IS NULL THEN LET dia = 0 END IF SELECT a.usuario FROM seg0003 a WHERE a.usuario = USUARIOS IF STATUS != NOTFOUND THEN LET fecha_c = fecha_c + dia END IF { LET datos_gen.bodega = 1 DISPLAY BY NAME datos_gen.bodega ATTRIBUTE (CYAN) LET datos_gen.fecha = today DISPLAY BY NAME datos_gen.fecha ATTRIBUTE (CYAN)} IF fecha_c < TODAY THEN LET numero_msg = 57 CALL msg(numero_msg) NEXT FIELD fecha END IF AFTER FIELD bodega IF datos_gen.bodega IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD bodega END IF LET descripcion_bodega = NULL SELECT UNIQUE a.usuario, b.descripcion INTO descripcion_bodega FROM iptb00048 a, intb00009 b WHERE a.bodega = datos_gen.bodega AND a.usuario = usuarios AND a.bodega = b.cod_bodega IF STATUS = NOTFOUND THEN CALL fgl_winmessage( "ERROR", "USTED NO TIENE PERMISOS PARA UTILIZAR BODEGA", "INFO") END IF AFTER FIELD orden_compra # Verifica que la orden de compra este en el archivo y # ademas obliga a que el usuario tenga que digitar este campo IF datos_gen.orden_compra IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD orden_compra ELSE SELECT a.cod_sp, a.cod_sp_sec, a.cierre INTO datos_gen.cod_sp, datos_gen.cod_sp_sec, cerrada FROM cotb00014 a WHERE a.tipo = datos_gen.tipo AND a.num_oc = datos_gen.orden_compra AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo END IF SELECT UNIQUE nom_sp INTO datos_gen.nom_sp FROM cotb00001 WHERE cod_sp = datos_gen.cod_sp AND cod_sp_sec = datos_gen.cod_sp_sec AND status_t IS NULL DISPLAY BY NAME datos_gen.nom_sp, datos_gen.cod_sp, datos_gen.cod_sp_sec ATTRIBUTE(CYAN) END IF IF cerrada = "S" THEN CALL fgl_winmessage( "ERROR", "ORDEN CERRADA, NO PUEDES RECIBIR MERCANCIAS", "INFO") NEXT FIELD orden_compra END IF IF cerrada IS NULL THEN LET cerrada = "N" END IF AFTER FIELD fact_no # Verifica que el numero de la factura no se repita con el mismo numero de # documento. IF datos_gen.conduce_no IS NULL AND datos_gen.fact_no IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD conduce_no END IF IF datos_gen.conduce_no IS NOT NULL AND datos_gen.fact_no IS NOT NULL THEN LET numero_msg = 29 CALL msg(numero_msg) NEXT FIELD conduce_no END IF AFTER INPUT # Chequea que el conduce y la factura no este en blanco IF datos_gen.conduce_no IS NULL AND datos_gen.fact_no IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD conduce_no END IF # bodegas IF datos_gen.bodega IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD bodega END IF LET descripcion_bodega = NULL SELECT UNIQUE a.usuario FROM iptb00048 a WHERE a.bodega = datos_gen.bodega AND a.usuario = usuarios IF STATUS = NOTFOUND THEN CALL fgl_winmessage( "ERROR", "USTED NO TIENE PERMISOS PARA UTILIZAR BODEGA", "INFO") NEXT FIELD bodega END IF IF movi.getLength() <= 1 THEN DECLARE locales CURSOR FOR SELECT a.cod_n, a.cod_grupo, a.cod_tipo, a.cod_sec, a.cantidad, '0', a.cod_n, " ", a.cod_n, b.desglose, b.descrip_esp FROM cotb00015 a LEFT OUTER JOIN iptb00002 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.tipo = datos_gen.tipo AND a.num_oc = datos_gen.orden_compra ORDER BY 1, 2, 3, 4, 8 LET idx = 1 FOREACH locales INTO movi[idx].* IF idx = 1 THEN IF datos_gen.tipo = "01" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM intb00001 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF IF datos_gen.tipo = "02" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM iptb00002 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF IF datos_gen.tipo = "04" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM istb00002 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF LET descripcion_f = descrip_espa CLIPPED, " ", unidad CLIPPED DISPLAY BY NAME descripcion_f ATTRIBUTE(CYAN) END IF IF datos_gen.tipo = "01" THEN SELECT SUM(a.cantidad_2) INTO recibida FROM intb00006 a WHERE (a.orden_compra = datos_gen.orden_compra) AND (a.cod_n = movi[idx].cod_n) AND (a.cod_grupo = movi[idx].cod_grupo) AND (a.cod_tipo = movi[idx].cod_tipo) AND (a.cod_sec = movi[idx].cod_sec) AND a.status_t IS NULL LET movi[idx].cod_mov = 34 END IF IF datos_gen.tipo = "02" THEN SELECT SUM(a.cantidad_2) INTO recibida FROM iptb00006 a WHERE (a.orden_compra = datos_gen.orden_compra) AND (a.cod_n = movi[idx].cod_n) AND (a.cod_grupo = movi[idx].cod_grupo) AND (a.cod_tipo = movi[idx].cod_tipo) AND (a.cod_sec = movi[idx].cod_sec) AND a.status_t IS NULL LET movi[idx].cod_mov = 10 SELECT a.status_mov INTO estado_mov FROM iptb00005 a WHERE a.cod_mov = movi[idx].cod_mov END IF IF recibida IS NULL THEN LET recibida = 0 END IF # LET movi[idx].cod_mov = null # LET movi[idx].cantidad_2 = null LET movi[idx].pendiente = movi[idx].cantidad_1 - recibida LET idx = idx + 1 END FOREACH END IF DISPLAY "recepcion ", recepTodas IF recepTodas = 1 THEN FOR idx = 1 TO movi.getLength() LET movi[idx].cantidad_2 = movi[idx].cantidad_1 IF datos_gen.tipo = "01" THEN LET movi[idx].cod_mov = 34 LET xcod_mov = movi[idx].cod_mov END IF IF datos_gen.tipo = "02" THEN LET movi[idx].cod_mov = 10 LET xcod_mov = movi[idx].cod_mov LET movi10Dest[idx].area = 1 LET movi10Dest[idx].cod_n = movi[idx].cod_n LET movi10Dest[idx].cod_grupo = movi[idx].cod_grupo LET movi10Dest[idx].cod_tipo = movi[idx].cod_tipo LET movi10Dest[idx].cod_Sec = movi[idx].cod_sec LET movi10Dest[idx].cantidad1 = movi[idx].cantidad_1 LET movi10Dest[idx].cantidad2 = movi[idx].cantidad_2 LET movi10Dest[idx].cod_mov = movi[idx].cod_mov LET movi10Dest[idx].id_bodega = datos_gen.bodega LET movi10Dest[idx].id_seccion1 = moviD.id_seccion1 LET movi10Dest[idx].id_tramo1 = moviD.id_tramo1 LET movi10Dest[idx].id_fila = moviD.id_fila LET movi10Dest[idx].id_pos = moviD.id_pos END IF END FOR CALL salvarData() RETURNING numero_msg, verdad1 IF NOT verdad1 THEN CALL msg(numero_msg) NEXT FIELD orden_compra END IF # CALL verificaCodigo() RETURNING verdad1 EXIT DIALOG END IF END INPUT # Si las informaciones estan correctas cuando se digite el proximo documento # busca la orden especificada # CAPTURA ARREGLO DE LOS CODIGOS DE MATERIA PRIMA INPUT ARRAY movi FROM s_movi1.* ATTRIBUTE(WITHOUT DEFAULTS) BEFORE INPUT CALL DIALOG.setActionActive("delete", FALSE) CALL dialog.setCellAttributes(att) CALL verificaCodigo() RETURNING verdad1 BEFORE ROW LET p_act = arr_curr() LET scr_l = scr_line() --ON ACTION test --SET CONNECTION "SQL_C" --CALL actExistencia(num_doc_tmp) AFTER FIELD cod_Sec IF movi[p_act].cantidad_1 IS NOT NULL AND datos_gen.tipo = "02" THEN SELECT a.factor_conv INTO moviD.factor_conv FROM iptb00001 a WHERE a.cod_n = movi[p_act].cod_n AND a.cod_grupo = movi[p_act].cod_grupo AND a.cod_tipo = movi[p_act].cod_tipo AND a.cod_sec = movi[p_act].cod_sec LET moviD.cod_n = movi[p_act].cod_n LET moviD.cod_grupo = movi[p_act].cod_grupo LET moviD.cod_tipo = movi[p_act].cod_tipo LET moviD.cod_sec = movi[p_act].cod_sec # AREA FIJA 1: DEBE COINCIDIR CON EL AREA DEL MOVIMIENTO EN # iptb00006/iptb00062 PARA QUE EL JSON DEL SP MATCHEE. LET moviD.area = 1 LET moviD.descripcion = descripcion_f LET moviD.id_bodega = datos_gen.bodega LET moviD.cod_mov = movi[p_act].cod_mov LET moviD.cantidad1 = movi[p_act].cantidad_1 / moviD.factor_conv #LET moviD.cantidad2 = movi[p_act].cantidad_2 LET scodigo = 1 USING "<<<", "-", movi[p_act].cod_n USING "<<<<", "-", movi[p_act].cod_grupo USING "<<<<<", "-", movi[p_act].cod_tipo USING "<<<<<<", "-", movi[p_act].cod_sec USING "<<<<<<", "-" LET idx = movi10Dest.search("codigo", scodigo) #CALL movi10Dest.deleteElement(idx) CALL insertaUbicacion( moviD.*, tmpnumero) RETURNING container, movi[p_act].cantidad_2, tmpnumero, movi10 # SI EL USUARIO SALIO DE LA VENTANA DE UBICACION SIN GUARDAR # (ESC/int_flag), movi10 REGRESA VACIO: NO CONTINUAR COMO SI # EL ITEM TUVIERA UBICACION. IF movi10.getLength() = 0 THEN LET numero_msg = 1668 CALL msg(numero_msg) NEXT FIELD cod_sec END IF # ELIMINAR LAS UBICACIONES ANTERIORES DE ESTE ITEM ANTES DE # AGREGAR LAS NUEVAS, PARA NO DUPLICAR EN movi10Dest. CALL eliminaUbicacionesItem( movi[p_act].cod_n, movi[p_act].cod_grupo, movi[p_act].cod_tipo, movi[p_act].cod_sec) CALL adicionaArray() LET att[p_act].col6 = 'green reverse' END IF AFTER FIELD cantidad_2 # Verifica que la cantidad recibida mas las que se han recibida de # la orden no exceda de un 10% de la cantidad total de la orden IF movi[p_act].cantidad_2 IS NOT NULL THEN IF movi[p_act].cantidad_2 < 0 THEN LET movi[p_act].cantidad_2 = 0 END IF IF datos_gen.tipo = "01" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM intb00001 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF IF datos_gen.tipo = "02" THEN CALL verificaCodigo() RETURNING verdad1 IF movi[p_act].desglose = 'S' THEN LET xcod_mov = movi[p_act].cod_mov CALL fotos( movi[p_act].cod_n, movi[p_act].cod_grupo, movi[p_act].cod_tipo, movi[p_act].cod_sec, movi[p_act].descrip_esp, USUARIOS, TRUE, movi[p_act].cantidad_2, tmpnumero, movid.cod_mov, datos_gen.bodega, estado_mov) RETURNING xcantidad2, xcantidad1 IF xcantidad2 > 0 THEN LET movi[p_act].cantidad_2 = xcantidad2 END IF # IF xcantidad1 > 0 THEN # LET movi[p_act].cantidad_1=xcantidad1 # END IF IF movi[p_act].cantidad_2 <> xcantidad2 THEN CALL msg(46) NEXT FIELD cantidad_1 END IF END IF SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM iptb00002 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF IF datos_gen.tipo = "04" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM istb00002 WHERE cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec END IF LET descripcion_f = descrip_espa CLIPPED, " ", unidad CLIPPED LET recibida = 0 IF datos_gen.tipo = "01" THEN SELECT SUM(cantidad_2) INTO recibida FROM intb00006 WHERE orden_compra = datos_gen.orden_compra AND cod_n = movi[p_act].cod_n AND cod_grupo = movi[p_act].cod_grupo AND cod_tipo = movi[p_act].cod_tipo AND cod_sec = movi[p_act].cod_sec AND status_t IS NULL END IF IF datos_gen.tipo = "02" THEN SELECT ISNULL(SUM(cantidad_2), 0) INTO recibida FROM iptb00006 WHERE orden_compra = datos_gen.orden_compra AND cod_n = movi[p_act].cod_n AND cod_grupo = movi[p_act].cod_grupo AND cod_tipo = movi[p_act].cod_tipo AND cod_sec = movi[p_act].cod_sec AND status_t IS NULL END IF SELECT SUM(cantidad) INTO ordenada FROM cotb00015 WHERE num_oc = datos_gen.orden_compra AND tipo = datos_gen.tipo AND cod_n = movi[p_act].cod_n AND cod_grupo = movi[p_act].cod_grupo AND cod_tipo = movi[p_act].cod_tipo AND cod_sec = movi[p_act].cod_sec AND status_t IS NULL IF recibida IS NULL THEN LET recibida = 0 END IF IF ordenada IS NULL THEN LET ordenada = 0 END IF LET porciento = ordenada * 0.10 --4.536 IF movi[p_act].cantidad_2 IS NOT NULL THEN LET recibida = recibida + movi[p_act].cantidad_2 END IF LET r_cantidad = ordenada + porciento IF recibida > (movi[p_act].cantidad_1 * 1.10) THEN DISPLAY "Recibida: ", recibida DISPLAY "Cantidad devuelta?:", (movi[p_act].cantidad_1 * 1.10) LET numero_msg = 28 CALL msg(numero_msg) NEXT FIELD cantidad_2 END IF END IF AFTER FIELD cod_mov LET p_act = arr_curr() IF movi[p_act].cantidad_2 IS NOT NULL THEN IF movi[p_act].cod_mov IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_mov END IF LET xcod_mov = movi[p_act].cod_mov # Busqueda en la tabla movimientos de productos terminados IF datos_gen.tipo = "01" THEN LET etiqueta = "MATERIAS PRIMAS" SELECT a.descrip_mov INTO datos_gen.descrip_mov FROM intb00005 a WHERE a.cod_mov = movi[p_act].cod_mov AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_mov END IF END IF IF datos_gen.tipo = "02" THEN LET etiqueta = "PROD. TERMINADOS" SELECT a.descrip_mov INTO datos_gen.descrip_mov FROM iptb00005 a WHERE a.cod_mov = movi[p_act].cod_mov AND a.status_t IS NULL IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_mov END IF IF primera = "S" THEN LET primera = "N" # Mismo calculo que en salvarData: la secuencia se # ancla al maximo real usado y NUNCA retrocede. LET datos_gen.num_doc = proximaSecuenciaIP(movi[p_act].cod_mov, datos_gen.bodega) LET ip_ultimo = datos_gen.num_doc LET documento[p_act] = datos_gen.num_doc SELECT UNIQUE num_doc FROM iptb00006 WHERE num_doc = datos_gen.num_doc AND cod_mov = movi[p_act].cod_mov AND bodega = datos_gen.bodega IF STATUS != NOTFOUND THEN LET numero_msg = 128 CALL msg(numero_msg) RETURN END IF END IF END IF # Busqueda del ultimo numero del reporte de entrada de Producto Terminados DISPLAY BY NAME datos_gen.num_doc, datos_gen.descrip_mov ATTRIBUTE(CYAN) END IF ON ACTION guardar ATTRIBUTE(TEXT = "Salvar", IMAGE = "save") CALL salvarData() RETURNING numero_msg, verdad1 IF NOT verdad1 THEN CALL msg(numero_msg) END IF END INPUT ON ACTION CANCEL ATTRIBUTE(TEXT = "Cancelar", IMAGE = "quick") DELETE FROM tmpdesglose_master WHERE num_Doc = tmpnumero AND cod_mov = xcod_mov AND us_crea = usuarios DELETE FROM tmpdesglose WHERE num_Doc = tmpnumero AND cod_mov = xcod_mov AND us_crea = usuarios EXIT PROGRAM END DIALOG # Actualiza la tabla de ordenes para cerrarla si la variable cerrada = "S" END FUNCTION { ---------------------------------------------------------------------------- PROGRAMA : PRD OBJETIVO : Controlar las operaciones que se hagan anterior a una fecha de corte. REALIZADO POR : Ing. Juan Fco. Soto. FECHA : Noviembre 4, 1992. --------------------------------------------------------------------------- } FUNCTION prd(p_fechas) DEFINE p_fechas CHAR(6) DEFINE comp_fech, comp_fech1 DATE DEFINE mes_control CHAR(2) DEFINE mes_calc SMALLINT DEFINE fecha_c CHAR(6) DEFINE c_ano, a_ano CHAR(4) LET a_ano = YEAR(p_fechas) LET mes_control = MONTH(TODAY) LET mes_calc = mes_control IF mes_calc = 01 THEN LET mes_calc = 13 LET a_ano = YEAR(TODAY - 32) END IF LET mes_calc = mes_calc - 2 IF mes_calc <= 0 THEN LET mes_calc = 12 LET a_ano = YEAR(TODAY) - 1 END IF LET c_ano = YEAR(TODAY) {IF a_ano != c_ano THEN LET numero_msg = 59 CALL msg(numero_msg) LET bandera = 1 RETURN END IF} SELECT fecha_corte INTO fecha_c FROM prdtable WHERE mes = mes_calc AND ano = a_ano IF STATUS = NOTFOUND THEN LET numero_msg = 58 CALL msg(numero_msg) LET bandera = 1 END IF LET comp_fech1 = fecha_c LET comp_fech = p_fechas { IF comp_fech < comp_fech1 THEN LET numero_msg = 57 CALL msg(numero_msg) LET bandera = 1 END IF } END FUNCTION { Esta funcion se utiliza para desplegar mensajes de errores en todos los sistemas de Ray-O-Vac Dominicana. Esta funcion busca el mensaje deseado en la tabla "msgtable" y lo despliega en la linea de mensajes } FUNCTION msg(numero_msg) DEFINE numero_msg SMALLINT DEFINE descripcion CHAR(60) SELECT desc_msg INTO descripcion FROM msgtable WHERE cod_msg = numero_msg IF STATUS = NOTFOUND THEN LET numero_msg = 22 SELECT desc_msg INTO descripcion FROM msgtable WHERE cod_msg = numero_msg ERROR descripcion ATTRIBUTE(BOLD) ELSE ERROR descripcion ATTRIBUTE(BOLD) LET numero_msg = 0 END IF END FUNCTION FUNCTION integridad() IF sqlca.sqlcode < 0 THEN LET numero_msg = sqlca.sqlcode CALL msg(numero_msg) DISPLAY numero_msg AT 23, 70 LET bandera = 1 SLEEP 2 RETURN END IF END FUNCTION FUNCTION no_existe() IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) LET verdad = "S" END IF CALL integridad() END FUNCTION REPORT entrada_imp(x, z) DEFINE x RECORD num_doc LIKE iptb00006.num_doc, tipo CHAR(2), orden_compra LIKE iptb00006.orden_compra, cod_sp LIKE iptb00006.cod_sp, cod_sp_sec LIKE iptb00006.cod_sp_sec, conduce_no LIKE iptb00006.conduce_no, tipo_recepcion_entrada TINYINT, num_cont INT, fech_recep_carga DATE, fact_no LIKE iptb00006.fact_no, fecha LIKE iptb00006.fecha, bodega LIKE iptb00006.bodega, nom_sp LIKE cotb00001.nom_sp, descrip_mov LIKE intb00005.descrip_mov END RECORD DEFINE z 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 LIKE iptb00006.cantidad_1, cantidad_2 LIKE iptb00006.cantidad_2, cod_mov SMALLINT, no_embarque CHAR(8), pendiente DECIMAL(12, 3), desglose CHAR(1), descrip_esp VARCHAR(180) END RECORD DEFINE etiq, unidad CHAR(20) DEFINE recibida1 DECIMAL(12, 3) DEFINE l SMALLINT DEFINE comp_on, comp_off, doce, normal, negras_of, negras_on, doble_on, doble_of CHAR(2) OUTPUT TOP MARGIN 0 BOTTOM MARGIN 0 LEFT MARGIN 0 FORMAT #BEFORE GROUP OF doc PAGE HEADER LET comp_on = ASCII 15 LET comp_off = ASCII 18 LET negras_on = ASCII 27, ASCII 69 LET negras_of = ASCII 27, ASCII 70 LET doble_on = ASCII 14 LET doble_of = ASCII 20 LET normal = ASCII 27, ASCII 80 LET doce = ASCII 27, ASCII 77 PRINT normal PRINT COLUMN 1, negras_on, doble_on, comp_on, COLUMN 1, p_companias.nombre CLIPPED, " RNC. ", p_companias.rnc CLIPPED, doble_of, negras_of PRINT COLUMN 58, "REPORTE DE ENTRADA" LET etiq = etiqueta CLIPPED LET l = (80 - LENGTH(etiq)) / 2 PRINT COLUMN 58, "No.", doble_on, datos_gen.num_doc USING "&&&&&&" LET l = (80 - LENGTH(datos_gen.descrip_mov)) / 2 PRINT COLUMN l, negras_on, "(", z.cod_mov USING "<<<", ")", datos_gen.descrip_mov, negras_of PRINT comp_on SELECT a.descripcion INTO descripcion_bodega FROM intb00009 a WHERE a.cod_bodega = datos_gen.bodega SKIP 1 LINE PRINT COLUMN 1, "Fecha : ", datos_gen.fecha USING "dd/mm/yy", COLUMN 49, "Orden de Compra: ", datos_gen.tipo, "-", datos_gen.orden_compra USING "&&&&&&" PRINT COLUMN 1, "Proveedor : ", datos_gen.cod_sp USING "&&", "-", datos_gen.cod_sp_sec USING "&&&&", " ", datos_gen.nom_sp[1, 30] PRINT COLUMN 1, "Conduce : ", datos_gen.conduce_no CLIPPED, COLUMN 49, "Factura : ", datos_gen.fact_no CLIPPED PRINT COLUMN 1, "BODEGA : (", datos_gen.bodega USING "<<<", ")", descripcion_bodega PRINT COLUMN 1, "=====================================================", "===========================" PRINT COLUMN 1, doce, COLUMN 23, "CANTIDAD", COLUMN 38, "CANTIDAD", COLUMN 53, "CANTIDAD" PRINT COLUMN 1, "CODIGO", COLUMN 21, "ORDENADA", COLUMN 36, "RECIBIDA", COLUMN 51, "PENDIENTE", COLUMN 71, "D E S C R I P C I O N" PRINT COLUMN 36, "EN DOCUM.", COLUMN 51, "ORDEN", normal PRINT COLUMN 1, "=====================================================", "===========================" PRINT doce ON EVERY ROW LET recibida1 = 0 LET descrip_espa = " " IF x.tipo = 1 THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM intb00001 WHERE cod_n = z.cod_n AND cod_grupo = z.cod_grupo AND cod_tipo = z.cod_tipo AND cod_sec = z.cod_sec END IF IF x.tipo = 2 THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM iptb00002 WHERE cod_n = z.cod_n AND cod_grupo = z.cod_grupo AND cod_tipo = z.cod_tipo AND cod_sec = z.cod_sec END IF LET descripcion_f = descrip_espa CLIPPED, " ", unidad CLIPPED PRINT COLUMN 1, z.cod_n USING "&&&&", "-", z.cod_grupo USING "&&&&", "-", z.cod_tipo USING "&&&&", "-", z.cod_sec USING "&&&&", COLUMN 20, z.cantidad_1 USING "##,###,###.###", COLUMN 37, z.cantidad_2 USING "##,###,###.###", COLUMN 53, z.pendiente - z.cantidad_2 USING "---,---.###", descripcion_f CLIPPED #--------------------------- DESGLOSE ------------------------------------------ # IMPRESION DESGLOSE SELECT DISTINCT a.num_doc FROM iptb00052 a WHERE a.num_doc = datos_gen.num_doc AND a.cod_mov = z.cod_mov IF STATUS <> NOTFOUND THEN PRINT COLUMN 10, "------------------------------------- DESGLOSE -----------------------------------" DECLARE busca_desglose CURSOR FOR SELECT a.lado_1, a.lado_2, a.lado_3, a.cantidad, a.cantidad2, a.tono, a.calidad, b.descripcion, c.descripcion FROM iptb00050 a, intb00010 b, intb00043 c WHERE a.cod_n = z.cod_n AND a.cod_grupo = z.cod_grupo AND a.cod_tipo = z.cod_tipo AND a.cod_sec = z.cod_sec AND a.num_doc = datos_gen.num_doc AND a.cod_mov = z.cod_mov AND a.cod_seccion = b.cod_seccion AND a.cod_bodega = x.bodega AND a.cod_bodega = b.cod_bodega AND a.cod_seccion = b.cod_seccion AND a.cod_tramo = c.cod_tramo AND b.cod_seccion = c.cod_seccion AND b.cod_bodega = c.cod_bodega LET i = 1 FOREACH busca_desglose INTO kdatos[i].lado_1, kdatos[i].lado_2, kdatos[i].lado_3, kdatos[i].cantidad, kdatos[i].cantidad2, kdatos[i].tono, kdatos[i].calidad PRINT COLUMN 10, kdatos[i].lado_1, 2 SPACES, kdatos[i].lado_2, 2 SPACES, kdatos[i].lado_3, 2 SPACES, kdatos[i].cantidad, 2 SPACES, kdatos[i].cantidad2, 2 SPACES, kdatos[i].tono, 2 SPACES, kdatos[i].calidad END FOREACH PRINT COLUMN 10, "----------------------------------------------------------------------------------" END IF PAGE TRAILER PRINT normal PRINT COLUMN 1, "OBSERVACION :" PRINT COLUMN 1, "--------------------------------------------------------------------------" PRINT SKIP 3 LINE PRINT normal END REPORT FUNCTION inpcmf006() DEFINE query_item CHAR(500) INPUT BY NAME datos_gen.tipo AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF IF datos_Gen.tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo END IF EXIT INPUT END INPUT # El ON (columnas) y el FROM (campos del formulario) deben tener la MISMA # cantidad y estar pareados 1:1. Cada campo del FROM debe existir en # alfmmt006.4fd. Se excluyen: cod_mov (solo esta en el detalle s_movi1) y # cod_sp/cod_sp_sec (NOENTRY en el formulario). Antes fallaba porque # 'fecha_contenedor_guia' no existe y ON(8)/FROM(9) estaban desbalanceados. CONSTRUCT criterio ON a.num_doc, a.orden_compra, a.conduce_no, a.fact_no, a.tipo_recepcion_entrada, a.num_contenedor_guia FROM num_Doc, orden_compra, conduce_no, fact_no, tipo_recepcion_entrada, num_cont BEFORE CONSTRUCT CALL bodegas('1') CALL tipoorden() AFTER CONSTRUCT IF INT_FLAG THEN CALL msg(2) LET INT_FLAG = FALSE RETURN END IF END CONSTRUCT IF datos_gen.tipo = '01' THEN LET selec = "SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ", " a.fact_no,CONVERT(CHAR(10),a.fecha,103),a.bodega,b.nom_sp, a.tipo_recepcion_entrada, ", " a.num_contenedor_guia, a.fecha_recepcion_carga ", " FROM intb00006 a,cotb00001 b ", " WHERE a.cod_sp = b.cod_sp and a.cod_sp_Sec = b.cod_sp_Sec and ", criterio CLIPPED, " AND a.status_t is null " END IF IF datos_gen.tipo = "02" THEN LET selec = " SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ", "a.fact_no,a.fecha,a.bodega,b.nom_sp, a.tipo_recepcion_entrada, ", " a.num_contenedor_guia, a.fecha_recepcion_carga ", " FROM iptb00006 a,cotb00001 b ", " WHERE a.cod_sp = b.cod_sp and a.cod_Sp_sec = b.cod_sp_sec ", " and ", criterio CLIPPED, " AND a.status_t IS NULL" DISPLAY SELEC END IF IF datos_gen.tipo = "04" THEN LET selec = " SELECT DISTINCT a.num_doc,a.tipo,a.orden_compra,a.cod_Sp,a.cod_sp_Sec,a.conduce_no, ", "a.fact_no,a.fecha,a.bodega,b.nom_sp a.tipo_recepcion_entrada, ", " a.num_contenedor_guia, a.fecha_recepcion_carga ", " FROM istb00006 a,cotb00001 b ", " WHERE a.cod_sp = b.cod_sp and a.cod_Sp_sec = b.cod_sp_sec ", " and ", criterio CLIPPED, " AND a.status_t IS NULL" END IF PREPARE comando FROM selec DECLARE busca_reporte SCROLL CURSOR FOR comando OPEN busca_reporte FETCH FIRST busca_reporte INTO datos_gen.num_doc, datos_Gen.tipo, datos_gen.orden_compra, datos_gen.cod_sp, datos_gen.cod_sp_sec, datos_gen.conduce_no, datos_gen.fact_no, datos_gen.fecha, datos_gen.bodega, datos_gen.nom_sp, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF DISPLAY BY NAME datos_gen.* MENU "NAVEGACION" COMMAND "SIGUIENTE" FETCH NEXT busca_reporte INTO datos_gen.num_doc, datos_Gen.tipo, datos_gen.orden_compra, datos_gen.cod_sp, datos_gen.cod_sp_sec, datos_gen.conduce_no, datos_gen.fact_no, datos_gen.fecha, datos_gen.bodega, datos_gen.nom_sp, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) END IF COMMAND "ANTERIOR" FETCH PREVIOUS busca_reporte INTO datos_gen.num_doc, datos_Gen.tipo, datos_gen.orden_compra, datos_gen.cod_sp, datos_gen.cod_sp_sec, datos_gen.conduce_no, datos_gen.fact_no, datos_gen.fecha, datos_gen.bodega, datos_gen.nom_sp, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) END IF COMMAND "PRIMERO" FETCH FIRST busca_reporte INTO datos_gen.num_doc, datos_Gen.tipo, datos_gen.orden_compra, datos_gen.cod_sp, datos_gen.cod_sp_sec, datos_gen.conduce_no, datos_gen.fact_no, datos_gen.fecha, datos_gen.bodega, datos_gen.nom_sp, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) END IF COMMAND "ULTIMO" FETCH LAST busca_reporte INTO datos_gen.num_doc, datos_Gen.tipo, datos_gen.orden_compra, datos_gen.cod_sp, datos_gen.cod_sp_sec, datos_gen.conduce_no, datos_gen.fact_no, datos_gen.fecha, datos_gen.bodega, datos_gen.nom_sp, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) END IF COMMAND "ITEMS" CALL defecto( usuarios, clave, impresor) RETURNING imprime, negrilla_on, negrillas_of, doble_on, doble_off, comp_on, comp_off, doce, normal, archivo, copia START REPORT entrada_imp TO archivo IF datos_Gen.tipo = '01' THEN LET query_item = " SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cod_mov,a.cantidad_1,", "a.cantidad_2 FROM intb00006 a ", "WHERE a.tipo = ", datos_gen.tipo, " AND a.orden_compra = '", datos_gen.orden_compra USING "&&&&&&", "' AND", " a.num_doc = '", datos_gen.num_doc USING "&&&&&&", "' ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec" ELSE LET query_item = " SELECT a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec,a.cod_mov,a.cantidad_1,", "a.cantidad_2 FROM iptb00006 a ", "WHERE a.tipo = ", datos_gen.tipo, " AND a.orden_compra = '", datos_gen.orden_compra USING "&&&&&&", "' AND", " a.num_doc = '", datos_gen.num_doc USING "&&&&&&", "' ORDER BY a.cod_n,a.cod_grupo,a.cod_tipo,a.cod_Sec" END IF PREPARE comandoi FROM query_item DECLARE busca_item CURSOR FOR comandoi LET idx = 1 FOREACH busca_item INTO movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec, movi[idx].cod_mov, movi[idx].cantidad_1, movi[idx].cantidad_2 OUTPUT TO REPORT entrada_imp(datos_Gen.*, movi[idx].*) LET idx = idx + 1 END FOREACH FINISH REPORT entrada_imp IF idx = 1 THEN LET numero_msg = 3 CALL msg(numero_msg) EXIT MENU END IF CALL set_count(idx - 1) DISPLAY ARRAY movi TO s_movi1.* AFTER ROW LET p_act = arr_curr() IF datos_gen.tipo = "01" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM intb00001 WHERE cod_n = movi[p_act].cod_n AND cod_grupo = movi[p_act].cod_grupo AND cod_tipo = movi[p_act].cod_tipo AND cod_sec = movi[p_act].cod_sec SELECT a.descrip_mov INTO datos_gen.descrip_mov FROM intb00005 a WHERE a.cod_mov = movi[p_act].cod_mov AND a.status_t IS NULL END IF IF datos_gen.tipo = "02" THEN SELECT unidad_med, descrip_esp INTO unidad, descrip_espa FROM iptb00002 WHERE cod_n = movi[p_act].cod_n AND cod_grupo = movi[p_act].cod_grupo AND cod_tipo = movi[p_act].cod_tipo AND cod_sec = movi[p_act].cod_sec SELECT a.descrip_mov INTO datos_gen.descrip_mov FROM iptb00005 a WHERE a.cod_mov = movi[p_act].cod_mov AND a.status_t IS NULL END IF LET descripcion_f = descrip_espa CLIPPED, " ", unidad CLIPPED DISPLAY BY NAME descripcion_f, datos_gen.descrip_mov AFTER DISPLAY EXIT DISPLAY END DISPLAY IF idx > 1 THEN LET opt = fgl_winquestion( "Atencion", "Desea Imprimir este Documento?", "cancel", "YES|NO|", "question", 0) IF opt = "YES" THEN RUN imprime END IF END IF COMMAND "RETORNAR" EXIT MENU END MENU END FUNCTION FUNCTION adicionaArray() DEFINE x1, current_length INT LET current_length = movi10Dest.getLength() FOR x1 = 1 TO movi10.getLength() IF movi10[x1].cantidad2 > 0 THEN # IF movi10[idx].id_seccion1 IS NOT NULL THEN LET current_length = current_length + 1 LET movi10Dest[current_length].* = movi10[x1].* # END IF END IF END FOR END FUNCTION {ELIMINA DE movi10Dest TODAS LAS UBICACIONES DE UN ITEM. SE USA ANTES DE adicionaArray() PARA QUE UNA RECAPTURA DE UBICACION NO DUPLIQUE FILAS. EN ESTE PROGRAMA EL AREA ES SIEMPRE 1, POR LO QUE NO SE FILTRA POR AREA.} FUNCTION eliminaUbicacionesItem(pcod_n, pcod_grupo, pcod_tipo, pcod_sec) DEFINE pcod_n, pcod_grupo, pcod_tipo, pcod_sec, x INTEGER FOR x = movi10Dest.getLength() TO 1 STEP -1 IF movi10Dest[x].cod_n = pcod_n AND movi10Dest[x].cod_grupo = pcod_grupo AND movi10Dest[x].cod_tipo = pcod_tipo AND movi10Dest[x].cod_sec = pcod_sec THEN CALL movi10Dest.deleteElement(x) END IF END FOR END FUNCTION FUNCTION addUbicacion() DEFINE flag BOOLEAN LET flag = TRUE FOR x2 = 1 TO movi10Dest.getLength() IF movi10Dest[x2].cantidad2 > 0 THEN IF movi10Dest[x2].id_seccion1 IS NOT NULL AND movi10Dest[x2].cod_n IS NOT NULL AND movi10Dest[x2].cod_Grupo IS NOT NULL AND movi10Dest[x2].cod_tipo IS NOT NULL AND movi10Dest[x2].cod_sec THEN INSERT INTO iptb00062( num_Doc, cod_mov, bodega, cod_seccion, cod_tramo, cod_fila, cod_pos, area, cod_n, cod_grupo, cod_tipo, cod_sec, cantidad, cantidad2, us_crea, fech_crea) VALUES(datos_gen.num_doc, movi[x2].cod_mov, datos_gen.bodega, movi10Dest[x2].id_seccion1, movi10Dest[x2].id_tramo1, movi10Dest[x2].id_fila, movi10Dest[x2].id_pos, movi10Dest[x2].area, movi10Dest[x2].cod_n, movi10Dest[x2].cod_Grupo, movi10Dest[x2].cod_tipo, movi10Dest[x2].cod_sec, movi10Dest[x2].cantidad1, movi10Dest[x2].cantidad2, usuarios, getdate()) IF STATUS = NOTFOUND THEN CALL msg(-1321) LET flag = FALSE END IF END IF END IF END FOR END FUNCTION FUNCTION verificaCodigo() DEFINE verdad BOOLEAN LET verdad = FALSE FOR i = 1 TO movi.getLength() LET att[i].col6 = 'red reverse' IF movi[i].cantidad_2 > 0 THEN FOR idx1 = 1 TO movi10Dest.getLength() IF movi10Dest[idx1].cod_n = movi[i].cod_n AND movi10Dest[idx1].cod_grupo = movi[i].cod_grupo AND movi10Dest[idx1].cod_tipo = movi[i].cod_tipo AND movi10Dest[idx1].cod_sec = movi[i].cod_sec THEN LET att[i].col6 = 'green reverse' LET verdad = TRUE # ELSE # DISPLAY "codigos: ",idx1,"-",movi10Dest[idx1].cod_grupo,"-",movi10Dest[idx1].cod_sec," NO LO ENCONTRE" # LET att[idx].col6 = 'red reverse' # LET verdad = FALSE END IF END FOR END IF END FOR RETURN verdad END FUNCTION FUNCTION verificarUbicacion() FOR idx1 = 1 TO movi.getLength() IF movi[idx1].cantidad_2 = 0 OR movi[idx1].cantidad_1 IS NULL THEN DISPLAY "borre: ", movi10dest[idx1].descripcion CALL movi10dest.deleteElement(idx1) END IF END FOR END FUNCTION FUNCTION salvarData() DEFINE jsonUbic DYNAMIC ARRAY OF RECORD area, cod_n, cod_Grupo, cod_tipo, cod_sec INT, id_bodega, id_seccion1 INT, id_tramo1 INT, id_fila, id_pos INT, cantidad1, cantidad2 DECIMAL(12, 5) END RECORD, jsonMovi STRING, procedimiento STRING, updExtra STRING, out_result INT, cod_mensaje INT, out_cantidad_item DECIMAL(18, 5), out_cantidad_ubicacion DECIMAL(18, 5), out_msg VARCHAR(1000), idxU, idxJSON INT, detalle_re CHAR(60), cherror STRING, areaFija SMALLINT, pcontrol_dep CHAR(5), controlaCosto CHAR(2), nullInt INT, nullChar CHAR(10), nullDec DECIMAL(18, 5) INITIALIZE nullInt TO NULL INITIALIZE nullChar TO NULL INITIALIZE nullDec TO NULL LET areaFija = 1 LET pcontrol_dep = "NO" # EL REPORTE DE ENTRADA RECEPCIONA ORDENES DE COMPRA: ES NORMAL QUE # EXISTAN ITEMS SIN COSTO DEFINIDO TODAVIA, POR LO QUE EL SP NO DEBE # RECHAZARLOS (PARAMETRO OPCIONAL @controla_costo = 'NO'). LET controlaCosto = "NO" LET total_cantidad = 0 FOR idx = 1 TO movi.getLength() IF movi[idx].cantidad_2 IS NOT NULL THEN DISPLAY "EN GUARDAR_3: ", movi[idx].* LET total_cantidad = movi[idx].cantidad_2 + total_cantidad END IF END FOR LET recibida = 0 LET ordenada = 0 DISPLAY "TOTAL CANTIDAD: ", total_cantidad CALL defecto( usuarios, clave, impresor) RETURNING imprime, negrilla_on, negrillas_of, doble_on, doble_off, comp_on, comp_off, doce, normal, archivo, copia START REPORT entrada_imp TO archivo # Busca la cantidad recibida de la orden especificada IF datos_gen.tipo = "01" THEN SELECT SUM(cantidad_2) INTO ip_recibida FROM intb00006 WHERE orden_compra = datos_gen.orden_compra AND tipo = datos_gen.tipo AND status_t IS NULL END IF IF datos_gen.tipo = "02" THEN SELECT SUM(cantidad_2) INTO ip_recibida FROM iptb00006 WHERE orden_compra = datos_gen.orden_compra AND tipo = datos_gen.tipo AND status_t IS NULL # SECUENCIA POR (cod_mov, bodega). Se ancla al maximo real usado en # iptb00006 (fuente de verdad) para que NUNCA retroceda aunque la fila # de iptb00007 quede en un valor menor. Ver FUNCTION proximaSecuenciaIP. LET datos_gen.num_doc = proximaSecuenciaIP(xcod_mov, datos_gen.bodega) SELECT a.num_doc INTO ip_ultimo FROM iptb00007 a WHERE a.cod_mov = xcod_mov AND a.bodega = datos_gen.bodega IF status = NOTFOUND THEN INSERT INTO iptb00007( num_doc, cod_mov, bodega, us_crea, fech_crea) VALUES(datos_gen.num_doc, xcod_mov, datos_gen.bodega, usuarios, GETDATE()) ELSE # Guarda anti-retroceso: solo se actualiza si el nuevo numero es # mayor al almacenado, para no pisar la secuencia hacia atras. UPDATE iptb00007 SET num_doc = datos_gen.num_doc WHERE cod_mov = xcod_mov AND bodega = datos_gen.bodega AND num_doc < datos_gen.num_doc END IF END IF IF datos_gen.tipo = "04" THEN SELECT SUM(cantidad_2) INTO ip_recibida FROM istb00006 WHERE orden_compra = datos_gen.orden_compra AND tipo = datos_gen.tipo AND status_t IS NULL END IF LET recibida = ip_recibida # Busca la cantidad ordenada de la orden especificada SELECT SUM(a.cantidad) INTO ordenada FROM cotb00015 a WHERE a.num_oc = datos_gen.orden_compra AND a.tipo = datos_gen.tipo AND a.status_t IS NULL IF recibida IS NULL THEN LET recibida = 0 END IF IF ordenada IS NULL THEN LET ordenada = 0 END IF # Calculo de los porcentaje limites de las ordenes LET porciento = ordenada * 0.10 LET recibida = recibida + total_cantidad LET r_cantidad = ordenada # - porciento LET r_cantidad1 = ordenada #+ porciento # Si la cantidad recibida producto de la sumatoria y subtracion del 10% # es mayor o igual a la cantidad recibida y menor o igual a la cantidad de # la orden cierra la orden IF recibida >= r_cantidad AND recibida <= r_cantidad1 THEN LET cerrada = "S" END IF LET primera = "S" # PREPARACION SP DE INVENTARIO (iptb00006 + iptb00062 EN UNA SOLA # OPERACION VALIDADA) PARA PRODUCTOS TERMINADOS (TIPO 02). LET procedimiento = "EXEC sp_insert_inventario ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?" PREPARE smt_re FROM procedimiento # EL SP NO MANEJA LAS COLUMNAS PROPIAS DE LA RECEPCION DE COMPRAS: # SE COMPLEMENTAN CON UN UPDATE SOBRE LA FILA RECIEN INSERTADA. LET updExtra = "UPDATE iptb00006 SET orden_compra = ?, tipo = ?, ", "fact_no = ?, ", "tipo_recepcion_entrada = ?, num_contenedor_guia = ?, ", "fecha_recepcion_carga = ? ", "WHERE num_doc = ? AND cod_mov = ? AND bodega = ? ", "AND cod_n = ? AND cod_grupo = ? AND cod_tipo = ? AND cod_sec = ? ", "AND us_crea = ? AND status_t IS NULL" PREPARE updcompra FROM updExtra LET detalle_re = "REPORTE DE ENTRADA OC ", datos_gen.orden_compra USING "<<<<<<&" BEGIN WORK IF datos_gen.tipo = "01" THEN SELECT UNIQUE a.num_doc INTO in_ultimo FROM intb00023 a WHERE a.cod_mov = xcod_mov AND bodega = datos_gen.bodega IF STATUS = NOTFOUND THEN LET datos_gen.num_doc = 1 INSERT INTO intb00023( num_doc, cod_mov, us_crea, fech_crea, bodega) VALUES(datos_gen.num_doc, xcod_mov, usuarios, GETDATE(), datos_gen.bodega) END IF LET in_ultimo = in_ultimo + 1 LET datos_gen.num_doc = in_ultimo DISPLAY BY NAME datos_gen.num_doc SELECT UNIQUE num_doc FROM intb00006 WHERE num_doc = datos_gen.num_doc AND cod_mov = xcod_mov IF STATUS != NOTFOUND THEN LET numero_msg = 128 RETURN numero_msg, FALSE END IF TRY UPDATE intb00023 SET num_doc = DATOS_GEN.num_doc WHERE cod_mov = xcod_mov CATCH RETURN 1663, FALSE END TRY END IF FOR idx = 1 TO movi.getLength() IF movi[idx].cantidad_2 IS NOT NULL AND movi[idx].cantidad_2 > 0 THEN IF datos_gen.tipo = "04" THEN INSERT INTO istb00006( num_doc, fecha, fact_no, conduce_no, orden_compra, tipo, cod_sp, cod_sp_sec, cod_mov, cod_n, cod_grupo, cod_tipo, cod_sec, cantidad_1, cantidad_2, bodega, tipo_recepcion_entrada, num_contenedor_guia, fecha_recepcion_carga, us_crea, fech_crea) VALUES(datos_gen.num_doc, datos_gen.fecha, datos_gen.fact_no, datos_gen.conduce_no, datos_gen.orden_compra, datos_gen.tipo, datos_gen.cod_sp, datos_gen.cod_sp_sec, movi[idx].cod_mov, movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec, movi[idx].cantidad_1, movi[idx].cantidad_2, datos_gen.bodega, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada, usuarios, GETDATE()) END IF # Actualizacion de las tablas de Productos terminados IF datos_gen.tipo = "02" THEN DISPLAY "EN GUARDAR_4: ", movi[idx].* {========================================================= ARMAR EL JSON CON LAS UBICACIONES DEL ITEM DESDE movi10Dest (CAPTURADAS EN insertaUbicacion O GENERADAS POR LA RECEPCION TOTAL). EL SP INSERTA iptb00006 E iptb00062 EN LA MISMA EJECUCION Y VALIDA CANTIDADES. =========================================================} CALL jsonUbic.clear() LET idxJSON = 0 FOR idxU = 1 TO movi10Dest.getLength() IF movi10Dest[idxU].cod_n = movi[idx].cod_n AND movi10Dest[idxU].cod_grupo = movi[idx].cod_grupo AND movi10Dest[idxU].cod_tipo = movi[idx].cod_tipo AND movi10Dest[idxU].cod_sec = movi[idx].cod_sec AND movi10Dest[idxU].cantidad2 > 0 THEN LET idxJSON = idxJSON + 1 LET jsonUbic[idxJSON].area = 1 LET jsonUbic[idxJSON].cod_n = movi10Dest[idxU].cod_n LET jsonUbic[idxJSON].cod_Grupo = movi10Dest[idxU].cod_grupo LET jsonUbic[idxJSON].cod_tipo = movi10Dest[idxU].cod_tipo LET jsonUbic[idxJSON].cod_sec = movi10Dest[idxU].cod_sec LET jsonUbic[idxJSON].id_bodega = datos_gen.bodega LET jsonUbic[idxJSON].id_seccion1 = movi10Dest[idxU].id_seccion1 LET jsonUbic[idxJSON].id_tramo1 = movi10Dest[idxU].id_tramo1 LET jsonUbic[idxJSON].id_fila = movi10Dest[idxU].id_fila LET jsonUbic[idxJSON].id_pos = movi10Dest[idxU].id_pos LET jsonUbic[idxJSON].cantidad1 = movi10Dest[idxU].cantidad1 LET jsonUbic[idxJSON].cantidad2 = movi10Dest[idxU].cantidad2 END IF END FOR IF idxJSON = 0 THEN DISPLAY "SIN UBICACION PARA ITEM: ", movi[idx].cod_n, "-", movi[idx].cod_grupo, "-", movi[idx].cod_tipo, "-", movi[idx].cod_sec ROLLBACK WORK LET numero_msg = 1668 RETURN numero_msg, FALSE END IF LET jsonMovi = util.JSON.stringify(jsonUbic) DISPLAY "JSON ITEM: ", jsonMovi INITIALIZE out_result TO NULL INITIALIZE cod_mensaje TO NULL INITIALIZE out_msg TO NULL EXECUTE smt_re USING nullInt IN, # num_oc: NULL, LA ORDEN DE COMPRA # NO ES ORDEN DE PRODUCCION (prtb00013); # SE GRABA EN orden_compra VIA updcompra movi[idx].cod_n IN, movi[idx].cod_grupo IN, movi[idx].cod_tipo IN, movi[idx].cod_sec IN, areaFija IN, # area movi[idx].cantidad_1 IN, movi[idx].cantidad_2 IN, movi[idx].cod_mov IN, datos_gen.num_doc IN, # num_doc YA GENERADO ARRIBA tmpnumero IN, nullInt IN, # entrada datos_gen.fecha IN, datos_gen.conduce_no IN, datos_gen.cod_sp IN, datos_gen.cod_sp_sec IN, nullInt IN, # codtransp nullInt IN, # sectransp nullChar IN, # placa detalle_re IN, # detalle datos_gen.bodega IN, cerrada IN, # pcerrada usuarios IN, nullInt IN, # numreq nullChar IN, # codigobloque nullInt IN, # secvend nullChar IN, # direccion nullInt IN, # bodega_d nullInt IN, # num_doc_retrabajo nullChar IN, # aplicaDev nullInt IN, # departamento pcontrol_dep IN, # pcontrol_depto nullInt IN, # factura (numerico); el fact_no # alfanumerico se graba en iptb00006.fact_no via updcompra nullInt IN, # numero_doc nullDec IN, # costo (EL SP LO BUSCA) nullInt IN, # cod_mov_transferencia nullInt IN, # num_doc_transferencia nullInt IN, # bodega_procedencia jsonMovi IN, out_result OUT, cod_mensaje OUT, out_cantidad_item OUT, out_cantidad_ubicacion OUT, out_msg OUT, controlaCosto IN # @controla_costo = 'NO' IF STATUS < 0 THEN ROLLBACK WORK LET cherror = "Error SQL sp_insert_inventario ", SQLCA.sqlerrd[2], SQLERRMESSAGE CALL fgl_winmessage("ERROR", cherror, "stop") RETURN 16, FALSE END IF IF out_result <> 0 THEN DISPLAY "============================================" DISPLAY "ERROR sp_insert_inventario (REPORTE ENTRADA)" DISPLAY "ITEM: ", movi[idx].cod_n, "-", movi[idx].cod_grupo, "-", movi[idx].cod_tipo, "-", movi[idx].cod_sec DISPLAY "DOCUMENTO: ", datos_gen.num_doc, " MOVIMIENTO: ", movi[idx].cod_mov, " BODEGA: ", datos_gen.bodega DISPLAY "COD_MENSAJE: ", cod_mensaje DISPLAY "OUT_MSG: ", out_msg DISPLAY "JSON: ", jsonMovi DISPLAY "============================================" ROLLBACK WORK LET cherror = "ITEM ", movi[idx].cod_n USING "<<<&", "-", movi[idx].cod_grupo USING "<<<<&", "-", movi[idx].cod_tipo USING "<<<<&", "-", movi[idx].cod_sec USING "<<<<&", ": ", out_msg CLIPPED CALL fgl_winmessage("ERROR", cherror, "stop") IF cod_mensaje IS NULL THEN LET cod_mensaje = 16 END IF RETURN cod_mensaje, FALSE END IF # COMPLEMENTO: COLUMNAS DE LA RECEPCION DE COMPRAS QUE # EL SP NO MANEJA (orden_compra, tipo, recepcion, etc.) EXECUTE updcompra USING datos_gen.orden_compra, datos_gen.tipo, datos_gen.fact_no, datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada, datos_gen.num_doc, movi[idx].cod_mov, datos_gen.bodega, movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec, usuarios IF STATUS < 0 THEN ROLLBACK WORK LET cherror = "Error actualizando datos de compra ", SQLCA.sqlerrd[2], SQLERRMESSAGE CALL fgl_winmessage("ERROR", cherror, "stop") RETURN 16, FALSE END IF LET xcod_mov = movi[idx].cod_mov IF movi[idx].desglose = 'S' THEN # TRANSACCIONES DESGLOSE DE LOS PRODUCTOS EXECUTE inst1 USING datos_Gen.num_doc, tmpnumero, xcod_mov, usuarios, movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec EXECUTE inst2 USING datos_Gen.num_doc, tmpnumero, xcod_mov, usuarios, movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec DELETE FROM tmpdesglose_master WHERE num_Doc = tmpnumero AND cod_mov = xcod_mov AND cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec DELETE FROM tmpdesglose WHERE num_Doc = tmpnumero AND cod_mov = xcod_mov AND cod_n = movi[idx].cod_n AND cod_grupo = movi[idx].cod_grupo AND cod_tipo = movi[idx].cod_tipo AND cod_sec = movi[idx].cod_sec #---------------------------------------------------------------------------------- END IF END IF IF datos_gen.tipo = "01" THEN INSERT INTO intb00006( num_doc, fecha, fact_no, conduce_no, orden_compra, tipo, cod_sp, cod_sp_sec, cod_mov, cod_n, cod_grupo, cod_tipo, cod_sec, cantidad_1, cantidad_2, bodega, us_crea, fech_crea, tipo_recepcion_entrada, num_contenedor_guia, fecha_recepcion_carga) VALUES(datos_gen.num_doc, datos_gen.fecha, datos_gen.fact_no, datos_gen.conduce_no, datos_gen.orden_compra, datos_gen.tipo, datos_gen.cod_sp, datos_gen.cod_sp_sec, movi[idx].cod_mov, movi[idx].cod_n, movi[idx].cod_grupo, movi[idx].cod_tipo, movi[idx].cod_sec, movi[idx].cantidad_1, movi[idx].cantidad_2, datos_gen.bodega, USUARIOS, GETDATE(), datos_gen.tipo_recepcion_entrada, datos_gen.num_cont, datos_gen.fecha_recepcion_entrada) END IF OUTPUT TO REPORT entrada_imp(datos_Gen.*, movi[idx].*) END IF END FOR {LAS UBICACIONES (iptb00062) LAS INSERTA sp_insert_inventario JUNTO CON iptb00006; YA NO SE USA addUbicacion() PARA EL TIPO 02.} COMMIT WORK FINISH REPORT entrada_imp RUN imprime IF cerrada = "S" THEN UPDATE cotb00014 SET cierre = cerrada WHERE num_oc = datos_gen.orden_compra AND tipo = datos_gen.tipo END IF CALL movi.clear() CALL movi10Dest.clear() LET numero_msg = 1 RETURN numero_msg, TRUE END FUNCTION { ------------------------------------------------------------------------- FUNCION : tipoorden() (LOCAL a alprmt006) OBJETIVO : Llenar el combobox "tipo_recepcion_entrada" con los tipos de recepcion definidos en la tabla tipo_recepcion_entrada. NOTA : Se define LOCAL en este programa (no en la libreria compartida) porque la tipoorden() de la libreria llena otro combo (formonly.tipo, tipo de orden) y es usada por otros programas. ------------------------------------------------------------------------- } FUNCTION tipoorden() DEFINE ketiquetas SMALLINT, detiquetas CHAR(30), crecepcion ui.ComboBox LET crecepcion = ui.combobox.forname("formonly.tipo_recepcion_entrada") CALL crecepcion.clear() DECLARE brecepcion CURSOR FOR SELECT a.cod_recepcion, a.descrip_recepcion FROM tipo_recepcion_entrada a ORDER BY a.cod_recepcion FOREACH brecepcion INTO ketiquetas, detiquetas CALL crecepcion.additem(ketiquetas, detiquetas) END FOREACH END FUNCTION { ------------------------------------------------------------------------- FUNCION : proximaSecuenciaIP(pcod_mov, pbodega) OBJETIVO : Devuelve el proximo num_doc para un movimiento de productos terminados (tabla iptb00007), respetando que la secuencia es por (cod_mov, bodega). CLAVE : La secuencia se ancla al MAXIMO REAL ya usado en iptb00006 (fuente de verdad). Si por cualquier motivo la fila de iptb00007 quedo en un valor MENOR (corrupcion / retroceso), se reconcilia hacia arriba, de modo que el numero devuelto NUNCA retrocede ni choca con un documento existente. ------------------------------------------------------------------------- } FUNCTION proximaSecuenciaIP(pcod_mov, pbodega) DEFINE pcod_mov INT DEFINE pbodega INT DEFINE v_ult INT # valor guardado en el contador iptb00007 DEFINE v_real INT # maximo num_doc realmente usado en iptb00006 LET v_ult = NULL SELECT a.num_doc INTO v_ult FROM iptb00007 a WHERE a.cod_mov = pcod_mov AND a.bodega = pbodega IF v_ult IS NULL THEN LET v_ult = 0 END IF SELECT ISNULL(MAX(num_doc), 0) INTO v_real FROM iptb00006 WHERE cod_mov = pcod_mov AND bodega = pbodega IF v_real IS NULL THEN LET v_real = 0 END IF # La secuencia nunca puede ser menor que el maximo real ya emitido. IF v_ult < v_real THEN LET v_ult = v_real END IF RETURN v_ult + 1 END FUNCTION