Ronaldo Silva

Function com retorno do SQLCode, SQLState e SqlMSg

9 posts in this topic

Olá confrades.
Alguém tem alguma Function com retorno do SQLCode, SQLState e SqlMsg?.


 

Edited by Ronaldo Silva
1 person likes this

Share this post


Link to post
Share on other sites

Oi @Ronaldo Silva SqlCode em muitos casos é um propriedade tipo
 

HexecuteQuery(QRY_algumacoisa......)

If QRY_algumacoisa.SqlCode = 999 Then

	

End If

Tambem pode ser usado a função HerrorInfo logo após executar uma Query

Links de ajuda

 

https://help.windev.com/?1000017045&name=sqlcode_property

 

https://help.windev.com/?3044071&name=herrorinfo_function

1 person likes this

Share this post


Link to post
Share on other sites

Bom dia, amigos!

Sem estar relacionado ao topico, mas passando apenas para parabenizar os amigos pela pergunta e pela resposta. Somos gratos.

Ficamos imaginando o quanto de informação foi perdida (no limbo) durante todos esses anos

Share this post


Link to post
Share on other sites

Boa tarde,

Willian infelizmente essa propriedade SQLCode é na verdade o próprio código SQL, o que estamos procurando é como obter um retorno que temos em COBOL e é tratado pela variável "SQLCode" esse nome é dado pela definição do Embebed SQL existente no compilador, então por exemplo ao executar um SELECT se essa variável volta com o conteúdo 1222, sabemos que outro usuário executou um LOCK nessa linha, o Windev só devolve erros e isso não é um erro. 

 

Share this post


Link to post
Share on other sites

Willian, está havendo uma confusão quando falamos em SQLCode, SQLState e SQLMsg.
O Postgres tem alguns retornos de status e eles são 
SQLCode ( código de retorno da transação),
SQLState( O estado da transação) e
SQLMsg ( a mensagem de retorno ).
Na nossa linguagem, muitos ainda a utilizam, após qualquer interação com o banco podemos receber alem dos dados os retornos que identificam o estado da solicitação.

Os comandos H para Lock, só se aplicam ao HFSQL.
Para usar travamento de registro no windev + Postgres, teremos que abandonar os comandos H e passar a usar SQLExec ou colocar toda a regra no banco através de functions, triggers, SP; ou combinar as duas formas.

Esse assunto é muito delicado, seria interessante uma LIVE sobre o assunto onde os mais experientes, e principalmente os que usam o POSTGRES com windev, pudessem nos dar uma ideia de como fazem.

 

Share this post


Link to post
Share on other sites
21 horas atrás, Nelson disse:

Boa tarde,

Willian infelizmente essa propriedade SQLCode é na verdade o próprio código SQL, o que estamos procurando é como obter um retorno que temos em COBOL e é tratado pela variável "SQLCode" esse nome é dado pela definição do Embebed SQL existente no compilador, então por exemplo ao executar um SELECT se essa variável volta com o conteúdo 1222, sabemos que outro usuário executou um LOCK nessa linha, o Windev só devolve erros e isso não é um erro. 

 

Ahhh sim é mesmo o primeiro link esta errado mesmo, tem que ir pelo segundo, mas no caso o WX não é muito claro em relação a bloqueios em outros bancos, ele explica o dele, é só testando mesmo

mas teoricamente ao executar a QUERY ou um comando HRed..,hadd,hsave, hmod... e verificar o erro (em caso de ouver) dai pode usar o segundo Link

https://help.windev.com/?3044071&name=herrorinfo_function

mas como disse a PCSOFT não é clara sobre bloqueios com outros bancos

Share this post


Link to post
Share on other sites

Willian, eu e Paulo Viana já resolvemos o problema de travamento fazendo testes nesses últimos dias.
Com os  comandos Hread com lock nào funcionam para Postgres e nem para SQLServer.
Assim que os testes estiverem 100%, postaremos a solução.
A todos que de qualquer forma ajudaram para resolver o problema meus agradecimentos.

Share this post


Link to post
Share on other sites

Ronaldo com SQLServer funciona sim a opção "hLockWrite" trava efetivamente o registro, o problema era saber se o registro esta bloqueado, acabamos contornando por aqui usando assim:

MyQuery is Data Source

// comando para verificar se o registro esta em edição por outro usuario
IF HExecuteSQLQuery(MyQuery,MyConnection,hQueryWithoutCorrection,"select id_dup from duplicata WITH(ROWLOCK UPDLOCK NOWAIT) where id_dup ="+EDT_ID_DUP) = False THEN
    IF HErrorInfo(hErrBase) = 1222 THEN
        Info("O registro está bloqueado por outro usuário.")
    ELSE
        Error("Não foi possivel executar SQL",HErrorInfo(hErrFullDetails))
    END
    RETURN
END

Note que o HErrorInfo(hErrBase) retorna 1222 que é o código de registro bloqueado padrão do SQLServer

Share this post


Link to post
Share on other sites

No nosso caso, do Postgres, não conseguimos obter diretamente com hLockWrite no HreadSeekFirst.
Nossa solução foi parecida com a sua.
Vou postar as telas mostrando o lock e a instrução SQL que usamos no HexecuteSQLQuery.

Agradecemos a todos do Grupo Windev Cobol pelas dicas e ajuda efetiva em especial a Paulo Viana que passou um tempo comigo nos testes.
Parabéns pela sua solução.


 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now