{ ------------------------------------------------------------------ PROGRAMA : COPRMT001 OBJETIVO : Capturar, Modificar, Eliminar registros de la Tabla de suplidoreses. PROGRAMADOR : JUAN SOTO . FECHA REALIZACION : Agosto 1997. ------------------------------------------------------------------ } SCHEMA smarmotech DEFINE suplidores RECORD tipo_doc VARCHAR(10), rnc VARCHAR(11), cod_sp SMALLINT, cod_sp_sec SMALLINT, nom_sp VARCHAR(41), dir_sp VARCHAR(60), ciu_sp VARCHAR(30), cod_pais VARCHAR(3), tel_sp VARCHAR(25), area_sp VARCHAR(10), fax_sp VARCHAR(25), cont_sp VARCHAR(30), term_sp SMALLINT, status_t CHAR(1), cuenta_no VARCHAR(10), us_crea VARCHAR(50), fech_crea DATETIME YEAR TO FRACTION(3), us_mod VARCHAR(50), fech_mod DATETIME YEAR TO FRACTION(3), id_maintainx INTEGER, contactID INTEGER, email VARCHAR(60) END RECORD, pdocumentoEntrada VARCHAR(2), descripcion_cuenta VARCHAR(80), cuenta_suplidor SMALLINT DEFINE proveedores SMALLINT GLOBALS "coprgb000.4gl" DEFINE balance DEC(12, 2), q_opt CHAR(3) DEFINE apicheck BOOLEAN, answer, answer2 INT DEFINE email VARCHAR(60) MAIN DEFER INTERRUPT CALL ARG_VAL(1) RETURNING usuarios CALL ARG_VAL(2) RETURNING clave CONNECT TO "smarmotech" AS "SQL_C" USER usuarios USING clave SELECT a.* INTO p_companias.* FROM companias a CALL coprmt001() END MAIN FUNCTION coprmt001() OPTIONS FORM LINE 9, ERROR LINE 23, COMMENT LINE 21 OPEN FORM cofmmt001 FROM "cofmmt001" DISPLAY FORM cofmmt001 LET selec = "SELECT a.razon_social,RTRIM(a.calle) + ' #'+RTRIM(a.no_local) + ' '+a.sector,a.telefono FROM DGII.dbo.empresas a WHERE a.rnc = ?" PREPARE dgii FROM selec MENU ON ACTION nuevo CLEAR FORM CALL copcad001() ON ACTION buscar CALL copcmf001() ON ACTION Salir EXIT MENU END MENU END FUNCTION FUNCTION copcad001() DEFINE ultimo_codigo INTEGER # Captura los datos que va a contener el registro INITIALIZE suplidores.* TO NULL INPUT BY NAME suplidores.*, apicheck, pdocumentoEntrada BEFORE INPUT CALL proveedores() ON KEY(CONTROL-W) CASE WHEN INFIELD(cod_pais) CALL busca_pais() DISPLAY BY NAME paises.nom_pais, suplidores.cod_pais END CASE AFTER FIELD rnc IF suplidores.rnc IS NOT NULL THEN IF suplidores.tipo_doc = 'RNC' THEN SELECT a.rnc FROM cotb00001 a WHERE a.rnc = suplidores.rnc AND a.status_t IS NULL IF STATUS <> NOTFOUND THEN CALL msg(12) NEXT FIELD rnc END IF EXECUTE dgii INTO suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp USING suplidores .rnc IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD rnc END IF DISPLAY BY NAME suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp END IF END IF # Verifica que el codigo del suplidores no exista. Si existe, # entonces despliega los datos del registro existente. AFTER FIELD cod_sp IF suplidores.cod_sp IS NOT NULL THEN SELECT a.cod_sp_sec INTO ultimo_codigo FROM cotb00021 a WHERE a.cod_sp = suplidores.cod_sp IF ultimo_codigo IS NULL THEN LET ultimo_codigo = 0 END IF LET suplidores.cod_sp_sec = ultimo_codigo + 1 DISPLAY BY NAME suplidores.cod_sp_sec NEXT FIELD nom_sp END IF { AFTER FIELD cod_sp_sec SELECT a.* INTO suplidores.* FROM cotb00001 a WHERE a.cod_sp = suplidores.cod_sp and a.cod_sp_sec = suplidores.cod_sp_sec IF status != NOTFOUND THEN IF suplidores.status_t = "E" THEN LET numero_msg = 36 CALL msg(numero_msg) NEXT FIELD cod_sp END IF # Llamado a la rutina que despliega el mensaje del error retornado despues del # SELECT. Solamente despliega mensaje si hay error. DISPLAY BY NAME suplidores.* LET numero_msg = 12 CALL msg(numero_msg) NEXT FIELD cod_sp END IF } AFTER FIELD cod_pais IF suplidores.cod_pais IS NULL THEN CALL msg(16) NEXT FIELD cod_pais END IF SELECT a.nom_pais INTO paises.nom_pais FROM cotb00018 a WHERE a.cod_pais = suplidores.cod_pais IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_pais END IF DISPLAY BY NAME paises.nom_pais AFTER FIELD term_sp SELECT a.descrip_term INTO pagos.descrip_term FROM cotb00024 a WHERE a.term_sp = suplidores.term_sp IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD term_sp END IF DISPLAY BY NAME pagos.descrip_term AFTER FIELD cuenta_no SELECT a.descripcion INTO descripcion_cuenta FROM cgtb00001 a WHERE a.cuenta_no = suplidores.cuenta_no AND a.nivel = 3 IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF DISPLAY BY NAME descripcion_cuenta AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF IF suplidores.cod_pais IS NULL THEN CALL msg(16) NEXT FIELD cod_pais END IF IF suplidores.tipo_doc IS NULL THEN CALL msg(16) NEXT FIELD tipo_doc END IF IF suplidores.tipo_doc = 'RNC' AND LENGTH(suplidores.rnc) <> 9 THEN CALL msg(77) NEXT FIELD rnc END IF IF pdocumentoEntrada IS NULL THEN CALL msg(16) NEXT FIELD pdocumentoEntrada END IF IF suplidores.cuenta_no IS NULL THEN CALL msg(16) NEXT FIELD cuenta_o END IF IF suplidores.rnc IS NOT NULL THEN IF suplidores.tipo_doc = 'RNC' THEN EXECUTE dgii INTO suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp USING suplidores .rnc IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD rnc END IF DISPLAY BY NAME suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp END IF END IF BEGIN WORK #BUSCA EL ULTIMO NUMERO CREADO POR TIPO DE PROVEEDOR SELECT a.cod_sp_sec INTO ultimo_codigo FROM cotb00021 a WHERE a.cod_sp = suplidores.cod_sp IF ultimo_codigo IS NULL THEN LET ultimo_codigo = 0 INSERT INTO cotb00021( cod_sp, cod_sp_sec, us_mod, fech_mod) VALUES(suplidores.cod_sp, ultimo_codigo, usuarios, getdate()) END IF LET suplidores.cod_sp_sec = ultimo_codigo + 1 DISPLAY BY NAME suplidores.cod_sp_sec UPDATE cotb00021 SET cod_sp_sec = suplidores.cod_sp_sec, us_mod = usuarios, fech_mod = getdate() WHERE cod_sp = suplidores.cod_sp IF apicheck THEN CALL ApiMaintainC( 'POST', NULL, suplidores.*, usuarios) RETURNING answer, answer2 IF answer IS NULL THEN ROLLBACK WORK END IF IF answer2 = 0 THEN INITIALIZE answer2 TO NULL END IF ELSE INITIALIZE answer, answer2 TO NULL END IF INSERT INTO cotb00001( tipo_doc, rnc, cod_sp, cod_sp_sec, nom_sp, dir_sp, ciu_sp, cod_pais, tel_sp, area_sp, fax_sp, cont_sp, term_sp, us_crea, fech_crea, cuenta_no, id_maintainx, contactID, email, documentoEntrada) VALUES(suplidores.tipo_doc, suplidores.rnc, suplidores.cod_sp, suplidores.cod_sp_sec, suplidores.nom_sp, suplidores.dir_sp, suplidores.ciu_sp, suplidores.cod_pais, suplidores.tel_sp, suplidores.area_sp, suplidores.fax_sp, suplidores.cont_sp, suplidores.term_sp, usuarios, GETDATE(), suplidores.cuenta_no, answer, answer2, suplidores.email, pdocumentoEntrada) COMMIT WORK LET numero_msg = 1 CALL msg(numero_msg) CLEAR FORM # Verifica el Status que retorna luego de insertar el registro en la tabla. # Si hubo problemas en la insercion del registro, se despliega un mensaje. EXIT INPUT END INPUT END FUNCTION FUNCTION copcmf001() #WHENEVER ERROR CONTINUE DEFINE nombreF VARCHAR(100), actualiza VARCHAR(3) # Aqui se prepara para la captura del criterio de seleccion CONSTRUCT BY NAME criterio ON a.cod_sp, a.cod_sp_sec, a.nom_sp, a.tipo_doc, a.rnc BEFORE CONSTRUCT CALL proveedores() AFTER CONSTRUCT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF EXIT CONSTRUCT END CONSTRUCT LET SELEC = " SELECT a.tipo_Doc ,a.rnc ,a.cod_sp ,a.cod_sp_sec ,a.nom_sp ,a.dir_sp ,a.ciu_sp ,a.cod_pais ,a.tel_sp ,a.area_sp ,a.fax_sp ,a.cont_sp ,a.term_sp ,a.status_t ,a.cuenta_no ,a.us_crea ,a.fech_crea ,a.us_mod ,a.fech_mod ,a.id_maintainx,a.contactId,a.email,a.documentoEntrada,b.nom_sp FROM marmotech.dbo.cotb00001 a left outer join exterior.dbo.cotb00001 b on b.cod_sp = a.cod_sp and b.cod_sp_sec = a.cod_sp_Sec where ", " a.status_t is null AND ", criterio CLIPPED, " ORDER BY 1,2,3,4" PREPARE busca FROM selec DECLARE datos SCROLL CURSOR FOR busca OPEN datos FETCH FIRST datos INTO suplidores.*, pdocumentoEntrada, nombreF IF status >= 0 THEN IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) RETURN END IF END IF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp DISPLAY BY NAME suplidores.*, paises.nom_pais, pagos.descrip_term, pdocumentoEntrada, nombreF MENU "OPCIONES " COMMAND "Siguiente" "Presenta en pantalla el proximo registro encontrado" FETCH NEXT datos INTO suplidores.*, pdocumentoEntrada, nombreF IF status = NOTFOUND THEN LET numero_msg = 4 CALL msg(numero_msg) END IF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp DISPLAY BY NAME suplidores.*, paises.nom_pais, pagos.descrip_term, pdocumentoEntrada, nombreF COMMAND "Anterior" "Presenta en pantalla el registro anterior encontrado" FETCH PREVIOUS datos INTO suplidores.*, pdocumentoEntrada, nombreF IF status = NOTFOUND THEN LET numero_msg = 5 CALL msg(numero_msg) END IF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp DISPLAY BY NAME suplidores.*, paises.nom_pais, pagos.descrip_term, pdocumentoEntrada, nombreF COMMAND "Primero" "Presenta en pantalla el primer registro encontrado" FETCH FIRST datos INTO suplidores.*, pdocumentoEntrada, nombreF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp DISPLAY BY NAME suplidores.*, paises.nom_pais, pagos.descrip_term, pdocumentoEntrada, nombreF LET numero_msg = 5 CALL msg(numero_msg) COMMAND "Ultimo" "Presenta en pantalla el ultimo registro encontrado" FETCH LAST datos INTO suplidores.*, pdocumentoEntrada, nombreF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp DISPLAY BY NAME suplidores.*, paises.nom_pais, pagos.descrip_term, pdocumentoEntrada, nombreF LET numero_msg = 4 CALL msg(numero_msg) COMMAND "Escoger" " Actualiza Registro Cancela Operacion" IF suplidores.status_t = "E" THEN LET numero_msg = 36 CALL msg(numero_msg) RETURN END IF INPUT BY NAME suplidores.tipo_doc, suplidores.rnc, suplidores.nom_sp, suplidores.dir_sp, suplidores.cod_pais, suplidores.term_sp, suplidores.ciu_sp, suplidores.tel_sp, suplidores.area_sp, suplidores.fax_sp, suplidores.cont_sp, suplidores.email, apicheck, pdocumentoEntrada, suplidores.cuenta_no WITHOUT DEFAULTS ON KEY(CONTROL-W) CASE WHEN INFIELD(cod_pais) CALL busca_pais() DISPLAY BY NAME paises.nom_pais, suplidores.cod_pais END CASE AFTER FIELD rnc IF suplidores.rnc IS NOT NULL THEN IF suplidores.tipo_doc = 'RNC' THEN LET cuenta_suplidor = 0 SELECT COUNT(*) INTO cuenta_suplidor FROM cotb00001 a WHERE a.rnc = suplidores.rnc AND a.status_t IS NULL IF cuenta_suplidor > 1 THEN CALL msg(12) NEXT FIELD rnc END IF EXECUTE dgii INTO suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp USING suplidores .rnc IF STATUS = NOTFOUND THEN CALL msg(3) NEXT FIELD rnc END IF DISPLAY BY NAME suplidores.nom_sp, suplidores.dir_sp, suplidores.tel_sp END IF END IF AFTER FIELD cod_pais IF suplidores.cod_pais IS NULL THEN CALL msg(16) NEXT FIELD cod_pais END IF SELECT nom_pais INTO paises.nom_pais FROM cotb00018 WHERE cod_pais = suplidores.cod_pais IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cod_pais END IF DISPLAY BY NAME paises.nom_pais AFTER FIELD term_sp SELECT descrip_term INTO pagos.descrip_term FROM cotb00024 WHERE term_sp = suplidores.term_sp IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD term_sp END IF DISPLAY BY NAME pagos.descrip_term AFTER FIELD cuenta_no SELECT a.descripcion INTO descripcion_cuenta FROM cgtb00001 a WHERE a.cuenta_no = suplidores.cuenta_no IF status = NOTFOUND THEN LET numero_msg = 3 CALL msg(numero_msg) NEXT FIELD cuenta_no END IF DISPLAY BY NAME descripcion_cuenta AFTER INPUT IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE CLEAR FORM RETURN END IF IF suplidores.cod_pais IS NULL THEN CALL msg(16) NEXT FIELD cod_pais END IF IF suplidores.tipo_doc IS NULL THEN CALL msg(16) NEXT FIELD tipo_doc END IF IF suplidores.rnc IS NULL THEN CALL msg(16) NEXT FIELD rnc END IF IF suplidores.nom_sp <> nombreF THEN LET actualiza = fgl_winquestion( "Actualiza", "Nombres diferentes, si actualizas vas a actualizar Finanzas", "No", "Yes|No", "Question", 0) IF actualiza = "No" THEN CONTINUE INPUT END IF END IF BEGIN WORK IF apicheck THEN IF suplidores.id_maintainx IS NULL THEN CALL ApiMaintainC( 'POST', NULL, suplidores.*, usuarios) RETURNING answer, answer2 IF answer IS NULL OR answer2 IS NULL THEN ROLLBACK WORK ELSE IF answer != 0 THEN LET suplidores.id_maintainx = answer IF answer2 != 0 THEN LET suplidores.contactID = answer2 END IF END IF END IF ELSE CALL ApiMaintainC( 'PATCH', suplidores.id_maintainx, suplidores.*, usuarios) RETURNING answer, answer2 DISPLAY answer2 IF answer != 1 THEN ROLLBACK WORK END IF END IF END IF UPDATE cotb00001 SET tipo_Doc = suplidores.tipo_doc, rnc = suplidores.rnc, nom_sp = suplidores.nom_sp, dir_sp = suplidores.dir_sp, ciu_sp = suplidores.ciu_sp, cod_pais = suplidores.cod_pais, tel_sp = suplidores.tel_sp, area_sp = suplidores.area_sp, fax_sp = suplidores.fax_sp, cont_sp = suplidores.cont_sp, term_sp = suplidores.term_sp, id_maintainx = suplidores.id_maintainx, contactID = suplidores.contactID, email = suplidores.email, us_mod = usuarios, fech_mod = GETDATE(), cuenta_no = suplidores.cuenta_no, documentoEntrada = pdocumentoEntrada WHERE cod_sp = suplidores.cod_sp AND cod_sp_sec = suplidores.cod_sp_sec COMMIT WORK LET numero_msg = 13 CALL msg(numero_msg) END INPUT COMMAND KEY("L") "eLiminar" # BUSCA BALANCE SELECT SUM(a.valor) INTO balance FROM cptb00001 a WHERE a.cod_sp = suplidores.cod_sp AND a.cod_sp_sec = suplidores.cod_sp_sec AND a.status_t IS NULL IF balance <> 0 THEN CALL fgl_winmessage( "INFO", "NO PUEDES ELIMINAR ESTE PROVEEDOR, TIENE BALANCE EN CXP", "INFO") CONTINUE MENU END IF LET q_opt = fgl_winquestion( "ELIMINAR", "ESTA SEGURO DE ELIMINAR ESTE REGISTRO", "NO", "NO|YES", "QUESTION", 0) IF q_opt = "YES" THEN BEGIN WORK IF apicheck THEN IF suplidores.id_maintainx IS NOT NULL THEN CALL ApiMaintainC( 'DELETE', suplidores.id_maintainx, suplidores.*, usuarios) RETURNING answer, answer2 IF answer != 1 THEN ROLLBACK WORK END IF END IF END IF UPDATE cotb00001 SET status_t = "E", us_mod = usuarios, fech_mod = getdate() WHERE cod_sp = suplidores.cod_sp AND cod_sp_sec = suplidores.cod_sp_sec COMMIT WORK LET numero_msg = 39 CALL msg(numero_msg) END IF COMMAND "Retornar" "Retorna al menu anterior" CLEAR FORM EXIT MENU END MENU END FUNCTION FUNCTION busca_pais() OPEN WINDOW busqueda1 AT 10, 10 WITH FORM "cofmwd019" ATTRIBUTE(BORDER, FORM LINE FIRST + 1, COMMENT LINE LAST) CONSTRUCT criterio ON cotb00018.cod_pais, cotb00018.nom_pais FROM cotb00018.cod_pais, cotb00018.nom_pais IF int_flag THEN LET numero_msg = 2 CALL msg(numero_msg) LET int_flag = FALSE RETURN END IF LET selec = "SELECT cod_pais,nom_pais FROM cotb00018 ", "WHERE status_t is null AND ", criterio CLIPPED, "ORDER BY 1 " PREPARE localiza1 FROM selec DECLARE country CURSOR FOR localiza1 LET idx = 1 FOREACH country INTO pais_wd[idx].* IF status = NOTFOUND THEN LET existe = "N" EXIT FOREACH END IF LET idx = idx + 1 END FOREACH CALL set_count(idx - 1) DISPLAY ARRAY pais_wd TO consart.* LET curr1 = arr_curr() LET suplidores.cod_pais = pais_wd[curr1].cod_pais LET paises.nom_pais = pais_wd[curr1].nom_pais CLOSE WINDOW busqueda1 END FUNCTION 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