Usando os "bagulhos"(funções) do José Quintas!
********************************
FUNCTION CTeImportaXML(oDlgMain)
********************************
*
*
LOCAL oDlg, oFont, dhRec, cTitulo := "Importar CTe", dRecebido := Date(), cLocal
LOCAL lOk := .F.
PREPARE FONT oFont NAME "Verdana" WIDTH 0 HEIGHT -18
INIT DIALOG oDlg CLIPPER TITLE cTitulo Font oFont AT 0,0 SIZE 380,150
@ 005,035 Say "Recebimento:" size 130,20
@ 140,030 get oRecebido Var dRecebido size 100,30
@ 270,020 Button oBt Caption 'Cancelar' Size 100,30 ON CLICK {||hwg_EndDialog()}
@ 270,070 Button oBt Caption 'Confirmar' Size 100,30 ON CLICK {||lOk:=.t.,hwg_EndDialog()}
oDlg:Activate(,,,.T.)
IF !lOk
Return .t.
ENDIF
cLocal := hb_GetEnv("USERPROFILE") + "\Downloads"
cArq := HWG_SelectFile( "Arquivos XML ( *.xml )", "*.xml", cLocal )
cStr := hb_MemoRead( cArq )
DirChange( cDirSist )
IF Empty( cStr )
hwg_Msginfo("Não achou o arquivo XML")
RETURN .T.
ENDIF
cTagProtCTe := XmlNode(cStr, "protCTe" )
IF Empty(cTagProtCTe)
hwg_Msgstop( "TAG protCTe não localizada." )
RETURN .T.
ENDIF
cTagInfProt := XmlNode(cStr, "infProt" )
IF Empty(cTagInfProt)
hwg_Msgstop( "TAG infProt não localizada." )
RETURN .T.
ENDIF
cChCTe := XmlNode(cTagInfProt, "chCTe")
cTagIDE := XmlNode(cStr, "ide")
IF Empty(cTagIDE)
hwg_Msgstop( "TAG <ide> não localizada." )
RETURN .T.
ENDIF
cCCT := XmlNode(cTagIDE, "cCT")
cCFOP := XmlNode(cTagIDE, "CFOP")
cMod := XmlNode(cTagIDE, "mod")
cSerie := XmlNode(cTagIDE, "serie")
cNCT := XmlNode(cTagIDE, "nCT")
dhEmi := XmlNode(cTagIDE, "dhEmi")
dhEmi := StrTran(dhEmi,"T"," "); dhEmi := SubStr(dhEmi,1,19); dhEmi := hb_StrToTS(dhEmi)
dhSaiEnt := XmlNode(cTagIDE, "dhSaiEnt")
dhSaiEnt := StrTran(dhSaiEnt,"T"," "); dhSaiEnt := SubStr(dhSaiEnt,1,19); dhSaiEnt := hb_StrToTS(dhSaiEnt)
cTPCTe := XmlNode(cTagIDE,"tpCTe")
If Empty(cNCT)
hwg_Msgstop("CTe com problema."+hb_eol()+"Número da CTe, não informado.")
RETURN .T.
EndIf
If Empty(dhEmi)
hwg_Msgstop("CTe com problema."+hb_eol()+"DATA da emissão, não informada.")
RETURN .T.
EndIf
cCMunEnv := XmlNode(cTagIDE, "cMunEnv")
cXMunEnv := XmlNode(cTagIDE, "xMunEnv")
cUFEnv := XmlNode(cTagIDE, "cUFEnv")
cCMunIni := XmlNode(cTagIDE, "cMunIni")
cXMunIni := XmlNode(cTagIDE, "xMunIni")
cUFIni := XmlNode(cTagIDE, "cUFIni")
cCMunFim := XmlNode(cTagIDE, "cMunFim")
cXMunFim := XmlNode(cTagIDE, "xMunFim")
cUFFim := XmlNode(cTagIDE, "cUFFim")
cTagEmit := XmlNode(cStr, "emit")
IF Empty(cTagEmit)
hwg_Msgstop( "TAG <emit> não localizada." )
RETURN .T.
ENDIF
cCNPJ := XmlNode(cTagEmit, "CNPJ")
cIE := XmlNode(cTagEmit, "IE")
cXNome := XmlNode(cTagEmit, "xNome")
cTagEnderEmit := XmlNode(cStr, "enderEmit")
IF Empty(cTagEnderEmit)
hwg_Msgstop( "TAG <enderEmit> não localizada." )
RETURN .T.
ENDIF
cXLgr := XmlNode(cTagEnderEmit, "xLgr")
cNro := XmlNode(cTagEnderEmit, "nro")
cXBairro := XmlNode(cTagEnderEmit, "xBairro")
cCMun := XmlNode(cTagEnderEmit, "cMun")
cXMun := XmlNode(cTagEnderEmit, "xMun")
cCEP := XmlNode(cTagEnderEmit, "CEP")
cUF := XmlNode(cTagEnderEmit, "UF")
cFone := XmlNode(cTagEnderEmit, "fone")
cTagVPrest := XmlNode(cStr, "vPrest")
IF Empty(cTagVPrest)
hwg_Msgstop( "TAG <vPrest> não localizada." )
RETURN .T.
ENDIF
nVTPrest := Val( XmlNode(cTagVPrest, "vTPrest") )
nVDesc := 0
cTagImp := XmlNode(cStr, "imp")
IF Empty(cTagImp)
hwg_Msgstop( "TAG <imp> não localizada." )
RETURN .T.
ENDIF
nVBCUFFim := Val( XmlNode(cTagImp, "vBCUFFim") )
nPICMSUFFim:= Val( XmlNode(cTagImp, "pICMSUFFim") )
nVICMSUFFim:= Val( XmlNode(cTagImp, "vICMSUFFim") )
cTagInfNFe := XmlNode(cStr, "infNFe")
IF Empty(cTagInfNFe)
hwg_Msgstop( "TAG <infNFe> não localizada." )
RETURN .T.
ENDIF
cChave := XmlNode(cTagInfNFe, "chave")
cCodFor := ""
fo->(OrdSetFocus(3)) //CNPJ
IF lAchouFornec := fo->(DbSeek(cCNPJ))
cCodFor := fo->cod_fornec
AtualizarDadosFornededor(lAchouFornec,cCodFor,cCNPJ,cXNome,cXLgr,cNro,cXBairro,cCMun,cXMun,cUF,cCEP,cFone,cIE)
tp70->(ordSetFocus(4)) //dtos(dataemi)+numero+cnpj
IF tp70->( dbSeek( DToS(hb_ttod(dhEmi)) + cCNPJ + strzero(val(cNCT),9) ) ) //DToS(dhSaiEnt)) )
tp70->(ordSetFocus(1))
fo->(ordSetFocus(1))
oDlgMain:oBrw:Refresh()
hwg_MsgStop("CTe já cadastrada: " + strzero(val(cNCT),9) + " - " + cXNome + " - " + DToC(hb_TToD(dhEmi)) ) //DToS(dhSaiEnt) )
RETURN .F.
ENDIF
ENDIF
//Novo fornecedor
If Empty(cCodFor)
fo->(OrdSetFocus(1))
fo->(DbGoBottom())
nPos := hb_At( SubStr(fo->cod_fornec,1,1), "ABCDEFGHIJKLMNOPQRSTUVWXYZ" )
IF SubStr(fo->cod_fornec,2,3) == "999"
cCodFor := SubStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",nPos+1,1) + "001"
Else
cCodFor := SubStr(fo->cod_fornec,1,1) + strzero(val(substr(fo->cod_fornec,2,3))+1,3)
ENDIF
AtualizarDadosFornededor(lAchouFornec,cCodFor,cCNPJ,cXNome,cXLgr,cNro,cXBairro,cCMun,cXMun,cUF,cCEP,cFone,cIE)
EndIF
Incluir('tp70')
tp70->cod_fornec := cCodFor
tp70->fornecedor := cXNome
tp70->cnpj := cCNPJ
tp70->uf := cUF
tp70->ctechave := cChCTe
tp70->ctechavere := cChave
tp70->datarec := dRecebido
tp70->dataemi := hb_ttod(dhEmi)
tp70->ctetipo := cTPCTe
tp70->modelo := Val(cMod)
tp70->serie := cSerie
tp70->subserie := ""
tp70->numero := Val(cNCT)
tp70->cfop := cCFOP
tp70->total := nVTPrest
tp70->desconto := nVDesc
tp70->baseicms := nVBCUFFim
tp70->aliquota := nPICMSUFFim
tp70->valoricms := nVICMSUFFim
tp70->vlrredbc := 0
tp70->isenta := 0
tp70->outras := nVICMSUFFim
tp70->ciffob := "2"
tp70->situacao := "N"
tp70->cod_inf := ""
tp70->ctaconta := ""
tp70->CodMunDest := cCMunFim
tp70->CodMunOrig := cCMunIni
tp70->loja := "001"
tp70->(ordSetFocus(1))
fo->(ordSetFocus(1))
oDlgMain:oBrw:Refresh()
RETURN .T.
****************************************
FUNCTION XmlNode( cXml, cNode, lComTag )
****************************************
*
*
LOCAL nInicio, nFim, cResultado := ""
hb_Default( @lComTag, .F. )
nInicio := At( "<" + cNode, cXml )
// a linha abaixo é depois de pegar o inÃcio, senão falha
IF " " $ cNode
cNode := Substr( cNode, 1, At( " ", cNode ) - 1 )
ENDIF
IF nInicio != 0
IF ! lComTag
nInicio := nInicio + Len( cNode ) + 2
IF nInicio != 1 .AND. Substr( cXml, nInicio - 1, 1 ) != ">" // Quando tem elementos no bloco
nInicio := hb_At( ">", cXml, nInicio ) + 1
ENDIF
ENDIF
nFim := hb_At( "</" + cNode + ">", cXml, nInicio )
IF nFim != 0
nFim -= 1
IF lComTag
nFim := nFim + Len( cNode ) + 3
ENDIF
cResultado := Substr( cXml, nInicio, nFim - nInicio + 1 )
ENDIF
ENDIF
RETURN cResultado
Li alhures, que CTe gera crédito de ICMS para as empresas.
Saudações,
Itamar M. Lins Jr.