Pra quem achou que aquele FOR/EACH pra Hash foi uma maravilha por reduzir de 100 linhas pra 30....
Código: Selecionar todos
cItemICMSST := XmlNode( cItem, "ICMSST" )
::aItemICMSST := hb_Hash()
FOR EACH oElement IN { "orig", "CST", "vBCSTRet", "vICMSSTRet", "vBCSTDest", "vICMSSTDest" }
::aItemICMSST[ oElement ] := XmlNode( cItemIcmsSt, oElement )
NEXT
cItemICMSSN101 := XmlNode( cItem, "ICMSSN101" )
::aItemICMSSN101 := hb_Hash()
FOR EACH oElement IN { "orig", "CSOSN", "pCredSN", "vCredICMSSN" }
::aItemICMSSN101[ oElement ] := XmlNOde( cItemIcmsSN101, oElement )
NEXT
cItemICMSSN102 := XmlNode( cItem, "ICMSSN102" )
::aItemICMSSN102 := hb_Hash()
FOR EACH oElement IN { "orig", "CSOSN" }
::aItemICMSSN102[ oElement ] := XmlNode( cItemIcmsSN102, oElement )
NEXT
cItemICMSSN201 := XmlNode( cItem, "ICMSSN201" )
::aItemICMSSN201 := hb_Hash()
FOR EACH oElement IN { "orig", "CSOSN", "modBCST", "pMVAST", "pRedBCST", "vBCST", "pICMSST", "vICMSST", "pCredSN", "vCredICMSSN" }
::aItemICMSSN201[ oElement ] := XmlNode( cItemIcmsSN201, oElement )
NEXT
cItemICMSSN202 := XmlNode( cItem, "ICMSSN202" )
::aItemICMSSN202 := hb_Hash()
FOR EACH oElement IN { "orig", "CSOSN", "modBCST", "pMVAST", "pRedBCST", "vBCST", "pICMSST", "vICMSST" }
::aItemIcmsSN202[ oElement ] := XmlNode( cItemIcmsSN202, oElement )
NEXT
cItemICMSSN500 := XmlNode( cItem, "ICMSSN500" )
::aItemICMSSN500 := hb_Hash()
FOR EACH oElement IN { "orig", "CSOSN", "vBCSTRet", "vICMSSTRet" }
::aItemICMSSN500[ oElement ] := XmlNode( cItemIcmsSN500, oElement )
NEXT
Que tal reduzir pra 6 linhas?
Código: Selecionar todos
::aItemICMSST := XmlToHash( XmlNode( cItem, "ICMSST" ), { "orig", "CST", "vBCSTRet", "vICMSSTRet", "vBCSTDest", "vICMSSTDest" } )
::aItemICMSSN101 := XmlToHash( XmlNode( cItem, "ICMSSN101" ), { "orig", "CSOSN", "pCredSN", "vCredICMSSN" } )
::aItemICMSSN102 := XmlToHash( XmlNode( cItem, "ICMSSN102" ), { "orig", "CSOSN" } )
::aItemICMSSN201 := XmlToHash( XmlNode( cItem, "ICMSSN201" ), { "orig", "CSOSN", "modBCST", "pMVAST", "pRedBCST", "vBCST", "pICMSST", "vICMSST", "pCredSN", "vCredICMSSN" } )
::aItemICMSSN202 := XmlToHash( XmlNode( cItem, "ICMSSN202" ), { "orig", "CSOSN", "modBCST", "pMVAST", "pRedBCST", "vBCST", "pICMSST", "vICMSST" } )
::aItemICMSSN500 := XmlToHash( XmlNode( cItem, "ICMSSN500" ), { "orig", "CSOSN", "vBCSTRet", "vICMSSTRet" } )
STATIC FUNCTION XmlToHash( cXml, aTagList )
LOCAL oElement, oVar := hb_Hash()
FOR EACH oElement IN aTagList
oVar[ oElement ] := XmlNode( cXml, oElement )
NEXT
RETURN oVar
Notem que apenas usei uma função pra substituir o que estava se repetindo por todo fonte.