Jump to content
Fivewin Brasil

Erro Update PostGreSql via sqlrdd


augustogomes

Recommended Posts

Boa tarde pessoal

Estou com um problema com o update no postgresql, ocorreram poucas vezes este ano, mas causa um grande estrago.

o cliente altera um cadastro e no momento de salvar o postgresql salva todos os registros da tabela com o mesmo dado

eu estou usando o postgre 9.5 com sqlrdd, e costumo usar assim:

clSql  := UPDATE "sup0007" SET ;
            CodEmp = ::avCarrega[1]:cCodEmp ,;
            NomEmp = ::avCarrega[1]:cNomEmp ,;
            FanEmp = ::avCarrega[1]:cFanEmp ,;
            EndEmp = ::avCarrega[1]:cEndEmp ,;
            RedEmp = ::avCarrega[1]:cRedEmp ,;
            NumCep = ::avCarrega[1]:cNumCep ,;
            Bairro = ::avCarrega[1]:cBairro ,;
            TelEmp = ::avCarrega[1]:cTelEmp ,;
            TelEm2 = ::avCarrega[1]:cTelEm2 ,;
            Ativar = clAtivar ,;
            UltUsu = oCarVar:cUser ,;
            UltMod = date()        ,;
            Operad = oCarVar:cUser ,;
            Updated= date()         ;
            WHERE sr_recno = ? 

              alParam := {::avCarrega[1]:SR_RECNO}
        SR_BeginTransaction()
        
        Try
        
            oSql := SR_GetConnection()
             
            apCode := SR_SQLParse( clSql, @nErr, @nPos )
            cResu := SR_SQLCodeGen( apCode, alParam, oSql:nSystemID )
            nErr := oSql:Exec( cResu )

este é um exemplo usando a sqlrdd pra converter o codigo, mas tenho outro caso que uso o comando direto no oSql:Exec sem passar pelo sr_sqlcodegen e também deu o problema.

este comando acima, gera o comando abaixo para o postgre

UPDATE 
  "sup0007"
 SET
  "codemp" = E'3000286',
  "nomemp" = E'CONTE COMIGO',
  "fanemp" = E'CONTE',
  "endemp" = E'RUA BEABA,98',
  "redemp" = ' ',
  "numcep" = E'89837-000',
  "bairro" = E'CENTRO',
  "telemp" = E'3999999',
  "telem2" = E'89999427',
  "ativar" = E'FF',
  "ultusu" = E'AUGUSTO',
  "ultmod" = E'2019-10-01',
  "operad" = E'AUGUSTO',
  "updated" = E'2019-10-01' WHERE "sr_recno" = 1595

Não vejo erro no comando, isto ocorre muitas vezes em todo meu sistema, mas este erro ocorreu poucas vezes.

Alguém tem ideia do que pode ser? Algo na Tabela, no banco, etc.

Link to comment
Share on other sites

 

Boa tarde pessoal

Estou com um problema com o update no postgresql, ocorreram poucas vezes este ano, mas causa um grande estrago.

o cliente altera um cadastro e no momento de salvar o postgresql salva todos os registros da tabela com o mesmo dado

eu estou usando o postgre 9.5 com sqlrdd, e costumo usar assim:

clSql  := UPDATE "sup0007" SET ;
            CodEmp = ::avCarrega[1]:cCodEmp ,;
            NomEmp = ::avCarrega[1]:cNomEmp ,;
            FanEmp = ::avCarrega[1]:cFanEmp ,;
            EndEmp = ::avCarrega[1]:cEndEmp ,;
            RedEmp = ::avCarrega[1]:cRedEmp ,;
            NumCep = ::avCarrega[1]:cNumCep ,;
            Bairro = ::avCarrega[1]:cBairro ,;
            TelEmp = ::avCarrega[1]:cTelEmp ,;
            TelEm2 = ::avCarrega[1]:cTelEm2 ,;
            Ativar = clAtivar ,;
            UltUsu = oCarVar:cUser ,;
            UltMod = date()        ,;
            Operad = oCarVar:cUser ,;
            Updated= date()         ;
            WHERE sr_recno = ? 

              alParam := {::avCarrega[1]:SR_RECNO}
        SR_BeginTransaction()
        
        Try
        
            oSql := SR_GetConnection()
             
            apCode := SR_SQLParse( clSql, @nErr, @nPos )
            cResu := SR_SQLCodeGen( apCode, alParam, oSql:nSystemID )
            nErr := oSql:Exec( cResu )

este é um exemplo usando a sqlrdd pra converter o codigo, mas tenho outro caso que uso o comando direto no oSql:Exec sem passar pelo sr_sqlcodegen e também deu o problema.

este comando acima, gera o comando abaixo para o postgre

UPDATE 
  "sup0007"
 SET
  "codemp" = E'3000286',
  "nomemp" = E'CONTE COMIGO',
  "fanemp" = E'CONTE',
  "endemp" = E'RUA BEABA,98',
  "redemp" = ' ',
  "numcep" = E'89837-000',
  "bairro" = E'CENTRO',
  "telemp" = E'3999999',
  "telem2" = E'89999427',
  "ativar" = E'FF',
  "ultusu" = E'AUGUSTO',
  "ultmod" = E'2019-10-01',
  "operad" = E'AUGUSTO',
  "updated" = E'2019-10-01' WHERE "sr_recno" = 1595

Não vejo erro no comando, isto ocorre muitas vezes em todo meu sistema, mas este erro ocorreu poucas vezes.

Alguém tem ideia do que pode ser? Algo na Tabela, no banco, etc.

Puts, sem erro fica dificil, mas substitui todos os dados ou cria vários registros iguais?

Link to comment
Share on other sites

 

substitui todos os dados na tabela, como se fosse um replace all

Colega vc costuma usar editor de banco de dados, já tive problema nesse sentido pelo editor, tipo ao dar um select, pelo editor eu ia alterar um campo, todos campo que tivesse o mesmo resultado daquele select, tb era alterado sem aviso, hoje sempre ao fazer isto mando o ID do registro no select, dessa forma nunca vai ter dois resultado igual.

 

Obs: um outro detalhe que já ocorreu comigo foi UPDATE dessa forma 

 UPDATE parcela SET ccusto=(SELECT ccusto FROM pedido 
 WHERE parcela.pedido=pedido.pedido GROUP BY pedido.pedido) 
 WHERE parcela.emissao >= '2018-01-01' 
 

se eu errar algum detalhe nesse ultimo WHERE ele não ira acusar erro, porem ira dar um update em todos registros da tabela parcela

 

 

Link to comment
Share on other sites

Jovem,  sugiro que vc monitore o comando do SQLRDD junto ao PostGreSql, da seguinte forma:

Sr_StarLog()

/*comando sql - Insert, update, etc*/

Sr_StopLog()

Desta forma consegui resolver problemas parecidos e entender melhor o "modus operandi"  da SQLRDD. Sugiro que deixe ativo somente na rotina que deseja monitorar e pelo tempo necessário, pois causa lentidão.

Resultado, será criado um dbf como o comando Sql gerado pela SQLRD. Vide manual SQLRDD.

 

Link to comment
Share on other sites

  • 2 weeks later...
 

Augusto,
O que manda o gerenciador do banco de dados substituir o registro correto é o comando
WHERE "sr_recno" = 1595
Então verifique que nos casos de erro, o registro não está sendo corretamente identificado para o WHERE .
Nesses casos, por padrão o gerenciador sql faz um replace all.

[]´s

 

Obrigado pela dica, na rotina não teria como o registro não existir, mas vou testar e analisar sua sugestão.

Link to comment
Share on other sites

  • 4 months later...

Boa tarde a todos.

Voltei neste tópico porque descobrir o que esta acontecendo com o update

Quando faço um update assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

a palavra lixa d'agua não consegue processar pois a aspa do texto interrompe o processo, causando erro no sql e faz com que o replace seja em toda a tabela.

usando a função sr_startlog, vi que na sqlrdd ele salva o campo com 2 aspas simples, desta forma o sql reconhece como uma unica aspas no processo

usando a rdd do sqlrdd e vendo no log, a linha de comando fica assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D''AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

Pergunto aos colegas que usam sql e até mesmo o sqlrdd a mais tempo que eu, como vocês fazem em caso como este, tem alguma opção no banco de dados que tem que ativar para tratar automaticamente a aspa simples, ou teria que tratar campo a campo, substituindo o ' por ''?

estou usando o postgresql 9.5

 

 

Link to comment
Share on other sites

Augusto,

Sabendo de problemas que podem ocorrer pelo uso de aspas simples ou duplas no conteúdo de campos, eu adotei uma solução radical.
Sempre antes de qualquer INSERT ou UPDATE, eu limpo o conteúdo digitado pelo cliente, assim:

cQry += 'endereco = "'+ ClearChar(cmatriz[4], {"'",'"'} )+'",'

 

Function ClearChar(cString,aChar)
   Aeval(aChar, {|cChar| cString:=StrTran(cString,cChar,"")})
Return(cString)

[]´s

Link to comment
Share on other sites

Não vejo muito como contornar isso, exceto se vc puder utilizar o código EBCDIC http://ascii-table.com/ebcdic-table.php,  onde há diferenças entre aspas simples = quotes e apóstrofe, que acredito deve dar problemas por não ser reconhecido pelo ASCII. Veja que num terminal IBM 3070 vc não teria este problema, mas na micro informática sim.

Lembro que quando comecei com micro informatica e via o pessoal chamar o caracter "_" de underline (Linha baixa), eu ficava injuriado ahahahah, por mais que explicasse que era underscore (Carater baixo).

Acho que vc vai ter que fazer como o amigo citou, trocar o caracter pelo acento agudo, isso se não provocar erro na instrução.

[]s,

 

Boa tarde a todos.

Voltei neste tópico porque descobrir o que esta acontecendo com o update

Quando faço um update assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

a palavra lixa d'agua não consegue processar pois a aspa do texto interrompe o processo, causando erro no sql e faz com que o replace seja em toda a tabela.

usando a função sr_startlog, vi que na sqlrdd ele salva o campo com 2 aspas simples, desta forma o sql reconhece como uma unica aspas no processo

usando a rdd do sqlrdd e vendo no log, a linha de comando fica assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D''AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

Pergunto aos colegas que usam sql e até mesmo o sqlrdd a mais tempo que eu, como vocês fazem em caso como este, tem alguma opção no banco de dados que tem que ativar para tratar automaticamente a aspa simples, ou teria que tratar campo a campo, substituindo o ' por ''?

estou usando o postgresql 9.5

 

 

 

Boa tarde a todos.

Voltei neste tópico porque descobrir o que esta acontecendo com o update

Quando faço um update assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

a palavra lixa d'agua não consegue processar pois a aspa do texto interrompe o processo, causando erro no sql e faz com que o replace seja em toda a tabela.

usando a função sr_startlog, vi que na sqlrdd ele salva o campo com 2 aspas simples, desta forma o sql reconhece como uma unica aspas no processo

usando a rdd do sqlrdd e vendo no log, a linha de comando fica assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D''AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

Pergunto aos colegas que usam sql e até mesmo o sqlrdd a mais tempo que eu, como vocês fazem em caso como este, tem alguma opção no banco de dados que tem que ativar para tratar automaticamente a aspa simples, ou teria que tratar campo a campo, substituindo o ' por ''?

estou usando o postgresql 9.5

 

|

 

Boa tarde a todos.

Voltei neste tópico porque descobrir o que esta acontecendo com o update

Quando faço um update assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

a palavra lixa d'agua não consegue processar pois a aspa do texto interrompe o processo, causando erro no sql e faz com que o replace seja em toda a tabela.

usando a função sr_startlog, vi que na sqlrdd ele salva o campo com 2 aspas simples, desta forma o sql reconhece como uma unica aspas no processo

usando a rdd do sqlrdd e vendo no log, a linha de comando fica assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D''AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

Pergunto aos colegas que usam sql e até mesmo o sqlrdd a mais tempo que eu, como vocês fazem em caso como este, tem alguma opção no banco de dados que tem que ativar para tratar automaticamente a aspa simples, ou teria que tratar campo a campo, substituindo o ' por ''?

estou usando o postgresql 9.5

 

 

 

Boa tarde a todos.

Voltei neste tópico porque descobrir o que esta acontecendo com o update

Quando faço um update assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

a palavra lixa d'agua não consegue processar pois a aspa do texto interrompe o processo, causando erro no sql e faz com que o replace seja em toda a tabela.

usando a função sr_startlog, vi que na sqlrdd ele salva o campo com 2 aspas simples, desta forma o sql reconhece como uma unica aspas no processo

usando a rdd do sqlrdd e vendo no log, a linha de comando fica assim:

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D''AGUA',
  unifis = 'UN',
  clanbm = '01069000',
  WHERE sr_recno = '              1'

Pergunto aos colegas que usam sql e até mesmo o sqlrdd a mais tempo que eu, como vocês fazem em caso como este, tem alguma opção no banco de dados que tem que ativar para tratar automaticamente a aspa simples, ou teria que tratar campo a campo, substituindo o ' por ''?

estou usando o postgresql 9.5

 

 

 

Boa tarde pessoal

Estou com um problema com o update no postgresql, ocorreram poucas vezes este ano, mas causa um grande estrago.

o cliente altera um cadastro e no momento de salvar o postgresql salva todos os registros da tabela com o mesmo dado

eu estou usando o postgre 9.5 com sqlrdd, e costumo usar assim:

clSql  := UPDATE "sup0007" SET ;
            CodEmp = ::avCarrega[1]:cCodEmp ,;
            NomEmp = ::avCarrega[1]:cNomEmp ,;
            FanEmp = ::avCarrega[1]:cFanEmp ,;
            EndEmp = ::avCarrega[1]:cEndEmp ,;
            RedEmp = ::avCarrega[1]:cRedEmp ,;
            NumCep = ::avCarrega[1]:cNumCep ,;
            Bairro = ::avCarrega[1]:cBairro ,;
            TelEmp = ::avCarrega[1]:cTelEmp ,;
            TelEm2 = ::avCarrega[1]:cTelEm2 ,;
            Ativar = clAtivar ,;
            UltUsu = oCarVar:cUser ,;
            UltMod = date()        ,;
            Operad = oCarVar:cUser ,;
            Updated= date()         ;
            WHERE sr_recno = ? 

              alParam := {::avCarrega[1]:SR_RECNO}
        SR_BeginTransaction()
        
        Try
        
            oSql := SR_GetConnection()
             
            apCode := SR_SQLParse( clSql, @nErr, @nPos )
            cResu := SR_SQLCodeGen( apCode, alParam, oSql:nSystemID )
            nErr := oSql:Exec( cResu )

este é um exemplo usando a sqlrdd pra converter o codigo, mas tenho outro caso que uso o comando direto no oSql:Exec sem passar pelo sr_sqlcodegen e também deu o problema.

este comando acima, gera o comando abaixo para o postgre

UPDATE 
  "sup0007"
 SET
  "codemp" = E'3000286',
  "nomemp" = E'CONTE COMIGO',
  "fanemp" = E'CONTE',
  "endemp" = E'RUA BEABA,98',
  "redemp" = ' ',
  "numcep" = E'89837-000',
  "bairro" = E'CENTRO',
  "telemp" = E'3999999',
  "telem2" = E'89999427',
  "ativar" = E'FF',
  "ultusu" = E'AUGUSTO',
  "ultmod" = E'2019-10-01',
  "operad" = E'AUGUSTO',
  "updated" = E'2019-10-01' WHERE "sr_recno" = 1595

Não vejo erro no comando, isto ocorre muitas vezes em todo meu sistema, mas este erro ocorreu poucas vezes.

Alguém tem ideia do que pode ser? Algo na Tabela, no banco, etc.

Puts, sem erro fica dificil, mas substitui todos os dados ou cria vários registros iguais?

Link to comment
Share on other sites

Jorge, ele subsititui todos os dados da tabela porque o comando fica trucado, se não mudar o caracter ele entende assim

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'

desta forma é como se fosse um replace all, como o Rogério Figueira citou anteriormente.

Mas estou mudando como a sugestão dele mesmo, trocar o caracter antes do comando.

Link to comment
Share on other sites

 

Jorge, ele subsititui todos os dados da tabela porque o comando fica trucado, se não mudar o caracter ele entende assim

UPDATE sup0040
 SET
  codfis = ' 878',
  desfis = 'LIXA D'

desta forma é como se fosse um replace all, como o Rogério Figueira citou anteriormente.

Mas estou mudando como a sugestão dele mesmo, trocar o caracter antes do comando.

Justamente amigo, o problema está no tipo de código (EBCDIC e ASCII), conforme citado, pois em DB2 vc pode usar os 2 caracteres, e no ASCII está trucando um quotes simples, como se fosse fechamento da instrução, embora eu acho que deveria dar erro na instrução, mas como vc postou que ela fica com aspas dupla, então pode, o correto e fazer igual ao colega.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...