Pesquisei no fórum e não encontrei algo sobre a falha que ocorre aqui em um único lugar e a única loja.
Ocorre o seguinte:
Dois vendedores emitindo lançamentos de orçamento no banco de dados de orçamento, compartilhado.
Os dois vendedores efetuam registro de um item cada um enviando o comando DbAppend() ao banco de dados ao mesmo tempo, logicamente e tecnicamente deveria abrir no banco de dados dois registros em branco um para cada um, correto.
Bom, isto não ocorre rotineiramente, mas ocorre e necessito descobrir exatamente o porque.
Código abaixo
Static Procedure GravaOrc(atipo,amodo)
ShowWaitProc()
If amodo=="INCLUIR" //OCORRE EXATAMENTE NESTA LINHA ABAIXO
DbAppend() //tenta abrir o registro
While NetErr() //se nao conseguir abrir o registro, tente novamente
ShowWaitProc()
DbAppend() //se houve erro, retente para inserir novo registro
End
**** comentário sobre a linha acima no final do código.
Field->NR_DOC :=WDoc
Field->DATA :=WData
Field->CODIGO :=WCod
Field->NOME :=WNome
Field->VEND :=WVend
Field->PRACA :=WPraca
Field->COD_MERC :=WMerc
Field->TIPO :=p_DV
Field->GENERICO :=If(Left(wMerc,4)=="9999",w_DESCRICAO,w_GENERICO)
ElseIf atipo=="DBCOMITA" //E ALTERAR
While !RLock()
ShowMessage(,,"Aguardando liberação do registro do orçamento...",1)
End
EndIf
Field->DESCRICAO :=w_DESCRICAO
Field->GENERICO :=w_GENERICO
Field->DECIMAIS :=w_DECIMAIS
Field->ITEM :=w_ITEM
Field->UNIDADE :=w_UNIDADE
Field->LUCRO :=w_LUCRO
Field->CUSTO :=w_CUSTO
Field->COMISSAO :=w_COMISSAO
Field->GER_COM :=w_GER_COM
Field->SITUACAO :=w_SITUACAO
Field->DESCONTO :=w_DESCONTO
Field->VR_VENDIDO:=w_VR_VENDIDO
Field->SETOR1 :=w_SETOR1
Field->SETOR2 :=w_SETOR2
Field->SETOR3 :=w_SETOR3
Field->SETOR4 :=w_SETOR4
Field->QTE_REAL :=w_QTE_REAL
Field->QTE_ENT :=w_QTE_ENT
Field->QTE_REQ :=w_QTE_REQ
Field->OPER :=WOper
ShowWaitProc()
If(aTipo=="DBCOMITA",DbCommit(),.T.)
ShowWaitProc()
If(aTipo=="DBCOMITA".And.amodo=="ALTERAR",DbUnLock(),.T.)
ShowWaitProc()
Return .T.
Antes eu não usava a função neterr(), e ocorria com mais frequencia a falha, passei usar o neterr() e diminuiu a falha de sumir com algum item.
no entanto o erro em particular que ocorreu agora foi coisa esquisita.
um vendedor lançou o item 0917004 com descricao latex tal tal tal no valor 88,80 total e 2 quantidades
o outro vendedor lançou o item 0412026 com a descricao revestimento tal tal tal no valor total de 400,00 e 26 metros.
detalhe crucial, neste registro aberto no banco de dados apenas ficou 0917004 com a descricao revestimento tal tal tal no valor 88,80 com 26 metros.
um absurdo de erro, ao invés de haver dois registros, apenas abriu um e misturou os dois.
pergunto?, na internet pesquisando descobrir que usar o dbappend() desta forma, causa a liberação dos bloqueios pendentes, quais?, nao entendi, e usando
Dbappend(.F.) passando o parametro .F., os bloqueios são mantidos, quais não entendi.
fiz teste em laboratório não vi diferença alguma na gravação, grava normal, agora não sei se em produção em estado crÃtico daria algum problema ou não.
por isto pergunto agora primeiro antes de me aventurar.
Ou se por acaso há alguma outra forma de abrir o registro com mais segurança ou apenas um abrir e os outros ficam aguardando na fila, até que este seja gravado, coisa de 1 segundo para cada item, se tem como fazer isto, um só abrir o registro e os outros aguardarem ficaria melhor e mais seguro.
aguardo retorno.
Um abraço a todos.
:D