Olá,
Não é possível fazer a edição de uma workarea de query.
Quando você abre uma query, independe da forma, seja via Embedded SQL
, via DBUseArea
com TCGenQry
, essa workarea é apenas um resultset do banco, tudo ali é apenas leitura, logo é impossível efetuar qualquer commit.
Caso queira editar os registros com base no resultset de uma query, você pode fazer com que sua query retorne o R_E_C_N_O_
e com base nele, você posiciona a tabela via dbGoTo
e então altera o registro.
Focando em seu exemplo, somente no código que não está comentado, você teria mais ou menos o seguinte resultado:
#include "protheus.ch"
#include "totvs.ch"
#include "fwmvcdef.ch"
user function Canorca()
local dDat_DE as character
local dDat_ATE as character
local cAliasProd := GetNextAlias() as character
local aDados := {} as array
local cResult as character
local aDatas as array
local nPos := '0' as character
dDat_DE := FwInputBox("Digite a data inicial que deseja fechar os orçamentos",dDat_DE)
dDat_ATE := FwInputBox("Digite a data final que deseja fechar os orçamentos", dDat_ATE)
dDat_DE := cToD(dDat_DE)
dDat_ATE := cToD(dDat_ATE)
dbSelectArea("SCJ")
beginSql alias cAliasProd
Column CJ_NUM as Numeric(6,0)
Column CJ_EMISSAO as date
%NOPARSER%
SELECT CJ_NUM,
CJ_STATUS,
CJ_EMISSAO,
R_E_C_N_O_ RECN
FROM %TABLE:SCJ%
WHERE CJ_FILIAL = %xFilial:SCJ%
AND CJ_EMISSAO >= %EXP:dDat_DE%
AND CJ_EMISSAO <= %EXP:dDat_ATE%
//AND CJ_STATUS = A
AND %NOTDEL%
endsql
while !(cAliasProd) -> (eof())
if (cAliasProd)->CJ_STATUS = "A"
SCJ->(dbGoTo((cAliasProd)->RECN))
if Reclock("SCJ",.F.)
SCJ->CJ_STATUS := 'C'
SCJ->(MsUnlock())
endif
cResult := "Deu BOM"
else
cResult := "Deu ruim"
endif
MsgInfo("TROCADAS :" + cValToChar(nPos) + '---DATA CORRIDA :' + cValToChar(CJ_EMISSAO), "Atenção: " + cValToChar(cResult) )
aAdd(aDados, {CJ_NUM,CJ_EMISSAO,CJ_STATUS,cResult})
(cAliasProd)->(dbSkip())
enddo
(cAliasProd)->(dbClosearea())
aDatas := GetLastQuery()
cMensagem := ""
cMensagem += "* cAlias - " + aDatas[1] + Chr(13) + Chr(10)
cMensagem += "* cQuery - " + aDatas[2]
MsgInfo(cMensagem, "Atenção")
return
O foco dá alteração está em trazer o recno para a query e utilizar dele, para fazer o dbgoto no alias SCJ, pois esse de fato é a tabela do banco que permite inclusões, alterações e exclusões.
Obs.: Não sei o exato intuito desse código, mas colocar um MsgInfo
dentro de um laço, pode gerar uma quantidade bem alta de mensagens, além de fazer com que todo o processo depende de alguém ficar clicando no OK.