{ ------------------------------------------------------------------------------- PROGRAMA : CPPRMT004 OBJETIVO : Reclasificar las facturas que tiene saldo pendientes o a favor PROGRAMADOR : Juan F. Soto FECHA : Agosto 28, 1996 ------------------------------------------------------------------------------- } GLOBALS "cpprgb000.4gl" DEFINE aplica_wd1 ARRAY[100] OF RECORD numero CHAR(10), pendiente DECIMAL(12,2) END RECORD, num_ck LIKE cptb00001.num_doc # Variable de Captura datos generales DEFINE c_limpia RECORD fecha_orig LIKE cptb00001.fecha_orig, cod_sp LIKE cptb00001.cod_sp, cod_sp_sec LIKE cptb00001.cod_sp_sec, num_doc LIKE cptb00001.num_doc END RECORD, usuario CHAR(9), fecha_crea LIKE cptb00001.fech_crea, t_debito,t_credito,c_valor1,cuadre,c_valor DECIMAL(12,2), eli CHAR(1) # Variable de Captura Debitos y Creditos de Facturas DEFINE arr_limpia ARRAY[100] OF RECORD p_aplica_a LIKE cptb00001.aplica_a, debito DECIMAL(12,2), credito DECIMAL(12,2) END RECORD MAIN DEFER INTERRUPT SELECT * INTO p_companias.* FROM companias CALL cpprmt004() END MAIN # Funcion Para Desplegar El Menu de Opciones FUNCTION cpprmt004() OPTIONS ERROR LINE 24, FORM LINE 8 OPEN FORM cpfmmt004 FROM "cpfmmt004" DISPLAY FORM cpfmmt004 MENU "OPCION" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" LET int_flag = false CALL cpprad04() COMMAND "Consulta-modifica" " Busca Registro Cancela Operacion" LET int_flag = false CALL cpprmf04() COMMAND "Salir" "Retorna al menu anterior" EXIT MENU END MENU END FUNCTION # Funcion Para Agregar Registros a la tabla de transacciones de cxc FUNCTION cpprad04() CLEAR FORM INITIALIZE c_limpia.* TO NULL LET c_limpia.fecha_orig = TODAY DISPLAY BY NAME c_limpia.fecha_orig DISPLAY "Buscando Ultimo Numero... Espere Por Favor" AT 23,1 ATTRIBUTE (BOLD) SELECT MAX(num_doc) INTO c_limpia.num_doc FROM cptb00001 WHERE tipo_doc = "RC" IF c_limpia.num_doc IS NULL THEN LET c_limpia.num_doc = 0 END IF DISPLAY " " AT 23,1 LET c_limpia.num_doc = c_limpia.num_doc + 1 USING "<<<<<<" INPUT BY NAME c_limpia.* WITHOUT DEFAULTS { ON KEY (control-w) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() IF int_flag THEN LET int_flag = FALSE LET factura.cod_sp = null LET factura.cod_sp_sec = null LET nom_sup = null END IF LET c_limpia.cod_sp = factura.cod_sp LET c_limpia.cod_sp_sec = factura.cod_sp_sec IF c_limpia.cod_sp_sec IS NULL OR c_limpia.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME c_limpia.cod_sp,c_limpia.cod_sp_sec,nom_sup NEXT FIELD num_doc END IF EXIT CASE WHEN INFIELD(cod_sp_sec) CALL busca_suplidor() LET int_flag = FALSE IF c_limpia.cod_sp_sec IS NULL OR c_limpia.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME c_limpia.cod_sp,c_limpia.cod_sp_sec,nom_sup NEXT FIELD num_doc END IF EXIT CASE END CASE NEXT FIELD num_doc } AFTER FIELD fecha_orig IF c_limpia.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = c_limpia.fecha_orig CALL prd(p_fechas) IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF BEFORE FIELD cod_sp_sec DISPLAY BY NAME c_limpia.* AFTER FIELD cod_sp_sec IF c_limpia.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = c_limpia.cod_sp AND cod_sp_sec = c_limpia.cod_sp_sec AND status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF DISPLAY BY NAME nom_sup AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF SELECT UNIQUE @num_doc FROM cptb00001 WHERE @num_doc = c_limpia.num_doc AND @tipo_doc = "RC" AND status_t is null IF STATUS != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF EXIT INPUT END INPUT FOR idx = 1 TO 7 LET arr_limpia[idx].p_aplica_a = null LET arr_limpia[idx].debito = null LET arr_limpia[idx].credito= null DISPLAY arr_limpia[idx].p_aplica_a TO s_limpia[idx].p_aplica_a DISPLAY arr_limpia[idx].debito TO s_limpia[idx].debito DISPLAY arr_limpia[idx].credito TO s_limpia[idx].credito END FOR LABEL vuelve: ## AQUI SE INTRODUCEN LOS DATOS DEL ARREGLO INPUT ARRAY arr_limpia WITHOUT DEFAULTS FROM s_limpia.* ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON KEY (CONTROL-W) CASE WHEN INFIELD (p_aplica_a) CALL busca_facturas() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD p_aplica_a END IF IF arr_limpia[curr].debito < 0 THEN LET arr_limpia[curr].debito = arr_limpia[curr].debito * -1 END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD p_aplica_a END IF DISPLAY arr_limpia[curr].p_aplica_a to s_limpia[scr_l].p_aplica_a DISPLAY arr_limpia[curr].debito to s_limpia[scr_l].debito NEXT FIELD debito END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD p_aplica_a IF arr_limpia[curr].p_aplica_a IS NOT NULL THEN # Controla que la factura pertenezca al cliente SELECT UNIQUE a.num_doc FROM cptb00001 a WHERE a.num_doc = arr_limpia[curr].p_aplica_a and a.cod_sp = c_limpia.cod_sp AND a.cod_sp_sec = c_limpia.cod_sp_sec AND a.status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD p_aplica_a END IF SELECT SUM(a.valor) INTO valor_fac FROM cptb00001 a WHERE a.aplica_a = arr_limpia[curr].p_aplica_a and a.cod_sp = c_limpia.cod_sp AND a.cod_sp_sec = c_limpia.cod_sp_sec AND a.status_t is null IF valor_fac > 0 THEN LET arr_limpia[curr].debito = valor_fac DISPLAY arr_limpia[curr].debito to s_limpia[scr_l].debito ELSE LET arr_limpia[curr].credito = valor_fac DISPLAY arr_limpia[curr].credito to s_limpia[scr_l].credito END IF END IF AFTER ROW LET t_debito = 0 LET t_credito = 0 FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito is not null THEN LET t_debito = t_debito + arr_limpia[idx].debito END IF IF arr_limpia[idx].credito is not null THEN LET t_credito= t_credito + arr_limpia[idx].credito END IF END FOR DISPLAY BY NAME t_debito,t_credito ATTRIBUTE(BOLD) FOR idx = 1 TO arr_count() IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN IF arr_limpia[idx].debito IS NULL AND arr_limpia[idx].credito IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) LET arr_limpia[idx].p_aplica_a = null DISPLAY arr_limpia[idx].p_aplica_a TO s_limpia[scr_l].p_aplica_a NEXT FIELD p_aplica_a END IF END IF IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN IF (arr_limpia[idx].debito IS NOT NULL AND arr_limpia[idx].credito IS NOT NULL) THEN LET numero_msg = 360 CALL msg(numero_msg) NEXT FIELD p_aplica_a END IF END IF END FOR # Controla que el valor aplicado a las facturas no exceda el monto del recibo END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF # Chequea si la transaccion esta cuadrada LET c_valor = 0 LET c_valor1 = 0 FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito IS NULL THEN LET arr_limpia[idx].debito = 0 END IF IF arr_limpia[idx].credito IS NULL THEN LET arr_limpia[idx].credito = 0 END IF LET c_valor = c_valor + arr_limpia[idx].debito LET c_valor1 = c_valor1 + arr_limpia[idx].credito IF arr_limpia[idx].debito = 0 THEN LET arr_limpia[idx].debito = NULL END IF IF arr_limpia[idx].credito = 0 THEN LET arr_limpia[idx].credito = NULL END IF END FOR LET cuadre = c_valor - c_valor1 IF cuadre != 0 THEN LET numero_msg = 174 CALL msg(numero_msg) GOTO vuelve END IF #------------------------------------------------------------------------------- LET c_valor = 0 # Actualizacion de la tabla de cuentas por cobrar DISPLAY "Actualizando Tablas... Espere Por Favor" AT 23,1 ATTRIBUTE (BOLD) FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito IS NOT NULL OR arr_limpia[idx].debito > 0 THEN LET c_valor = arr_limpia[idx].debito * -1 END IF IF arr_limpia[idx].credito IS NOT NULL OR arr_limpia[idx].credito > 0 THEN LET c_valor = arr_limpia[idx].credito END IF IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN INSERT INTO cptb00001(num_doc,tipo_doc,cod_sp,cod_sp_sec, fecha_orig,aplica_a,valor,status_t,us_crea,fech_crea) VALUES (c_limpia.num_doc,"RC",c_limpia.cod_sp, c_limpia.cod_sp_sec,c_limpia.fecha_orig, arr_limpia[idx].p_aplica_a,c_valor, null,SUSER_SNAME(),GETDATE()) END IF END FOR DISPLAY " " UPDATE cctb00003 set ult_recibo = c_limpia.num_doc WHERE tipo_doc = "RC" DISPLAY " " AT 23,1 LET numero_msg = 1 CALL msg(numero_msg) END FUNCTION FUNCTION cpprmf04() CLEAR FORM CONSTRUCT BY NAME criterio ON cod_sp,cod_sp_sec,num_doc IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF LET selec = "SELECT fecha_orig,cod_sp,cod_sp_sec,num_doc,us_crea,", "fech_crea ", " FROM cptb00001 ", "WHERE ",criterio clipped, " AND tipo_doc = 'RC' ", " AND status_t is null ", " ORDER BY num_doc" DISPLAY "Buscando Documento(s)... Espere Por Favor " AT 23,1 ATTRIBUTE(BOLD) PREPARE comando FROM selec DECLARE busca SCROLL CURSOR FOR comando OPEN busca DISPLAY " " AT 23,1 FETCH FIRST busca INTO c_limpia.*,usuario,fecha_crea IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF CALL busca_cliente() MENU "OPCION" COMMAND "Siguiente" "Busca Siguiente Registro Cumpla Condicion" FETCH NEXT busca INTO c_limpia.*,usuario,fecha_crea IF STATUS = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF CALL busca_cliente() COMMAND "Anterior" "Busca Registro Anterior Cumpla Condicion" FETCH PREVIOUS busca INTO c_limpia.*,usuario,fecha_crea IF STATUS = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF CALL busca_cliente() COMMAND "Primero" "Busca Registro Anterior Cumpla Condicion" FETCH FIRST busca INTO c_limpia.*,usuario,fecha_crea LET numero_msg = 4 CALL msg(numero_msg) CALL busca_cliente() COMMAND "Ultimo" "Busca Registro Anterior Cumpla Condicion" FETCH LAST busca INTO c_limpia.*,usuario,fecha_crea LET numero_msg = 5 CALL msg(numero_msg) CALL busca_cliente() COMMAND "Escoger" " Actualiza Registro Cancela Operacion" INPUT BY NAME c_limpia.* WITHOUT DEFAULTS { ON KEY (control-w) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() IF int_flag THEN LET int_flag = FALSE LET factura.cod_sp = null LET factura.cod_sp_sec = null LET nom_sup = null END IF LET c_limpia.cod_sp = factura.cod_sp LET c_limpia.cod_sp_sec = factura.cod_sp_sec IF c_limpia.cod_sp_sec IS NULL OR c_limpia.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME c_limpia.cod_sp,c_limpia.cod_sp_sec,nom_sup NEXT FIELD num_doc END IF EXIT CASE WHEN INFIELD(cod_sp_sec) CALL busca_suplidor() LET int_flag = FALSE IF c_limpia.cod_sp_sec IS NULL OR c_limpia.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME c_limpia.cod_sp,c_limpia.cod_sp_sec,nom_sup NEXT FIELD num_doc END IF EXIT CASE END CASE } AFTER FIELD fecha_orig IF c_limpia.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = c_limpia.fecha_orig CALL prd(p_fechas) IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF BEFORE FIELD cod_sp_sec DISPLAY BY NAME c_limpia.* AFTER FIELD cod_sp_sec IF c_limpia.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = c_limpia.cod_sp AND cod_sp_sec = c_limpia.cod_sp_sec AND status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF DISPLAY BY NAME nom_sup AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF EXIT INPUT END INPUT DECLARE busca_trx CURSOR FOR SELECT a.aplica_a,a.valor FROM cptb00001 a WHERE a.num_doc = c_limpia.num_doc and a.tipo_doc = "RC" and a.cod_sp = c_limpia.cod_sp and a.cod_sp_sec = c_limpia.cod_sp_sec LET idx = 1 FOREACH busca_trx INTO arr_limpia[idx].* IF arr_limpia[idx].debito < 0 THEN LET arr_limpia[idx].credito = arr_limpia[idx].debito LET arr_limpia[idx].debito = NULL END IF LET idx = idx + 1 END FOREACH CALL set_count(idx - 1 ) LABEL vuelve: INPUT ARRAY arr_limpia WITHOUT DEFAULTS FROM s_limpia.* ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON KEY (CONTROL-W) CASE WHEN INFIELD (p_aplica_a) CALL busca_facturas() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD p_aplica_a END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD p_aplica_a END IF DISPLAY arr_limpia[curr].p_aplica_a to s_limpia[scr_l].p_aplica_a DISPLAY arr_limpia[curr].debito to s_limpia[scr_l].debito NEXT FIELD debito END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD p_aplica_a IF arr_limpia[curr].p_aplica_a IS NOT NULL THEN # Controla que la factura pertenezca al cliente SELECT UNIQUE a.num_doc FROM cptb00001 a WHERE a.num_doc = arr_limpia[curr].p_aplica_a and a.cod_sp = c_limpia.cod_sp AND a.cod_sp_sec = c_limpia.cod_sp_sec AND a.status_t is null IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD p_aplica_a END IF END IF AFTER ROW LET t_debito = 0 LET t_credito = 0 FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito is not null THEN LET t_debito = t_debito + arr_limpia[idx].debito END IF IF arr_limpia[idx].credito is not null THEN LET t_credito= t_credito + arr_limpia[idx].credito END IF END FOR DISPLAY BY NAME t_debito,t_credito ATTRIBUTE(BOLD) FOR idx = 1 TO arr_count() IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN IF arr_limpia[idx].debito IS NULL AND arr_limpia[idx].credito IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) LET arr_limpia[idx].p_aplica_a = null DISPLAY arr_limpia[idx].p_aplica_a TO s_limpia[scr_l].p_aplica_a NEXT FIELD p_aplica_a END IF END IF IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN IF (arr_limpia[idx].debito IS NOT NULL AND arr_limpia[idx].credito IS NOT NULL) THEN LET numero_msg = 360 CALL msg(numero_msg) NEXT FIELD p_aplica_a END IF END IF END FOR END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false RETURN END IF # Chequea si la transaccion esta cuadrada LET c_valor = 0 LET c_valor1 = 0 FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito IS NULL THEN LET arr_limpia[idx].debito = 0 END IF IF arr_limpia[idx].credito IS NULL THEN LET arr_limpia[idx].credito = 0 END IF LET c_valor = c_valor + arr_limpia[idx].debito LET c_valor1 = c_valor1 + arr_limpia[idx].credito IF arr_limpia[idx].debito = 0 THEN LET arr_limpia[idx].debito = NULL END IF IF arr_limpia[idx].credito = 0 THEN LET arr_limpia[idx].credito = NULL END IF END FOR LET cuadre = c_valor - c_valor1 IF cuadre != 0 THEN LET numero_msg = 174 CALL msg(numero_msg) GOTO vuelve END IF LET c_valor = 0 # Actualizacion de la tabla de cuentas por cobrar DISPLAY "Actualizando Tablas... Espere Por Favor" AT 23,1 ATTRIBUTE (BOLD) DELETE FROM cptb00001 WHERE num_doc = c_limpia.num_doc AND tipo_doc = "RC" FOR idx = 1 TO arr_count() IF arr_limpia[idx].debito IS NOT NULL OR arr_limpia[idx].debito > 0 THEN LET c_valor = arr_limpia[idx].debito END IF IF arr_limpia[idx].credito IS NOT NULL OR arr_limpia[idx].credito > 0 THEN LET c_valor = arr_limpia[idx].credito * -1 END IF IF arr_limpia[idx].p_aplica_a IS NOT NULL THEN INSERT INTO cptb00001(num_doc,tipo_doc,cod_sp, cod_sp_sec, fecha_orig,aplica_a,valor,status_t, us_crea,fech_crea,us_mod,fech_mod) VALUES (c_limpia.num_doc,"RC",c_limpia.cod_sp, c_limpia.cod_sp_sec,c_limpia.fecha_orig, arr_limpia[idx].p_aplica_a,c_valor,null, usuario,fecha_crea,SUSER_SNAME(),GETDATE()) END IF END FOR DISPLAY " " AT 23,1 LET numero_msg = 13 CALL msg(numero_msg) COMMAND KEY("L") "eLiminar" "Elimina Logicamente Este Movimiento" PROMPT "Esta Seguro de Eliminar Este Registro(S/N)?" FOR CHAR eli LET eli = UPSHIFT(eli) IF eli = "S" THEN UPDATE cctb00001 SET status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE num_doc = c_limpia.num_doc AND tipo_doc = "RC" END IF COMMAND "Retornar" "Retorna Al menu Anterior" CLEAR FORM EXIT MENU END MENU END FUNCTION FUNCTION busca_cliente() SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = c_limpia.cod_sp AND cod_sp_sec = c_limpia.cod_sp_sec DISPLAY BY NAME nom_sup,c_limpia.* END FUNCTION FUNCTION busca_facturas() OPEN WINDOW busqueda1 AT 10,10 WITH FORM "cpfmwd008" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, comment line last) DECLARE aplicar CURSOR FOR SELECT a.aplica_a,SUM(a.valor) FROM cptb00001 a WHERE a.cod_sp = c_limpia.cod_sp AND a.cod_sp_sec = c_limpia.cod_sp_sec AND a.status_t is null GROUP BY 1 HAVING SUM(a.valor) != 0 ORDER BY 1 LET existe = "N" LET idx = 1 FOREACH aplicar INTO aplica_wd1[idx].numero,aplica_wd1[idx].pendiente SELECT unique a.num_doc FROM cptb00001 a WHERE a.num_doc = aplica_wd1[idx].numero IF STATUS = NOTFOUND THEN SELECT UNIQUE a.num_doc INTO num_ck FROM cptb00001 a WHERE a.aplica_a = aplica_wd1[idx].numero IF STATUS != NOTFOUND THEN LET aplica_wd1[idx].numero = num_ck END IF END IF IF aplica_wd1[idx].numero IS NOT NULL THEN LET idx = idx + 1 END IF END FOREACH IF existe = "N" and idx = 1 THEN LET numero_msg = 3 CALL msg(numero_msg) GOTO salir END IF CALL set_count(idx-1) DISPLAY ARRAY aplica_wd1 TO consart.* LET curr1 = arr_curr() IF int_flag THEN GOTO salir END IF LET arr_limpia[curr].p_aplica_a = aplica_wd1[curr1].numero LET arr_limpia[curr].debito = aplica_wd1[curr1].pendiente LABEL salir: CLOSE WINDOW busqueda1 END FUNCTION