{ ----------------------------------------------------------------------------- PROGRAMA : CCPRMT007 OBJETIVO : Mantenimiento de Recibo de Pago y otros Movimientos por clientes REALIZADO POR : JUAN SOTO FECHA : Enero 1997 MODIFICADO POR : ING. JUAN SOTO FECHA MODIFICACION: MARZO 3, 2018 ----------------------------------------------------------------------------- } GLOBALS "ccprgb000.4gl" DEFINE numero_recibo,valor_cheque1,p_num_doc,aplicar INTEGER DEFINE valor_ctrl1,valor_nc,nc_pend,valor_ctrl,p_total, valor_p,remanente,val_pen,valor2 DECIMAL(12,2) DEFINE fecha1 DATE DEFINE nombre_cta CHAR(30) DEFINE tipo_ant,tipo_doc2,tipo_doc1 CHAR(2) DEFINE opc CHAR(1) DEFINE recibo7 RECORD tipo_doc LIKE cctb00001.tipo_doc, num_doc LIKE cctb00001.num_doc, cod_emp_sec LIKE cctb00001.cod_emp_sec, fecha_orig LIKE cctb00001.fecha_orig END RECORD DEFINE arr_recibo7 DYNAMIC ARRAY OF RECORD tipo_cliente LIKE cctb00001.tipo_cliente, sec_cliente LIKE cctb00001.sec_cliente, tipo_doc_apl CHAR(2), aplica_a LIKE cctb00001.aplica_a, valor_pen DECIMAL(12,2), desc_p LIKE cctb00001.monto_desc, valor_pag DECIMAL(12,2) END RECORD, busca_clientes VARCHAR(2) ####### Funcion para agregar un recibo de pago MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CALL ARG_VAL(4) RETURNING impresor CONNECT to "smarmotech" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL ccprmt007() END MAIN FUNCTION ccprmt007() OPTIONS FORM LINE 8, ERROR LINE 24, COMMENT LINE 22, PROMPT LINE 23 OPEN FORM ccfmmt007 FROM "ccfmmt007" DISPLAY FORM ccfmmt007 LET fecha1 = today MENU "OPCION" COMMAND "Adicionar" " Adiciona Registro Cancela Operacion" CALL ccpcad007() COMMAND "Consultar-modificar" " Busca Registro Cancela Operacion" CALL ccpcmf007() COMMAND "Salir" "Retorna Menu Anterior" EXIT MENU END MENU END FUNCTION FUNCTION ccpcad007() DEFINE porc_p DECIMAL(10,2) DEFINE emp SMALLINT DEFINE hoy DATE LET hoy = null LABEL volver: LET recibo.fecha_orig = fecha1 LET valor_ctrl = NULL LET tipo_ant = "ND" INPUT BY NAME recibo7.*,valor_ctrl,busca_clientes WITHOUT DEFAULTS ## VENTANAS PARA BUSCAR LOS CLIENTES Y LOS EMPLEADOS ## AQUI SE PREPARA PARA LA CAPTURA DE INFORMACION BEFORE FIELD tipo_doc LET recibo7.tipo_doc = tipo_ant AFTER FIELD tipo_doc IF recibo7.tipo_doc IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_doc END IF LET tipo_ant = recibo.tipo_doc SELECT ult_recibo INTO recibo7.num_doc FROM cctb00003 WHERE tipo_doc = recibo7.tipo_doc LET recibo7.num_doc = recibo7.num_doc + 1 DISPLAY BY NAME recibo7.num_doc ## CHEQUEA QUE EL REGISTRO NO SE REPITA AFTER FIELD num_doc IF recibo7.num_doc IS NULL or recibo7.num_doc = 0 THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT UNIQUE a.num_doc FROM cctb00001 a WHERE a.tipo_doc = recibo7.tipo_doc AND a.num_doc = recibo7.num_doc IF STATUS != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_doc END IF ## CHEQUEA QUE EL CLIENTE EXISTA, SI EXISTE DESPLEGA SU NOMBRE AFTER FIELD cod_emp_sec IF recibo7.cod_emp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_emp_sec END IF LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME nombre_emp ATTRIBUTE (BOLD) AFTER FIELD fecha_orig IF recibo7.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = recibo7.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF LET fecha1 = recibo7.fecha_orig BEFORE FIELD valor_ctrl LET valor_ctrl = null DISPLAY BY NAME valor_ctrl AFTER FIELD valor_ctrl IF valor_ctrl IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_ctrl END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF EXIT INPUT END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF CALL arr_recibo.clear() LABEL arreglo1: ## AQUI SE INTRODUCEN LOS DATOS DEL ARREGLO INPUT ARRAY arr_recibo7 WITHOUT DEFAULTS FROM s_recibo.* ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON KEY (CONTROL-W) CASE WHEN INFIELD(tipo_cliente) CALL consulta_clientes() LET curr = arr_curr() LET scr_l = scr_line() LET arr_recibo7[curr].tipo_cliente = cliente_dir.tipo_cliente LET arr_recibo7[curr].sec_cliente = cliente_dir.sec_cliente SELECT a.nombre INTO nom_cli FROM vetb00004 a WHERE a.tipo_cliente = cliente_dir.tipo_cliente and a.sec_cliente = cliente_dir.sec_cliente AND a.status_t IS NULL DISPLAY arr_recibo7[curr].tipo_cliente TO s_recibo[scr_l].tipo_cliente ATTRIBUTE (BOLD) DISPLAY arr_recibo7[curr].sec_cliente TO s_recibo[scr_l].sec_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) WHEN INFIELD(sec_cliente) CALL consulta_clientes() LET curr = arr_curr() LET scr_l = scr_line() LET arr_recibo7[curr].tipo_cliente = cliente_dir.tipo_cliente LET arr_recibo7[curr].sec_cliente = cliente_dir.sec_cliente SELECT nombre INTO nom_cli FROM vetb00004 WHERE tipo_cliente = cliente_dir.tipo_cliente and sec_cliente = cliente_dir.sec_cliente DISPLAY arr_recibo7[curr].tipo_cliente TO s_recibo[scr_l].tipo_cliente ATTRIBUTE (BOLD) DISPLAY arr_recibo7[curr].sec_cliente TO s_recibo[scr_l].sec_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) WHEN INFIELD (aplica_a) LET curr = arr_curr() LET scr_l = scr_line() LET recibo.tipo_cliente = arr_recibo7[curr].tipo_cliente LET recibo.sec_cliente = arr_recibo7[curr].sec_cliente CALL busca_apl7() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD aplica_a END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD aplica_a END IF DISPLAY arr_recibo7[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen LET bandera = 0 NEXT FIELD aplica_a END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD sec_cliente IF arr_recibo7[curr].sec_cliente IS NOT NULL THEN SELECT b.nombre INTO nom_cli FROM vetb00004 b WHERE b.tipo_cliente = arr_recibo7[curr].tipo_cliente and b.sec_cliente = arr_recibo7[curr].sec_cliente IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) END IF AFTER FIELD aplica_a IF arr_recibo7[curr].aplica_a IS NOT NULL THEN # Controla que la factura pertenezca al cliente SELECT unique a.tipo_cliente FROM cctb00001 a WHERE a.num_doc = arr_recibo7[curr].aplica_a and a.tipo_cliente = arr_recibo7[curr].tipo_cliente and a.sec_cliente = arr_recibo7[curr].sec_cliente and (a.tipo_doc IN ("FT","FE","FI")) and a.status_t is null IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD aplica_a END IF LET valor_p = 0 SELECT SUM(a.valor+monto_desc) INTO valor_p FROM cctb00001 a WHERE a.aplica_a = arr_recibo7[curr].aplica_a and a.sec_cliente = arr_recibo7[curr].sec_cliente and a.status_t is null LET arr_recibo7[curr].valor_pen = valor_p DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen END IF # Busca el valor pendiente de la factura BEFORE FIELD desc_p LET arr_recibo7[curr].desc_p = 0 #LET arr_recibo7[curr].valor_pag = arr_recibo7[curr].valor_pen DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo7[curr].desc_p to s_recibo[scr_l].desc_p AFTER FIELD desc_p IF arr_recibo7[curr].desc_p is null THEN LET arr_recibo7[curr].desc_p = 0 END IF LET arr_recibo7[curr].valor_pag = arr_recibo7[curr].valor_pag - arr_recibo7[curr].desc_p DISPLAY arr_recibo7[curr].valor_pag to s_recibo[scr_l].valor_pag AFTER FIELD valor_pag IF arr_recibo7[curr].aplica_a IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arr_recibo7[curr].valor_pag IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF LET p_total = 0 LET remanente = valor_ctrl FOR idx = 1 TO arr_count() IF arr_recibo7[idx].valor_pag is not null THEN LET p_total = p_total + arr_recibo7[idx].valor_pag LET remanente = remanente - arr_recibo7[idx].valor_pag END IF END FOR IF p_total < 0 THEN LET p_total = p_total * -1 END IF IF p_total > valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) END IF DISPLAY BY NAME p_total ATTRIBUTE(BOLD) DISPLAY BY NAME remanente ATTRIBUTE(blue) # 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 CLEAR FORM RETURN END IF IF p_total != valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) LET curr = 0 LET scr_l = 0 GOTO arreglo1 END IF LET opc = NULL LET valor_cheque1 = NULL #BUSCA NUMERO SECUENCIAL DEL DOCUMENTO SELECT ult_recibo INTO recibo7.num_doc FROM cctb00003 WHERE tipo_doc = recibo7.tipo_doc LET recibo7.num_doc = recibo7.num_doc + 1 DISPLAY BY NAME recibo7.num_doc IF recibo7.tipo_doc <> "PG" THEN UPDATE cctb00003 set ult_recibo = recibo7.num_doc, us_crea = SUSER_SNAME(), fech_crea = GETDATE(), us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc = recibo7.tipo_doc END IF ## SI NO OCURRE NINGUN ERROR SE PROCEDE A INSERTAR EL REGISTRO FOR idx = 1 to arr_count() IF arr_recibo7[idx].aplica_a is not null THEN CASE WHEN recibo7.tipo_doc = "NC" AND arr_recibo7[idx].valor_pag > 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "ND" AND arr_recibo7[idx].valor_pag < 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "OD" AND arr_recibo7[idx].valor_pag < 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "OC" AND arr_recibo7[idx].valor_pag > 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE END CASE #-------------------------------------------------------------------------- LET tipo_doc1 = NULL LET tipo_doc1 = recibo7.tipo_doc INSERT INTO cctb00001(tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp_sec,fecha_orig,fecha_ven, aplica_a,num_cheque,valor,valor_efectivo,monto_desc,us_crea,fech_crea) values (tipo_doc1,recibo7.num_doc, arr_recibo7[idx].tipo_cliente,arr_recibo7[idx].sec_cliente, recibo7.cod_emp_sec,recibo7.fecha_orig,"010101", arr_recibo7[idx].aplica_a, recibo7.num_doc,arr_recibo7[idx].valor_pag, valor_cheque1,arr_recibo7[idx].desc_p,SUSER_SNAME(),GETDATE()) IF tipo_doc1 = "ND" THEN UPDATE cctb00001 set valor_cheque = numero_recibo WHERE num_doc = recibo7.num_doc AND tipo_doc = "ND" END IF END IF END FOR IF recibo7.tipo_doc = "PG" THEN UPDATE cctb00003 set ult_recibo = recibo7.num_doc, us_crea = SUSER_SNAME(), fech_crea = GETDATE(), us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE sec_vend = recibo7.cod_emp_sec END IF CALL integridad() IF bandera = 1 THEN LET bandera = 0 RETURN END IF LET numero_msg = 1 CALL msg(numero_msg) LET emp = recibo7.cod_emp_sec CLEAR FORM GOTO volver END FUNCTION ## Funcion para consultar/modificar un recibo de pago FUNCTION ccpcmf007() DEFINE usuario RECORD us_crea CHAR(9), fech_crea LIKE cctb00001.fech_crea END RECORD ## SE PREPARA EL CRITERIO PARA CONSULTAR/MODIFICAR UN REGISTRO CONSTRUCT CRITERIO ON a.tipo_doc,a.num_doc, a.cod_emp_sec,a.fecha_orig FROM tipo_doc,num_doc,cod_emp_sec, fecha_orig IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET selec = "SELECT UNIQUE a.tipo_doc,a.num_doc, ", " a.cod_emp_sec,a.fecha_orig ", "FROM cctb00001 a ", "WHERE ",criterio clipped," and a.tipo_doc NOT IN('FE','FT','PC') AND ", " a.status_t is null ORDER BY 1,2" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos FETCH FIRST datos INTO recibo7.* IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF IF recibo7.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_doc = "PG" AND a.num_doc = recibo7.num_doc AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = recibo7.tipo_doc AND a.status_t IS NULL END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo7.tipo_doc = "ND" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME recibo7.*,nombre_emp,valor_ctrl LABEL vuelve: MENU "OPCION" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO recibo7.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF IF recibo7.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_doc = "PG" AND a.num_doc = recibo7.num_doc AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = recibo7.tipo_doc AND a.status_t IS NULL END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo7.tipo_doc = "ND" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME recibo7.*,nombre_emp,valor_ctrl COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO recibo7.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo7.tipo_doc = "ND" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF IF recibo7.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_doc = "PG" AND a.num_doc = recibo7.num_doc AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = recibo7.tipo_doc AND a.status_t IS NULL END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME recibo7.*,nom_cli,nombre_emp,valor_ctrl COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO recibo7.* IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF IF recibo7.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_doc = "PG" AND a.num_doc = recibo7.num_doc AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = recibo7.tipo_doc AND a.status_t IS NULL END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo7.tipo_doc = "ND" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME recibo7.*,nombre_emp,valor_ctrl COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO recibo7.* IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF IF recibo7.tipo_doc = "PG" THEN SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.tipo_doc = "PG" AND a.num_doc = recibo7.num_doc AND a.status_t IS NULL ELSE SELECT SUM((a.valor)*-1) INTO valor_ctrl FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = recibo7.tipo_doc AND a.status_t IS NULL END IF IF valor_ctrl IS NULL THEN LET valor_ctrl = 0 END IF IF recibo7.tipo_doc = "ND" THEN LET valor_ctrl = valor_ctrl * -1 IF valor_ctrl < 0 THEN LET valor_ctrl = valor_ctrl * -1 END IF END IF SELECT nom1_emp,apell1_emp INTO descrip2,descrip3 FROM adtb00003 WHERE num_emp = recibo7.cod_emp_sec LET nombre_emp = descrip2 clipped," ",descrip3 clipped DISPLAY BY NAME recibo7.*,nombre_emp,valor_ctrl COMMAND "Escoger" " Actualiza Registro Cancela Operacion" ## AQUI SE MODIFICAN/ACTUALIZAN LOS DATOS DEL REGISTRO LET p_fechas = recibo7.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 RETURN END IF { INPUT BY NAME arr_recibo7[cuenta_no,arr_recibo7[deposito,arr_recibo7[tipo_cliente, arr_recibo7[sec_cliente,arr_recibo7[fecha_orig,valor_ctrl WITHOUT DEFAULTS } INPUT BY NAME recibo7.fecha_orig,valor_ctrl WITHOUT DEFAULTS AFTER FIELD fecha_orig IF recibo7.fecha_orig IS NULL OR recibo7.fecha_orig > TODAY THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = recibo7.fecha_orig CALL prd(p_fechas,usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF AFTER FIELD valor_ctrl IF valor_ctrl IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_ctrl END IF AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE GO TO vuelve END IF EXIT INPUT END INPUT IF recibo7.tipo_doc = "PG" THEN LET selec = "SELECT a.tipo_cliente,a.sec_cliente,a.aplica_a,a.valor,a.monto_desc,a.valor ", "FROM cctb00001 a ", "WHERE ((a.tipo_doc = ? OR a.tipo_doc = 'AV') AND ", " a.num_cheque = ?) ", " ORDER BY 2,1 " ELSE LET selec = "SELECT tipo_cliente,sec_cliente,aplica_a,valor,monto_desc,valor FROM cctb00001 ", "WHERE (tipo_doc=? AND num_cheque=?) ", " ORDER BY 2,1 " END IF PREPARE comando FROM selec DECLARE buscar1 CURSOR FOR comando OPEN buscar1 USING recibo7.tipo_doc,recibo7.num_doc LET idx = 1 WHILE STATUS != NOTFOUND FETCH buscar1 INTO arr_recibo7[idx].* IF STATUS = NOTFOUND THEN EXIT WHILE END IF IF recibo7.tipo_doc != "ND" THEN LET arr_recibo7[idx].valor_pen = arr_recibo7[idx].valor_pen * -1 ELSE IF arr_recibo7[idx].valor_pen < 0 THEN LET arr_recibo7[idx].valor_pen = arr_recibo7[idx].valor_pen *-1 END IF END IF LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pen LET arr_recibo7[idx].valor_pen = 0 LET arr_recibo7[idx].desc_p = arr_recibo7[idx].desc_p * -1 SELECT sum(valor) INTO valor2 FROM cctb00001 WHERE tipo_cliente = arr_recibo7[idx].tipo_cliente and sec_cliente = arr_recibo7[idx].sec_cliente and aplica_a = arr_recibo7[idx].aplica_a and status_t is null AND num_cheque = recibo7.num_doc LET arr_recibo7[idx].valor_pen = valor2 LET idx = idx + 1 END WHILE CALL set_count(idx - 1) LABEL arreglo2: ## AQUI SE MODIFICAN/ACTUALIZAN LOS CAMPOS DEL ARREGLO INPUT ARRAY arr_recibo7 WITHOUT DEFAULTS FROM s_recibo.* ## VENTANA PARA BUSCAR LOS DOCUMENTOS ON KEY (CONTROL-W) CASE WHEN INFIELD(tipo_cliente) CALL consulta_clientes() LET curr = arr_curr() LET scr_l = scr_line() LET arr_recibo7[idx].tipo_cliente = cliente_dir.tipo_cliente LET arr_recibo7[idx].sec_cliente = cliente_dir.sec_cliente SELECT a.nombre INTO nom_cli FROM vetb00004 a WHERE a.tipo_cliente = cliente_dir.tipo_cliente and a.sec_cliente = cliente_dir.sec_cliente AND a.status_t IS NULL DISPLAY arr_recibo7[curr].tipo_cliente TO s_recibo[scr_l].tipo_cliente ATTRIBUTE (BOLD) DISPLAY arr_recibo7[curr].sec_cliente TO s_recibo[scr_l].sec_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) WHEN INFIELD(sec_cliente) CALL consulta_clientes() LET curr = arr_curr() LET scr_l = scr_line() LET arr_recibo7[curr].tipo_cliente = cliente_dir.tipo_cliente LET arr_recibo7[curr].sec_cliente = cliente_dir.sec_cliente SELECT nombre INTO nom_cli FROM vetb00004 WHERE tipo_cliente = cliente_dir.tipo_cliente and sec_cliente = cliente_dir.sec_cliente DISPLAY arr_recibo7[curr].tipo_cliente TO s_recibo[scr_l].tipo_cliente ATTRIBUTE (BOLD) DISPLAY arr_recibo7[curr].sec_cliente TO s_recibo[scr_l].sec_cliente ATTRIBUTE (BOLD) DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) WHEN INFIELD (aplica_a) CALL busca_apl7() IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = false NEXT FIELD aplica_a END IF IF existe = "N" THEN LET existe = "S" NEXT FIELD aplica_a END IF DISPLAY arr_recibo7[curr].aplica_a to s_recibo[scr_l].aplica_a DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen LET bandera = 0 NEXT FIELD aplica_a END CASE BEFORE ROW LET curr = arr_curr() LET scr_l = scr_line() AFTER FIELD sec_cliente IF arr_recibo7[curr].sec_cliente IS NOT NULL THEN SELECT b.nombre INTO nom_cli FROM vetb00004 b WHERE b.tipo_cliente = arr_recibo7[curr].tipo_cliente and b.sec_cliente = arr_recibo7[curr].sec_cliente IF status = notfound THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD tipo_cliente END IF DISPLAY BY NAME nom_cli ATTRIBUTE (BOLD) END IF AFTER FIELD aplica_a IF arr_recibo7[curr].aplica_a IS NOT NULL THEN # Controla que la factura pertenezca al cliente SELECT unique a.tipo_cliente FROM cctb00001 a WHERE a.num_doc = arr_recibo7[curr].aplica_a and a.tipo_cliente = arr_recibo7[curr].tipo_cliente and a.sec_cliente = arr_recibo7[curr].sec_cliente and (a.tipo_doc IN ("FT","FE","FI")) and a.status_t is null IF status = notfound THEN LET numero_msg = 126 CALL msg(numero_msg) NEXT FIELD aplica_a END IF # Busca el valor pendiente de la factura #DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen END IF BEFORE FIELD desc_p LET arr_recibo7[curr].desc_p = 0 LET arr_recibo7[curr].valor_pag = arr_recibo7[curr].valor_pen DISPLAY arr_recibo7[curr].valor_pen to s_recibo[scr_l].valor_pen DISPLAY arr_recibo7[curr].desc_p to s_recibo[scr_l].desc_p AFTER FIELD desc_p IF arr_recibo7[curr].desc_p is null THEN LET arr_recibo7[curr].desc_p = 0 END IF LET arr_recibo7[curr].valor_pag = arr_recibo7[curr].valor_pag - arr_recibo7[curr].desc_p DISPLAY arr_recibo7[curr].valor_pag to s_recibo[scr_l].valor_pag AFTER FIELD valor_pag IF arr_recibo7[curr].aplica_a IS NULL AND arr_recibo7[curr].tipo_cliente IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arr_recibo7[curr].valor_pag IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF LET p_total = 0 LET remanente = valor_ctrl FOR idx = 1 TO arr_count() IF arr_recibo7[idx].valor_pag is not null THEN LET p_total = p_total + arr_recibo7[idx].valor_pag LET remanente = remanente - arr_recibo7[idx].valor_pag END IF END FOR IF p_total < 0 THEN LET p_total = p_total * -1 END IF IF p_total > valor_ctrl THEN LET numero_msg = 178 CALL msg(numero_msg) END IF DISPLAY BY NAME p_total ATTRIBUTE(BOLD) DISPLAY BY NAME remanente ATTRIBUTE(blue) # Controla que el valor aplicado a las facturas no exceda el monto del recibo END INPUT # QUI SE MODIFICAN/ACTUALIZAN LOS CAMPOS DEL ARREGLO ## AQUI SE REALIZA LA MODIFICACION DEL REGISTRO IF recibo7.tipo_doc = "PG" THEN DELETE FROM cctb00001 WHERE num_cheque= recibo7.num_doc and tipo_doc IN ("PG","AV") ELSE IF recibo7.tipo_doc = "ND" THEN SELECT unique a.valor_cheque INTO valor_cheque1 FROM cctb00001 a WHERE a.num_doc = recibo7.num_doc AND a.tipo_doc = "ND" END IF DELETE FROM cctb00001 WHERE @num_cheque= recibo7.num_doc and @tipo_doc = recibo7.tipo_doc END IF FOR idx = 1 to arr_count() IF arr_recibo7[idx].aplica_a is not null THEN CASE WHEN recibo7.tipo_doc = "NC" AND arr_recibo7[idx].valor_pag > 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "ND" AND arr_recibo7[idx].valor_pag < 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "OD" AND arr_recibo7[idx].valor_pag < 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE WHEN recibo7.tipo_doc = "OC" AND arr_recibo7[idx].valor_pag > 0 LET arr_recibo7[idx].valor_pag = arr_recibo7[idx].valor_pag * -1 EXIT CASE END CASE LET tipo_doc1 = recibo7.tipo_doc INSERT INTO cctb00001 (tipo_doc,num_doc,tipo_cliente,sec_cliente,cod_emp_sec,fecha_orig,fecha_ven, aplica_a,num_cheque,valor,valor_efectivo,monto_desc,us_crea,fech_crea) values (tipo_doc1,recibo7.num_doc, arr_recibo7[idx].tipo_cliente,arr_recibo7[idx].sec_cliente, recibo7.cod_emp_sec,recibo7.fecha_orig,"010101", arr_recibo7[idx].aplica_a, recibo7.num_doc,arr_recibo7[idx].valor_pag, valor_cheque1,arr_recibo7[idx].desc_p,SUSER_SNAME(),GETDATE()) END IF END FOR LET numero_msg = 13 CALL msg(numero_msg) COMMAND KEY ("N") "aNular" ## AQUI SE REALIZA LA ANULACION DE UN REGISTRO IF recibo7.tipo_doc = "PG" THEN UPDATE cctb00001 set status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc IN ("AV","PG") and num_cheque = recibo7.num_doc ELSE UPDATE cctb00001 set status_t = "E", us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE tipo_doc = recibo7.tipo_doc and num_cheque = recibo7.num_doc END IF LET numero_msg = 82 CALL msg(numero_msg) COMMAND "Retornar" CLEAR FORM FOR idx = 1 to 3 LET arr_recibo7[idx].aplica_a = null LET arr_recibo7[idx].valor_pen = null LET arr_recibo7[idx].valor_pag = null DISPLAY arr_recibo7[idx].aplica_a to s_recibo[idx].aplica_a DISPLAY arr_recibo7[idx].valor_pen to s_recibo[idx].valor_pen DISPLAY arr_recibo7[idx].valor_pag to s_recibo[idx].valor_pag END FOR EXIT MENU END MENU END FUNCTION FUNCTION busca_apl7() OPEN WINDOW busqueda1 AT 10,10 WITH FORM "ccfmwd001" ATTRIBUTE (BORDER,FORM LINE FIRST + 1, comment line last) DECLARE aplicar CURSOR FOR SELECT a.aplica_a,SUM(a.valor+a.monto_desc) FROM cctb00001 a WHERE a.tipo_cliente = recibo.tipo_cliente AND a.sec_cliente = recibo.sec_cliente AND a.status_t is null and a.fech_crea > '01/01/2006' GROUP BY a.aplica_a HAVING SUM(a.valor+a.monto_desc) > 0 ORDER BY 1 LET existe = "N" LET idx = 1 FOREACH aplicar INTO aplica_wd[idx].aplica_a,aplica_wd[idx].pendiente IF status = NOTFOUND THEN LET existe = "N" EXIT FOREACH END IF CALL integridad() LET tipo_doc2 = "FT" LET aplica_wd[idx].tipo_doc = tipo_doc2 # Busca Nota de credito LET valor_ctrl1 = 0 IF valor_ctrl1 is null THEN LET valor_ctrl1 = 0 END IF LET aplica_wd[idx].pendiente = aplica_wd[idx].pendiente - valor_ctrl1 LET existe = "S" IF aplica_wd[idx].pendiente != 0 THEN LET idx = idx + 1 END IF END FOREACH IF existe = "N" and idx = 1 THEN LET numero_msg = 127 CALL msg(numero_msg) GOTO salir END IF CALL set_count(idx-1) DISPLAY ARRAY aplica_wd TO consart.* LET curr1 = arr_curr() LET arr_recibo7[curr].aplica_a = aplica_wd[curr1].aplica_a LET arr_recibo7[curr].valor_pen = aplica_wd[curr1].pendiente LABEL salir: CLOSE WINDOW busqueda1 END FUNCTION FUNCTION buscaClientes() DEFINE selec3 STRING DEFINE doccli16 RECORD tipo_cliente SMALLINT, sec_cliente SMALLINT, nombre CHAR(30), aplica_a INTEGER, pendiente DECIMAL(12,2), fecha_factura DATE, tipo_doc CHAR(2), sec_vend SMALLINT, cotizacion_no INT END RECORD, sbalance,sbalance1 DEC(12,2) LET selec3 = "SELECT a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a, ", " SUM(a.valor+a.monto_desc) ", "FROM cctb00001 a,vetb00004 b,vetb00028 c ", "WHERE a.fecha_orig <= ? AND a.cod_emp_Sec = ? ", " AND a.tipo_cliente=b.tipo_cliente AND a.sec_cliente=b.sec_cliente AND ", " a.tipo_cliente = c.tipo_cliente AND ", " a.sec_cliente = c.sec_cliente AND ", " a.sec_cliente=a.sec_cliente AND a.tipo_doc !='PC' AND a.num_doc IS NOT NULL ", " AND a.status_t IS NULL ", "GROUP BY a.tipo_cliente,a.sec_cliente,b.nombre,a.aplica_a HAVING SUM(a.valor + a.monto_desc) <> 0 ORDER BY a.tipo_cliente,a.sec_cliente,a.aplica_a" PREPARE comandosel FROM selec3 DECLARE busca_cli CURSOR FOR comandosel OPEN busca_cli USING recibo7.fecha_orig,recibo7.cod_emp_sec LET idx = 1 FOREACH busca_cli INTO doccli16.* # BUSCA BALANCE DEL CLIENTE PARA IMPRIMIRLO SELECT SUM(a.valor+a.monto_desc) INTO sbalance FROM cctb00001 a WHERE (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente = doccli16.sec_cliente) AND (a.fecha_orig <= recibo7.fecha_orig) AND (a.tipo_doc NOT IN ("AV","PC",'AP') AND a.num_doc = a.num_doc) AND a.status_t IS NULL SELECT SUM(a.valor+a.monto_desc) INTO sbalance1 FROM cctb00001 a WHERE (a.tipo_cliente = doccli16.tipo_cliente AND a.sec_cliente = doccli16.sec_cliente) AND (a.fecha_orig <= recibo7.fecha_orig) AND (a.tipo_doc IN ("AV") AND a.num_doc = a.aplica_a) AND a.status_t IS NULL IF sbalance IS NULL THEN LET sbalance = 0 END IF IF sbalance1 IS NULL THEN LET sbalance1 = 0 END IF LET sbalance = sbalance - sbalance1 IF sbalance = 0 THEN CONTINUE FOREACH END IF IF recibo7.tipo_doc = 'ND' OR recibo7.tipo_doc = 'OD' THEN IF doccli16.pendiente > 0 THEN CONTINUE FOREACH END IF END IF SELECT MAX( a.tipo_doc),CONVERT(CHAR(10),MAX(a.fecha_ven),103) INTO doccli16.tipo_doc,doccli16.fecha_factura FROM cctb00001 a WHERE a.status_t IS NULL AND a.num_doc = a.num_doc AND a.num_doc=doccli16.aplica_a AND a.tipo_doc not in ("PG","NC","PC","OC","DV") and a.tipo_cliente=doccli16.tipo_cliente AND a.sec_cliente=doccli16.sec_cliente LET arr_recibo7[idx].aplica_a = doccli16.aplica_a LET arr_recibo7[idx].tipo_doc_apl = doccli16.tipo_doc LET arr_recibo7[idx].tipo_cliente = doccli16.tipo_cliente LET arr_recibo7[idx].sec_cliente = doccli16.sec_cliente LET arr_recibo7[idx].valor_pag = doccli16.pendiente LET idx = idx + 1 END FOREACH END FUNCTION