Variável não recebe o valor
Tenho o seguinte código:
Minha variavel IDe é do tipo integer e meu Banco é MS SQL, porém, TODAS as minhas variáveis que deveriam pegar algum valor não só do banco como no programa... não estão pegando os valores... estão zeradas...
Que erro maluco é esse?
Desde já agradeço.
[b:813c22df7b][color=red:813c22df7b]Título editado pelo Moderador (AZ) - Removido: ´Nao acho qual o erro! ! !´[/color:813c22df7b][/b:813c22df7b]
Query2.SQL.Clear; Query2.SQL.Add(´SELECT Id FROM [dbo].[Movimentos]´); Query2.Open; Query2.Last; if Query2.RecordCount < 1 then IDe := 0; IDe := Query2.FieldByName(´Id´).Value + 1;
Minha variavel IDe é do tipo integer e meu Banco é MS SQL, porém, TODAS as minhas variáveis que deveriam pegar algum valor não só do banco como no programa... não estão pegando os valores... estão zeradas...
Que erro maluco é esse?
Desde já agradeço.
[b:813c22df7b][color=red:813c22df7b]Título editado pelo Moderador (AZ) - Removido: ´Nao acho qual o erro! ! !´[/color:813c22df7b][/b:813c22df7b]
Titanius
Curtidas 0
Respostas
Aroldo Zanela
04/02/2004
Colega,
Execute a instrução abaixo no Query Analyzer e poste aqui a última linha:
Também há um erro de lógica no fragmento acima. Reveja e se não identificar, avise.
Execute a instrução abaixo no Query Analyzer e poste aqui a última linha:
SELECT Id FROM Movimentos
Também há um erro de lógica no fragmento acima. Reveja e se não identificar, avise.
GOSTEI 0
Titanius
04/02/2004
Olá Aroldo, segue o resultado:
na ordem dos campos:
Id( inteiro : 8 ) , Historico( char : 30 ) , Data( char : 20 ) , Obs( text ) , Valor( float : 8 ) , ValorAtual( float : 8)
quanto ao erro no código vi qual é, arrumei para o seguinte:
o Delphi, na hora que eu debugo nao entra na parte da variavel IDe := IDe + 1;, estranho d+...
Ainda não consegui arrumar isso de jeito nenhum...
Abraços,
0, Deposito, 04/02/2004, Pagamento motorista, 200.0, 1500.0
na ordem dos campos:
Id( inteiro : 8 ) , Historico( char : 30 ) , Data( char : 20 ) , Obs( text ) , Valor( float : 8 ) , ValorAtual( float : 8)
quanto ao erro no código vi qual é, arrumei para o seguinte:
Query2.SQL.Clear; Query2.SQL.Add(´SELECT * FROM Movimentos´); Query2.Open; Query2.Last; if Query2.RecordCount < 1 then IDe := 0; IDe := IDe + 1;
o Delphi, na hora que eu debugo nao entra na parte da variavel IDe := IDe + 1;, estranho d+...
Ainda não consegui arrumar isso de jeito nenhum...
Abraços,
GOSTEI 0
Aroldo Zanela
04/02/2004
Colega,
Por favor, confirma essas informações.
IDe := 0; // Inicializa com zero Query2.SQL.Clear; Query2.SQL.Add(´SELECT * FROM Movimentos´); Query2.Open; Query2.Last; // Vai para o último registro if Query2.RecordCount < 1 then IDe := 0; // Se não retornar nenhum registro IDe := IDe + 1; // Incrementa com + 1 -> Inc(IDe); ShowMessage(IntToStr(IDe)); // Vai mostrar 1
Por favor, confirma essas informações.
GOSTEI 0
Titanius
04/02/2004
Caro Aroldo,
Realmente o seu código está mais enxuto... porém continua dando o erro... e é exatamente o que você descreveu que eu quero que faça..
Segue uma imagem da tela do Delphi, na hora de debugar:
Como dá pra perceber, ele não entra nas variáveis de jeito nenhum.. acho que meu delphi, meu arquivo.. alguma coisa está errada.. pois nenhuma variavel esta recebendo valores...
Muito estranho isso...
Abraços,
Realmente o seu código está mais enxuto... porém continua dando o erro... e é exatamente o que você descreveu que eu quero que faça..
Segue uma imagem da tela do Delphi, na hora de debugar:
Como dá pra perceber, ele não entra nas variáveis de jeito nenhum.. acho que meu delphi, meu arquivo.. alguma coisa está errada.. pois nenhuma variavel esta recebendo valores...
Muito estranho isso...
Abraços,
GOSTEI 0
Beppe
04/02/2004
A variável IDe está sendo definida(atribuída), mas não esta sendo usada(lida). Desmarque Optimization nas opções do projeto, aba Compiler. Com otimização on, o Delphi remove tais variáveis.
GOSTEI 0
Titanius
04/02/2004
Olá Beppe, fiz o que você disse, porém continua na mesma.. ele não entra nas variáveis de jeito algum... estou achando que é problema no meu Delphi...
Abraços,
Abraços,
GOSTEI 0
Beppe
04/02/2004
Experimenta um Build antes de rodar...
GOSTEI 0
Aroldo Zanela
04/02/2004
Colega,
Teste o seguinte:
Teste o seguinte:
With Query2 do Close; SQL.Text := ´SELECT Max(id) FROM Movimentos´; // Pega o maior Open; end; IDe := Query2.FieldByName(´ID´).AsInteger + 1; // Incrementa With Query2 do Close; SQL.Text := ´SELECT Max(id) FROM Contas WHERE descricao = ´ + QuotedStr(ComboBox2.Text); Open; end; IDConta := Query2.FieldByName(´ID´).AsInteger;
GOSTEI 0
Pantoja
04/02/2004
na minha modesta opnião acho que tem um erro na lógica da sua variavel... cada vez que voce clicar no botao a variavel IDE = 0 e em um determinado momento ela vira 1. SEMPRE isso irá ocorrer pois voce colocou o ´zeramento´ da varialvel dentro da mesma procedure que esta o inc(ide). tente zerala no evento onshow do form. e tire o ide:=0 do evento onclick ... acho que ira funcionar
GOSTEI 0
Titanius
04/02/2004
Depois de muito tentar consegui arrumar utilizando o código do aroldo .... ate que enfim.... esta funcionando perfeitamente agora...
Valeu pela paciencia de todos e pelas dicas...
Brigadao...
Abraços,
Valeu pela paciencia de todos e pelas dicas...
Brigadao...
Abraços,
GOSTEI 0
Allen74
04/02/2004
Fellipe,
Pelo que pude perceber do comentário no seu código na imagem que você postou, o objetivo de sua primeira Query é obter o próximo ID para a tabela de movimentos. Imagino que você queira implementar um tipo de auto-incremento para a mesma. Se for este o caso, o ideal seria avaliar se o banco de dados que você utiliza não fornece este recurso, como os campos AUTO_INCREMENT no MySQL, os GENERATORS no Oracle ou IDENTITY no SQLServer.
Em todo caso, sem a utilização de campos auto-incrementáveis, a melhor forma de fazê-lo seria seguindo a última sugestão do Aroldo, na qual eu faria uma única modificação, acrescentando um nome para o campo, pois dependendo do banco de dados o nome da coluna não permanecerá o mesmo quando é aplicada uma fórmula:
O seu código original realmente tinha um problema de lógica, se o funcionamento que você deseja é este do código acima, ficou faltando um else na sua primeira versão do código. O correto seria:
Agora, quanto ao problema que você está tendo com os breakpoints e com a inspeção da variável IDe:
O problema é mais ou menos o que o Beppe te disse. No seu código (pelo menos na parte que está visivel na figura) somente existe uma atribuição e um incremento para a variável IDe, o valor atribuido por ela [i:8e65b9f9a9]aparentemente[/i:8e65b9f9a9] não está sendo utilizado em nenhum outro lugar do código.
Então, o que ocorre é que após a compilação e a posterior linkedição de seu programa, o Delphi, no processo de otimização do córido irá desconsiderar esta parte do código que não será realmente utilizada. Por isso o breakpoint que você colocou nas variáveis ficou inválido (repare no X amarelo no meio do círculo vermelho). Então durante a depuração, seu código não irá parar nestes breakpoints.
Se você reparar bem, o Delphi te indica quais linhas de código são executáveis na janela de edição: são os pequenos pontos azuis no lado esquerdo de cada linha. Qualquer breakpoint que você colocar nesta linha será válido. Para ilustrar melhor o problema, segue um exemplo:
Na figura abaixo, você verá que após a compilação, nenhuma das linhas do código são válidas. Isso porque o conteúdo da variável I não é realmente utilizado para nenhuma operação realmente útil no código.
Já no código abaixo, o simples fato de incluir um IF que irá avaliar o conteúdo desta variável e realizar uma operação ou outra torna as linhas de atribuição válidas.
Portanto, não se trata de nenhum problema no Delphi. Fique tranquilo quanto a isso. Se mesmo assim sua rotina não estiver funcionando da forma que você idealizou, descreve em maiores detalhes o quê ela deve fazer e poste todo o trecho de código para tentarmos te ajudar.
[]s
Pelo que pude perceber do comentário no seu código na imagem que você postou, o objetivo de sua primeira Query é obter o próximo ID para a tabela de movimentos. Imagino que você queira implementar um tipo de auto-incremento para a mesma. Se for este o caso, o ideal seria avaliar se o banco de dados que você utiliza não fornece este recurso, como os campos AUTO_INCREMENT no MySQL, os GENERATORS no Oracle ou IDENTITY no SQLServer.
Em todo caso, sem a utilização de campos auto-incrementáveis, a melhor forma de fazê-lo seria seguindo a última sugestão do Aroldo, na qual eu faria uma única modificação, acrescentando um nome para o campo, pois dependendo do banco de dados o nome da coluna não permanecerá o mesmo quando é aplicada uma fórmula:
With Query2 do Close; SQL.Text := ´SELECT Max(id) AS valor FROM Movimentos´; // Pega o maior Open; end; IDe := Query2.FieldByName(´valor´).AsInteger + 1; // Incrementa
O seu código original realmente tinha um problema de lógica, se o funcionamento que você deseja é este do código acima, ficou faltando um else na sua primeira versão do código. O correto seria:
if Query2.RecordCount < 1 then IDe := 0 else IDe := Query2.FieldByName(´Id´).Value + 1;
Agora, quanto ao problema que você está tendo com os breakpoints e com a inspeção da variável IDe:
O problema é mais ou menos o que o Beppe te disse. No seu código (pelo menos na parte que está visivel na figura) somente existe uma atribuição e um incremento para a variável IDe, o valor atribuido por ela [i:8e65b9f9a9]aparentemente[/i:8e65b9f9a9] não está sendo utilizado em nenhum outro lugar do código.
Então, o que ocorre é que após a compilação e a posterior linkedição de seu programa, o Delphi, no processo de otimização do córido irá desconsiderar esta parte do código que não será realmente utilizada. Por isso o breakpoint que você colocou nas variáveis ficou inválido (repare no X amarelo no meio do círculo vermelho). Então durante a depuração, seu código não irá parar nestes breakpoints.
Se você reparar bem, o Delphi te indica quais linhas de código são executáveis na janela de edição: são os pequenos pontos azuis no lado esquerdo de cada linha. Qualquer breakpoint que você colocar nesta linha será válido. Para ilustrar melhor o problema, segue um exemplo:
Na figura abaixo, você verá que após a compilação, nenhuma das linhas do código são válidas. Isso porque o conteúdo da variável I não é realmente utilizado para nenhuma operação realmente útil no código.
Já no código abaixo, o simples fato de incluir um IF que irá avaliar o conteúdo desta variável e realizar uma operação ou outra torna as linhas de atribuição válidas.
Portanto, não se trata de nenhum problema no Delphi. Fique tranquilo quanto a isso. Se mesmo assim sua rotina não estiver funcionando da forma que você idealizou, descreve em maiores detalhes o quê ela deve fazer e poste todo o trecho de código para tentarmos te ajudar.
[]s
GOSTEI 0
Allen74
04/02/2004
Depois de muito tentar consegui arrumar utilizando o código do aroldo .... ate que enfim.... esta funcionando perfeitamente agora...
Valeu pela paciencia de todos e pelas dicas...
Brigadao...
Abraços,
hehe, parece que meu post chegou atrasado. Enquanto estava escrevendo o texto acima não percebi que você já tinha encontrado a solução, mas mesmo assim, fica aí para esclarecer alguns pontos.
GOSTEI 0
Aroldo Zanela
04/02/2004
Allen,
Muito bem observado. Obrigado.
Muito bem observado. Obrigado.
GOSTEI 0
Titanius
04/02/2004
Valeu Allen, a partir de agora prestarei mais atencao no que voce disse...
obrigado a todos...
[]s
obrigado a todos...
[]s
GOSTEI 0