Primeiro esboço.
Estou convertendo antigo relatório 60 colunas que usa replicate("-"... etc.
Ainda não está do meu agrado, removerei as linhas e ajustar para esquerda os campos numéricos... bastante intuitivo e simples.
Vamos colocando um em baixo do outro e o navegador vai organizando tudo. Depois que pegamos a "manha" é bem rápido.
cHtml += '<img src="./imagens/logoempresa.png" width="120" height="60" alt="Logo Empresa" >'
cHtml += '<table cellpadding="1" cellspacing="1">'
cHtml += '<tr><th align="center" colspan="5">ORÇAMENTO</th></tr>'
cHtml += '<tr><th align="left" colspan="5">Empresa.: ' + em->fantasia + '<br>'
cHtml += 'Telefone: ' + Transform(AllTrim(em->telefone),'@R (99) 9999-9999') + '<br>'
cHtml += 'Cliente.: ' + LTrim(SubStr(cCliente,1,37)) + '<br>'
cHtml += 'Vendedor: ' + AllTrim(cVendedor)+'<br>'
cHtml += 'PDV.....: ' + StrZero(nPdv,3)+'<br>'
cHtml += Str(Day(Date()),2)+" de "+SubStr(CMonth(Date()),1,3)+' de '+Str(Year(Date()),4)+' '+AMPM(Time())+'</th></tr>'
cHtml += '<tr><th>Descrição</th><th>Qtd</th><th>Preço</th><th>Total</th><th>Desc</th></tr>'
Do WHILE pd->(!eof())
IF Empty(pd->cod_mercad)
pd->(dbSkip())
LOOP
ENDIF
IF eq->(DbSeek(pd->cod_mercad))
ELSE
hwg_Msginfo('Não Foi Encontrado no Estoque')
pd->(DbSkip())
LOOP
ENDIF
cEAN := val(pd->cod_fiscal)
cHtml += '<tr><td colspan="5">' + padl(pd->mercadoria,48) + '</td></tr>'
cHtml += '<tr><td>' + pd->cod_mercad + '</td>'
IF es->(dbseek(eq->unidade))
IF es->precisao = 0
cHtml += '<td>' + Transform(pd->quantidade,'99999') + eq->unidade + '</td>'
ELSEIF es->precisao = 1
cHtml += '<td>' + Transform(pd->quantidade,'999999.9') + '</td>'
ELSEIF es->precisao = 2
cHtml += '<td>' + Transform(pd->quantidade,'99999.99') + '</td>'
ELSEIF es->precisao = 3
cHtml += '<td>' + Transform(pd->quantidade,'9999.999') + '</td>'
ENDIF
ELSE
cHtml += '<td>' + Transform(pd->quantidade,'99999') + eq->unidade + '</td>'
ENDIF
cHtml += '<td>' + SubStr(Transform(pd->preco_unit,'@e 999,999.99'),3,10) + '</td>'
cHtml += '<td>' + SubStr(Transform(Round(pd->quantidade*pd->preco_unit,2),'@e 999,999.99'),3,10) + '</td>'
cHtml += '<td>' + SubStr(Transform(pd->desconto, '@e 99,999.99'),3,9) + '</td></tr>'
nTotal += Round(pd->quantidade*pd->preco_unit,2)
pd->(dbSkip())
EndDo
IF nSemdesc-nTotal>0
cHtml += '<tr><td colspan="5" align="left"> Total Sem Desconto: '+Transform(nSemdesc,'@e 9999,999.99') + '</td></tr>'
cHtml += '<tr><td colspan="5" align="left"> Desconto de.......: '+Transform(nSemdesc-nTotal,'@e 9999,999.99') + '</td></tr>'
ENDIF
cHtml += '<tr><td colspan="5" align="left"> Total do Orçamento: ' + Transform(nTotal,'@e 9999,999.99') + '</td></tr>'
cHtml += '<tr><td colspan="5" align="left"> Forma de Pagamento: ' + SubStr(aFormVend[oFinaliza][1],1,20) + '</td></tr>'
cHtml += '<tr><td colspan="5" align="left"> Atenção, Controle Interno Sem Valor Fiscal. </td></tr>'
cHtml += '</table></div></body></html>'
hb_MemoWrit("orcamento.html",cHtml)
PS. O Forum "come" algumas tags.
Saudações,
Itamar M. Lins Jr.