Elisei 0 Denunciar post Postado Janeiro 22, 2009 Estou elaborando um sistema para a empresa, mas neste meio de caminho me surgiu uma dúvida que está me quebrando a cabeça. No meu DBgrid está selecionada a linha que contém um código de número 6. Ao pressionar uma determinada tecla, abre para mim, uma outra tela que me permite alterar o status e a data deste registro (codigo 6). Se eu pressionar o botão “Atualizar” deste novo form, a seguinte Query é executada: DM_sosi.QR_atualiza_status_os.Close; DM_sosi.QR_atualiza_status_os.SQL.Clear; DM_sosi.QR_atualiza_status_os.SQL.Add('UPDATE cos_abertura_os'); DM_sosi.QR_atualiza_status_os.SQL.Add('SET data_fim_real = :DatFimReal ,'); DM_sosi.QR_atualiza_status_os.SQL.Add('cod_status = :CodStatus'); DM_sosi.QR_atualiza_status_os.SQL.Add('WHERE num_os_int = :NumOsInt'); DM_sosi.QR_atualiza_status_os.ParamByName('DatFimReal').AsString := quotedstr(DT_EC_data_fim_real.EditText); DM_sosi.QR_atualiza_status_os.ParamByName('CodStatus').AsString := quotedstr(CBO_EC_status.KeyValue); DM_sosi.QR_atualiza_status_os.ParamByName('NumOsInt').AsString := quotedstr(TXT_EC_Osint.Text); DM_sosi.QR_atualiza_status_os.ExecSQL; DM_sosi.TB_abertura_os.Refresh; showmessage('OS: '+TXT_EC_Osint.Text+' atualizada com sucesso!'); frm_encerra_cancela_os.Close; DM_sosi.QR_cons_os_pend.Close; DM_sosi.QR_cons_os_pend.SQL.Clear; DM_sosi.QR_cons_os_pend.SQL.Add('SELECT num_os_int, num_os_ext, cod_tipo_os, cod_sistema, cod_prioridade, num_programa, data_fim_prevista, titulo_os'); DM_sosi.QR_cons_os_pend.SQL.Add('FROM cos_abertura_os'); DM_sosi.QR_cons_os_pend.SQL.Add('WHERE cod_status = "P"'); DM_sosi.QR_cons_os_pend.Open; Em seguida, a confirmação é executada (showmessage) Porém, ao atualizar o DBgrid, percebemos que o registro cujo status foi alterado foi o de número 3 (primeiro registro da tabela) e não o de número 6 (que permaneceu no DBgrid). Obs. No DBGrid, estão sendo mostradas somente os registros cujo status = “P” Alguém saberia me responder por que a atualização está sendo realizada no primeiro registro da tabela e não de acordo com a parametrização de minha query? Obrigado pela atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 23, 2009 Pode postar aqui a estrutura das suas tabelas (indicando as primary key) e como está fazendo a carga do grid para a tela de alteração? O valor carregado na tela de alteração está sendo o da linha correta? Compartilhar este post Link para o post Compartilhar em outros sites
Elisei 0 Denunciar post Postado Janeiro 23, 2009 Ola, boa tarde. Minha tabela tem apenas uma chave primaria, que tratase deste código de referencia citado acima. É um campo integer auto incremento. A carga do DBgrid se dá pela query citada acima que está ligada ao componente de conexão. Já na tela de alteração, eu tenho tres objetos: 1 DbDate (rx) - data a ser alterada 1 Edit - código informado - clausula where (minha chave) 1 DbLockUpComboBox - status a ser alterado Ao carregar o formulario de alteração, executo os comandos: TXT_EC_OSint.Text := frm_abertura_os.DGB_os_pendentes.SelectedField.AsString; Desta forma, em meu Edit, é mostrado o código (primary Key) referente a linha do DBgrid que esta selecionada. Mas de qualquer maneira, isso não importa muito, pois o usuário poderá digitar um outro código indiferente da linha selecionada. Isto é apenas uma facilidade a mais. Mas a query deveria ser executada conforme a primary key cujo valor digito no Edit. Segue legenda: TXT_EC_OSint = Edit (normal) frm_abertura_os = Form (normal) onde contém o DBgrid DGB_os_pendentes = DbGrid (rx) Não sei se responde às suas solicitaçãos..... qualquer coisa me retorne ok? Obrigado pela atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 23, 2009 Quando você executa este código: TXT_EC_OSint.Text := frm_abertura_os.DGB_os_pendentes.SelectedField.AsString; O valor carregado para a tela de alteração está sendo a chave primária correta da tabela? Já tentou dar um breakpoint antes do execsql e pegar o valor da propriedade text do mesmo para ver se ela está montando corretamente a sql? Verificou se os parâmetros que a query está recebendo estão realmente oks? Qual componente de conexão e que banco de dados está usando para realizar a operação? Sei que são perguntas meio básicas, mas a princípio seu sql está ok (supondo que o campo num_os_int seja sua primary Key). Compartilhar este post Link para o post Compartilhar em outros sites
Elisei 0 Denunciar post Postado Janeiro 26, 2009 Olá boa tarde. Coloquei um label para receber o sql da query e percebi o seguinte: UPDATE cos_abertura_os SET data_fim_real = :DatFimReal, cod_status = :CodStatus WHERE num_os_int = :NumOsInt Desta forma, em outro label, recebi os valores de :DatFimReal, :CodStatus e :NumOsTi Percebi que estão devidamente preenchidos, mas mesmo assim não está executando o comando. Tentei utilizar o breakpoit mas me enrolei um pouco, poderia me dar uma dica de como visualizar o break point? Desde já agradeço a atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 26, 2009 Coloque o cursor e clique sobre a linha onde está o ExecSql, em seguida clique no F5 para marcar a linha como um breakpoint (ponto de parada) ... isso fará com que quando executar sua rotina pelo F9 seu sistema pare nesta linha para que você possa debugar o seu código a partir dela e também permitirá a você verificar o valor de variáveis locais e globais da sua aplicação passo a passo. Após por este breakpoint, tecle CTRL+F5 (sem ter nada selecionado na tela) e adicione a seguinte instrução no campo expression: DM_sosi.QR_cons_os_pend.SQL.Text Quando rodar seu programa no F9 e entrar no ponto de parada, com esse watch você vai conseguir ver o que está na sua sql em runtime... outras questões a serem verificadas: os campos estão sendo passados corretamente para a sql? DateTimes como datetimes, int como int, string como string, etc? Já pegou sua query de update e jogou no banco preenchendo os valores que passa por parâmetro na mão com os mesmos valores que está passando em runtime para a aplicação para ver se a query está correta quanto a qual registro atualizar? []'s Compartilhar este post Link para o post Compartilhar em outros sites
Elisei 0 Denunciar post Postado Janeiro 28, 2009 Ola, boa tarde. O BreakPoint me retornou a seguinte string: DM_sosi.QR_atualiza_status_os.SQL.Text:'UPDATE cos_abertura_os'#$D#$A' SET data_fim_real = :DatFimReal,'#$D#$A' cod_status = :CodStatus'#$D#$A'WHERE num_os_in = : NumOsInt'#$D#$A' Não sei o que significa nem como deveria me retornar. Obrigado pela atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Janeiro 28, 2009 Ao que parece a montagem do update está correta.... o problema pelo jeito está na passagem dos valores por parâmetros... tenta dar um showmessage antes do exec para pegar a informação que seus parâmetros estão recebendo e depois joga isso num select e depois no update testando na base de dados (num ibconsole por exemplo) para ver se realmente o que está passando de valores para sua query são os valores corretos. Você pode dar um prepare na sua query também após passar os parâmetros e tentar jogar salvar ela num arquivo txt e ver se ela monta a query completa (não lembro se querys com parâmetro sendo passado são montadas com os dados completos). DM_sosi.QR_atualiza_status_os.Close; DM_sosi.QR_atualiza_status_os.SQL.Clear; DM_sosi.QR_atualiza_status_os.SQL.Add('UPDATE cos_abertura_os'); DM_sosi.QR_atualiza_status_os.SQL.Add('SET data_fim_real = :DatFimReal ,'); DM_sosi.QR_atualiza_status_os.SQL.Add('cod_status = :CodStatus'); DM_sosi.QR_atualiza_status_os.SQL.Add('WHERE num_os_int = :NumOsInt'); DM_sosi.QR_atualiza_status_os.ParamByName('DatFimReal').AsString := quotedstr(DT_EC_data_fim_real.EditText); DM_sosi.QR_atualiza_status_os.ParamByName('CodStatus').AsString := quotedstr(CBO_EC_status.KeyValue); DM_sosi.QR_atualiza_status_os.ParamByName('NumOsInt').AsString := quotedstr(TXT_EC_Osint.Text); [b]DM_sosi.QR_atualiza_status_os.Prepare; DM_sosi.QR_atualiza_status_os.SQL.SaveToFile('C:\Documents and Settings\Aion\Desktop\Temp.txt'); Showmessage('Valores passados por parâmetro que serão usados no update ' + #13 + 'DatFimReal: ' + DM_sosi.QR_atualiza_status_os.ParamByName('DatFimReal').Text + #13 + 'CodStatus: ' + DM_sosi.QR_atualiza_status_os.ParamByName('CodStatus').Text + #13 + 'NumOsInt: ' + DM_sosi.QR_atualiza_status_os.ParamByName('NumOsInt').Text);[/b] DM_sosi.QR_atualiza_status_os.ExecSQL; []'s Compartilhar este post Link para o post Compartilhar em outros sites
Elisei 0 Denunciar post Postado Janeiro 29, 2009 Ola, bom dia! Então, eu já tenho uma ferramenta de visualização da query. Jogo dentro de um MEMO. Salvando em um arquivo texto conforme sua indicação, tenho o mesmo resultado, ou seja: UPDATE cos_abertura_os SET data_fim_real = :DatFimReal , cod_status = :CodStatus WHERE num_os_int = :NumOsInt Também já peguei os valores de minhas variáveis e joguei dentro de Edits, o resultado apresentado, está de acordo com o informado. Também já executei a query com as variáveis diretamente em um gerenciador (utilizo o SQLYog) entretanto, obtendo sucesso na atualização. As tentativas estão quase esgotadas. Estou querendo replanejar a estrutura do processo. Estou tentando mais algumas alternativas e se conseguir posto a solução. De qualquer maneira, muito obrigado pela imensa atenção. Compartilhar este post Link para o post Compartilhar em outros sites
Chrnos 30 Denunciar post Postado Fevereiro 2, 2009 Debugando, verifique o seguinte... logo após dar o update na base, execute o select que trás os dados da tabela no banco e veja se foi alterado o registro que deveria ser... se foi, o problema pode ser em outro lugar... observando agora vi que usa uma tabela no seu aplicativo... como está carregando os dados nesta tabela?? Existe alguma trigger associada a tabela?? Se seu programa está passando as variáveis corretamente para o update, o problema não está no sql, está em algum ponto do seu código que não estamos vendo.... o melhor seria você ir debugando usando o F7 a partir do exec do update para ver onde seu programa está passando para tentar localizar a raíz do problema. []'s Compartilhar este post Link para o post Compartilhar em outros sites