METHOD SalvaCustoProduto( nIdPedido ) CLASS SubPedidoClass
LOCAL npdValCus := 0, cnSQL := ADOClass():New( AppConexao() )
IF nIdPedido == 0
RETURN NIL
ENDIF
WITH OBJECT cnSQL
:cSQL := "UPDATE JPITPED, JPITEM" + ;
" SET IPPRECUS = JPITEM.IEULTPRE, IPVALCUS = JPITPED.IPQTDE * JPITEM.IEULTPRE" + ;
" WHERE IPPEDIDO = " + NumberSQL( nIdPedido ) + " AND JPITPED.IPPRODUTO = JPITEM.IDPRODUTO"
:ExecuteCmd()
:cSQL := "SELECT SUM( IPVALCUS ) AS VALCUS" + ;
" FROM JPITPED" + ;
" WHERE IPPEDIDO = " + NumberSQL( nIdPedido )
:Execute()
nPdValCus += :Number( "VALCUS" )
:CloseRecordset()
:QueryCreate()
:QueryAdd( "PDVALCUS", npdValCus )
:QueryAdd( "PDINFALT", LogInfo() )
:QueryExecuteUpdate( "JPPEDIDO", "IDPEDIDO = " + NumberSQL( nIdPedido ) )
ENDWITH
RETURN NIL
Isso dá pra simplificar pra dois comandos
METHOD SalvaCustoProduto( nIdPedido ) CLASS SubPedidoClass
LOCAL cnSQL := ADOClass():New( AppConexao() )
IF nIdPedido == 0
RETURN NIL
ENDIF
WITH OBJECT cnSQL
//:ExecuteCmd( "call ze_PedidoSalvaCusto( " + NumberSQL( nIdPedido ) + ", " + StringSQL( LogInfo() ) + " )" )
:ExecuteCmd( "UPDATE JPITPED, JPITEM" + ;
" SET IPPRECUS = JPITEM.IEULTPRE, IPVALCUS = JPITPED.IPQTDE * JPITEM.IEULTPRE" + ;
" WHERE IPPEDIDO = " + NumberSQL( nIdPedido ) + " AND JPITPED.IPPRODUTO = JPITEM.IDPRODUTO" )
:ExecuteCmd( "UPDATE JPPEDIDO" + ;
" SET PDVALCUS = ( SELECT SUM( IPVALCUS ) AS VALCUS" + ;
" FROM JPITPED" + ;
" WHERE IPPEDIDO = " + NumberSQL( nIdPedido ) + ")," + ;
" PDINFALT = " + StringSQL( LogInfo() ) + ;
" WHERE IDPEDIDO = " + NumberSQL( nIdPedido ) )
ENDWITH
RETURN NIL
O que está comentado é o que vai ser depois: apenas uma chamada a uma stored procedure
CREATE PROCEDURE ze_PedidoSalvaCusto(
nIdPedido INT(11),
cLogInfo VARCHAR(100)
)
BEGIN
IF nIdPedido <> 0 THEN
UPDATE JPITPED, JPITEM
SET IPPRECUS = JPITEM.IEULTPRE, IPVALCUS = JPITPED.IPQTDE * JPITEM.IEULTPRE
WHERE IPPEDIDO = nIdPedido AND JPITPED.IPPRODUTO = JPITEM.IDPRODUTO;
UPDATE JPPEDIDO
SET PDVALCUS = ( SELECT SUM( IPVALCUS )
FROM JPITPED
WHERE IPPEDIDO = nIdPedido ),
PDINFALT = cLogInfo
WHERE IDPEDIDO = nIdPedido;
END IF;
END
Esse fonte acima vai ser executado no MySQL, e vai criar a STORED PROCEDURE que vai fazer o cálculo.
A partir daÃ.... disponÃvel pra qualquer linguagem de programação.
E assim... de pedacinho em pedacinho... apagando fonte Harbour e substituindo por fonte SQL.
A nova rotina em Harbour vai ficar assim:
METHOD SalvaCustoProduto( nIdPedido ) CLASS SubPedidoClass
LOCAL cnSQL := ADOClass():New( AppConexao() )
cnSQL:ExecuteCmd( "call ze_PedidoSalvaCusto( " + NumberSQL( nIdPedido ) + ", " + StringSQL( LogInfo() ) + " )" )
RETURN NIL
Pois é....
trabalhar com Microsoft ADO fica preso a... NADA... só usando recursos do servidor MySQL.
Então....
Foi isso que eu sempre quis dizer sobre o ADO.
Não se trata de ser melhor ou pior.
Apenas não dependemos de ninguém, e vamos dando atenção à parte importante.
É enviar comando e receber resposta (se tiver).
Sem se aprofundar em recursos extras do ADO, assim não fica preso ao ADO.
E todo conhecimento vale pra qualquer coisa depois.
O difÃcil é depois querer trocar ADO por outra coisa, porque não faz mais diferença kkkk
E nesse caso, tanto faz se o formato fosse DBF, array ou recordset.... não tá usando nenhum deles kkkk