Não vi sua mensagem antes.
Mas a classe não é pra gerar, e sim pra ler, por exemplo pra importar XMLs de fornecedores.

Moderador: Moderadores
cXml := "texto do xml"
cXml := ""
cXml += "pedaco do xml"
cXml += "pedaço do xml"
cXml ++ "<texto>pedaco do xml</texto"
XmlTag()
NumberXml()
StringXml()
DateXml()
BlocoIde( @cXml )
BlocoProduto( @cXml )
FUNCTION BlocoProduto( cXml )
cXml += [<det nItem="1">]
...
BlocoIcms( @cXml )
BlocoPis( @cXml )
BlocoCofins( @cXml )
cXml += {</det>]
RETURN NIL
Static Procedure fGera_xml(cNf, cCnpj)
Local cId:= GetChaveAcesso(cNf, cCnpj), oXml:= iCSTIPI:= iBCST:= iValorST:= iDesconto:= iValorIPI:= vPis:= vCofins:= iEAN:= iRedBC:= iAliqIPI:= iFabrica:= iValidade:= iIndST:= [], i:= vBC:= vICMS:= vProduto:= iLote:= vIPI:= vBCST:= vValorST:= vDescont:= vIPI:= vBaseIPI:= vPis:= iOutroDes:= 0
* oXml:= '<?xml version="1.0" encoding="UTF-8"?>'
oXml:= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
oXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >'
oXml+= '<ide>' // Inicio da TAG (ide)
oXml+= '<cUF>' + AllTrim(f_AcessaIni(PATHDADOS + [MALC.INI], [NFe], [Uf Emitente])) + '</cUF>' // UF do Emitente no caso SP = 35 DEIXEI FIXO
oXml+= '<cNF>' + Padl(cNf, 8 , "0" ) + '</cNF>' // Controle da Nota ou numero do pedido
oXml+= '<natOp>' + SubStr(AllTrim(fRetiraAcento(GetProperty([f_Generico], [Cb_Cfop], [DisplayValue]))), 9) + '</natOp>' // Natureza da Operação
oXml+= '<indPag>' + Str(GetProperty([f_Generico], [Cb_Pagamento], [Value]) - 1, 1) + '</indPag>' // Indice de Pagamento
oXml+= '<mod>55</mod>' // Modalidade (FIXO)
oXml+= '<serie>' + AllTrim(f_AcessaIni(PATHDADOS + [MALC.INI], [NFe], [Série])) + '</serie>' // Serie (FIXA)
oXml+= '<nNF>' + cNf + '</nNF>' // Numero da Nota Fiscal
oXml+= '<dhEmi>' + DateTimeXml(GetProperty([f_Generico], [Dp_Emissao], [Value]), GetProperty([f_Generico], [Tm_Hora], [Value])) + '</dhEmi>' // Data Emissão Formato yyyy-mm-dd
If !Empty(GetProperty([f_Generico], [Dp_saida], [Value]))
oXml+= '<dhSaiEnt>' + DateTimeXml(GetProperty([f_Generico], [Dp_saida], [Value]), GetProperty([f_Generico], [Tm_Hora], [Value])) + '</dhSaiEnt>' // Data da Saida da mercadoria
Endif
Static Procedure fGera_xml(cNf, cCnpj)
Local cId:= GetChaveAcesso(cNf, cCnpj), oXml:= iCSTIPI:= iBCST:= iValorST:= iDesconto:= iValorIPI:= vPis:= vCofins:= iEAN:= iRedBC:= iAliqIPI:= iFabrica:= iValidade:= iIndST:= [], i:= vBC:= vICMS:= vProduto:= iLote:= vIPI:= vBCST:= vValorST:= vDescont:= vIPI:= vBaseIPI:= vPis:= iOutroDes:= 0
oXml:= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
oXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >'
oXml+= '<ide>' // Inicio da TAG (ide)
cText := f_AcessaIni(PATHDADOS + [MALC.INI], [NFe], [Uf Emitente])
oXml+= XmlTag( "cUF", StringXml( cText )) // UF do Emitente no caso SP = 35 DEIXEI FIXO
oXml+= XmlTag( "cNF", StringXml( cNf ) ) // Controle da Nota ou numero do pedido
cText := SubStr(AllTrim(fRetiraAcento(GetProperty([f_Generico], [Cb_Cfop], [DisplayValue]))), 9)
oXml+=XmlTag( "natOp", cText ) // Natureza da Operação
cText := Str(GetProperty([f_Generico], [Cb_Pagamento], [Value]) - 1, 1) // Indice de Pagamento
oXml+= XmlTag( "indPag", cText )
oXml+= XmlTag( "mod", "55" ) // Modelo NFE=55
cText := AllTrim(f_AcessaIni(PATHDADOS + [MALC.INI], [NFe], [Série])
oXml+= XmlTag( "serie", cText ) // Serie (FIXA)
oXml+= XmlTag( "nNF", cNf ) // Numero da Nota Fiscal
cText := GetProperty([f_Generico], [Dp_Emissao], [Value]), GetProperty([f_Generico], [Tm_Hora], [Value])
oXml+=XmlTag( "dhEmi", DateXml( cText ) // Data Emissão Formato yyyy-mm-dd
If !Empty(GetProperty([f_Generico], [Dp_saida], [Value]))
oXml+= XmlTag( "dhSaiEnt", DateTimeXml(GetProperty([f_Generico], [Dp_saida], [Value]), GetProperty([f_Generico], [Tm_Hora], [Value])) ) // Data da Saida da mercadoria
Endif
FUNCTION XmlTag( cNome, cConteudo )
RETURN "<" + cNome + ">" + cConteudo + "</" + cNome + ">"
// fonte 1 = carregar dados
oNota:Numero := "1"
oNota:DataEmissao := 11/11/11
// fonte 2 = gerar xml
cXml += XmlTag( "cNF", oNota:Numero )
cXml += XmlTag( "dhEmi", DateXml( oNota:DataEmissao ) )
// fonte 3 - a classe
// acrescentar campos que possam estar faltando
Procedure GeraXml(cNf, cCnpj)
Private cXml:= [teste.xml], cId:= GetChaveAcesso(cNf, cCnpj)
*** Cria o xml
cXml:= fCria_Xml(@cXml, cId)
*** Identificação - Tag Ide
fCriaIde(@cXml, [35], [000000001], [Venda mercadoria adquirida ou recebida de terceiros], [0], [1], dtoc(date()), time(), dtoc(date()), time(), [0], [1], [2], [0], [1], [3550308], [1], [])
*** Fechamento do Cfe
fCriaFechamento(@cXml)
Return (Nil)
Procedure fCria_Xml(cXml, cId)
Local nHandle:= 0
If !Empty(cXml)
cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' + hb_OsNewLine()
cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >' + hb_OsNewLine()
Endif
Return (nHandle)
Procedure fCriaFechamento(cXml)
Local nHandle
If Empty(cXml)
Return (Nil)
Endif
cXml+= '</NFe>'
If (nHandle:= FCREATE(oArq, 0)) == -1
MsgInfo([Não foi possÃvel criar o arquivo rascunho XML])
Return (Nil)
Endif
FWRITE(nHandle, cXml)
FCLOSE(nHandle)
Return (Nil)
Procedure fCriaIde(cXml, cUf, cNf, cCfop, cIndPag, cSerie, cDataE, cTimeE, cDataS, cTimeS, cTipoNf, cDv, cAmbiente, cIndPres, cIdest, cMunIbged, cFinalidade, Nfrefencia)
If Empty(cXml)
Return (Nil)
Endif
cXml+= '<ide>') // Inicio da TAG (ide)
cXml+= XmlTag( "cUF", cUf) // UF do Emitente no caso SP = 35
cXml+= XmlTag( "cNF", cNf ) // Controle da Nota ou numero do pedido
cXml+= XmlTag( "natOp", cCfop) // Natureza da Operação
cXml+= XmlTag( "indPag", cIndPag ) // Indice de Pagamento
cXml+= XmlTag( "mod", "55" ) // Modelo NFE=55 (FIXA)
cXml+= XmlTag( "serie", cSerie ) // Serie
cXml+= XmlTag( "nNF", cNf ) // Numero da Nota Fiscal
cXml+=XmlTag( "dhEmi", DateTimeXml(cDataE, cTimeE) // Data Emissão Formato yyyy-mm-dd
If !Empty(cDataS)
cXml+= XmlTag( "dhSaiEnt", DateTimeXml(cDataS, cTimeS)) // Data da Saida da mercadoria
Endif
cXml+= XmlTag( "<tpNF>", cTipoNf) // Tipo de Emissão da NF
cXml+= XmlTag( "<idDest>", cIdest) // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
cXml+= XmlTag( "<cMunFG>" + cMunIbged ) // IBGE do destinatário
cXml+= XmlTag( "<tpImp>", "1") // Tipo de Impressão (Paisagem/Retrato) (FIXO)
cXml+= XmlTag( "<tpEmis>", "1") // Tipo de Emissão (FIXO)
cXml+= XmlTag( "<cDV>" + Right(cDv, 1)) // DÃgito da Chave de Acesso
cXml+= XmlTag( "<tpAmb>" , cAmbiente) // Ambiente de Emissão (Hom./Producao)
cXml+= XmlTag( "<finNFe>" + cFinalidade ) // NF Complementar
If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
cXml+= XmlTag( "<indFinal>", "1") // Indica operação com consumidor final (0-Não;1-Consumidor Final)
Else
cXml+= XmlTag( "<indFinal>", "0") // Indica operação com consumidor final (0-Não;1-Consumidor Final)
Endif
cXml+= XmlTag( "<indPres>" , cIndPres) // Indicador de Presença
* cXml+= '<indPres>' + Iif(oPresencial,'1',;
* Iif(GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 2 .or. GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 3, [0], [2])) + '</indPres>' // Indicador de presença do comprador no estabelecimento comercial no momento da
* // operação. (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação
* // presencial;2-Não presencial, internet;3-Não presencial, tele-atendimento;4-NFC-e entrega
* // em domicÃlio;9-Não presencial, outros.
cXml+= XmlTag( "<procEmi>", "3") // Fixo
cXml+= XmlTag( "<verProc>", "3.10.86") // Versão do XML
If !Empty(Nfrefencia)
cXml+= "<NFref>"
cXml+= XmlTag( "<refNFe>" + CharRem("/;-:,\.(){}[] ", Nfrefencia))
cXml+= "</NFref>"
Endif
cXml += '</ide>') // Final da TAG (ide)
Return (Nil)
FUNCTION XmlTag( cTag, cConteudo ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cTexto := ""
hb_Default( @cConteudo, "" )
cConteudo := AllTrim( cConteudo )
IF Len( Trim( cConteudo ) ) = 0
cTexto := [<]+ cTag + [/>]
ELSE
cConteudo := AllTrim( cConteudo )
IF Len( cConteudo ) == 0
cConteudo := " "
ENDIF
cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
ENDIF
RETURN cTexto
FUNCTION DateTimeXml( dDate, cTime, cUF, lUTC ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cText, lHorarioVerao
hb_Default( @dDate, Date() )
hb_Default( @cTime, Time() )
hb_Default( @cUF, "SP" )
hb_Default( @lUTC, .T. )
lHorarioVerao := ( dDate >= HorarioVeraoInicio( Year( dDate ) ) .AND. dDate <= HorarioVeraoTermino( Year( dDate - 1 ) ) )
cText := Transform( Dtos( dDate ), "@R 9999-99-99" ) + "T" + cTime
DO CASE
CASE ! lUTC ; cText += "" // no UTC
CASE cUF $ "AC" ; cText += "-05:00"
CASE cUF $ "MT,MS" .AND. lHorarioVerao ; cText += "-05:00"
CASE cUF $ "DF,ES,GO,MG,PR,RJ,RS,SC,SP" .AND. lHorarioVerao ; cText += "-04:00"
CASE cUF $ "AM,MT,MS,RO,RR" ; cText += "-04:00"
OTHERWISE ; cText += "-03:00"
ENDCASE
RETURN cText
STATIC FUNCTION QualquerNome()
/*****************************************************************************
* SISTEMA : ROTINA EVENTUAL *
* PROGRAMA : TESTE_GERAR_XML.PRG *
* OBJETIVO : Gerar Xml de Nfe *
* AUTOR : Marcelo Antonio Lázzaro Carli *
* DATA : 29.09.2016 *
* ULT. ALT.: 29.09.2016 *
*****************************************************************************/
#include "minigui.ch"
#define DOW_DOMINGO 1 /// este define está em ze_xmlfun.prg - postei somente para funcionar
Procedure Main()
REQUEST HB_LANG_PT
HB_LangSelect([PT])
REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
HB_SETCODEPAGE([PT850]) &&& PARA INDEXAR CAMPOS ACENTUADOS
Set wrap on
Set talk off
Set date briti &&& data no formato dd/mm/aaaa
Set dele on &&& ignora registros marcados por deleção
Set score off
Set exact on
Set ToolTip on
Setcancel(.F.) &&& evitar cancelar sistema c/ ALT + C
Set cent on &&& ano com 4 dÃgitos
Set epoch to 2000 &&& ano a partir de 2000
Set excl off &&& abre arquivos em modo compartilhado
Set navigation extended &&& enter no lugar do tab
Set language to portuguese &&& mensagens em português
Set multiple off warning &&& abrir 1 cópia somente
Set browsesync on &&& para o comando browse funcionar ok
Set tooltipstyle balloon &&& para mensagem dos campos em forma de balão
Set menustyle extended &&& padrão é standard, extended estilo office 2007
Set programmaticchange off &&& introduzida na build 1.9.94
define window fTeste_Xml at 0, 0 width 500 height 300 ICON [demo.ico] NOTIFYICON [demo.ico] MAIN title [Gerar Xml de Nfe] NOSIZE NOMAXIMIZE
DEFINE STATUSBAR FONT "Arial" SIZE 9
STATUSITEM [Sistemas] ICON [demo.ico] DEFAULT ACTION MsgInfo([Cliquei no Ãcone])
KEYBOARD
CLOCK
DATE
END STATUSBAR
define button btn_GerarXml
row 50
col 90
width 120
caption [&Gerar Xml]
action {|| fGeraXml([0000000001], [99.999.999/0001-91])}
DEFAULT .t.
end button
on key escape action {|| Thiswindow.Release}
end window
fTeste_Xml.center()
fTeste_Xml.activate()
Return (Nil)
Static Procedure fGeraXml(cNf, cCnpj)
Local cXml:= [], cId:= GetChaveAcesso(cNf, cCnpj, [35], [1])
*** Cria o xml
fCria_Xml(@cXml, cId)
*** Identificação - Tag Ide
fCriaIde(@cXml, [35], [000000001], [Venda mercadoria adquirida ou recebida de terceiros], [0], [1], dtoc(date()), time(), dtoc(date()), time(), [0], [1], [2], [0], [1], [3550308], [1], [])
*** Fechamento do Cfe
fCriaFechamento(@cXml)
Return (Nil)
Static Procedure fCria_Xml(cXml, cId)
cXml+= '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">' + hb_OsNewLine()
cXml+= '<infNFe versao="3.10" Id="NFe' + cId + '" >' + hb_OsNewLine()
Return (Nil)
Static Procedure fCriaFechamento(cXml)
Local nHandle
If Empty(cXml)
Return (Nil)
Endif
cXml+= '</NFe>'
If (nHandle:= FCREATE([teste.xml], 0)) == -1
MsgInfo([Não foi possÃvel criar o arquivo rascunho XML])
Return (Nil)
Endif
FWRITE(nHandle, cXml)
FCLOSE(nHandle)
Return (Nil)
Static Procedure fCriaIde(cXml, cUf, cNf, cCfop, cIndPag, cSerie, cDataE, cTimeE, cDataS, cTimeS, cTipoNf, cDv, cAmbiente, cIndPres, cIdest, cMunIbged, cFinalidade, Nfrefencia)
If Empty(cXml)
Return (Nil)
Endif
cXml+= '<ide>' // Inicio da TAG (ide)
cXml+= XmlTag( "cUF", cUf) // UF do Emitente no caso SP = 35
cXml+= XmlTag( "cNF", cNf ) // Controle da Nota ou numero do pedido
cXml+= XmlTag( "natOp", cCfop) // Natureza da Operação
cXml+= XmlTag( "indPag", cIndPag ) // Indice de Pagamento
cXml+= XmlTag( "mod", "55" ) // Modelo NFE=55 (FIXA)
cXml+= XmlTag( "serie", cSerie ) // Serie
cXml+= XmlTag( "nNF", cNf ) // Numero da Nota Fiscal
cXml+=XmlTag( "dhEmi", DateTimeXml(cDataE, cTimeE)) // Data Emissão Formato yyyy-mm-dd
If !Empty(cDataS)
cXml+= XmlTag( "dhSaiEnt", DateTimeXml(cDataS, cTimeS)) // Data da Saida da mercadoria
Endif
cXml+= XmlTag( "tpNF", cTipoNf) // Tipo de Emissão da NF
cXml+= XmlTag( "idDest", cIdest) // Identificador de Local de destino da operação (1-Interna;2-Interestadual; 3-Exterior)
cXml+= XmlTag( "cMunFG", cMunIbged ) // IBGE do destinatário
cXml+= XmlTag( "tpImp", "1") // Tipo de Impressão (Paisagem/Retrato) (FIXO)
cXml+= XmlTag( "tpEmis", "1") // Tipo de Emissão (FIXO)
cXml+= XmlTag( "cDV", Right(cDv, 1)) // DÃgito da Chave de Acesso
cXml+= XmlTag( "tpAmb" , cAmbiente) // Ambiente de Emissão (Hom./Producao)
cXml+= XmlTag( "finNFe" + cFinalidade ) // NF Complementar
If cAmbiente == [2] // Alteração para Homologação vigente a partir de 01/05/2011
cXml+= XmlTag( "indFinal", "1") // Indica operação com consumidor final (0-Não;1-Consumidor Final)
Else
cXml+= XmlTag( "indFinal", "0") // Indica operação com consumidor final (0-Não;1-Consumidor Final)
Endif
cXml+= XmlTag( "indPres" , cIndPres) // Indicador de Presença
* cXml+= '<indPres>' + Iif(oPresencial,'1',;
* Iif(GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 2 .or. GetProperty([f_Generico], [Cb_Finalidade], [Value]) == 3, [0], [2])) + '</indPres>' // Indicador de presença do comprador no estabelecimento comercial no momento da
* // operação. (0-Não se aplica (ex.: Nota Fiscal complementar ou de ajuste;1-Operação
* // presencial;2-Não presencial, internet;3-Não presencial, tele-atendimento;4-NFC-e entrega
* // em domicÃlio;9-Não presencial, outros.
cXml+= XmlTag( "procEmi", "3") // Fixo
cXml+= XmlTag( "verProc", "3.10.86") // Versão do XML
If !Empty(Nfrefencia)
cXml+= "<NFref>"
cXml+= XmlTag( "refNFe" + CharRem("/;-:,\.(){}[] ", Nfrefencia))
cXml+= "</NFref>"
Endif
cXml += '</ide>' // Final da TAG (ide)
Return (Nil)
Static Function GetChaveAcesso(cNF, cCnpj, cUfEmit, cSerie) // Manual cUf + AAMM + CNPJ + Mod + Serie + NrNota + cNF + cDV - Marcelo de Paula 22/06/2016
Local cKey:= cUfEmit /// no caso sp = 35
cKey+= SubStr(Dtoc(date()), 9, 2) + SubStr(Dtoc(date()), 4, 2)
cKey+= CharRem("/;-:,\.(){}[] ", cCnpj)
cKey+= [55] + Padl(cSerie, 3, [0])
cKey+= Padl(cNF, 9, [0])
cKey+= [1]
cKey+= Padl(cNF, 8, [0])
Return (cKey + fDv_nfe(cKey))
Static Function fDv_nfe(cVarchave) // Função para Calculo de Digito - Marcelo de Paula 22/06/2016
Local nCont1:= Len(cVarchave) + 1, nCont2:= x_Cont:= 1, nSoma:= 0, cDigito:= [0]
For x_Cont:= 1 to Len(cVarchave)
nCont1-= 1
nCont2+= 1
If nCont2 == 10
nCont2:= 2
Endif
nSoma+= Val(SubStr(cVarchave, nCont1, 1)) * nCont2
Next
If Mod(nSoma, 11) <= 1
cDigito:= [0]
Else
cDigito:= AllTrim(Str(11 - Mod(nSoma, 11), 10))
Endif
Return(cDigito)
FUNCTION XmlTag( cTag, cConteudo ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cTexto := ""
hb_Default( @cConteudo, "" )
cConteudo := AllTrim( cConteudo )
IF Len( Trim( cConteudo ) ) = 0
cTexto := [<]+ cTag + [/>]
ELSE
cConteudo := AllTrim( cConteudo )
IF Len( cConteudo ) == 0
cConteudo := " "
ENDIF
cTexto := cTexto + [<] + cTag + [>] + cConteudo + [</] + cTag + [>]
ENDIF
RETURN cTexto
FUNCTION DateTimeXml( dDate, cTime, cUF, lUTC ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL cText, lHorarioVerao
hb_Default( @dDate, Date() )
hb_Default( @cTime, Time() )
hb_Default( @cUF, "SP" )
hb_Default( @lUTC, .T. )
lHorarioVerao := ( dDate >= HorarioVeraoInicio( Year( dDate ) ) .AND. dDate <= HorarioVeraoTermino( Year( dDate - 1 ) ) )
cText := Transform( Dtos( dDate ), "@R 9999-99-99" ) + "T" + cTime
DO CASE
CASE ! lUTC ; cText += "" // no UTC
CASE cUF $ "AC" ; cText += "-05:00"
CASE cUF $ "MT,MS" .AND. lHorarioVerao ; cText += "-05:00"
CASE cUF $ "DF,ES,GO,MG,PR,RJ,RS,SC,SP" .AND. lHorarioVerao ; cText += "-04:00"
CASE cUF $ "AM,MT,MS,RO,RR" ; cText += "-04:00"
OTHERWISE ; cText += "-03:00"
ENDCASE
RETURN cText
FUNCTION HorarioVeraoInicio( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL dPrimeiroDeOutubro, dPrimeiroDomingoDeOutubro, dTerceiroDomingoDeOutubro
dPrimeiroDeOutubro := Stod( StrZero( iAno, 4 ) + "1001" )
dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + iif( Dow( dPrimeiroDeOutubro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeOutubro ) + 1 ) )
dTerceiroDomingoDeOutubro := dPrimeiroDomingoDeOutubro + 14
RETURN dTerceiroDomingoDeOutubro
FUNCTION DomingoDePascoa( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL iA, iB, iC, iD, iE, iF, iG, iH, iI, iK, iL, iM, iMes, iDia
iA := iAno % 19
iB := Int( iAno / 100 )
iC := iAno % 100
iD := Int( iB / 4 )
iE := iB % 4
iF := Int( ( iB + 8 ) / 25 )
iG := Int( ( iB - iF + 1 ) / 3 )
iH := ( 19 * iA + iB - iD - iG + 15 ) % 30
iI := Int( iC / 4 )
iK := iC % 4
iL := ( 32 + 2 * iE + 2 * iI - iH - iK ) % 7
iM := Int( ( iA + 11 * iH + 22 * iL) / 451 )
iMes := Int( ( iH + iL - 7 * iM + 114 ) / 31 )
iDia := ( ( iH + iL - 7 * iM + 114 ) % 31 ) + 1
RETURN Stod( StrZero( iAno, 4 ) + StrZero( iMes, 2 ) + StrZero( iDia, 2 ) )
FUNCTION TercaDeCarnaval( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
RETURN DomingoDePascoa( iAno ) - 47
FUNCTION HorarioVeraoTermino( iAno ) /// esta função está em ze_xmlfun.prg - postei somente para funcionar
LOCAL dPrimeiroDeFevereiro, dPrimeiroDomingoDeFevereiro, dTerceiroDomingoDeFevereiro
dPrimeiroDeFevereiro := Stod( StrZero( iAno + 1, 4 ) + "0201" )
dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + iif( Dow( dPrimeiroDeFevereiro ) == DOW_DOMINGO, 0, ( 7 - Dow( dPrimeiroDeFevereiro ) + 1 ) )
dTerceiroDomingoDeFevereiro := dPrimeiroDomingoDeFevereiro + 14
IF dTerceiroDomingoDeFevereiro == TercaDeCarnaval( iAno + 1 ) - 2 /* nao pode ser domingo de carnaval */
dTerceiroDomingoDeFevereiro += 7
ENDIF
RETURN dTerceiroDomingoDeFevereiro
cKey+= SubStr(Dtoc(date()), 9, 2) + SubStr(Dtoc(date()), 4, 2)
cKey += Right( StrZero( Year( Date() ), 4 ), 2 ) + StrZero( Day( Date() ), 2 )
Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante