Um outro fonte alterado.
Apesar de relativamente simples, é mais interessante.
Código: Selecionar todos
FUNCTION MsgSemRegra( cModulo )
LOCAL cTexto := ""
hb_Default( @cModulo, m_Prog )
cTexto += "REGRA DE TRIBUTAÇÃO:" + hb_eol()
cTexto += hb_eol()
cTexto += "Transação..........: "
IF Empty( jppedido->pdTransa )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jppedido->pdTransa + " " + DescricaoJPTRANSA( jppedido->pdTransa )
ENDIF
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação UF......: "
IF Empty( jpuf->ufTriUf )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpuf->ufTriUf + " " + Trim( AUXTRIUFClass():Descricao( jpuf->ufTriUf ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpcadastro->cdUf
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Cadastro: "
IF Empty( jpcadastro->cdTriCad )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpcadastro->cdTriCad + " " + Trim( AUXTRICADClass():Descricao( jpcadastro->cdTriCad ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpcadastro->idCadastro + " " + jpcadastro->cdNome
cTexto += hb_eol() + hb_eol()
Encontra( jpcadastro->cdUf, "jpuf", "numlan" )
cTexto += "Tributação Produto.: "
IF Empty( jpitem->ieTriPro )
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += jpitem->ieTriPro + " " + Trim( AUXTRIPROClass():Descricao( jpitem->ieTriPro ) )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + jpitem->idProduto + " " + jpitem->ieDescri
cTexto += hb_eol() + hb_eol()
IF Empty( jpitped->ipPisCst )
cTexto += "*** produto sem CST PIS ***" + hb_eol()
ENDIF
cTexto += "Posição:" + cModulo + hb_eol()
cTexto += hb_eol()
cTexto += "Não foi encontrada uma regra de tributação para essa combinação de informações" + hb_eol()
cTexto += "Pode ser alguma informação errada, ou falta cadastrar uma regra de tributação com esta combinação" + hb_eol()
cTexto += "Se for na confirmação do pedido, pode faltar passar na digitação de produto pra atualizar pedido" + hb_eol()
MsgWarning( cTexto )
RETURN NIL
O que ele usa:
- JPITPED - produtos dos pedidos
- JPPEDIDO - pedidos
- JPCADASTRO - cadastros
- JPTRANSA - transação
- JPITEM - produtos
- JPUF - pra UFs
- JPAUXILIAR - para descrição de tributação de UF
- JPAUXILIAR - pra descrição de tributação de cadastro
- JPAUXILIAR - pra descrição de tributação de produto
Por isso é interessante: são 7 DBFs, mas equivalente a 9 DBFs.
Como ficou em SQL: o de sempre, o comando e o uso do resultado.
Código: Selecionar todos
FUNCTION MsgSemRegra( mIdItPed, cModulo )
LOCAL cTexto := ""
LOCAL cnSQL := ADOClass():New( AppConexao() )
hb_Default( @cModulo, m_Prog )
WITH OBJECT cnSQL
:cSQL := "SELECT" + ;
" JPPEDIDO.PDTRANSA, JPTRANSA.TRDESCRI," + ;
" JPPEDIDO.PDCADASTRO, JPCADASTRO.CDNOME, JPCADASTRO.CDTRICAD, TRICAD.AXDESCRI AS TRICADDESCRI," + ;
" JPCADASTRO.CDUF, JPUF.UFTRIUF, TRIUF.AXDESCRI AS TRIUFDESCRI," + ;
" JPITPED.IPPRODUTO, JPITEM.IEDESCRI, JPITEM.IETRIPRO, TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
" FROM JPITPED" + ;
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
" LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
" LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
" LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
" LEFT JOIN JPUF ON JPUF.UFUF = JPCADASTRO.CDUF" + ;
" LEFT JOIN JPAUXILIAR AS TRICAD ON TRICAD.AXTABELA = " + StringSQL( AUX_TRICAD ) + ;
" AND TRICAD.AXCODIGO = JPCADASTRO.CDTRICAD" + ;
" LEFT JOIN JPAUXILIAR AS TRIPRO ON TRIPRO.AXTABELA = " + StringSQL( AUX_TRIPRO ) + ;
" AND TRIPRO.AXCODIGO = JPITEM.IETRIPRO" + ;
" LEFT JOIN JPAUXILIAR AS TRIUF ON TRIUF.AXTABELA = " + StringSQL( AUX_TRIUF ) + ;
" AND TRIUF.AXCODIGO = JPUF.UFTRIUF" + ;
" WHERE JPITPED.IDITPED = " + NumberSQL( midItPed )
:Execute()
cTexto += "REGRA DE TRIBUTAÇÃO:" + hb_eol()
cTexto += hb_eol()
cTexto += "Transação..........: "
IF :Number( "PDTRANSA" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "PDTRANSA" ), 6 ) + " " + :String( "TRDESCRI" )
ENDIF
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação UF......: "
IF :Number( "UFTRIUF" ) = 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "UFTRIUF" ), 6 ) + " " + :String( "TRIUFDESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + :String( "CDUF", 2 )
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Cadastro: "
IF :Number( "CDTRICAD" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "CDTRICAD" ), 6 )+ " " + :String( "TRICADDESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + Str( :Number( "PDCADASTRO" ), 6 ) + " " + :String( "CDNOME" )
cTexto += hb_eol() + hb_eol()
cTexto += "Tributação Produto.: "
IF :Number( "IETRIPRO" ) == 0
cTexto += MSG_DESCONHECIDO
ELSE
cTexto += Str( :Number( "IETRIPRO" ), 6 ) + " " + :String( "TRIPRODESCRI" )
ENDIF
cTexto += hb_eol()
cTexto += Space(10) + Str( :Number( "IPPRODUTO" ), 6 ) + " " + :String( "IEDESCRI" )
cTexto += hb_eol() + hb_eol()
cTexto += "Posição:" + cModulo + hb_eol()
cTexto += hb_eol()
cTexto += "Não foi encontrada uma regra de tributação para essa combinação de informações" + hb_eol()
cTexto += "Pode ser alguma informação errada, ou falta cadastrar uma regra de tributação com esta combinação" + hb_eol()
cTexto += "Se for na confirmação do pedido, pode faltar passar na digitação de produto pra atualizar pedido" + hb_eol()
:CloseRecordset()
ENDWITH
MsgWarning( cTexto )
RETURN NIL
Parece complicado, mas é o de sempre.
SELECT com a seleção dos campos que interessam
" JPPEDIDO.PDTRANSA, JPTRANSA.TRDESCRI," + ;
" JPPEDIDO.PDCADASTRO, JPCADASTRO.CDNOME, JPCADASTRO.CDTRICAD, TRICAD.AXDESCRI AS TRICADDESCRI," + ;
" JPCADASTRO.CDUF, JPUF.UFTRIUF, TRIUF.AXDESCRI AS TRIUFDESCRI," + ;
" JPITPED.IPPRODUTO, JPITEM.IEDESCRI, JPITEM.IETRIPRO, TRIPRO.AXDESCRI AS TRIPRODESCRI" + ;
se quiser comparar com DBF, seria só trocar o ponto pelo ->
por exemplo, jpcadastro.cdnome, equivale a jpcadastro->cdnome, seria o campo CDNOME que está na tabela JPCADASTRO
FROM com a indicação de onde vém
FROM JPITPED - vém dos produtos dos pedidos (itens do pedido)
LEFT JOIN é o relacionamento, pra "ensinar" o MySQL qual a ligação/relacionamento entre os arquivos
" LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPITPED.IPPEDIDO" + ;
vai usar o campo jpitped->ipPedido pra procurar nos pedidos o jppedido->idPedido com mesmo número
WHERE pra indicar o filtro
" WHERE JPITPED.IDITPED = " + NumberSQL( midItPed )
Vai procurar o lançamento de produto para um pedido, aonde a identificação desse lançamento é esse número
Em termos práticos: a partir do lançamento no pedido, vai pesquisar todas as informações relacionadas a ele. (as que interessam neste fonte)
E isso é feito usando um único comando SQL.
Então, o comando diz qual a informação, e como o servidor vai fazer pra pegar a informação.
O comando grande não significa que vai demorar mais.
Por último: o retorno, NESSE CASO, é apenas um registro com todo conteúdo indicado.
A partir daí, só usar o registro.
Nota:
Só lembrando que eu decidi fazer desse jeito, não significa que é a única forma de fazer isso.
E esses relacionamentos poderiam já ter sido definidos previamente na própria base de dados, e nem precisar colocar no comando.
É só uma das muitas possibilidades de se fazer isso.
Ainda estou saindo dos DBFs... vou fazendo do jeito que conheço...