Só estou pegando o fonte que já existe em Harbour, e transformando em SQL, ajustando necessidades.
Código: Selecionar todos
STATIC FUNCTION NfeBlocoProdutoIcms00( cXml, cnSQL )
WITH OBJECT cnSQL
cXml += [<ICMS00>]
cXml += XmlTag( "orig", Substr( :String( "IPICMCST" ), 1, 1 ) )
cXml += XmlTag( "CST", Substr( :String( "IPICMCST" ), 2, 2 ) )
cXml += XmlTag( "modBC", "3" ) // base valor da operacao
cXml += XmlTag( "vBC", :Number( "IPICMBAS" ), 2 )
cXml += XmlTag( "pICMS", :Number( "IPICMALI" ), 2 )
cXml += XmlTag( "vICMS", :Number( "IPICMVAL" ), 2 )
cXml += [</ICMS00>]
ENDWITH
RETURN Nil
No fonte SQL, pego diretamente da tabela.
Já poderia acabar com a função do Harbour, substituindo aqui:
Código: Selecionar todos
STATIC FUNCTION NfeBlocoProdutoIcms( cXml, cnSQL, nTotDifValf, nTotRemVal, nTotDesVal )
LOCAL nCst
nCst := Val( Substr( :String( "IPICMCST" ), 2 ) )
WITH OBJECT cnSQL
cXml += [<ICMS>]
DO CASE
CASE nCst == 0; NfeBlocoProdutoIcms00( @cXml, cnSQL )
Já poderia trocar a função Harbour pela função do SQL.
Com isso, vou migrando a conversão aos poucos, podendo conferir/colocar em prática um bloco de cada vez.
Acho que se fizer tudo numa única função SQL vai ser difícil conferir no caso de erro, seriam trocentas variáveis também.
Um bloco de cada vez, trata poucas variáveis, e facilita.
Talvez... apenas talvez... possa ser usado um BEGIN/END pra cada bloco, permitindo juntar tudo numa única function, e cada BEGIN/END tratando de suas variáveis.
NÃO dá pra colocar function dentro de function, mas dá pra usar IF/CASE, e um BEGIN/END em cada um, com suas próprias variáveis.
Tipo... um BEGIN/END pra IPI com as variáveis do IPI, um BEGIN/END pra ICMS com as variáveis do ICMS, etc.
O tempo vai dizer o que facilita mais...
