SQL Embedded - manipulação

Boa tarde Senhores, - Estou tentando fazer uma alteração de um campo mas até agora sem sucesso. - Eu consigo fazer a consulta da tabela, o programa faz a comparação dos campos, tudo ok, mas na hora de fazer alteração, ele retorna dizendo que o campo está bloqueado. - Já tentei usar o RecLock de diversas formas mas ainda nada. - Fazendo pelo SQL Embedded eu nao consigo setar um nome para o Alias para colocar no Reclock - Usei o GetLastQuery para saber o nome do alias e retornou: SCGN0000C0 - Joguei o SCGN0000C0 deu erro tbm. Se alguem puder me ajudar , ficarei muito grato.

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

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.

Então Daniel Mendes, não deu certo ele me retorna,informando que o SCJ não foi encontrado :frowning:

Eu utilizei essas msg no codigo para saber o processo dele, por onde ele ta passando.

Eu fiz uma correção no código, seu exemplo precisa de ambiente aberto, então você precisa colocar essa rotina no menu.

Eu abro essa função assim :SIGAFAT>ORÇAMENTOS>ORÇAMENTOS>OUTRAS OPÇOES.
Ai tem uma função que chama a CANORCA.PRW. lá dentro do mata415 O QUE MAIS PRECISO FAZER?

O erro é bem nessa linha : SCJ->CJ_STATUS := ‘C’

Screenshot_1.jpg

Alias does not exist CJ_STATUS U_CANORCA - CANORCA.PRW(51) EXECUTE - FWFORMBROWSE.PRW(1167) - Params: CFUNCTION:U_CANORCA(),NOPTION:3,NVERIFY:0,CTITLE:VALIDADE ORÇAMENTO,NREALOPC:11,CPARFUNCTION:(),COPERATID:VALIDADE ORÇAMENTO,CTOOLBAR:,NROTOPC:11 ) {|| OSELF:EXECUTE("U_CANORCA", 3, 0,"VALIDADE ORÇAMENTO", 11,"()","VALIDADE ORÇAMENTO","", 11) } - FWFORMBROWSE.PRW(579) MSDIALOG:ACTIVATE - (0) ACTIVATE - FWMBROWSE.PRW(700) - Params: OOWNER:O ) FWMBROWSE - MSLIB.PRW(10429) - Params: CALIAS:SCJ,AFIXE:NIL,CCPO:NIL,CFUN:.f.,NDEFAULT:NIL,@ACOLORS:,CTOPFUN:NIL,CBOTFUN:NIL,BPARBLOCO:NIL,LNOTOPFILTER:.F.,LSEEALL:NIL,LCHGALL:NIL,CEXPRFILTOP:,NINTERVAL:NIL,BTIMERACTION:NIL,CTELA:NIL,CFILTERDEFAULT:NIL,BBEFOREACTIVATE:NIL,@AOBFUSCFIELDS: ) MBROWSE - MSLIB.PRW(169) - Params: NT:6,NL:1,NB:22,NR:75,CALIAS:SCJ,AFIXE:NIL,CCPO:NIL,NPOSI:NIL,CFUN:.f.,NDEFAULT:NIL,@ACOLORS:,CTOPFUN:NIL,CBOTFUN:NIL,NFREEZE:NIL,BPARBLOCO:NIL,LNOTOPFILTER:.F.,LSEE...

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Fiz uma alteração no código, essa rotina precisa ser utilizada dentro de menu, pois ela exige o ambiente aberto.

Consegui Daniel Mendes, Tive que colocar o getarea e o obrowse =: GetobjBrow