Las clases

En Windev tienes una opción en el menú para crear clases no visuales. Cuando miras el código que te ha generado ves:

Animales is a Class
	// Miembros de la clase
	sTipo is string = "Sin definir"
END

En las clases podemos crear métodos. Por ejemplo:

PROCEDURE Ruge()

info("Aaaah")

Si queremos crear una sub-clase, basta con que crear una clase y añadirle el inherit. Así tendriamos:

Ballena is a Class
	inherits from Animales
END

El método Ruge() de la clase ballena es identico al de la clase animal. Si queremos manipularlo podemos escribir:

PROCEDURE Ruge()

// Ejecuta el código antes de la clase padre
Info("No hemos definido rugido")

// Método 1: Ejecuta el código de la clase padre, de la que hereda
Ancestor:Ruge()

// Método 2: Si solo hay un nivel de herencia es similar al anterior.  Si hay más niveles, se puede ejecutar cualquier nivel anterior poniendo directamente la clase
Animales:Ruge()

Para instanciar una clase usamos el código:

clAnimal is dynamic Ballena
clAnimal = new Ballena()
clAnimal.Ruge()

Email con gmail

Al conectarte con gmail mediante EmailStartSMTPSession puede que te de algun error al configurar el certificado TLS

La solución está en usar:

EmailConfigure(emailParameterMode, 1)

antes del EmailStartSMTPSession

El problema es que esta función sólo está en la 22

Ejemplo de crear fichero en XML

Objetivo:

Código:

sMidoc is string = "XML"
sMiinfo is string
XmlDocument(sMidoc," ") //Creates a sMidoc XML in memory

XMLAddChild(sMidoc,"FacturaElectronica"," ", True) //Creates the Root Level, see the "True" parameter
XMLAddChild(sMidoc,"Clave","12345key") //Creates an element under the Root level
XMLAddChild(sMidoc,"NumeroConsecutivo","0100001") //Creates an Element under the Root level

XMLAddChild(sMidoc,"Emisor","",True) //Creates a new "Emisor" Level under the root level (True Parameter)
XMLAddChild(sMidoc,"Nombre","Nombre de mi empresa") //Creates an element under Emisor

XMLAddChild(sMidoc,"Identificacion"," ", True) //Creates a new "Identificacion" Sublevel under "Emisor" level (True parameter)
XMLAddChild(sMidoc,"Tipo","01") //Creates an Element "Tipo" under "Identificacion" Sublevel
XMLAddChild(sMidoc,"Numero","3101347822") //Creates an Element "Numero" under "Identificacion" Sublevel
XMLParent(sMidoc) //Up one level, now we are on the "Emisor" level again

XMLAddChild(sMidoc,"Ubicacion"," ",True) //Creates a new "Ubicación" sublevel under "Emisor" Level (True parameter)
XMLAddChild(sMidoc,"Provincia","Heredia") //Creates an Element "Provincia" under "Ubicacion" sublevel
XMLAddChild(sMidoc,"Canton","Santo Domingo") //Creates an Element "Canton" under "Ubicacion" sublevel
XMLAddChild(sMidoc,"Distrito","Santo Tomas") //Creates an Element "Distrito" under "Ubicacion" sublevel
XMLParent(sMidoc) //Up one level, now we are on the "Emisor" level again


//Now the fun part

XMLAddChild(sMidoc,"DetalleServicio"," ",True) //Creates a new "DetalleServicio" Level same level as "Emisor"
XMLAddChild(sMidoc,"LineaDetalle"," ",True) //Creates a new "LineaDetalle" sublevel under "DetalleServicio" Level

poslineas is int = garrdetfac..Occurrence
FOR i=1 TO poslineas
XMLAddChild(sMidoc,"NumeroLinea" ,NumToString(i)) //Element "NumeroLinea" under "LineaDetalle" Sublevel

XMLAddChild(sMidoc,"Codigo","" ,True) //Creates a "Codigo" Sublevel under "NumeroLinea" Level
XMLAddChild(sMidoc,"Tipo" ,"04") //Element "Tipo" of "Codigo" Sublevel
XMLAddChild(sMidoc,"Codigo" ,"004") //Element "Codigo" of "Codigo" Sublevel
XMLParent(sMidoc) //Up one level, now we are on the "LineaDetalle" Sublevel

XMLAddChild(sMidoc,"Cantidad" ,3) //Element "Cantidad" under "LineaDetalle" Sublevel
XMLAddChild(sMidoc,"Monto" ,1525.00) //Element "Monto" under "LineaDetalle" Sublevel
END
XMLParent(sMidoc) //Up one level, now we are on the "LineaDetalle" Sublevel
XMLParent(sMidoc) //Up one level, now we are on the "DetalleServicio" level
XMLParent(sMidoc) //Up one level, now we are on the Root level

sMiinfo = XMLBuildString(sMidoc,XMLDocumentDefault,XMLEncodingUTF8)
XMLClose(sMidoc)
fSaveText("C:\Users\Desktop\Mixmlayuda.xml",sMiinfo) //Done

Enviar Emails con imagenes

Uno de los problemas tipicos de los envios masivos de emails es que las imagenes tienen que incrustarse en el email o la url tiene que estar disponible (no pueden aputar a tu disco duro). WinDev soluciona esto incrustando las imagenes en el propio email.

Tengo el siguiente fichero HTML:


La imagen está fisicamente al lado de este fichero html pero en mi disco local (no en internet)

Aplicaría el siguiente código:


// Start an SMTP session
MySession is EmailSMTPSession
MySession..ServerAddress = «mail.mihost.com»
MySession..Name=»alice@mihost.com»
MySession..Password=»clave»
EmailStartSession(MySession)

// Build the message
MyMessage is Email
MyHTMLText is string = fLoadText(«d:\windev\006\prueba.html»)

EmailImportHTML(MyMessage, MyHTMLText, «d:\windev\006\»)

MyMessage..Sender =»alice@mihost.com»
Add(MyMessage..Recipient, «pep@mihost.com»)
MyMessage..Message = «hola»
MyMessage..Subject = «asunto»

// Send the message
EmailSendMessage(MySession, MyMessage)

Array Tridimensional con orden

miArray is array of 1 by 3 int
i is int = 1

miArray[i,1] = 1
miArray[i,2] = 3
miArray[i,3] = 4
i++
Dimension(miArray, i, 3)
miArray[i,1] = 1
miArray[i,2] = 2
miArray[i,3] = 5
i++
Dimension(miArray, i, 3)
miArray[i,1] = 1
miArray[i,2] = 1
miArray[i,3] = 3

ArraySort(miArray, asColumn, «2»)
FOR linea = 1 _TO_ ArrayCount(miArray)
Trace(miArray[linea,1] + » – » + miArray[linea,2] + » – » + miArray[linea,3])
END

Usar DLL’s externas

1.- Registra la libreria dll en windows con regsvr32

2.- Averiguar como se debe instanciar. En mi caso para una libreria llamada «integridad.dll» es una libreria de terceros
segun el proveedor debe instanciarse asi: «Integracion.bean»

Aquí el código:

pautMiarchivoxml is object OLE «Integracion.bean»

Una vez instanciado ya puede utilizar las funciones de esa libreria

pautMiarchivoxml>>enviar(«nombre del archivo a enviar»)

Un ejemplo con Word.

WHEN EXCEPTION IN
     
      Word is object OLE dynamic
     
      Word = new object OLE "Word.Application"
      Word>>Visible     = True
      Word>>Documents>>Add()
     
      Tablas      is object OLE dynamic
      Tabla is object OLE dynamic
     
      Tablas = Word>>ActiveDocument>>Tables
      Tabla  = Tablas>>Add(Word>>Selection>>Range(),3,5)
      Tabla>>Cell(1,1)>>Range>>Text = "No"
      Tabla>>Cell(1,2)>>Range>>Text = "Importe"
     
DO
      Error(ExceptionInfo(errMessage))
END

Funcion Proper

Esta función pone en mayúsuculas la primera leta de cada palabra de una cadena:

lcCadena is string = ‘WIN DEV’

PROPER(lcCadena) && Muestra «Win Dev»

===================================

PROCEDURE PROPER(LOCAL sCadena is string):string
sReturn is string
arrWord is array of ANSI string
StringToArray(sCadena, arrWord,» «)
FOR EACH sPalabra OF arrWord
sReturn += Upper(sPalabra[[1]]) + Lower(Middle(sPalabra, 2)) + » »
END
RESULT NoSpace(sReturn)

Convierte una hora a time

// Recibe como parámetro un número entero que representa una hora y lo convierte en un tipo TIME
// Parameters:
// Hora (INT): Valor numérico que representa una hora (Ej. 0851, que serían las 08:51 de tipo TIME)
// Return Value: time
// For instance:
// info( TimeToString( HoraIntegerToTime(851), "HH:MM AP" ) ) à 08:51 PM
 PROCEDURE HoraToTime(LOCAL Hora is int):Time
   tTime is Time
   tTime..Hour = IntegerPart(Hora / 100)
   tTime..Minute = modulo(Hora, 100)
   RESULT tTime