jueves, 2 de septiembre de 2021

Envío de correo

 

MySession is emailSMTPSession
MyMessage is Email
myAttach  is emailAttach
sFile     is string


MySession..ServerAddress = "smtp.gmail.com"
// The TLS port depends on the provider, don't forget to check it!
MySession..Option = emailOptionSecuredTLS
MySession..Port = 587 //587 o 465
MySession..Name = "xxxxxxxx@gmail.com"
MySession..Password = "yyyyyyyyyyy"
EmailSetTimeOut(10)
IF EmailStartSession(MySession) = False THEN
Error("no se pudo iniciar la sesión SMTP", ErrorInfo())
RETURN
END
EmailReset(MyMessage)
MyMessage..Sender = "xxxx@gmail.com"
MyMessage..SenderAddress = "xxxxx@gmail.com"
Add(MyMessage..Recipient, "zzzzzz@hotmail.com")
MyMessage..Subject = "Envío de su cita de verificación"
MyMessage..Message = "Descargue el documento adjunto"
//adjunto el archivo anexo
// Select the file to attach
//sFile = fSelect("", "", "Selecciona el documento a anexar...", ...
// "PDF documents (*.PDF)" + TAB + "*.PDF", "*.PDF")
// Build the EmailAttach variable if exist

// Generate a unique PDF file name
sArchivo is string = fWebDir() + "\" + "Cita_" + DateSys() + TimeSys() + ".pdf"  
// Configure the destination of the print
iDestination(iPDF, sArchivo)  
// Print the RPT_OrderPDF report
iInitReportQuery(RPT_Cita, gnFolio)
iPrintReport(RPT_Cita, gnFolio)
IF fFileExist(sArchivo) = True
myAttach..Name = fExtractPath(sArchivo, fFileName + fExtension)
myAttach..Content = fLoadBuffer(sArchivo)
myAttach..ContentType = "application/pdf"
myAttach..ContentDescription = "A PDF document"
// Add the attachment
Add(MyMessage..Attach, myAttach)
END
EmailSendMessage(MySession,MyMessage)
EmailCloseSession(MySession)
fDelete(sArchivo)

lunes, 23 de agosto de 2021

Crear XML a partir de un XSD

 PROCEDURE GP_INV_XmlGeneraECI(gsIdDB_Inv_Contrato,gnAño,gnMes)
//Genera el xml del estado de cuenta de inversión

nContador                 is int = 0
nActual                 is int = 0
nAnterior                 is int = 0


dPeriodoDel             is Date = FirstDayOfMonth(gnAño,gnMes)
dPeriodoAl                 is Date = LastDayOfMonth(gnAño, gnMes)
sResultado                 is ANSI string

HReadSeekFirst(DB_Inv_Contrato,IdDB_Inv_Contrato, gsIdDB_Inv_Contrato)
HReadSeekFirst(DB_Socio,IdSocio,DB_Inv_Contrato.IdSocio)


miEci         is xmlDocument <description = "eci_v02">
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNode         is dynamic xmlNode
nNode         = miEci.eci

nNameSpace1.Name     = "xsi"
nNameSpace1.URI     = "http://www.w3.org/2001/XMLSchema-instance"
Add(nNode..NamespaceDeclared, nNameSpace1)

nNameSpace2.Name    = "schemaLocation"
nNameSpace2.URI        = "eci_v02.xsd"
Add(nNode..NamespaceDeclared, nNameSpace2)

miEci.eci:version             =  "1.0"
miEci.eci:fechaEmision         = DateToString(Today(),"YYYY-MM-DD")
miEci.eci:periodoDel           = DateToString(dPeriodoDel,"YYYY-MM-DD")
miEci.eci:periodoAl           = DateToString(dPeriodoAl ,"YYYY-MM-DD")    
miEci.eci:contratoNo        = DB_Inv_Contrato.Folio
miEci.eci:comisionesPer        = 0
miEci.eci:interesesAcum     = 0
miEci.eci:ImpuestosRet        = 0
miEci.eci:fechaCorte         = dPeriodoAl

miEci.eci.socio:noSocio     = DB_Socio.NoSocio
miEci.eci.socio:razonSocial = DB_Socio.RazonSocial
miEci.eci.socio:rfc            = DB_Socio.RFC  

HReadSeekFirst(DB_Soc_Domicilio, IdSocio,DB_Socio.IdSocio)
WHILE HFound(DB_Soc_Domicilio) = True
    IF DB_Soc_Domicilio.Legal = True THEN
    miEci.eci.socio:calle         = DB_Soc_Domicilio.Calle
    miEci.eci.socio:noExterior    = DB_Soc_Domicilio.NoExterior
    miEci.eci.socio:noInterior    = DB_Soc_Domicilio.NoInterior
    miEci.eci.socio:cp             = DB_Soc_Domicilio.Cp
    miEci.eci.socio:colonia     = DB_Soc_Domicilio.Colonia
    miEci.eci.socio:ciudad         = DB_Soc_Domicilio.Localidad
    miEci.eci.socio:estado         = DB_Soc_Domicilio.Estado
    BREAK
    END
    HReadNext(DB_Soc_Domicilio,IdSocio)
END

//**** MOVIMIENTOS DEL PERIODO  ****
HReadSeekFirst(DB_Inv_Inversion,IdDB_Inv_Contrato,gsIdDB_Inv_Contrato)
WHILE HFound(DB_Inv_Inversion) = True
    IF  (DB_Inv_Inversion.FechaInversion >= dPeriodoDel AND DB_Inv_Inversion.FechaInversion <= dPeriodoAl) THEN    
        nContador++
        miEci.eci.movimientos.movimiento[nContador]:fecha       = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:concepto       = "PAGARE"
        miEci.eci.movimientos.movimiento[nContador]:certificado = DB_Inv_Inversion.Folio
        miEci.eci.movimientos.movimiento[nContador]:plazo         = DB_Inv_Inversion.Plazo
        miEci.eci.movimientos.movimiento[nContador]:inversion     = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:vencimiento = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:tasa         = DB_Inv_Inversion.TasaBruta
        miEci.eci.movimientos.movimiento[nContador]:gatNominal     = 0
        miEci.eci.movimientos.movimiento[nContador]:gatReal        = 0
        miEci.eci.movimientos.movimiento[nContador]:debe         = 0
        miEci.eci.movimientos.movimiento[nContador]:haber         = DB_Inv_Inversion.APagar
        miEci.eci.movimientos.movimiento[nContador]:total         = DB_Inv_Inversion.APagar
    END
    IF  (DB_Inv_Inversion.FechaVencimiento >= dPeriodoDel AND DB_Inv_Inversion.FechaVencimiento <= dPeriodoAl) THEN    
        nContador++
        miEci.eci.movimientos.movimiento[nContador]:fecha       = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:concepto       = "VENCIMIENTO"
        miEci.eci.movimientos.movimiento[nContador]:certificado = DB_Inv_Inversion.Folio
        miEci.eci.movimientos.movimiento[nContador]:plazo         = DB_Inv_Inversion.Plazo
        miEci.eci.movimientos.movimiento[nContador]:inversion     = DB_Inv_Inversion.FechaInversion
        miEci.eci.movimientos.movimiento[nContador]:vencimiento = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.movimientos.movimiento[nContador]:tasa         = DB_Inv_Inversion.TasaBruta
        miEci.eci.movimientos.movimiento[nContador]:gatNominal     = 0
        miEci.eci.movimientos.movimiento[nContador]:gatReal        = 0
        miEci.eci.movimientos.movimiento[nContador]:debe         = DB_Inv_Inversion.APagar
        miEci.eci.movimientos.movimiento[nContador]:haber         = 0
        miEci.eci.movimientos.movimiento[nContador]:total         = DB_Inv_Inversion.APagar
    END    
    //**** PORTAFOLIO MES ACTUAL  ****
    IF  (DB_Inv_Inversion.FechaVencimiento > dPeriodoAl) THEN    
        nActual++    
        miEci.eci.actual.portafolio[nActual]:concepto       = "PAGARE"
        miEci.eci.actual.portafolio[nActual]:certificado    = DB_Inv_Inversion.Folio
        miEci.eci.actual.portafolio[nActual]:plazo             = DB_Inv_Inversion.Plazo
        miEci.eci.actual.portafolio[nActual]:inversion         = DB_Inv_Inversion.FechaInversion
        miEci.eci.actual.portafolio[nActual]:vencimiento     = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.actual.portafolio[nActual]:tasa             = DB_Inv_Inversion.TasaBruta
        miEci.eci.actual.portafolio[nActual]:gatNominal     = 0
        miEci.eci.actual.portafolio[nActual]:gatReal        = 0    
        miEci.eci.actual.portafolio[nActual]:importe        = DB_Inv_Inversion.APagar        
    END
    //**** PORTAFOLIO MES ANTERIOR  ****
    IF  DB_Inv_Inversion.FechaInversion < dPeriodoDel AND DB_Inv_Inversion.FechaVencimiento > dPeriodoAl THEN
        nAnterior++    
        miEci.eci.anterior.portafolio[nAnterior]:concepto       = "PAGARE"
        miEci.eci.anterior.portafolio[nAnterior]:certificado    = DB_Inv_Inversion.Folio
        miEci.eci.anterior.portafolio[nAnterior]:plazo             = DB_Inv_Inversion.Plazo
        miEci.eci.anterior.portafolio[nAnterior]:inversion         = DB_Inv_Inversion.FechaInversion
        miEci.eci.anterior.portafolio[nAnterior]:vencimiento     = DB_Inv_Inversion.FechaVencimiento
        miEci.eci.anterior.portafolio[nAnterior]:tasa             = DB_Inv_Inversion.TasaBruta
        miEci.eci.anterior.portafolio[nAnterior]:gatNominal     = 0
        miEci.eci.anterior.portafolio[nAnterior]:gatReal        = 0    
        miEci.eci.anterior.portafolio[nAnterior]:importe        = DB_Inv_Inversion.APagar            
    END    
        
    HReadNext(DB_Inv_Inversion,IdDB_Inv_Contrato)
    
END
//info("terminé xml")

IF miEci.eci.movimientos..Occurrence > 0 OR miEci.eci.actual..Occurrence > 0 THEN
    IF XMLValidDocument(miEci) = True THEN    
        sResultado = XMLBuildString(miEci)
        HReset(DB_Inv_Eci)
        DB_Inv_Eci.IdDB_Inv_eci        = GP_DameIdentificador()
        DB_Inv_Eci.IdDB_Inv_Contrato= gsIdDB_Inv_Contrato
        DB_Inv_Eci.Contenido        = sResultado
        DB_Inv_Eci.Año               = gnAño
        DB_Inv_Eci.Mes               = gnMes
        IF HSave(DB_Inv_Eci) = True THEN
            //info("guardado")
        END
        //Ahora guardo el archivo para poder timbrarlo    
        IF ErrorOccurred = True THEN
            Error("No se pudo grabar el documento", ErrorInfo())
        ELSE
            //Info("OK")
        END
    ELSE
        Error("El documento XML es inválido", ErrorInfo())
    END
    
END

RESULT sResultado


lunes, 19 de julio de 2021

DRAG AND DROP

  // EN LA VENTANA
TABLE_Fortaleza..DndTarget = dndInactive
TABLE_Fortaleza..DndSource = dndProgram
TABLE_FichaFortaleza..DndTarget = dndProgram
TABLE_FichaFortaleza..DndSource = dndInactive

DnDEvent("Fortaleza_Suelta", "Table_FichaFortaleza", dndDragLeave)
DnDEvent("Fortaleza_Toma", "Table_Fortaleza", dndBeginDrag)
 
 // PROCEDIMIENTOS LOCALES
PROCEDURE Fortaleza_Toma()
gxFortalezaID = TABLE_Fortaleza.COL_FortalezaID
RETURN

PROCEDURE Fortaleza_Suelta()
HReset(FichaFortaleza)
FichaFortaleza.IdFicha = gsIdFicha
FichaFortaleza.FortalezaID = gxFortalezaID
HAdd(FichaFortaleza)
TableDisplay(TABLE_FichaFortaleza)
RETURN

 

lunes, 12 de julio de 2021

Lee XML



FOR EACH RowNode OF gMiCFDI.Comprobante.Conceptos ON Concepto // where RowNode:Importe.Value < "0"
    Info(RowNode:Cantidad, RowNode:ValorUnitario)
    gstUnConcepto.sClaveProdServ   = RowNode:ClaveProdServ
    gstUnConcepto.cyValorUnitario     = RowNode:ValorUnitario
    gstUnConcepto.nCantidad             = RowNode:Cantidad
    Add(garrConcepto,gstUnConcepto)
END
/////////////////////////**************************

LeeXML              ROUTINE
DATA
rtn:filtro  cstring(256)
rtn:numeroCfdi      SHORT
rtn:respuesta       SHORT
rtn:nombreArchivo   cstring(256)
rtn:bandera         BYTE
rtn:UUID            cstring(32)
rtn:FechaTimbrado   cstring(32)
CODE
    if RIGHT(LOC:NombreDirectorio, 1) <> '\' then
        rtn:filtro = LOC:NombreDirectorio & '\*.xml'
    else
        rtn:filtro = LOC:NombreDirectorio & '*.xml'
    end  
    MESSAGE(rtn:filtro)
    DIRECTORY(QArchivos,rtn:filtro,ff_:NORMAL)  
    rtn:numeroCfdi = RECORDS(QArchivos)
    
    LOOP i# = rtn:numeroCfdi TO 1 BY -1
        GET(QArchivos,i#)
        MESSAGE(QArchivos:name)
        if RIGHT(LOC:NombreDirectorio, 1) <> '\' then
            rtn:nombreArchivo = LOC:NombreDirectorio & '\' & QArchivos:name
        else
            rtn:nombreArchivo = LOC:NombreDirectorio & QArchivos:name
        end  
        !!!!!!!!!!!!!!!!!!!!!!!!!!*****!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      
        LOC:UUID        = ''
        rtn:respuesta   = XML:LoadFromFile(rtn:nombreArchivo)  
        Xml:GotoTop()   ! Sets the pointer to ('tfd:TimbreFiscalDigital','UUID')
        If NOT Xml:FindNextNode('tfd:TimbreFiscalDigital','UUID')
            IF NOT XML:ReadCurrentData(LOC:UUID)
            rtn:bandera = true
            END
        End
        
        if rtn:bandera = true
            clear(cfdi:record)
            cfdi:UUID = LOC:UUID
            if access:cfdi.fetch(cfdi:PKUUID) = Level:Benign
                MESSAGE('El CFDI ya está grabado')
            else
                clear(cfdi:record)
                cfdi:UUID = LOC:UUID
                Xml:GotoTop()  ! Sets the pointer to ('tfd:TimbreFiscalDigital','FechaTimbrado')
                If NOT Xml:FindNextNode('tfd:TimbreFiscalDigital','FechaTimbrado')
                    IF NOT XML:ReadCurrentData(cfdi:FechaTimbrado)
                    !!MESSAGE('Fecha de Timbrado es: ' & LOC:FechaTimbrado)
                    END
                End
                Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Comprobante','Fecha')
                    XML:ReadCurrentData(cfdi:Fecha)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Comprobante','Serie')
                    XML:ReadCurrentData(cfdi:Serie)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Comprobante','Folio')
                    XML:ReadCurrentData(cfdi:Folio)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Comprobante','SubTotal')
                    XML:ReadCurrentData(cfdi:Subtotal)
                End
                Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Comprobante','Total')
                    XML:ReadCurrentData(cfdi:Total)
                End
                Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Emisor','Rfc')
                    XML:ReadCurrentData(cfdi:EmisorRFC)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Emisor','Nombre')
                    XML:ReadCurrentData(cfdi:EmisorNombre)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Receptor','Rfc')
                    XML:ReadCurrentData(cfdi:ReceptorRFC)
                End
                 Xml:GotoTop()  
                If NOT Xml:FindNextNode('cfdi:Receptor','Nombre')
                    XML:ReadCurrentData(cfdi:ReceptorNombre)
                End
                access:cfdi.insert()
                
                !!! Ahora leo los conceptos
                free(QConceptos)  
                Xml:GotoTop()
                If NOT xml:FindNextNode('cfdi:Conceptos','cfdi:Concepto')
                    XML:AutoRootSet()
                    rtn:respuesta = Xml:loadQueue(QConceptos,False, False)
                    LOOP Q# = 1 TO RECORDS(QConceptos) BY 1;GET(QConceptos,Q#)
                        clear(cfde)
                        cfde:ClaveProdServ  = QCo:ClaveProdServ
                        cfde:ClaveUnidad    = QCo:ClaveUnidad
                        cfde:NoIdentificacion = QCo:NoIdentificacion
                        cfde:Cantidad       = QCo:Cantidad
                        cfde:Unidad         = QCo:Unidad
                        cfde:Descripcion    = QCo:Descripcion
                        cfde:ValorUnitario  = QCo:ValorUnitario
                        cfde:Importe        = QCo:Importe
                        cfde:Descuento      = QCo:Descuento
                        cfde:UUID           = cfdi:UUID
                        cfde:IdCfde         = s_dameIdentificador()
                        access:cfde.insert()
                END
                end !!! if NOT xml:FindNextNode('cfdi:Conceptos','cfdi:Concepto')
                
            end ! else
        end !if rtn:bandera = true  
         !!*************************************************************************
        XML:Free()    
      
       
        DELETE(QArchivos)                        !Get rid of all other entries   
        
    END  !!!!  LOOP i# = rtn:numeroCfdi TO 1 BY -1
 
    
    

    EXIT

Usuario NetworkUser en Windev

 gsUsuario is string
gbAcceso is boolean = False
gsTipo is string
gsArea is string
gsNombre is string
gsClave is string
gnNivel is int


gsIdDB_Alumno is string
gsIdDB_Area is string



//(gsUsuario,gsArea,gsTipo, gbAcceso) = Open(WIN_Acceso)
//INFO(gsUsuario,gsArea,gsTipo)
bValida is boolean
gsUsuario = NetworkUser()
//gsUsuario = "FVALENCIA"
HReadSeekFirst(DB_Alumno,Clave,gsUsuario,hGeneric)
IF HFound(DB_Alumno) = False THEN
    Error("Alumno  no encontrado")
    bValida  = False
    gbAcceso = False
    gsTipo   = ""
    gsArea   = ""
ELSE
    gnNivel            = DB_Alumno.Nivel
    gsTipo             = DB_Alumno.IdTipo
    gsNombre         = DB_Alumno.Nombre
    gsIdDB_Alumno     = DB_Alumno.IdDB_Alumno
    HReadSeekFirst(DB_Area,IdDB_Area,DB_Alumno.IdDB_Area)
    IF HFound(DB_Area) =True THEN
        gsArea         = DB_Area.Nombre
        gsIdDB_Area = DB_Area.IdDB_Area
    END
    bValida  = True
    gbAcceso = True
    
END


WIN_Menu.SBC_Usuario = "Usuario: " + gsUsuario
WIN_Menu.SBC_Nombre  = "Nombre: " + gsNombre
//WIN_MENU.SBC_Area    = "Área: "    + gsArea
/////////////////////////////////////////////////

IF gbAcceso = False THEN
    EndProgram()
    
END


//OPT_Sistemas..Visible = False

IF gnNivel = 0 THEN
    OPT_Sistemas..Visible = False
//    MENUFILE_Catalogos..Visible = False    
//    MENUFILE_Calendario.OPT_NuevaObligacion..Visible = False
//    MENUFILE_Utilerías..Visible = False
//ELSE
//    MENUFILE_Catalogos..Visible = True
END


miércoles, 7 de julio de 2021

Windows - Excel

 

Una guía paso a paso para los perplejos:

  1. Presione la tecla de Windows
  2. Escribe " intl.cpl " y presiona Enter.
  3. Haga clic en " Configuración adicional ".
  4. Vaya a la pestaña " Números ":
  5. Cambia el símbolo decimal a un punto .
  6. Cambie el " Símbolo de agrupación de dígitos " a un espacio .
  7. Cambie el " Separador de lista " a una coma .
  8. Vaya a la pestaña " Moneda ":
  9. Cambia el símbolo decimal a un punto .
  10. Cambie el " Símbolo de agrupación de dígitos " a un espacio .

martes, 6 de julio de 2021

Ejemplo de campo tipo fórmula

 CONCAT(TO_CHAR(db_con_catalogo.Cta1,'0999'), CHAR(45),
TRIM(TO_CHAR(db_con_catalogo.Cta2,'09')), CHAR(45),
TRIM(TO_CHAR(db_con_catalogo.Cta3,'09')), CHAR(45),
TRIM(TO_CHAR(db_con_catalogo.Cta4,'09')), CHAR(45),
TRIM(TO_CHAR(db_con_catalogo.Cta5,'09')))

Valida RFC

 // Summary: <specify the procedure action> // Syntax: //[ <Result> = ] GP_ValidaRFC (<nTipoPersona>, <sParamRFC>) /...