Então, velhinho... Mas de ele(DSP) não fazer o update corretamente, com mais de uma tabela no From, é a 1ª vez... Realmente, não sei se existem alguma lógica, ou sequencia para ele buscar a tabela que será usada no update... Mas valeu...
Francisco Thiago <[EMAIL PROTECTED]> escreveu: Meu, seguinte: O DataSetProvider tenta "adivinhar" (procurando por from's no select) o nome da tabela... Quando tem subselect, ou vc informa mais de uma tabela na cláusula from, eu acho que o DataSetProvider meio que se perde... saca? por isso ele pega um nome e pronto... Eu só não parei para pensar qual seria a lógica que ele usa (se é a primeira tabela que aparecer, se é aquela que tem mais campos... se é aleatório)... Em todo caso, sempre que vc tiver mais de uma tabela no from (ou mais de um from no select), especifique o nome da tabela no evento OnGetTableName e pronto... Lembra daquelas funcões malucas que eu usava para gerar sql automaticamente (e que até hoje uso às vezes hehehe)... então, eu acredito que internamente o DataSetProvider use algo do tipo. []'s e tamos ae vlw? Francisco Thiago de Almeida Enter & Plug Informática Divisão: Desenvolvimento e Banco de dados Franca / SP msn: [EMAIL PROTECTED] ----- Original Message ----- From: "Danilo Rogério" <[EMAIL PROTECTED]> To: "Delphi-Br" <delphi-br@yahoogrupos.com.br> Sent: Friday, August 05, 2005 7:54 PM Subject: [delphi-br] Update executado pelo DbExpress foi meio suspeito Galera da lista, seguinte. Em Anexo consta um Select que está em uma SQLQuery, por ser muito grande, mandei em anexo. Mas vamos lá, os campos que ele retorna são os sequintes, e seus respectivos valores de providers flags que estão como TRUE, tanto da query quanto do Clientdataset. Estes campos são a minha chave da tabela NRO_MC: pfInUpdate, pfInWhere, pfInKey. COD_ITEM: pfInUpdate, pfInWhere, pfInKey. COD_APROVADOR: pfInUpdate, pfInWhere, pfInKey. SEQUENCIA: pfInUpdate, pfInWhere, pfInKey. Estes NÃO devem ser atualizados CODIGO: Tudo False nos flags SIGLA_FORN: Tudo False nos flags DSC_REDUZIDA: Tudo False nos flags TOTAL_ITEM: Tudo False nos flags APROVADO: Tudo False nos flags REPROVADO: Tudo False nos flags Estes campos serão atualizados DT_APROVACAO:pfInUpdate STATUS:pfInUpdate OBS_APROVACAO:pfInUpdate O DataSetProvider tem na propriedade UpdateMode: upWhereKeyOnly Os campos chave, e os campos que devem ser atualizados são de uma Tabela chamada APROVACAO_TABELA_PRECO, que vocês podem ver no Select Vamos para o Problema agora. Eu Edito, dou Post, tudo certo. No Momento do Apply Updates, o Reconcile Error me retorna: ORA-00904: field SEQUENCIA Invalid Identifier. Bem, coloquei o SQLMonitor e veja o resultado no momento do apply updates: update "ITEM_TABELA_PRECO" set "STATUS" = :1 where "NRO_MC" = :2 and "COD_ITEM" = :3 and "COD_APROVADOR" = :4 and "SEQUENCIA" = :5 Ou seja, ele achou que a tabela que deveria ser atualizada seria a ITEM_TABELA_PRECO(por isso o erro, porque não existe o campo SEQUENCIA na ITEM_TABELA_PRECO), e a única referencia a esta tabela é um SubSelect na Clausula FROM. Andei conversando com o Amigo Francisco Thiago, que frequenta a lista e ele também não tinha uma explicação lógica para isto, mas sugeriu colocar no OnGetTableNames do DataSetProvider o nome da tabela que deve ser atualizada. Muito bem, funcionou. Mas trabalho diariamente com este tipo de select, contendo subselect, e a configuração dos Flags basta para que o update seja executado corretamente. Me ajudem aí galera... Umm abraço, Danilo Rogério Betta Informática --------------------------------- Yahoo! Acesso Grátis: Internet rápida e grátis. Instale o discador agora! ---------- SELECT A.NRO_MC, A.COD_ITEM, A.COD_APROVADOR, A.SEQUENCIA, A.FORN_CODIGO || '-' || A.FORN_COMPLE AS CODIGO, A.SIGLA_FORN, I.DSC_REDUZIDA, DECODE(B.NRO_TABELA_PRECO, NULL,(SELECT (NVL(IC.VLR_UNITARIO,0) - NVL(IC.VLR_DESCONTO,0)) + NVL(IC.VLR_IPI,0) + NVL(IC.VLR_OUTDESPESA,0) FROM ITEM_COLETA_PRECO IC WHERE IC.NRO_MC = A.NRO_MC AND IC.FORN_CODIGO = A.FORN_CODIGO AND IC.FORN_COMPLE = A.FORN_COMPLE AND IC.SIGLA_FORN = A.SIGLA_FORN AND IC.COD_ITEM = A.COD_ITEM), (SELECT (NVL(IT.VLR_UNITARIO,0) - NVL(IT.VLR_DESCONTO,0)) + (NVL(IT.VLR_UNITARIO,0) - NVL(IT.VLR_DESCONTO,0) * (NVL(IT.PERC_IMPOSTO,0)/100)) + NVL(IT.VLR_OUTDESPESA,0) FROM ITEM_TABELA_PRECO IT WHERE IT.NRO_TABELA_PRECO = B.NRO_TABELA_PRECO AND IT.COD_ITEM = A.COD_ITEM)) AS TOTAL_ITEM, A.DT_APROVACAO, A.STATUS, A.OBS_APROVACAO, ' ' AS APROVADO, ' ' AS REPROVADO FROM APROVACAO_TABELA_PRECO A, (SELECT T.NRO_TABELA_PRECO, T.NRO_MC, T.FORN_CODIGO, T.FORN_COMPLE, T.SIGLA_FORN FROM TABELA_PRECO T WHERE T.NRO_TABELA_PRECO = (SELECT MAX(NRO_TABELA_PRECO) FROM TABELA_PRECO WHERE NRO_MC = T.NRO_MC AND FORN_CODIGO = T.FORN_CODIGO AND FORN_COMPLE = T.FORN_COMPLE AND SIGLA_FORN = T.SIGLA_FORN AND BLOQUEADA = 'S' ) ) B, ITEM I WHERE A.NRO_MC = B.NRO_MC(+) AND A.FORN_CODIGO = B.FORN_CODIGO(+) AND A.FORN_COMPLE = B.FORN_COMPLE(+) AND A.SIGLA_FORN = B.SIGLA_FORN(+) AND A.COD_ITEM = I.COD_ITEM AND A.STATUS = 'P' AND A.SEQUENCIA = (SELECT MAX(SEQUENCIA) FROM APROVACAO_TABELA_PRECO WHERE NRO_MC = A.NRO_MC AND COD_ITEM = A.COD_ITEM AND COD_APROVADOR = A.COD_APROVADOR) AND A.COD_APROVADOR =:USUARIO ORDER BY A.COD_ITEM [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos _______________________________________________________ Yahoo! Acesso Grátis - Internet rápida e grátis. Instale o discador agora! http://br.acesso.yahoo.com/ -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] --------------------------------- Links do Yahoo! Grupos Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!. --------------------------------- Yahoo! Acesso Grátis: Internet rápida e grátis. Instale o discador agora! [As partes desta mensagem que não continham texto foram removidas] -- <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>> Para ver as mensagens antigas, acesse: http://br.groups.yahoo.com/group/delphi-br/messages Para falar com o moderador, envie um e-mail para: [EMAIL PROTECTED] ou [EMAIL PROTECTED] Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/delphi-br/ <*> Para sair deste grupo, envie um e-mail para: [EMAIL PROTECTED] <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html