viernes, 14 de febrero de 2020
De excel a texto
nContador is int = 0
nConsecutivo is int = 0 //número de registro consecutivo
nAnterior is int
sRenglon01 is string
sRenglon02 is string
sRenglon03 is string
sRenglon04 is string
sArchivo is string
MyExcelDoc is xlsDocument
MyExcelFile is string = EDT_ExcelFile
nRenglonInicial is int = EDT_RenglonInicial
nRenglonFinal is int = EDT_RenglonFinal
IF MyExcelFile = "" THEN RETURN
MyExcelDoc = xlsOpen(MyExcelFile,xlsWrite)
IF MyExcelDoc <> -1 THEN
//nRenglones = xlsNbRow(MyExcelDoc)
FOR nContador = nRenglonInicial TO nRenglonFinal
// Retrieve the value of a cell
IF nContador = nRenglonInicial THEN // primer renglon = registro de encabezado
nConsecutivo += 1
sRenglon01 = LP_GeneraCabecera(MyExcelDoc, nContador, nConsecutivo) //nContador es el renglon, nconsecutivo es el consecutivo de registro
nConsecutivo += 1
sRenglon02 = LP_GeneraDetalle(MyExcelDoc, nContador, nConsecutivo)
nAnterior = nConsecutivo
nConsecutivo += 1
sRenglon03 = LP_GeneraDomicilio(MyExcelDoc, nContador, nConsecutivo, nAnterior)
sArchivo += sRenglon01 + CR
sArchivo += sRenglon02 + CR
sArchivo += sRenglon03 + CR
ELSE
nConsecutivo += 1
sRenglon02 = LP_GeneraDetalle(MyExcelDoc, nContador, nConsecutivo)
nAnterior = nConsecutivo
nConsecutivo += 1
sRenglon03 = LP_GeneraDomicilio(MyExcelDoc,nContador, nConsecutivo, nAnterior)
sArchivo += sRenglon02 + CR
sArchivo += sRenglon03 + CR
END
END
//finalmente agrego ell sumario
nConsecutivo += 1
nContador = nRenglonInicial
sRenglon04 = LP_GeneraSumario(MyExcelDoc,nContador, nConsecutivo)
sArchivo += sRenglon04 + CR // el sumario hasta el final
// Create a directory
bResCreate is boolean = fMakeDir("C:\Temp")
IF bResCreate = True
//Salvo el archivo
fSaveText ("c:\temp\AAA2019.txt", sArchivo)
xlsClose(MyExcelDoc)
Info("Archivo creado","c:\temp\AAA201900.txt")
END
END
martes, 11 de febrero de 2020
Cadena de conexión
IF InTestMode()=False THEN
Server = "192.168.0.100"
ELSE
Server = "192.168.0.101"
END
HDescribeConnection("HFSQL","admin","",Server,"NOM_BASE_DATOS",hAccessHFClientServer)
HOpenConnection("HFSQL")
HChangeConnection("*","HFSQL")
otro apunte
en mi caso, utilizo HFSQL
conBD is Connection
IF InTestMode() THEN
conBD..Provider = hAccessHFClientServer
conBD..User = "admin"
conBD..Password = "seiya"
conBD..Server = "localhost"
conBD..Database = "RefaccionariaWeb"
conBD..CryptMethod = hCryptNo
ELSE
conBD..Provider = hAccessHFClientServer
conBD..User = "admin"
conBD..Password = "leviatan"
conBD..Server = "18.189.13.14"
conBD..Database = "RefaccionariaWeb"
conBD..CryptMethod = hCryptNo
END
HChangeConnection("*", conBD)
HOpenConnection(conBD)
lunes, 27 de enero de 2020
Número a letra
PROCEDURE GF_ConvertAmountToWords(cAmount=0)
//Declaro variables locales
sCurrency is string
sTempString is string = ""
sReturnString is string = ""
IF (IntegerPart(cAmount)) = 1 THEN
sCurrency = "Peso"
ELSE
sCurrency = "Pesos"
END
//Construyo texto - parte entera primero
sTempString = GF_ConvierteEnteroaTexto(IntegerPart(cAmount))
IF sTempString <> "" THEN
sTempString = sTempString +" " + sCurrency + " "
ELSE
sTempString=""
END
sReturnString = sTempString
//Construyo texto - parte decimal
sTempString = NumToString((DecimalPart(cAmount)*100),"02d")
sTempString += "/100 M.N."
sReturnString += sTempString
//Regreso resultado
RESULT sReturnString
************************************************************************
PROCEDURE GF_ConvierteEnteroaTexto(iInteger)
//The best data type to feed in is a WD Integer
//Declare local variables
sTempString is string = ""
sNewString is string = ""
sReturnString is string = ""
bAgregaY is boolean
//Cast incoming integer to currency type for higher accuracy on decimals
cIntegerAsCurrency is currency = iInteger
//Reviso para valor 0
IF cIntegerAsCurrency = 0 THEN
sReturnString = "Cero "
RESULT sReturnString
END
//maximo tamaño
IF cIntegerAsCurrency > Power(10,15) THEN
sReturnString = "***ERROR - Numero muy grande para convertir a letras***"
RESULT sReturnString
END
//Billón
IF cIntegerAsCurrency >= Power(10,12) THEN
sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,12)))
IF IntegerPart(cIntegerAsCurrency / Power(10,12)) = 1 THEN
sTempString += sNewString + "Billón "
ELSE
sTempString += sNewString + "Billones "
END
cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / Power(10,12)) * Power(10,12))
END
//miles de millones
IF cIntegerAsCurrency >= Power(10,9) THEN
sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,9)))
cIntegerAsCurrency = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,9)) * Power(10,9))
sTempString += sNewString + "Mil "
END
//millones
IF cIntegerAsCurrency >= Power(10,6) THEN
sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,6)))
IF IntegerPart(cIntegerAsCurrency / Power(10,6)) = 1 THEN
sTempString += sNewString + "Millón "
ELSE
sTempString += sNewString + "Millones "
END
cIntegerAsCurrency = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,6)) * Power(10,6))
END
//miles
IF cIntegerAsCurrency >= Power(10,3) THEN
sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,3)))
cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / Power(10,3)) * Power(10,3))
sTempString += sNewString + "Mil "
END
//cientos
IF cIntegerAsCurrency >= Power(10,2) THEN
sNewString = GF_ConvierteEnteroaTexto(IntegerPart(cIntegerAsCurrency / Power(10,2)))
SWITCH (IntegerPart(cIntegerAsCurrency / Power(10,2)))
CASE 1: sTempString += "Ciento "
CASE 2: sTempString += "Doscientos "
CASE 3: sTempString += "Trecientos "
CASE 4: sTempString += "Cuatrocientos "
CASE 5: sTempString += "Quinientos "
CASE 6: sTempString += "Seiscientos "
CASE 7: sTempString += "setecientos "
CASE 8: sTempString += "Ochocientos "
CASE 9: sTempString += "Novecientos "
END
cIntegerAsCurrency = cIntegerAsCurrency -(IntegerPart(cIntegerAsCurrency / Power(10,2)) * Power(10,2))
END
//para 30 a 100
IF cIntegerAsCurrency >= 30 THEN
SWITCH (IntegerPart(cIntegerAsCurrency / 10))
CASE 3: sTempString += "Treinta "
CASE 4: sTempString += "Cuarenta "
CASE 5: sTempString += "Cincuenta "
CASE 6: sTempString += "Sesenta "
CASE 7: sTempString += "Setenta "
CASE 8: sTempString += "Ochenta "
CASE 9: sTempString += "Noventa "
END
cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / 10) * 10)
bAgregaY = True
ELSE
bAgregaY = False
END
//para 1 a 29
IF cIntegerAsCurrency > 0 AND cIntegerAsCurrency <= 29 THEN
IF bAgregaY = True THEN
sTempString += "y "
END
SWITCH cIntegerAsCurrency
CASE 1: sTempString += " Un "
CASE 2: sTempString += " Dos "
CASE 3: sTempString += "Tres "
CASE 4: sTempString += "Cuatro "
CASE 5: sTempString += "Cinco "
CASE 6: sTempString += "Seis "
CASE 7: sTempString += "Siete "
CASE 8: sTempString += "Ocho "
CASE 9: sTempString += "Nueve "
CASE 10: sTempString += "Diez "
CASE 11: sTempString += "Once "
CASE 12: sTempString += "Doce "
CASE 13: sTempString += "Trece "
CASE 14: sTempString += "Catorce "
CASE 15: sTempString += "Quince "
CASE 16: sTempString += "Dieciseis "
CASE 17: sTempString += "Diecisiete "
CASE 18: sTempString += "Dieciocho "
CASE 19: sTempString += "Diecinueve "
CASE 20: sTempString += "Veinte "
CASE 21: sTempString += "Veintiun "
CASE 22: sTempString += "Veintidos "
CASE 23: sTempString += "Veintitres "
CASE 24: sTempString += "Veinticuatro "
CASE 25: sTempString += "Veinticinco "
CASE 26: sTempString += "Veintiseis "
CASE 27: sTempString += "Veintisiete "
CASE 28: sTempString += "Veintiocho "
CASE 29: sTempString += "Veintinueve "
END
cIntegerAsCurrency = cIntegerAsCurrency - (IntegerPart(cIntegerAsCurrency / 10) * 10)
END
//Paso string con número en letras
sReturnString = sTempString
RESULT sReturnString
viernes, 11 de agosto de 2017
De Excel a XML
xSaldoinicial is numeric(10,2)
xSaldofinal is numeric(10,2)
xDebe is numeric(10,2)
xHaber is numeric(10,2)
sArchivoXML is string
cInformacion is character = "N"
nRenglones is int
nContador is int
nContador2 is int = 0
sDocName is xmlDocument <description = "BalanzaComprobacion_1_2">
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNode is dynamic xmlNode
nNode = sDocName.Balanza
IF COMBO_Informacion..DisplayedValue = "Normal" THEN
cInformacion = "N"
ELSE
cInformacion = "C"
END
sDocName.Balanza:Version = "1.1"
sDocName.Balanza:RFC = COMBO_RFC..DisplayedValue
sDocName.Balanza:Mes = NumToString(COMBO_Mes..Value,"02d")
sDocName.Balanza:Anio = COMBO_Anio..DisplayedValue
sDocName.Balanza:TipoEnvio = cInformacion
nNameSpace1.Name = "xsi"
nNameSpace1.URI = "http://www.w3.org/2001/XMLSchema-instance"
nNameSpace2..Name= "schemaLocation"
nNameSpace2..URI = "www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
sDocName.Balanza..Namespace.Name = "BCE"
Add(nNode..NamespaceDeclared, nNameSpace1)
Add(nNode..NamespaceDeclared, nNameSpace2)
//sDocName..schemaLocation = "http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
//nNode:schemaLocation..Name = "xsi"
//nNode:schemaLocation..Value = "http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/BalanzaComprobacion/BalanzaComprobacion_1_1.xsd"
MyExcelDoc is xlsDocument
MyExcelFile is string = EDT_ExcelFile
IF MyExcelFile = "" THEN RETURN
MyExcelDoc = xlsOpen(MyExcelFile,xlsWrite )
IF MyExcelDoc <> -1 THEN
nRenglones = xlsNbRow(MyExcelDoc)
FOR nContador = 2 TO nRenglones
// Retrieve the value of a cell
sCta1 = xlsData(MyExcelDoc, nContador, 1)
xSaldoinicial = xlsData(MyExcelDoc, nContador,2)
xDebe = xlsData(MyExcelDoc, nContador,3)
xHaber = xlsData(MyExcelDoc, nContador,4)
xSaldofinal = xlsData(MyExcelDoc, nContador,5)
/////////// crea xml
IF sCta1 <> "" THEN
nContador2 += 1
sDocName.Balanza.Ctas[nContador2]:Debe = xDebe
sDocName.Balanza.Ctas[nContador2]:Haber = xHaber
sDocName.Balanza.Ctas[nContador2]:NumCta= sCta1
sDocName.Balanza.Ctas[nContador2]:SaldoFin = xSaldofinal
sDocName.Balanza.Ctas[nContador2]:SaldoIni = xSaldoinicial
END
END
IF XMLValidDocument(sDocName) = True THEN
sArchivoXML = COMBO_RFC..DisplayedValue + NumToString(COMBO_Anio..DisplayedValue) + NumToString(COMBO_Mes..Value,"02d") + "B" + cInformacion + ".XML"
XMLSave(sDocName, EDT_Destino+ "\" + sArchivoXML)
IF ErrorOccurred = True THEN
Error("Unable to save the XML document", ErrorInfo())
ELSE
Info("OK")
END
ELSE
Error("The XML document is invalid", ErrorInfo())
END
END
xlsClose(MyExcelDoc)
Envío de correo
MyMessage is Email
myAttach is EmailAttach
sFile is string
MySession..ServerAddress = "smtp.miempresa.com.mx"
// The TLS port depends on the provider, don't forget to check it!
MySession..Port = 2525
MySession..Name = "gmero@miempresa.com.mx"
MySession..Password = "secrEto*"
EmailSetTimeOut(10)
IF EmailStartSession(MySession) = False THEN
Error("no se pudo iniciar la sesión SMTP", ErrorInfo())
RETURN
END
EmailReset(MyMessage)
MyMessage..Sender = "gmero@miempresa.com.mx"
MyMessage..SenderAddress = "gmero@miempresa.com.mx"
Add(MyMessage..Recipient, "yootro@otraempresa.com.mx")
MyMessage..Subject = "Prueba desde windev"
MyMessage..Message = "Hola Mundo 1"
//adjunto el archivo anexo
// Select the file to attach
sFile = EDT_File
// Build the EmailAttach variable if exist
IF fFileExist(sFile) = True
myAttach..Name = fExtractPath(sFile, fFileName)
myAttach..Content = fLoadText(sFile)
myAttach..ContentType = "application/pdf"
myAttach..ContentDescription = "A PDF document"
// Add the attachment
Add(MyMessage..Attach, myAttach)
END
EmailSendMessage(MySession,MyMessage)
EmailCloseSession(MySession)
Genera XML
nNameSpace1 is xmlNamespace
nNameSpace2 is xmlNamespace
nNameSpace3 is xmlNamespace
nNode is dynamic xmlNode
nNode = miCFDI.Comprobante
nNameSpace1.Name = "xsi"
nNameSpace1.URI = "http://www.w3.org/2001/XMLSchema-instance"
Add(nNode..NamespaceDeclared, nNameSpace1)
XMLAddAttribute(miCFDI,"xsi:schemaLocation","www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd")
miCFDI.Comprobante:Version = XML_TextoConEscape("3.3")
miCFDI.Comprobante:Serie = XML_TextoConEscape("A")
miCFDI.Comprobante:Folio = XML_TextoConEscape("12345")
miCFDI.Comprobante:Fecha = XML_TextoConEscape("2017-05-11T16:07:07")
miCFDI.Comprobante:Sello = ""
miCFDI.Comprobante:FormaPago = XML_TextoConEscape("01")
miCFDI.Comprobante:NoCertificado = "12345678901234567890"
miCFDI.Comprobante:Certificado = ""
miCFDI.Comprobante:CondicionesDePago = XML_TextoConEscape("UNA SOLA EXHIBICION")
miCFDI.Comprobante:SubTotal = "110.00"
miCFDI.Comprobante:Descuento = "10.00"
miCFDI.Comprobante:Moneda = "MXN"
///miCFDI.Comprobante:TipoCambio = "1"
miCFDI.Comprobante:Total = "116.00"
miCFDI.Comprobante:TipoDeComprobante = "I"
miCFDI.Comprobante:MetodoPago = XML_TextoConEscape("PUE")
miCFDI.Comprobante:LugarExpedicion = "03920"
//miCFDI.Comprobante:Confirmacion = "ECVH1"
miCFDI.Comprobante.CfdiRelacionados:TipoRelacion = "05"
miCFDI.Comprobante.CfdiRelacionados.CfdiRelacionado[1]:UUID = "9C1605E0-D05B-456F-9734-10788CC2E07D" //"5FB2822E-396D-4725-8521-CDC4BDD20CCF"
miCFDI.Comprobante.Emisor:Rfc = "ALI890323KX5"
miCFDI.Comprobante.Emisor:Nombre = "ABARROTES LA IMPERIAL SA DE CV"
miCFDI.Comprobante.Emisor:RegimenFiscal = "601"
miCFDI.Comprobante.Receptor:Rfc = "MAFR570325MH5"
miCFDI.Comprobante.Receptor:Nombre = "MARTINEZ FUENTES RODRIGO"
miCFDI.Comprobante.Receptor:ResidenciaFiscal = "MEX"
//miCFDI.Comprobante.Receptor:NumRegIdTrib = ""
miCFDI.Comprobante.Receptor:UsoCFDI = "P01"
miCFDI.Comprobante.Conceptos.Concepto[1]:ClaveProdServ = "01010101"
miCFDI.Comprobante.Conceptos.Concepto[1]:NoIdentificacion = "CLAVE INTERNA"
miCFDI.Comprobante.Conceptos.Concepto[1]:Cantidad = "1"
miCFDI.Comprobante.Conceptos.Concepto[1]:ClaveUnidad = "SR"
miCFDI.Comprobante.Conceptos.Concepto[1]:Unidad = "STRIP"
miCFDI.Comprobante.Conceptos.Concepto[1]:Descripcion = "REPARACION DE EQUIPO"
miCFDI.Comprobante.Conceptos.Concepto[1]:ValorUnitario = "110.00"
miCFDI.Comprobante.Conceptos.Concepto[1]:Importe = "110.00"
miCFDI.Comprobante.Conceptos.Concepto[1]:Descuento = "10.00"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Base = "100.00"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Impuesto = "002"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:TipoFactor = "Tasa"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:TasaOCuota = "0.160000"
miCFDI.Comprobante.Conceptos.Concepto[1].Impuestos.Traslados.Traslado[1]:Importe = "16.00"
miCFDI.Comprobante.Impuestos:TotalImpuestosTrasladados = "16.00"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:Impuesto = "002"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:TipoFactor = "Tasa"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:TasaOCuota = "0.160000"
miCFDI.Comprobante.Impuestos.Traslados.Traslado[1]:Importe = "16.00"
//nNameSpace1.Name = "cfdi"
//nNameSpace1.URI = "http://www.w3.sat.gob.mx/cfd/3"
//Add(nNode..NamespaceDeclared, nNameSpace3)
IF XMLValidDocument(miCFDI) = True THEN
sArchivoXML is string = "Cfdi33" + ".XML"
XMLSave(miCFDI, EDT_Directorio+ "\" + sArchivoXML)
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
Timbrando con Facturador Electrónico
sFacturaXML is string
ResExecute is boolean
sRespuesta is string
sResultado1 is string
sMiarchivo4 is string = "c:\temp\MiCfdi4.xml" //archivo completo de respuesta del pac
sMiarchivo5 is string = "c:\temp\MiCfdi5.xml" //timbre obtenido del pac
// Create
sFacturaXML = fLoadText(EDT_File,foAnsi)
bufMessageXML = ...
"<?xml version=""1.0"" encoding=""utf-8"" ?>" + ...
"<soap:Envelope xmlns:soap=""http://www.w3.org/2003//05/soap-envelope/""" + ...
" xmlns:tim=""http://facturadorelectronico.com/timbrado"">" + ...
" <soap:Header/>" + ...
" <soap:Body>" + ...
"<tim:obtenerTimbrado>" + ...
"<tim:CFDIcliente>" + "<![CDATA["+sFacturaXML + "]]> " + "</tim:CFDIcliente>" + ...
"<tim:Usuario>test</tim:Usuario>" + ...
"<tim:password>TEST</tim:password>" + ...
"</tim:obtenerTimbrado></soap:Body></soap:Envelope>"
//
Info(bufMessageXML)
//https://stagetimbrado.facturador.com/timbrado.asmx
//http://facturadorelectronico.com/timbrado/obtenerTimbrado
sURL is string = URLEncode("https://stagetimbrado.facturador.com/timbrado.asmx")
sAccion is a string = URLEncode("http://facturadorelectronico.com/timbrado/obtenerTimbrado")
//HTTPCertificate(
// Run the procedure
//ResExecute = SOAPRunXML(sURL ,bufMessageXML,sAccion)
ResExecute = SOAPRunXML("https://stagetimbrado.facturador.com/timbrado.asmx",bufMessageXML,sAccion)
IF ResExecute = True THEN // Is the communication with the server successful?
// Is the procedure successfully run?
sRespuesta = SOAPGetResult(SOAPXMLResult)
fSaveText(sMiarchivo4,sRespuesta)
IF sRespuesta <> "" THEN
//Info(sRespuesta) // Display the result returned by the procedure
ELSE
Error("El error es: " + SOAPError(SOAPErrMessage))
// Display the error returned by the SOAP server
END
ELSE
Error("No hay respuesta del servidor", ErrorInfo(errMessage),ResExecute)
END
sResultado1 = XMLExtractString(sRespuesta,"obtenerTimbradoResult",1,XMLExact)
Message(sResultado1)
Valida RFC
// Summary: <specify the procedure action> // Syntax: //[ <Result> = ] GP_ValidaRFC (<nTipoPersona>, <sParamRFC>) /...
-
PROCEDURE ValeurChamp(sNomChamp) WHEN EXCEPTION IN RETURN (sNomChamp) DO IF ExceptionInfo(errCode) = ExIDInconnu THEN RETURN "...
-
sMiArchivo1 is string = EDT_XMLFile sMiArchivo2 is string = EDT_XMLFile + "1" //// //hInst = LoadDLL("diFirmaSAT2.DLL"...
-
i,nTotalItems,x,nPos,y isint bHayEntrega isboolean=False arrNombreCampos1 isarray0string arrNombreCampos2 isarray0string arrNombreCampos3 i...