augustogomes Posted October 1, 2019 Report Share Posted October 1, 2019 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. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted October 1, 2019 Report Share Posted October 1, 2019 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? Quote Link to comment Share on other sites More sharing options...
augustogomes Posted October 1, 2019 Author Report Share Posted October 1, 2019 substitui todos os dados na tabela, como se fosse um replace all Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted October 1, 2019 Report Share Posted October 1, 2019 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 Quote Link to comment Share on other sites More sharing options...
augustogomes Posted October 1, 2019 Author Report Share Posted October 1, 2019 Luiz Fernando, obrigado pela resposta. Não estou usando editor, e mando o id do registro, veja no exemplo que passei, WHERE "sr_recno" = 1595 , o sr_recno é campo chave primaria. Eu realmente não entendi pq faz isto e é intermitente, não acontece direto. Quote Link to comment Share on other sites More sharing options...
Rogerio Figueira Posted October 1, 2019 Report Share Posted October 1, 2019 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 Quote Link to comment Share on other sites More sharing options...
Jmsilva Posted October 4, 2019 Report Share Posted October 4, 2019 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. Quote Link to comment Share on other sites More sharing options...
augustogomes Posted October 16, 2019 Author Report Share Posted October 16, 2019 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. Quote Link to comment Share on other sites More sharing options...
augustogomes Posted February 17, 2020 Author Report Share Posted February 17, 2020 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 Quote Link to comment Share on other sites More sharing options...
Rogerio Figueira Posted February 17, 2020 Report Share Posted February 17, 2020 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 Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted February 18, 2020 Report Share Posted February 18, 2020 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? Quote Link to comment Share on other sites More sharing options...
augustogomes Posted February 18, 2020 Author Report Share Posted February 18, 2020 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. Quote Link to comment Share on other sites More sharing options...
Jorge Andrade Posted February 18, 2020 Report Share Posted February 18, 2020 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.