{ ----------------------------------------------------------------------------- PROGRAMA : CPPRMT001 OBJETIVO : Mantenimiento de Factura Proveedor REALIZADO POR : Tadeo A. Ferreras FECHA : Junio 17, 1993 MODIFICADO POR : Juan F. Soto FECHA : Enero 16, 1996 DESCRIPCION : Buscar conjuntamente con los pre-pagos las NOTAS DE DEBITO ----------------------------------------------------------------------------- } IMPORT FGL fgldialog GLOBALS "cpprgb000.4gl" DEFINE ent_num CHAR(150) DEFINE hoy, fecha1, fecha2 DATE DEFINE debe_ir CHAR(1), pdocumentoEntrada, cod_mon VARCHAR(2), titulo_moneda VARCHAR(60) DEFINE cuenta CHAR(8) DEFINE total1, valor_cxp, valor, valor_f, monto_orden DECIMAL(12, 2) DEFINE cat, dpto, refe, tiene_cta, chequea, ctrl_cxp CHAR(1) DEFINE ctrl_reg, orden_ant, aplicar INTEGER DEFINE p, l, niv, cod1_sp, cod1_sp_sec SMALLINT DEFINE idx2, p_orden INTEGER DEFINE valor2, pbase, flete, gasto, pvalor, tvalor DECIMAL(16, 2) DEFINE tiempo, pano CHAR(4), entrada_no CHAR(25), numero_ent CHAR(2) DEFINE nom_tipo CHAR(15) DEFINE idx1, ultimo SMALLINT DEFINE nombre, apellido CHAR(14) DEFINE tipo_emp CHAR(1) DEFINE buscar_oc RECORD orden_no INTEGER, fecha_orig DATE, cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30) END RECORD DEFINE v_term_sp SMALLINT DEFINE cod_sp1, cod_sp2 SMALLINT DEFINE total_v DECIMAL(12, 2) DEFINE valor3 DECIMAL(12, 2) DEFINE credito DECIMAL(12, 2) DEFINE datos_usu RECORD status_t CHAR(1), us_crea CHAR(50), fech_crea VARCHAR(25), us_mod CHAR(50), fech_mod VARCHAR(25) END RECORD DEFINE supl ARRAY[200] OF RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sp CHAR(30) END RECORD DEFINE cuentas ARRAY[200] OF RECORD cuenta_no CHAR(8), departamento SMALLINT, cod_aux SMALLINT, sec_aux SMALLINT, num_doc CHAR(10), debito DECIMAL(12, 2), credito DECIMAL(12, 2) END RECORD DEFINE descripcion CHAR(30) DEFINE arrfac1 DYNAMIC ARRAY OF RECORD tipo CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12, 2), valor DECIMAL(12, 2) END RECORD DEFINE arrfac DYNAMIC ARRAY OF RECORD tipo CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12, 2), valor DECIMAL(12, 2) END RECORD DEFINE arr_fac1 DYNAMIC ARRAY OF RECORD tipo1 CHAR(1), aplica_a CHAR(10), tipo_doc CHAR(2), valor_prep DECIMAL(12, 2), valor DECIMAL(12, 2) END RECORD DEFINE j RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30), num_doc CHAR(10), valor_fac DECIMAL(12, 2), detalle CHAR(30), tipo CHAR(1), aplica_a CHAR(10), valor DECIMAL(12, 2) END RECORD DEFINE ordenes DYNAMIC ARRAY OF RECORD orden_no LIKE cptb00001.orden_no, tipo LIKE cptb00001.tipo END RECORD DEFINE i INTEGER, opc CHAR(3), detalle1, detalle2 STRING DEFINE entradas_atadas DYNAMIC ARRAY OF RECORD tipo CHAR(2), descrip CHAR(30), entrada INTEGER, orden INTEGER, valor DECIMAL(12, 2) END RECORD MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL cpprmt001() END MAIN FUNCTION cpprmt001() OPTIONS FORM LINE 8, ERROR LINE 24, COMMENT LINE 22, PROMPT LINE 23 OPEN FORM cpfmmt001 FROM "cpfmmt001" DISPLAY FORM cpfmmt001 DISPLAY "cpprmt001" AT 4, 3 DISPLAY "Registro de Facturas" AT 6, 29 MENU "OPCION" ON ACTION Adicionar CALL cppcad000() ON ACTION Consultar_modificar CALL cppcmd000() COMMAND "Salir" EXIT MENU END MENU END FUNCTION ####### Proceso para Insertar Una Factura ########### FUNCTION cppcad000() DEFINE porc_p DECIMAL(10, 2) DEFINE emp SMALLINT LET hoy = NULL LABEL volver: INITIALIZE factura, fecha1, fecha2, v_term_sp TO NULL LET factura.cod_sp = cod_sp1 LET factura.cod_sp_sec = cod_sp2 {LET factura.fecha_orig = fecha1 LET factura.fecha_proc = fecha2} INPUT BY NAME factura.*, v_term_sp ATTRIBUTES(UNBUFFERED, WITHOUT DEFAULTS) BEFORE INPUT --CALL dialog.setFieldActive("fecha_proc", FALSE) #CALL tipoorden() CALL proveedores() CALL condiciones_pago() CALL cuentas.clear() LET v_term_sp = 1 ON KEY(CONTROL-p) NEXT FIELD cod_sp ON KEY(CONTROL-w) CASE WHEN INFIELD(cod_sp) CALL busca_suplidor() LET int_flag = FALSE IF factura.cod_sp_sec IS NULL OR factura.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME factura.cod_sp, factura.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 factura.cod_sp_sec IS NULL OR factura.cod_sp_sec = 0 THEN NEXT FIELD cod_sp ELSE DISPLAY BY NAME factura.cod_sp, factura.cod_sp_sec, nom_sup ATTRIBUTE(BLUE) NEXT FIELD num_doc END IF EXIT CASE END CASE AFTER FIELD cod_sp ### Codigo Suplidor IF factura.cod_sp IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp END IF AFTER FIELD cod_sp_sec ### Secuencia Suplidor IF factura.cod_sp_sec IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD cod_sp_sec END IF SELECT a.nom_sp, a.documentoEntrada, a.cuenta_no INTO nom_sup, pdocumentoEntrada, cuenta FROM cotb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_sp END IF LET cod_sp1 = factura.cod_sp LET cod_sp2 = factura.cod_sp_sec DISPLAY BY NAME nom_sup ATTRIBUTE(BLUE) #### Nombre del suplidor BEFORE FIELD num_doc LET factura.num_doc = NULL DISPLAY BY NAME factura.num_doc AFTER FIELD num_doc #### Numero del documento o factura IF factura.num_doc IS NULL OR factura.num_doc[1] = " " THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD num_doc END IF SELECT UNIQUE a.num_doc, a.status_t INTO factura.num_doc, datos_usu.status_t FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.num_doc = factura.num_doc AND a.tipo_doc = "FT" ##### Proceso para evitar se digite el mismo numero de factura ##### Para el mismo suplidor IF status != NOTFOUND THEN LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD num_doc END IF IF datos_usu.status_t = "E" THEN LET numero_msg = 36 CALL msg(numero_msg) NEXT FIELD num_doc END IF AFTER FIELD v_term_sp LET v_term_sp = ui.Dialog.getCurrent().getFieldValue("v_term_sp") CALL calcular_vencimiento() IF pdocumentoEntrada = "SI" THEN CALL entradas_atadas.clear() CALL ataduras_entradas(factura.cod_sp, factura.cod_sp_sec, nom_sup) IF entradas_atadas.getLength() = 0 THEN CALL fgl_winmessage("Aviso", "Debe atar al menos un reporte de entrada o ACTIVO para este proveedor.", "stop") NEXT FIELD v_term_sp END IF LET factura.tipo = entradas_atadas[1].tipo LET factura.reporteEntrada = entradas_atadas[1].entrada LET factura.orden_no = entradas_atadas[1].orden DISPLAY BY NAME factura.valor_fac END IF NEXT FIELD valor_fac BEFORE FIELD fecha_orig IF fecha1 IS NULL OR fecha1 > TODAY THEN LET fecha1 = TODAY END IF LET factura.fecha_orig = fecha1 DISPLAY BY NAME factura.fecha_orig AFTER FIELD fecha_orig IF factura.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF CALL prd(factura.fecha_orig, usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF IF factura.fecha_orig > TODAY THEN LET numero_msg = 189 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET fecha1 = factura.fecha_orig LET p_fechas = factura.fecha_orig CALL calcular_vencimiento() DISPLAY BY NAME factura.fecha_proc NEXT FIELD v_term_sp BEFORE FIELD fecha_proc IF factura.cod_sp = 23 THEN LET factura.fecha_proc = factura.fecha_orig DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) NEXT FIELD valor_fac END IF CALL calcular_vencimiento() DISPLAY BY NAME factura.fecha_proc ATTRIBUTE(BLUE) NEXT FIELD valor_fac AFTER FIELD valor_fac IF factura.valor_fac IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_fac END IF IF factura.valor_fac < 0 THEN LET valor = 0 NEXT FIELD valor_fac END IF --IF factura.cod_sp = 21 OR factura.cod_sp = 22 THEN -- NEXT FIELD tipo --ELSE -- NEXT FIELD detalle --END IF { BEFORE FIELD bodega IF pdocumentoEntrada = "NO" THEN NEXT FIELD ncf ELSE IF factura.tipo = '02' THEN CALL bodegas(1) ELSE IF factura.tipo = '03' THEN CALL bodegas(3) END IF IF factura.tipo = '01' THEN CALL bodegas(4) END IF END IF END IF AFTER FIELD bodega IF pdocumentoEntrada = "SI" THEN CALL buscaEntradas( factura.cod_sp, factura.cod_sp_sec, factura.tipo, factura.bodega, nom_sup) RETURNING factura.reporteEntrada, factura.orden_no, monto_orden, titulo_moneda, cod_mon IF factura.reporteEntrada = 0 THEN CALL msg(1685) NEXT FIELD bodega END IF IF factura.orden_no IS NOT NULL THEN SELECT term_sp INTO v_term_sp FROM cotb00014 WHERE num_oc = factura.orden_no AND tipo = factura.tipo AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME v_term_sp CALL calcular_vencimiento() END IF END IF AFTER FIELD reporteEntrada IF pdocumentoEntrada = "SI" THEN IF factura.reporteEntrada IS NOT NULL THEN IF factura.tipo IS NULL THEN CALL msg(16) NEXT FIELD tipo_oc END IF IF factura.bodega IS NULL THEN CALL msg(16) NEXT FIELD bodega END IF # LET monto_orden = ototal_bruto - ototal_Desc # LET valor_recibido_b = valor_recibido_b - valor_recibido_d DISPLAY BY NAME monto_orden #, valor_recibido_b # SET CONNECTION "IFMX" # VERIFICA SI LA ORDEN TIENE FACTURA EN CXP # SELECT a.cod_sp FROM cptb00001 a WHERE a.orden_no = factura.orden_no AND # a.status_t IS NULL # IF STATUS <> NOTFOUND THEN # CALL fgl_winmessage("INFO","EXISTEN FACTURAS CON ESTE NUMERO DE ORDEN","INFO") # END IF END IF END IF AFTER FIELD tipo IF factura.tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo END IF IF factura.tipo = 10 THEN NEXT FIELD detalle END IF} BEFORE FIELD detalle LET factura.detalle = NULL DISPLAY BY NAME factura.detalle ATTRIBUTE(BLUE) AFTER FIELD detalle EXIT INPUT AFTER INPUT EXIT INPUT END INPUT ##### Proceso Para abortar OPERACION ###### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF CALL contab() IF int_flag THEN LET int_flag = FALSE RETURN END IF DECLARE buscar4 CURSOR FOR SELECT UNIQUE "N", a.num_doc, a.tipo_doc, a.valor * - 1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = a.num_doc AND a.tipo_doc IN ("ND") AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 LET idx = 1 FOREACH buscar4 INTO arrfac[idx].* LET arr_fac1[idx].tipo1 = "N" LET arr_fac1[idx].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx].valor = arrfac[idx].valor_prep LET idx = idx + 1 END FOREACH DECLARE buscar CURSOR FOR SELECT UNIQUE "N", a.num_doc, a.tipo_doc, SUM(a.valor * - 1) FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NULL AND a.tipo_doc_CP IN ("CP") AND a.status_t IS NULL GROUP BY a.num_doc, a.tipo_doc ORDER BY a.num_doc LET idx1 = idx FOREACH buscar INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc_CP = "CP" AND a.status_t IS NULL IF valor1 IS NULL THEN LET valor1 = 0 END IF LET arrfac[idx].valor_prep = arrfac[idx].valor_prep + valor1 LET arrfac[idx].valor = arrfac[idx].valor_prep IF arrfac[idx].valor > 0 THEN LET arr_fac1[idx1].tipo1 = "N" LET arr_fac1[idx1].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx1].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx1].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx1].valor = arrfac[idx].valor LET idx1 = idx1 + 1 END IF LET idx = idx + 1 END FOREACH LET l = 1 FOR p = 1 TO idx IF arr_fac1[p].aplica_a IS NOT NULL THEN IF arr_fac1[l].valor_prep > 0 THEN LET arr_fac1[l].tipo1 = "N" LET arr_fac1[l].aplica_a = arrfac[p].aplica_a LET arr_fac1[l].tipo_doc = arrfac[p].tipo_doc LET arr_fac1[l].valor_prep = arrfac[p].valor_prep LET arr_fac1[l].valor = arrfac[p].valor_prep LET l = l + 1 END IF END IF END FOR CALL SET_COUNT(l - 1) LABEL volver1: INPUT ARRAY arr_fac1 WITHOUT DEFAULTS FROM factura1.* BEFORE ROW LET curr = arr_curr() LET fila = scr_line() AFTER FIELD valor ##### Valor del documento o factura IF arr_fac1[curr].valor IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor END IF IF arr_fac1[curr].valor > arr_fac1[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET total1 = 0 FOR k = 1 TO arr_curr() IF arr_fac1[k].tipo1 = "S" THEN LET total1 = total1 + arr_fac1[k].valor END IF END FOR IF total1 > factura.valor_fac THEN LET numero_msg = 162 CALL msg(numero_msg) GOTO volver1 END IF ###### Insertando registros en la Maestra de cuentas por Pagar #### LET cod_sp1 = factura.cod_sp --- GENERA LA SECUENCIA PARA LA ENTRADA AL DIARIO EN LA TABLA DEL MAYOR SELECT a.ref INTO entrada_no FROM cotb00047 a WHERE a.cod_sp = factura.cod_sp LET numero_ent = entrada_no[4, 5] LET pano = YEAR(factura.fecha_orig) LET tiempo = MONTH(factura.fecha_orig) USING "&&", pano[3, 4] BEGIN WORK CALL controlNumericoED( numero_ent, factura.fecha_orig, usuarios) RETURNING entrada_no INSERT INTO cptb00001( tipo_doc, num_doc, cod_sp, cod_sp_sec, fecha_orig, fecha_proc, orden_no, tipo, aplica_a, cta_ctble, valor, detalle, us_crea, fech_crea, ref, term_sp) VALUES("FT", factura.num_doc, factura.cod_sp, factura.cod_sp_sec, factura.fecha_orig, factura.fecha_proc, factura.orden_no, factura.tipo, factura.num_doc, NULL, factura.valor_fac, factura.detalle, usuarios, GETDATE(), entrada_no, v_term_sp) FOR idx = 1 TO ARR_COUNT() IF arr_fac1[idx].tipo1 = "S" AND arr_fac1[idx].valor > 0 THEN IF arr_fac1[idx].tipo_doc = "CP" THEN LET arrfac[idx].valor = arrfac[idx].valor * -1 INSERT INTO cptb00001( tipo_doc, num_doc, cod_sp, cod_sp_sec, fecha_orig, fecha_proc, orden_no, tipo, aplica_a, cta_ctble, valor, detalle, status_t, us_crea, fech_crea, us_mod, fech_mod, ref) VALUES(arr_fac1[idx].tipo_doc, arr_fac1[idx].aplica_a, factura.cod_sp, factura.cod_sp_sec, factura.fecha_orig, factura.fecha_proc, ordenes[idx].*, factura.num_doc, NULL, arr_fac1[idx].valor, NULL, NULL, SUSER_SNAME(), GETDATE(), NULL, NULL, entrada_no) ELSE UPDATE cptb00001 SET aplica_a = factura.num_doc WHERE num_doc = arr_fac1[idx].aplica_a AND tipo_doc = "ND" AND tipo = "ND" END IF END IF END FOR FOR idx = 1 TO entradas_atadas.getLength() IF entradas_atadas[idx].entrada IS NOT NULL THEN INSERT INTO cptb00010( num_doc, cod_sp, cod_sp_sec, reporteEntrada, tipo, num_oc, valor) VALUES(factura.num_doc, factura.cod_sp, factura.cod_sp_sec, entradas_atadas[idx].entrada, entradas_atadas[idx].tipo, entradas_atadas[idx].orden, entradas_atadas[idx].valor) END IF END FOR FOR idx = 1 TO entradas_atadas.getLength() IF entradas_atadas[idx].orden > 0 THEN UPDATE cotb00014 SET pago = 'S', us_mod = usuarios, fech_mod = GETDATE() WHERE num_oc = entradas_atadas[idx].orden END IF END FOR LET ent_num = NULL DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc AND fecha > "01/01/2008" DELETE FROM cgtb00004 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura_proveedor = factura.num_doc { IF factura.cod_sp = 22 THEN LET cuenta = "2114" END IF IF factura.cod_sp = 23 THEN LET cuenta = "2113" END IF IF factura.cod_sp = 24 THEN LET cuenta = "2116" END IF } LET credito = factura.valor_fac FOR idx = 1 TO ctrl_reg IF cuentas[idx].cuenta_no IS NOT NULL THEN IF idx = 1 THEN INSERT INTO cptb00003( fecha, cod_sp, cod_sp_sec, factura, cuenta_no, detalles, debito, credito, us_crea, fech_crea, ref, reporteEntrada, bodega) VALUES(factura.fecha_orig, factura.cod_sp, factura.cod_sp_sec, factura.num_doc, cuenta, factura.detalle, 0, factura.valor_fac, usuarios, GETDATE(), entrada_no, factura.reporteEntrada, factura.bodega) ---------------------------------------------------------------------------------------------- INITIALIZE detalle1, detalle2 TO NULL LET detalle1 = "REGISTRO FACTURA ", factura.num_doc, " ", factura.cod_sp, "-", factura.cod_sp_sec, " ", nom_sup[1, 50] INSERT INTO cgtb00004( fecha, tipo, ref, cuenta_no, debito, credito, detalles, us_crea, fech_crea, cod_sp, cod_sp_sec, nombre_proveedor, factura_proveedor, valor_original, departamento, detalle_1, detalle_2, ordenCompras) VALUES(factura.fecha_orig, 1, entrada_no, cuenta, 0, credito, factura.detalle, usuarios, getdate(), factura.cod_sp, factura.cod_sp_sec, nom_sup, factura.num_doc, factura.valor_fac, cuentas[idx].departamento, detalle1, detalle2, factura.orden_no) END IF END IF IF cuentas[idx].debito <> 0 OR cuentas[idx].credito <> 0 THEN IF cuentas[idx].debito IS NULL THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito IS NULL THEN LET cuentas[idx].credito = 0 END IF INSERT INTO cptb00003( fecha, cod_sp, cod_sp_sec, factura, cuenta_no, departamento, num_doc, cod_aux, cod_sec, detalles, debito, credito, us_crea, fech_crea, ref, reporteEntrada, bodega) VALUES(factura.fecha_orig, factura.cod_sp, factura.cod_sp_sec, factura.num_doc, cuentas[idx].cuenta_no, cuentas[idx].departamento, cuentas[idx].num_doc, cuentas[idx].cod_aux, cuentas[idx].sec_aux, cuentas[idx].num_doc, cuentas[idx].debito, cuentas[idx].credito, usuarios, GETDATE(), entrada_no, factura.reporteEntrada, factura.bodega) INSERT INTO cgtb00004( fecha, tipo, ref, cuenta_no, departamento, detalles, debito, credito, us_crea, fech_crea, cod_sp, cod_sp_sec, nombre_proveedor, factura_proveedor, detalle_1, detalle_2, ordenCompras) VALUES(factura.fecha_orig, 1, entrada_no, cuentas[idx].cuenta_no, cuentas[idx].departamento, factura.detalle, cuentas[idx].debito, cuentas[idx].credito, suser_sname(), getdate(), factura.cod_sp, factura.cod_sp_sec, nom_sup, factura.num_doc, detalle1, detalle2, factura.orden_no) END IF # END IF END FOR COMMIT WORK LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM GOTO volver END FUNCTION ###### Proceso de Modificacion de registros FUNCTION cppcmd000() ##### Criterio de Busqueda de informacion a consultar y/o modificar CONSTRUCT CRITERIO ON b.cod_sp, b.cod_sp_sec, b.num_doc, b.fecha_orig, b.fecha_proc, b.valor, b.detalle FROM cod_sp, cod_sp_sec, num_doc, fecha_orig, fecha_proc, valor, detalle BEFORE CONSTRUCT CALL proveedores() AFTER CONSTRUCT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF END CONSTRUCT ##### Busquedas de los datos generales LET selec = "SELECT UNIQUE b.cod_sp,b.cod_sp_sec,b.num_doc,b.fecha_orig, ", " b.fecha_proc,b.valor,b.detalle,b.us_crea, ", " b.fech_crea,b.us_mod,b.fech_mod, b.term_sp ", "FROM cptb00001 b ", "WHERE b.status_t is null AND b.tipo_doc = 'FT' AND ", criterio CLIPPED, " ORDER BY 1,2" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos #### Buscando el primer registro FETCH FIRST datos INTO factura.cod_sp, factura.cod_sp_sec, factura.num_doc, factura.fecha_orig, factura.fecha_proc, factura.valor_fac, factura.detalle, datos_usu.us_crea, datos_usu.fech_crea, datos_usu.us_mod, datos_usu.fech_mod, v_term_sp IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec CALL condiciones_pago() DISPLAY BY NAME factura.*, nom_sup, v_term_sp ATTRIBUTE(BLUE) MENU "OPCION" COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO factura.cod_sp, factura.cod_sp_sec, factura.num_doc, factura.fecha_orig, factura.fecha_proc, factura.valor_fac, factura.detalle, datos_usu.us_crea, datos_usu.fech_crea, datos_usu.us_mod, datos_usu.fech_mod, v_term_sp IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec CALL condiciones_pago() DISPLAY BY NAME factura.*, nom_sup, v_term_sp ATTRIBUTE(BLUE) COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO factura.cod_sp, factura.cod_sp_sec, factura.num_doc, factura.fecha_orig, factura.fecha_proc, factura.valor_fac, factura.detalle, datos_usu.us_crea, datos_usu.fech_crea, datos_usu.us_mod, datos_usu.fech_mod, v_term_sp IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec CALL condiciones_pago() DISPLAY BY NAME factura.*, nom_sup, v_term_sp ATTRIBUTE(BLUE) COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO factura.cod_sp, factura.cod_sp_sec, factura.num_doc, factura.fecha_orig, factura.fecha_proc, factura.valor_fac, factura.detalle, datos_usu.us_crea, datos_usu.fech_crea, datos_usu.us_mod, datos_usu.fech_mod, v_term_sp IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec CALL condiciones_pago() DISPLAY BY NAME factura.*, nom_sup, v_term_sp ATTRIBUTE(BLUE) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO factura.cod_sp, factura.cod_sp_sec, factura.num_doc, factura.fecha_orig, factura.fecha_proc, factura.valor_fac, factura.detalle, datos_usu.us_crea, datos_usu.fech_crea, datos_usu.us_mod, datos_usu.fech_mod, v_term_sp IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_sp INTO nom_sup FROM cotb00001 WHERE cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec CALL condiciones_pago() DISPLAY BY NAME factura.*, nom_sup, v_term_sp ATTRIBUTE(BLUE) ###### Escoger registro para modificar COMMAND "Escoger" "Actualiza Registro Cancela Operacion Codigo Suplidor" LET p_fechas = factura.fecha_orig CALL prd(p_fechas, usuarios) RETURNING bandera LET debe_ir = "N" IF bandera = 1 THEN LET bandera = 0 LET debe_ir = "S" RETURN END IF INITIALIZE pdocumentoEntrada, cuenta TO NULL SELECT a.nom_sp, a.documentoEntrada, a.cuenta_no INTO nom_sup, pdocumentoEntrada, cuenta FROM cotb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec IF debe_ir = "N" THEN CALL entradas_atadas.clear() DECLARE cur_ata CURSOR FOR SELECT a.tipo, a.reporteEntrada, a.num_oc, a.valor, b.descripcion FROM cptb00010 a LEFT OUTER JOIN cotb00010 b ON b.tipo = a.tipo WHERE a.num_doc = factura.num_doc AND a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec LET idx = 1 FOREACH cur_ata INTO entradas_atadas[idx].tipo, entradas_atadas[idx].entrada, entradas_atadas[idx].orden, entradas_atadas[idx].valor, entradas_atadas[idx].descrip IF entradas_atadas[idx].tipo = "10" THEN LET entradas_atadas[idx].descrip = "ACTIVO" END IF IF entradas_atadas[idx].tipo = "11" THEN LET entradas_atadas[idx].descrip = "SERVICIO" END IF LET idx = idx + 1 END FOREACH IF pdocumentoEntrada = "SI" THEN CALL ataduras_entradas( factura.cod_sp, factura.cod_sp_sec, nom_sup) LET factura.tipo = entradas_atadas[1].tipo LET factura.reporteEntrada = entradas_atadas[1].entrada LET factura.orden_no = entradas_atadas[1].orden END IF LET v_term_sp = NULL IF factura.orden_no IS NOT NULL THEN SELECT term_sp INTO v_term_sp FROM cotb00014 WHERE num_oc = factura.orden_no AND tipo = factura.tipo AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec ELSE SELECT term_sp INTO v_term_sp FROM cptb00001 WHERE num_doc = factura.num_doc AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec AND tipo_doc = "FT" END IF INPUT BY NAME factura.fecha_orig, v_term_sp, factura.valor_fac, factura.tipo, factura.orden_no, factura.detalle WITHOUT DEFAULTS BEFORE INPUT CALL condiciones_pago() IF factura.orden_no IS NOT NULL THEN SELECT term_sp INTO v_term_sp FROM cotb00014 WHERE num_oc = factura.orden_no AND tipo = factura.tipo AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME v_term_sp END IF { AFTER FIELD tipo_oc IF factura.tipo_oc is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF AFTER FIELD orden_no IF factura.orden_no is null THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF SELECT UNIQUE a.tipo,a.num_oc FROM cotb00014 a WHERE a.tipo = factura.tipo_oc AND a.num_oc = factura.orden_no AND a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.status_t is null IF status = notfound THEN LET numero_msg = 358 CALL msg(numero_msg) NEXT FIELD tipo_oc END IF } AFTER FIELD v_term_sp IF factura.orden_no IS NOT NULL THEN SELECT term_sp INTO v_term_sp FROM cotb00014 WHERE num_oc = factura.orden_no AND tipo = factura.tipo AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec DISPLAY BY NAME v_term_sp END IF CALL calcular_vencimiento() IF pdocumentoEntrada = "SI" THEN CALL entradas_atadas.clear() CALL ataduras_entradas(factura.cod_sp, factura.cod_sp_sec, nom_sup) IF entradas_atadas.getLength() = 0 THEN CALL fgl_winmessage("Aviso", "Debe atar al menos un reporte de entrada, activo o servicio para este proveedor.", "stop") NEXT FIELD v_term_sp END IF LET factura.tipo = entradas_atadas[1].tipo LET factura.reporteEntrada = entradas_atadas[1].entrada LET factura.orden_no = entradas_atadas[1].orden DISPLAY BY NAME factura.valor_fac END IF NEXT FIELD valor_fac AFTER FIELD fecha_orig IF factura.fecha_orig IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD fecha_orig END IF LET p_fechas = factura.fecha_orig CALL prd(p_fechas, usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 NEXT FIELD fecha_orig END IF CALL calcular_vencimiento() AFTER FIELD valor_fac IF factura.valor_fac IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor_fac END IF AFTER INPUT EXIT INPUT END INPUT ##### Proceso Para abortar OPERACION ###### IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF END IF LET debe_ir = "N" CALL contab() DECLARE busca2 CURSOR FOR SELECT "S", a.num_doc, a.tipo_doc, a.valor * - 1, a.valor * - 1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = factura.num_doc AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 LET idx = 1 FOREACH busca2 INTO arrfac[idx].* LET idx = idx + 1 END FOREACH DECLARE busca3 CURSOR FOR SELECT "N", a.num_doc, a.tipo_doc, a.valor * - 1, a.valor * - 1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = a.num_doc AND a.tipo = "ND" AND a.status_t IS NULL ORDER BY 2 FOREACH busca3 INTO arrfac[idx].* LET idx = idx + 1 END FOREACH DECLARE buscar1 CURSOR FOR SELECT "S", a.num_doc, a.tipo_doc, a.valor * - 1, a.valor * - 1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = factura.num_doc AND a.tipo_doc IN ("CP") AND a.status_t IS NULL ORDER BY 2 FOREACH buscar1 INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor2 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc IN ("CP") AND a.status_t IS NULL SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc IN ("CP") AND a.status_t IS NULL AND a.aplica_a != arrfac[idx].aplica_a IF valor1 IS NULL THEN LET valor1 = 0 END IF IF valor2 IS NULL THEN LET valor2 = 0 END IF LET arrfac[idx].valor = arrfac[idx].valor_prep LET arrfac[idx].valor_prep = valor2 - valor1 LET idx = idx + 1 END FOREACH DECLARE buscar20 CURSOR FOR SELECT UNIQUE "N", a.num_doc, a.tipo_doc, SUM(a.valor * - 1) FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NULL AND a.tipo_doc IN ("CP") AND a.status_t IS NULL GROUP BY a.num_doc, a.tipo_doc ORDER BY a.num_doc LET idx1 = idx FOREACH buscar20 INTO arrfac[idx].* SELECT SUM(a.valor) INTO valor1 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a IS NOT NULL AND a.num_doc = arrfac[idx].aplica_a AND a.tipo_doc = "CP" AND a.status_t IS NULL IF valor1 IS NULL THEN LET valor1 = 0 END IF LET arrfac[idx].valor_prep = arrfac[idx].valor_prep + valor1 LET arrfac[idx].valor = arrfac[idx].valor_prep IF arrfac[idx].valor > 0 THEN LET arr_fac1[idx1].tipo1 = "N" LET arr_fac1[idx1].aplica_a = arrfac[idx].aplica_a LET arr_fac1[idx1].tipo_doc = arrfac[idx].tipo_doc LET arr_fac1[idx1].valor_prep = arrfac[idx].valor_prep LET arr_fac1[idx1].valor = arrfac[idx].valor LET idx1 = idx1 + 1 END IF LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) LABEL volver2: INPUT ARRAY arrfac WITHOUT DEFAULTS FROM factura1.* BEFORE ROW LET curr = arr_curr() LET fila = scr_line() AFTER FIELD aplica_a IF arrfac[curr].tipo IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD tipo END IF IF arrfac[curr].aplica_a IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF arrfac[curr].tipo_doc = "CP" THEN SELECT SUM(a.valor) INTO valor3 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.tipo_doc = "CP" AND a.num_doc = arrfac[curr].aplica_a AND a.aplica_a IS NOT NULL AND a.num_doc != arrfac[curr].aplica_a AND a.status_t IS NULL SELECT SUM(a.valor * - 1) INTO valor2 FROM cptb00001 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.tipo_doc = "CP" AND a.num_doc = arrfac[curr].aplica_a AND a.aplica_a IS NULL AND a.status_t IS NULL IF valor2 IS NULL THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD aplica_a END IF IF valor2 IS NULL THEN LET valor2 = 0 END IF IF valor3 IS NULL THEN LET valor3 = 0 END IF LET arrfac[curr].valor_prep = valor2 + valor3 IF arrfac[curr].valor IS NULL THEN LET arrfac[curr].valor = arrfac[curr].valor_prep END IF IF arrfac[curr].valor > arrfac[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF ELSE SELECT UNIQUE valor * - 1 INTO valor2 FROM cptb00001 WHERE num_doc = arrfac[curr].aplica_a AND tipo_doc = "ND" AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD aplica_a END IF END IF DISPLAY arrfac[curr].aplica_a, arrfac[curr].tipo_doc, arrfac[curr].valor_prep, arrfac[curr].valor TO factura1[fila].aplica_a, factura1[fila].tipo_doc, factura1[fila].valor_prep, factura1[fila].valor AFTER FIELD valor ##### Valor del documento o factura IF arrfac[curr].valor IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD valor END IF IF arrfac[curr].valor > arrfac[curr].valor_prep THEN LET numero_msg = 162 CALL msg(numero_msg) NEXT FIELD valor END IF END INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF LET total1 = 0 FOR k = 1 TO arr_curr() IF arrfac[k].tipo = "S" THEN LET total1 = total1 + arrfac[k].valor END IF END FOR IF total1 > factura.valor_fac THEN LET numero_msg = 162 CALL msg(numero_msg) GOTO volver2 END IF ###### Insertando registros en la Maestra de cuentas por Pagar #### LET cod_sp1 = factura.cod_sp BEGIN WORK DELETE FROM cptb00001 WHERE @aplica_a = factura.num_doc AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @tipo_doc = "CP" AND fecha_orig > "01/01/2008" UPDATE cptb00001 SET (fecha_orig, fecha_proc, orden_no, tipo, valor, detalle, us_mod, fech_mod, term_sp) = (factura.fecha_orig, factura.fecha_proc, factura.orden_no, factura.tipo, factura.valor_fac, factura.detalle, SUSER_SNAME(), GETDATE(), v_term_sp) WHERE @num_doc = factura.num_doc AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @tipo_doc = "FT" LET k = 0 FOR idx = 1 TO ARR_COUNT() LET k = k + 1 IF arrfac[idx].tipo = "S" AND arrfac[idx].valor > 0 THEN LET arrfac[idx].valor = arrfac[idx].valor * -1 IF arrfac[idx].tipo_doc = "CP" THEN INSERT INTO cptb00001 VALUES(arrfac[idx].tipo_doc, arrfac[idx].aplica_a, factura.cod_sp, factura.cod_sp_sec, factura.fecha_orig, factura.fecha_proc, ordenes[idx].*, factura.num_doc, NULL, arrfac[idx].valor, NULL, NULL, SUSER_SNAME(), GETDATE(), SUSER_SNAME(), GETDATE(), entrada_no) ELSE UPDATE cptb00001 SET aplica_a = factura.num_doc WHERE num_doc = arr_fac1[idx].aplica_a AND tipo_doc = "ND" AND tipo = "ND" END IF END IF IF arrfac[idx].tipo = "N" THEN UPDATE cptb00001 SET aplica_a = num_doc WHERE num_doc = arrfac[idx].aplica_a AND tipo_doc = "ND" AND tipo = "ND" END IF END FOR IF entradas_atadas[0].entrada IS NOT NULL THEN DELETE FROM cptb00010 WHERE num_doc = factura.num_doc AND cod_sp = factura.cod_sp AND cod_sp_sec = factura.cod_sp_sec FOR idx = 1 TO entradas_atadas.getLength() IF entradas_atadas[idx].entrada IS NOT NULL THEN INSERT INTO cptb00010( num_doc, cod_sp, cod_sp_sec, reporteEntrada, tipo, num_oc, valor) VALUES(factura.num_doc, factura.cod_sp, factura.cod_sp_sec, entradas_atadas[idx].entrada, entradas_atadas[idx].tipo, entradas_atadas[idx].orden, entradas_atadas[idx].valor) END IF END FOR END IF IF k IS NULL OR k = 0 THEN LET k = 1 END IF IF debe_ir = "N" THEN DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc AND fecha > "01/01/2008" DELETE FROM cgtb00004 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura_proveedor = factura.num_doc IF factura.cod_sp = 22 THEN LET cuenta = "2114" END IF IF factura.cod_sp = 23 THEN LET cuenta = "2113" END IF IF factura.cod_sp = 24 THEN LET cuenta = "2116" END IF LET credito = factura.valor_fac FOR idx = 1 TO ctrl_reg IF cuentas[idx].cuenta_no IS NOT NULL THEN IF idx = 1 THEN INSERT INTO cptb00003( fecha, cod_sp, cod_sp_sec, factura, cuenta_no, departamento, num_doc, cod_aux, cod_sec, detalles, debito, credito, status_t, us_crea, fech_crea, us_mod, fech_mod) VALUES(factura.fecha_orig, factura.cod_sp, factura.cod_sp_sec, factura.num_doc, cuenta, NULL, NULL, NULL, NULL, NULL, 0, factura.valor_fac, NULL, SUSER_SNAME(), GETDATE(), NULL, NULL) --- GENERA LA SECUENCIA PARA LA ENTRADA AL DIARIO EN LA TABLA DEL MAYOR SELECT a.ref INTO entrada_no FROM cotb00047 a WHERE a.cod_sp = factura.cod_sp LET numero_ent = entrada_no[4, 5] LET pano = YEAR(factura.fecha_orig) LET tiempo = MONTH(factura.fecha_orig) USING "&&", pano[3, 4] SELECT MAX(a.ref[7, 9]) INTO ultimo FROM cgtb00004 a WHERE a.ref[4, 5] = numero_ent AND a.ref[11, 14] = tiempo IF ultimo IS NULL THEN LET ultimo = 0 END IF LET ultimo = ultimo + 1 LET entrada_no = entrada_no CLIPPED, "-", ultimo USING "&&&", "/", tiempo CLIPPED ---------------------------------------------------------------------------------------------- INITIALIZE detalle1, detalle2 TO NULL LET detalle1 = "REGISTRO FACTURA ", factura.num_doc, " ", factura.cod_sp, "-", factura.cod_sp_sec, " ", nom_sup[1, 50] INSERT INTO cgtb00004( fecha, tipo, ref, cuenta_no, debito, credito, us_crea, fech_crea, cod_sp, cod_sp_sec, nombre_proveedor, factura_proveedor, valor_original, departamento, detalle_1, detalle_2, ordenCompras) VALUES(factura.fecha_orig, 1, entrada_no, cuenta, 0, credito, suser_sname(), getdate(), factura.cod_sp, factura.cod_sp_sec, nom_sup, factura.num_doc, factura.valor_fac, cuentas[idx].departamento, detalle1, detalle2, factura.orden_no) END IF { INSERT INTO cgtb00004 (fecha, tipo, ref, cuenta_no,credito, us_crea, fech_crea, cod_sp, cod_sp_sec, nombre_proveedor, factura_proveedor ) VALUES(factura.fecha_orig,1,entrada_no,cuenta,factura.valor_fac,suser_sname(),getdate(), factura.cod_sp,factura.cod_sp_sec,nom_sup,factura.num_doc) } END IF IF cuentas[idx].debito <> 0 OR cuentas[idx].credito <> 0 THEN IF cuentas[idx].debito IS NULL THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito IS NULL THEN LET cuentas[idx].credito = 0 END IF INSERT INTO cptb00003 VALUES(factura.fecha_orig, factura.cod_sp, factura.cod_sp_sec, factura.num_doc, cuentas[idx].cuenta_no, cuentas[idx].departamento, cuentas[idx].num_doc, cuentas[idx].cod_aux, cuentas[idx].sec_aux, factura.detalle, cuentas[idx].debito, cuentas[idx].credito, NULL, SUSER_SNAME(), GETDATE(), NULL, NULL, entrada_no) INSERT INTO cgtb00004( fecha, tipo, ref, cuenta_no, departamento, detalles, debito, credito, us_crea, fech_crea, cod_sp, cod_sp_sec, nombre_proveedor, factura_proveedor, detalle_1, detalle_2, ordenCompras) VALUES(factura.fecha_orig, 1, entrada_no, cuentas[idx].cuenta_no, cuentas[idx].departamento, factura.detalle, cuentas[idx].debito, cuentas[idx].credito, suser_sname(), getdate(), factura.cod_sp, factura.cod_sp_sec, nom_sup, factura.num_doc, detalle1, detalle2, factura.orden_no) --,entrada_no) # END IF END IF END FOR END IF COMMIT WORK LET numero_msg = 13 CALL msg(numero_msg) IF debe_ir = "S" THEN START REPORT apl_fact TO "%USHOME%\\archivo" FOR idx = 1 TO k IF arrfac[idx].tipo IS NOT NULL THEN LET j.cod_sp = factura.cod_sp LET j.cod_sp_sec = factura.cod_sp_sec LET j.nom_sup = nom_sup LET j.num_doc = factura.num_doc LET j.valor_fac = factura.valor_fac LET j.detalle = factura.detalle LET j.tipo = arrfac[idx].tipo LET j.aplica_a = arrfac[idx].aplica_a LET j.valor = arrfac[idx].valor OUTPUT TO REPORT apl_fact(j.*) END IF END FOR FINISH REPORT apl_fact ##### Proceso Para Anular una Factura END IF COMMAND KEY("L") "Eliminar" LET bandera = 0 LET p_fechas = factura.fecha_orig CALL prd(p_fechas, usuarios) RETURNING bandera IF bandera = 1 THEN LET bandera = 0 LET numero_msg = 57 CALL msg(numero_msg) RETURN END IF LET opc = fgl_winquestion( "PREGUNTA", "ESTA SEGURO DE ELIMINAR ESTE REGISTRO?", "YES", "YES|NO", "QUESTION", 0) LET opc = upshift(opc) DISPLAY opc IF opc = "YES" THEN # Inserta en la tabla Historica Registros Eliminados BEGIN WORK INSERT INTO cptb00006( tipo_doc, num_doc, cod_sp, cod_sp_sec, fecha_orig, fecha_proc, orden_no, tipo, aplica_a, cta_ctble, valor, detalle, status_t, us_crea, fech_crea, us_mod, fech_mod, ref, reporteEntrada, bodega, term_sp) SELECT a.tipo_doc, a.num_doc, a.cod_sp, a.cod_sp_sec, a.fecha_orig, a.fecha_proc, a.orden_no, a.tipo, a.aplica_a, a.cta_ctble, a.valor, a.detalle, a.status_t, a.us_crea, a.fech_crea, a.us_mod, a.fech_mod, a.ref, a.reporteEntrada, a.bodega, a.term_sp FROM cptb00001 a WHERE a.tipo_doc = "FT" AND a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.aplica_a = factura.num_doc UPDATE cptb00006 SET us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @tipo_doc = "FT" AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @aplica_a = factura.num_doc #------------------------------------------------------------------------- DELETE FROM cptb00001 WHERE @tipo_doc = "FT" AND @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @aplica_a = factura.num_doc AND fecha_orig > "01/01/2008" # Inserta en la tabla Historica Registros Eliminados INSERT INTO cptb00005 SELECT * FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc UPDATE cptb00005 SET us_mod = SUSER_SNAME(), fech_mod = GETDATE() WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc #-------------------------------------------------------------------------- SELECT UNIQUE a.ref INTO ent_num FROM cgtb00004 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.factura_proveedor = factura.num_doc UPDATE cgtb00004 SET status_t = 'E', us_mod = usuarios, fech_mod = getdate() WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura_proveedor = factura.num_doc {DELETE FROM cgtb00004 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura_proveedor = factura.num_doc } DELETE FROM cptb00003 WHERE @cod_sp = factura.cod_sp AND @cod_sp_sec = factura.cod_sp_sec AND @factura = factura.num_doc AND fecha > "01/01/2008" COMMIT WORK LET numero_msg = 82 CALL msg(numero_msg) END IF COMMAND "Retornar" CLEAR FORM EXIT MENU END MENU END FUNCTION #### Busqueda de datos generales referente a un suplidor FUNCTION busca_suplidor() LET int_flag = FALSE OPEN WINDOW busca_sp AT 10, 3 WITH FORM "cpfmwd001" ATTRIBUTE(BORDER, FORM LINE FIRST + 2, COMMENT LINE LAST) CONSTRUCT criterio ON a.nom_sp FROM nom_sp IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLOSE WINDOW busca_sp RETURN END IF LET selec = "SELECT a.cod_sp,a.cod_sp_sec,a.nom_sp FROM cotb00001 a ", "WHERE a.status_t IS NULL AND ", criterio CLIPPED, " ORDER BY 3 " PREPARE comando1 FROM selec DECLARE busc CURSOR FOR comando1 LET idx = 1 FOREACH busc INTO supl[idx].* LET idx = idx + 1 END FOREACH CALL SET_COUNT(idx - 1) DISPLAY ARRAY supl TO s_suplid.* LET curr = ARR_CURR() LET factura.cod_sp = supl[curr].cod_sp LET factura.cod_sp_sec = supl[curr].cod_sp_sec LET nom_sup = supl[curr].nom_sp CLOSE WINDOW busca_sp END FUNCTION FUNCTION contab() LET int_flag = FALSE OPEN WINDOW cpfmwd007 AT 10, 3 WITH FORM "cpfmwd007" ATTRIBUTE(BORDER, FORM LINE FIRST + 2, COMMENT LINE LAST) DECLARE busca_ctas CURSOR FOR SELECT a.cuenta_no, a.departamento, a.cod_aux, a.cod_sec, a.num_doc, a.debito, a.credito FROM cptb00003 a WHERE a.cod_sp = factura.cod_sp AND a.cod_sp_sec = factura.cod_sp_sec AND a.factura = factura.num_doc AND a.cuenta_no NOT IN ("21-03", "21-02") LET idx2 = 1 FOREACH busca_ctas INTO cuentas[idx2].* LET idx2 = idx2 + 1 END FOREACH CALL SET_COUNT(idx2 - 1) LABEL arreglo1: LET int_flag = FALSE INPUT ARRAY cuentas WITHOUT DEFAULTS FROM cuentas1.* BEFORE ROW LET curr = ARR_CURR() LET curr1 = SCR_LINE() AFTER FIELD cuenta_no IF cuentas[curr].cuenta_no IS NOT NULL THEN SELECT a.descripcion, a.cata, a.depto, a.nivel, a.ref INTO descripcion, cat, dpto, niv, refe FROM cgtb00001 a WHERE a.status_t IS NULL AND a.cuenta_no = cuentas[curr].cuenta_no AND a.nivel = 3 IF STATUS = NOTFOUND OR descripcion IS NULL THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF DISPLAY BY NAME descripcion ATTRIBUTE(BLUE) IF cuentas[curr].cuenta_no = "21-02" OR cuentas[curr].cuenta_no = "21-03" THEN LET numero_msg = 192 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF IF cat = "S" THEN IF cuentas[curr].cod_aux IS NULL THEN LET cuentas[curr].cod_aux = factura.cod_sp END IF IF cuentas[curr].sec_aux IS NULL THEN LET cuentas[curr].sec_aux = factura.cod_sp_sec END IF END IF IF refe = "S" THEN IF cuentas[curr].num_doc IS NULL THEN LET cuentas[curr].num_doc = factura.orden_no END IF END IF DISPLAY cuentas[curr].cod_aux, cuentas[curr].sec_aux, cuentas[curr].num_doc TO cuentas1[curr1].cod_aux, cuentas1[curr1].sec_aux, cuentas1[curr1].num_doc BEFORE FIELD departamento IF dpto = "N" OR dpto IS NULL THEN LET cuentas[curr].departamento = NULL NEXT FIELD cod_aux END IF AFTER FIELD departamento IF cuentas[curr].departamento IS NULL THEN LET numero_msg = 16 CALL msg(numero_msg) NEXT FIELD departamento END IF SELECT UNIQUE a.departamento FROM adtb00001 a WHERE a.status_t IS NULL AND a.departamento = cuentas[curr].departamento IF STATUS = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD departamento END IF BEFORE FIELD cod_aux IF cat = "N" OR cat IS NULL THEN LET cuentas[curr].cod_aux = NULL LET cuentas[curr].sec_aux = NULL NEXT FIELD num_doc END IF AFTER FIELD cod_aux IF cat = "N" OR cat IS NULL THEN LET cuentas[curr].cod_aux = NULL LET cuentas[curr].sec_aux = NULL NEXT FIELD num_doc END IF BEFORE FIELD num_doc IF refe = "N" OR refe IS NULL THEN LET cuentas[curr].num_doc = NULL NEXT FIELD debito END IF AFTER FIELD num_doc IF refe = "N" OR refe IS NULL THEN LET cuentas[curr].num_doc = NULL NEXT FIELD debito END IF AFTER ROW IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) EXIT INPUT END IF IF cuentas[curr].cuenta_no IS NOT NULL THEN IF cuentas[curr].debito = 0 AND cuentas[curr].credito = 0 THEN LET numero_msg = 207 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF END IF END INPUT IF int_flag THEN GOTO sale END IF FOR idx = 1 TO arr_count() IF cuentas[idx].cuenta_no IS NOT NULL THEN IF cuentas[idx].cuenta_no = "21-02" OR cuentas[idx].cuenta_no = "21-03" THEN LET chequea = "S" LET valor_cxp = valor_cxp + cuentas[idx].debito END IF END IF END FOR IF chequea = "S" THEN IF valor_f != valor_cxp THEN LET numero_msg = 206 CALL msg(numero_msg) SLEEP 2 RETURN #NEXT FIELD debito END IF END IF # Controla las cuentas por pagar si se digito una cuenta perteneciente # a las cuentas por pagar y no se le dice al programa que no afecta # las cuentas por pagar LET tiene_cta = "N" FOR idx = 1 TO arr_count() IF cuentas[idx].cuenta_no IS NOT NULL THEN LET tiene_cta = "S" END IF END FOR IF tiene_cta = "N" THEN LET numero_msg = 84 CALL msg(numero_msg) GOTO arreglo1 #RETURN END IF LET valor = 0 LET monto = 0 #LET ctrl_reg = 0 FOR idx = 1 TO arr_count() IF cuentas[idx].debito IS NULL THEN LET cuentas[idx].debito = 0 END IF IF cuentas[idx].credito IS NULL THEN LET cuentas[idx].credito = 0 END IF LET valor = valor + cuentas[idx].debito LET monto = cuentas[idx].credito + monto LET ctrl_reg = idx END FOR LET valor = valor - monto IF valor != factura.valor_fac THEN LET numero_msg = 213 CALL msg(numero_msg) CLEAR FORM GOTO arreglo1 END IF LABEL sale: CLOSE WINDOW cpfmwd007 END FUNCTION REPORT apl_fact(x) DEFINE x RECORD cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sup CHAR(30), num_doc CHAR(10), valor_fac DECIMAL(12, 2), detalle CHAR(30), tipo CHAR(1), aplica_a CHAR(10), valor DECIMAL(12, 2) END RECORD DEFINE cod1, dias SMALLINT DEFINE direccion, p_descrip CHAR(30) DEFINE p_casa, p_zona, p_numero CHAR(10) DEFINE doble_on CHAR(2) DEFINE doble_off CHAR(2) DEFINE negrillas_on CHAR(6) DEFINE negrillas_off CHAR(6) DEFINE comp_on CHAR(2) DEFINE comp_off CHAR(2) DEFINE doce CHAR(2) DEFINE normal CHAR(2) DEFINE normall CHAR(3) DEFINE comprimido CHAR(3) DEFINE hora CHAR(5) DEFINE tipo CHAR(2) DEFINE imp_cli CHAR(1) DEFINE credito, debito, tcredito, tdebito, tbalance, t_valor1, t_valor2, limite, b_balance, v1_30, v31_45, v46_60, vm_60, p_valor, t_valor3 DECIMAL(12, 2) OUTPUT TOP MARGIN 0 LEFT MARGIN 0 BOTTOM MARGIN 2 PAGE LENGTH 66 FORMAT PAGE HEADER LET doble_on = ASCII 14 LET doble_off = ASCII 20 LET negrillas_on = ASCII 027, ASCII 098 LET negrillas_off = ASCII 027, ASCII 099 LET comp_on = ASCII 31 LET comp_off = ASCII 30 LET comprimido = ASCII 031 LET doce = ASCII 27, ASCII 77 LET normal = ASCII 27, ASCII 80 LET normall = ASCII 030 LET hora = TIME LET lj = (86 - LENGTH(p_companias.nombre CLIPPED)) / 2 PRINT COLUMN 1, comp_off, negrillas_on PRINT COLUMN 1, "cpprmt001", COLUMN lj, p_companias.nombre CLIPPED, COLUMN 79, "Pag. ", PAGENO USING "###" PRINT COLUMN 16, " Sistema de Cuentas por Pagar", COLUMN 79, TODAY USING "dd/mm/yyyy" PRINT COLUMN 16, " Modificacion de Factura", COLUMN 82, hora SKIP 1 LINE LET b_balance = 0 PRINT COLUMN 1, "Factura No. : ", x.num_doc PRINT COLUMN 1, "Suplidor : ", x.cod_sp USING "&&", "-", x.cod_sp_sec USING "&&&&", " ", x.nom_sup CLIPPED PRINT COLUMN 1, "Fecha Aplic.: ", TODAY USING "dd/mm/yyyy" PRINT COLUMN 1, "Valor Fact. : ", x.valor_fac USING "###,###,###.##" PRINT COLUMN 1, "Observacion : ", x.detalle CLIPPED SKIP 1 LINE PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------" PRINT COLUMN 1, "Tipo", COLUMN 20, "Aplica", COLUMN 65, "Monto " PRINT COLUMN 1, "--------------------------------------------------", "--------------------------------" PRINT COLUMN 1, negrillas_off LET debito = 0 ON EVERY ROW LET debito = debito + x.valor PRINT COLUMN 1, x.tipo, COLUMN 20, x.aplica_a, COLUMN 60, x.valor USING "###,###,###.##" ON LAST ROW PRINT comp_off END REPORT FUNCTION proveedores() DEFINE cod_sp SMALLINT, descrip VARCHAR(200), cproveedores ui.ComboBox, query STRING LET cproveedores = ui.combobox.forname("formonly.cod_sp") LET query = "SELECT a.cod_sp, CONCAT('(' ,a.cod_sp, ')',' ',a.titulo) FROM cotb00047 a " DECLARE bproveedores CURSOR FROM query CALL cproveedores.clear() FOREACH bproveedores INTO cod_sp, descrip CALL cproveedores.additem(cod_sp, descrip) END FOREACH END FUNCTION FUNCTION condiciones_pago() DEFINE v_term SMALLINT, v_desc CHAR(30), ccond ui.ComboBox LET ccond = ui.ComboBox.forName("v_term_sp") CALL ccond.clear() DECLARE bcond CURSOR FOR SELECT term_sp, descrip_term FROM cotb00024 WHERE status_t IS NULL ORDER BY term_sp FOREACH bcond INTO v_term, v_desc CALL ccond.addItem(v_term, v_desc CLIPPED) END FOREACH END FUNCTION FUNCTION dias_condicion(p_term) DEFINE p_term SMALLINT, p_dias INTEGER SELECT dias INTO p_dias FROM cotb00024 WHERE term_sp = p_term AND status_t IS NULL IF p_dias IS NULL THEN LET p_dias = 0 END IF RETURN p_dias END FUNCTION FUNCTION calcular_vencimiento() IF v_term_sp IS NULL OR factura.fecha_orig IS NULL THEN DISPLAY "se salio" RETURN END IF DISPLAY "term sp: ", v_term_sp LET factura.fecha_proc = factura.fecha_orig + dias_condicion(v_term_sp) DISPLAY "fecha vencimiento nueva: ", factura.fecha_proc DISPLAY BY NAME factura.fecha_proc END FUNCTION FUNCTION ataduras_entradas(pcodsp, pcodspsec, pnom_sup) DEFINE pcodsp, pcodspsec INTEGER DEFINE pnom_sup STRING DEFINE tipo STRING DEFINE ktipo CHAR(2), kdesc CHAR(30) DEFINE strq, tabla STRING DEFINE i, j, dup SMALLINT DEFINE desc_inv CHAR(30) DEFINE disp DYNAMIC ARRAY OF RECORD sel CHAR(1), entrada INTEGER, orden INTEGER, cod_mon SMALLINT, moneda CHAR(30), valor DECIMAL(12, 2) END RECORD DEFINE total DECIMAL(12, 2) DEFINE query STRING OPEN WINDOW w10 WITH FORM "cpfmwd010" DISPLAY pnom_sup TO nom_sup CALL tipoOrden() LET total = 0; DIALOG ATTRIBUTES(UNBUFFERED) INPUT BY NAME tipo ATTRIBUTES(WITHOUT DEFAULTS) BEFORE INPUT LET tipo = '01' END INPUT INPUT ARRAY disp FROM tdisp.* ATTRIBUTES(APPEND ROW = FALSE, INSERT ROW = FALSE, DELETE ROW = FALSE, AUTO APPEND = FALSE) END INPUT DISPLAY ARRAY entradas_atadas TO tata.* END DISPLAY ON ACTION buscar LET ktipo = ui.Dialog.getCurrent().getFieldValue("tipo") CALL disp.clear() IF ktipo = "10" THEN LET dup = FALSE FOR j = 1 TO entradas_atadas.getLength() IF entradas_atadas[j].tipo = "10" THEN LET dup = TRUE EXIT FOR END IF END FOR IF dup THEN CALL fgl_winmessage( "Aviso", "ACTIVO ya esta agregado.", "info") ELSE LET j = entradas_atadas.getLength() + 1 LET entradas_atadas[j].tipo = "10" LET entradas_atadas[j].descrip = "ACTIVO" LET entradas_atadas[j].entrada = 0 LET entradas_atadas[j].orden = 0 LET entradas_atadas[j].valor = 0 END IF CONTINUE DIALOG END IF IF ktipo = "11" THEN LET dup = FALSE FOR j = 1 TO entradas_atadas.getLength() IF entradas_atadas[j].tipo = "11" THEN LET dup = TRUE EXIT FOR END IF END FOR IF dup THEN CALL fgl_winmessage( "Aviso", "Servicio ya esta agregado.", "info") ELSE LET j = entradas_atadas.getLength() + 1 LET entradas_atadas[j].tipo = "11" LET entradas_atadas[j].descrip = "SERVICIO" LET entradas_atadas[j].entrada = 0 LET entradas_atadas[j].orden = 0 LET entradas_atadas[j].valor = 0 END IF CONTINUE DIALOG END IF CASE ktipo WHEN "01" LET tabla = "marmotech.dbo.intb00006" WHEN "02" LET tabla = "marmotech.dbo.iptb00006" WHEN "03" LET tabla = "marmotech.dbo.irtb00006" END CASE LET strq = "SELECT a.num_doc, a.orden_compra, c.cod_mon, c.descrip_mon, ", "SUM(a.cantidad_2*d.precio) - SUM(a.cantidad_2*d.precio*(ISNULL(d.porc_Desc,0)/100)) ", "FROM ", tabla CLIPPED, " a ", "INNER JOIN marmotech.dbo.cotb00014 b ON b.cod_sp=a.cod_sp AND b.cod_sp_sec=a.cod_sp_sec ", "INNER JOIN marmotech.dbo.cotb00015 d ON d.num_oc=b.num_oc AND d.cod_n=a.cod_n AND d.cod_grupo=a.cod_grupo ", "AND d.cod_tipo=a.cod_tipo AND d.cod_sec=a.cod_Sec AND d.num_oc=a.orden_compra ", "INNER JOIN marmotech.dbo.cotb00031 c ON c.cod_mon=d.cod_mon ", "WHERE a.cod_sp=", pcodsp, " AND a.cod_sp_sec=", pcodspsec, " AND a.status_t is null ", " AND a.fecha >= DATEADD(YEAR, -1, GETDATE()) ", "GROUP BY a.num_doc, a.orden_compra, c.descrip_mon, c.cod_mon ", "ORDER BY a.num_doc, a.orden_compra" PREPARE cmd10 FROM strq DECLARE cur10 CURSOR FOR cmd10 LET i = 1 FOREACH cur10 INTO disp[i].entrada, disp[i].orden, disp[i].cod_mon, disp[i].moneda, disp[i].valor LET disp[i].sel = " " LET i = i + 1 END FOREACH IF disp.getLength() > 0 AND disp[disp.getLength()].entrada IS NULL THEN CALL disp.deleteElement(disp.getLength()) END IF CONTINUE DIALOG ON ACTION agregar LET query = "SELECT descripcion FROM cotb00010 WHERE tipo = ?" PREPARE buscar_descrip FROM query EXECUTE buscar_descrip INTO desc_inv USING tipo FOR i = 1 TO disp.getLength() IF disp[i].sel = "X" OR disp[i].sel = "x" THEN LET dup = FALSE FOR j = 1 TO entradas_atadas.getLength() IF entradas_atadas[j].tipo = ktipo AND entradas_atadas[j].entrada = disp[i].entrada AND entradas_atadas[j].orden = disp[i].orden THEN LET dup = TRUE EXIT FOR END IF END FOR IF NOT dup THEN LET j = entradas_atadas.getLength() + 1 LET entradas_atadas[j].tipo = ktipo LET entradas_atadas[j].descrip = desc_inv LET entradas_atadas[j].entrada = disp[i].entrada LET entradas_atadas[j].orden = disp[i].orden LET entradas_atadas[j].valor = disp[i].valor END IF LET disp[i].sel = " " END IF END FOR CONTINUE DIALOG ON ACTION quitar IF entradas_atadas.getLength() > 0 THEN CALL entradas_atadas.deleteElement(arr_curr()) END IF CONTINUE DIALOG ON ACTION aceptar IF entradas_atadas.getLength() = 0 THEN CALL fgl_winmessage( "Aviso", "Debe atar al menos un reporte de entrada, ACTIVO o SERVICIO.", "stop") CONTINUE DIALOG ELSE FOR i = 1 TO entradas_atadas.getLength() LET total = total + entradas_atadas[i].valor END FOR LET factura.valor_fac = total END IF EXIT DIALOG ON ACTION cancelar CALL entradas_atadas.clear() EXIT DIALOG END DIALOG CLOSE WINDOW w10 END FUNCTION FUNCTION tipoorden() DEFINE ptipo ui.combobox, ktipo CHAR(2), kdescripcion CHAR(30) LET ptipo = ui.combobox.forname("formonly.tipo") CALL ptipo.clear() DECLARE buscaTipo CURSOR FOR SELECT a.tipo, a.descripcion INTO ktipo, kdescripcion FROM cotb00010 a ORDER BY a.descripcion FOREACH buscatipo CALL ptipo.additem(ktipo, kdescripcion) END FOREACH CALL ptipo.additem(10, 'ACTIVO') CALL ptipo.additem(11, 'SERVICIO') END FUNCTION