
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Então, provavelmente será interessante olha lá em Tutoriais & Dicas um tópico que fiz para a formatação de horas com mais de 23:59:59hs. primeiro devo perguntar: porque você faz este tipo de conversão?e segundo, você realmente está armazenando Data separado da Hora, como eu imaginei no post anterior?
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
quando usando componentes data-aware padrões, você sempre vai ter: - no componente data-aware, a propriedade DataSource apontando para um componente TDataSource; - no componente datasource, a propriedade DataSet apontando para um componente dataset tipo Query ou Table (no seu caso TIBQuery ou TIBTable); - e nestes dataset estarão os campos (fields) então: - se DsAluLan é um DataSource; - se DtsAluLan é um DataSet; - e se DBGrid é um componente data-aware.... você vai ter: - a propriedade DataSource do seu DBGrid apontando para DsAluLan; - a propriedade DataSet do seu DsAluLan apontando para DstAluLan; e por fim, se DstAluLan é seu dataset, o método ParamByName só pode se aplicar sobre ele. Então, a linha que acusa erro deve ficar: ... ParambyName('Vencimento').AsDateTime := DtmIza.DstAluLan.FieldByName('Vencimento').AsDateTime; ... -
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
se você não entender o "espírito da coisa" vai ficar complicado... este: DtmIza.DsAluLan.FieldByName('Vencimento').AsDateTime; a que me refiro, pode estar errado, mas a idéia é obter o campo Vencimento do dataset ligado ao seu DBGrid. Se ele não se chama DsAluLan ou se não está no datamodule DtmIza, daí é com você. O importante é que você saiba que FieldByName é um método de um componente tipo dataset (seja Query, Table,...) e não de um TDataSource ou outra coisa. ;) -
Eder, a sugestão é que você calcule na mão. - Crie uma variável do tipo datetime (vamos chamar DtAnterior) na seção private do seu form (o do relatório). - No BeforePrint da banda que você iniciar o motorista (talvez você liste vários motoristas, então pode ter um groupband) voce inicializa esta variável com o valor do campo (será o primeiro valor, no seu exemplo 16/10/2007 16:00). procedure Form1.group1BeforePrint(....); begin // como você tem os campos data e hora separados, iremos concatená-los para facilitar as coisas DtAnterior := <dataset>DatSaida.value +<dataset>HraSaida.value; end; - Coloca um QRLabel na banda em que a hora será impressa e, depois, no before print você faz a continha e atribui o valor: procedure Form1.band1BeforePrint(....); var QtdHora :TDateTime; begin QtdHora := (<dataset>DatSaida.value +<dataset>HraSaida.value) - DtAnterior; if QtdHora = 0 then QRLabel1.Caption := '' // na primeira linha não há diferença else QRLabel1.Caption := TimeToStr(QtdHora); // guarda campo atual para próxima interação DtAnterior := (<dataset>DatChegada.value +<dataset>HraChegada.value); end; Algo assim. Resta uma pergunta: Há a possibilidade de este intervalo de tempo ser maior que 23:59h?
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
isto mesmo. mas ainda está errada a linha que questionei. A cláusula WHERE não pode estar deste jeito: SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao'); deve ser provavelmente algo assim: SQL.Add('WHERE Codigo = :Codigo and Vencimento = :Vencimento'); (acho que já identifica unicamente a parcela deste aluno) e você ainda não passou o parâmetro "Codigo" e "Vencimento" que acrescentei acima, acredito que deveria ficar deste jeito: procedure Tfrmalunos.SpbBaixarClick(Sender: TObject); begin with DtmIza.UpAluLan do begin SQL.Clear; SQL.Add('UPDATE Lancamento'); // tabela que terá o campo atualizado SQL.Add('SET baixado = :Tipo'); // campo a ser atualizado com valor -> parâmetro SQL.Add('WHERE Codigo = :Codigo' and Vencimento = :Vencimento); ParambyName('Codigo').AsInteger := DtmIza.DsAluLan.FieldByName('Aluno').AsInteger; ParambyName('Vencimento').AsDateTime := DtmIza.DsAluLan.FieldByName('Vencimento').AsDateTime; if RdbBaixa.Checked then ParambyName('Tipo').AsInteger := 1 else ParamByname('Tipo').AsInteger := 0; ExecSQL; // instrução UPDATE é executa com este método, não o Open; end; end;confira se os campos são estes mesmos, bem como seus tipos (Codigo/Aluno=Integer e Vencimento=Date) mas como você vê, uma instrução UPDATE não é um SELECT. Voce apenas atualiza as colunas necessárias. Sugiro que você procure dar uma olhada em apostilas de SQL para conhecer melhor os comandos existentes e como utilizá-los. -
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, lembra que eu disse utilizar outro IBQuery para fazer o update? Então, você mudou seu dataset que era mostrado no DBGrid para fazer as duas funções. Não vai prestar! Voce deve continuar mostrando os dados no DBGrid como fazia antes (se não me engano com o DsAluLan) e ter em seu datamodule DtmIza um outro IBQuery com nome UpAluLan (como você o tem agora), mas que será utilizado apenas para aquilo que eu propus ainda há pouco. No momento, não tenho tempo para lhe fazer uma avaliação mais detalhada, mas sem dúvida você ainda terá muito o que fazer no seu projeto, e muitas dúvidas aparecerão, já que até agora tem poucos recursos (imagino que será mais complexo). Pelo que vejo, no seu projeto, você está economizando em componentes. Não há porque ter "medo" de utilizar vários datasets no projeto. Considero mais importante que as coisas estejam claras no código. Quando se começa a utilizar um único dataset para executar todas as coisas (mostrar dados no DBGrids, DBEdits, ... e fazer outras operações SQL) é quase certo que em algum momento vai ter dor de cabeça. Abraços -
o conceito básico é este: - no evento OnClick do seu botão consultar, você pode fazer uma pesquisa no seu banco utilizando um SQL. . - Se não encontrar alguma coisa, a informação ainda não existe no cadastro e neste caso você habilita seu botão de cadastro. Usando uma query você faz isto, após o <query>.Open, testando se foi achado o fim de arquivo: if <query>.EOF then; . - Se for encontrado algum registro no cadastro, <query>.EOF retornará false, e com isto você não habilitará o botão cadastro. Mas precisamos de mais informação: - qual banco de dados você está utilizando? - com qual tipo de conexão/componentes você acessa o banco de dados? - você pretendo ter uma tela de consulta (onde os dados são mostrados em um grid) e outra tela para cadastro? Você pode acessar o link do 4Share (lá embaixo na minha assinatura) e acessar a pasta Tutoriais. Lá tem dois exemplos relacionados a esta minha última pergunta. Baixe eles e teste, talvez você possa dar mais informações sobre o que você pretende, mas lembro que o TCC é seu, então, a gente ajuda, mas você é quem faz. ;) Abraços
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, só por curiosidade, neste curso lhe ensinaram este método de programação? Assim, sem o uso de componentes Data-aware? (os tais dos DBEdits, DBComboBox,...)Porque é o meio mais complicado para começar. (minha opinião) bom, a falho foi minha, mas a essas alturas, você já poderia verificar que este método estava sendo usado no local correto (você já utilizou ele antes). Na dúvida, tecle F1 sobre o método e você vai descobrir onde ele é utilizado. Ok?! ;) Então, esta parte: ... if RdbBaixa.Checked then SQL.ParambyName('Tipo').AsInteger := 1 else SQL.ParamByname('Tipo').AsInteger := 0; deveria ser: ... if RdbBaixa.Checked then ParambyName('Tipo').AsInteger := 1 else ParamByname('Tipo').AsInteger := 0; já que ParamByName é um método do Dataset (TIBQuery) e não da propriedade SQL (TStrings). Vejo também, que você incluiu um novo parâmetro (Tipo, na cláusula WHERE), porém não o inicializou em lugar algum - tem que fazê-lo antes de chamar ExecSQL. Mas ainda assim, você iria ter mais uma mensagem de erro, porque tem um monte de coisa seguindo o parâmetro: SQL.Add('WHERE Codigo = :Codigo, Aluno, Tipo, Parcela, Valor, Vencimento, Emissao '); O que é que é isto tudo? :huh: Abraços -
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, você tem que entender o "espírito da coisa". Lembre-se sempre que quem está com o programa na mão é você, então a gente dá a sugestão e você tenta ajustar ao seu código. por exemplo, este código que passei: procedure TCadAluno.SpbBaixaClick(Sender :TObject); begin dataset.edit; // campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox if RdbBaixa.Checked then dataset_campo_baixado.Value := 1 else dataset_campo_baixado.Value := 0; dataset.post; end; obviamente não está totalmente correto. Eu não sabia qual era o nome do dataset que você estava utilizando. Pelos outros posts seguintes, agora eu poderia dizer que deveria ser "DtmIza.DsAluLan", então naquele caso eu exemplificaria com: procedure TCadAluno.SpbBaixaClick(Sender :TObject); begin DtmIza.DsAluLan.edit; // campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox if RdbBaixa.Checked then DtmIza.DsAluLanbaixado.Value := 1 // ou DtmIza.DsAluLan.FieldByName('baixado').Value := 1 else DtmIza.DsAluLanbaixado.Value := 0; // ou DtmIza.DsAluLan.FieldByName('baixado').Value := 0 DtmIza.DsAluLan.post; end; Mas como depois você também disse que está utilizando um IBQuery, e ele é somente leitura, não daria para utilizar o método Edit para alterar o campo BAIXADO na linha atualmente selecionada no DBGrid. como sugeri: nos resta utilizar uma querie auxiliar, ou seja, utilizar outro componente IBQuery para executar uma instrução de UPDATE no registro atualmente selecionado no seu DBGrid. Então, esta instrução seria obviamente executada no clicar do speedbutton: procedure TCadAluno.SpbBaixaClick(Sender :TObject); begin with DtmIza.UpAluLan do begin SQL.Clear; SQL.Add('UPDATE Lancamento '); // tabela que terá o campo atualizado SQL.Add('SET baixado = :baixado'); // campo a ser atualizado com valor -> parâmetro SQL.Add('WHERE Codigo = :Codigo'); // campo(s) a ser(em) filtrado(s) p/ identificar o registro // campo da tabela receberá o valor 0 ou 1, conforme o seu radiobox if RdbBaixa.Checked then SQL.ParamByname('baixado').AsInteger := 1 else SQL.ParamByname('baixado').AsInteger := 0; ExecSQL; // instrução UPDATE é executa com este método, não o Open; end; end; mas novamente eu não sei quais são os campos chaves (aquele que identifica unicamente o registro na tabela LANCAMENTO e que você está mostrando os dados no seu DBGrid). Então, você terá que ajustar a cláusula WHERE para contê-los. Caso haja algum campo que faça parte da chave na tabela LANCAMENTO, mas que você não tenha incluído ele na cláusula SELECT da sua consulta DsAluLan, mas que você vai precisar dele para filtrar corretamente no UPDATE, então você deverá incluí-lo lá na sua consulta DsAluLan. Assim, você vai ter estes valores para passar nos parâmetros que você precisará no dataset UpAluLan. Observações: 1) assumi que você adicionou o novo IBQuery (sugerido) no seu datamodule DtmIza, e deu a ele o nome UpdAluLan; 2) eu não vi a informação do estado baixado em sua consulta mostrada no DBGrid, mas se por algum acaso você vier a colocá-la, você terá que ser preocupar com a atualização da sua consulta DsAluLan, após alterar o valor do campo, ou seja, ao final da execução do update no speedbutton. Como vai fazer isto? Re-executando a sua consulta. Como fazer isto? Executando um Close seguido de um Open, mas não esqueça de concatenar qualquer parâmetro que você esteja utilizando na consulta (tipo aquele "+ TxtMat.Tex +"). Espero não o ter confundido ainda mais. Abraços -
Como Usar Um Dbnavigator P/ Várias Janelas Mdi?
pergunta respondeu ao Warrior.of.Ice de Micheus em Delphi, Kylix
Experimente, ao tornar a janela filha ativa, alterar o dataset (ou datasource) ligado ao DBNavigator. -
mas, "será o benedito?!" :angry: Faz o seguinte, me envia seu e-mail via MP (mensagem pessoal) Neste arquivo zipado tem 7 arquivos (até baixei ele do link), você deve estar tendo algum problema.
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, se você der uma olhada nas propriedades do componente (no Object Inspector - você não olhou heim!!!), vai ver que ele não tem a propriedade SQL, mas sim uma para a consulta (SelectSQL), outra para inserção (InsertSQL), outra para atualização (RefreshSQL), outra para exclusão (DeleteSQL) e a de alteração (ModifySQL). Mas se você achar que complica demais, então utilize outro IBQuery com uma instrução de UPDATE. No OnClick do seu botão, você utiliza uma instrução SQL similar a esta: UPDATE Lancamento SET baixado = :baixado WHERE Codigo = :Codigo você tem que verificar ai que campos você precisa colocar na cláusula WHERE para identificar corretamente a linha mostrada no seu DBGrid. Depois passa os parâmetros como de costume e executa ele com ExecSQL. Abraços -
(Resolvido) Tratamento De Erro No Ado Acessando O Postgres
pergunta respondeu ao Samuelsjn de Micheus em Delphi, Kylix
Samuelsjn, o seu problema reside no fato de que você está querendo comparar a mensagem "normal" (com maiúsculas e minúsculas) com a mensagem original da exceção em maiúscula (você está utilizando UpperCase): Mas a título de garantir o resultado, o correto seria realmente testar tudo (os dois lados) em maiúscula ou minúscula (tanto faz), então a sugestão seria deixar como você verá abaixo. Sugiro ainda que deixe o tratamento um pouco mais gernérico - não precisa colocar todos os detalhes da mensagem, apenas aquilo que a identifica (no seu caso a violação da chave estrangeira). Também é interessante observar que, se você vai permitir o RAISE (que abortará a continuidade da execução de sua procedure), então fica mais lógico você modificar a mensagem original da exceção e não utilizar a função ShowMessage: ... try dtmdlCIM.QueryPrincipal.ExecSQL; except on E: EDatabaseErro do begin if Pos('violates foreign key constraint', LowerCase(E.Message)) > 0 then begin E.Message := 'Dados importantes não foram preenchidos!'#10#10'Erro: ' +E.Message; raise; end; end; end; Voce pode apenas atribuir a sua mensagem para a propriedade Message, mas por questões de "segurança", eu costumo agregar ao final da mesma a mensgem original (fica a seu critério). -
Voce talvez possa fazer uso da cláusula LIMIT existente na instrução SELECT. Leia o que há sobre LIMIT nesta página de help do MySQL. Eis um exemplo que está lá: como vê, neste caso o select do "cara" descarta as primeiras 95 linhas.
-
Espaço para troca de informações e discussão sobre Microsoft SQL Server - http://blogsqlserver.blogspot.com/
-
Vai dando uma olhada neste post
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
se é query, não vai funcionar. É componente da paleta BDE ou Interbase. Se for da BDE, tenta habilitar a propriedade RequestLive (true), se for InterBase, troca por um IBDataSet (se não me engano, é este). Daí você vai poder colocar em modo edição, pois um componente do tipo TQuery - a princípio é apenas leitura. -
Exato! Mas, lembre-se que não deixará de ser um documento HTML.
-
Samuelsjn, você pode testar o nível do nó. Se o nó selecionado (Selected) estiver no nível (Level) 0, então está selecionado Itens, do contrário fornecedor - simples assim: ... if Assigned(TreeView1.Selected) then begin if TreeView1.Selected.Level = 0 then // selecionado Item<n> begin // aqui você faz as inserções de fornecedores end; end; end;
-
(Resolvido) Como Dar Baixa Em Lancamentos Direto Do Cadastro De A
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, qual componente você utiliza para acessar a tabela (qual tipo de dataset)?Se puder ser posta em modo edição bastaria colocar no botão algo bem simples, mais ou menos assim: procedure TCadAluno.SpbBaixaClick(Sender :TObject); begin dataset.edit; // campo da tabela recebe o valor 0 ou 1, conforme o seu radiobox if RdbBaixa.Checked then dataset_campo_baixado.Value := 1 else dataset_campo_baixado.Value := 0; dataset.post; end; -
Walter, se elas tiverem algum campo de relacionamento - com certeza! p.s. tenho observado que você tem postado sem estar logado. Voce está com algum problema para se logar no forum?
-
Completando... Não faz muitos dias postei este link de busca do Google que retorna alguns tutoriais passo-a-passo de como criar uma instalação com o InnoSetup. Abraços
-
Uashington, muito provavelmente você não abriu o dataset IBDataSet1 antes de utilizá-lo. No seu exemplo, você deveria ter chamado o método Open antes do Append: ... IBDataSet1.Open; // <== *** IBDataSet1.Append; IBDataSet1PRODUTOR.AsString := Edit1.Text; // outros campos do dataset a serem inicializados IBDataSet1.ApplyUpdates; // supondo que você sempre vai abrir a tabela apenas para fazer as // inclusões, então, após concluída feche a mesma. IBDataSet1.Close; e acho que ainda faltará chamar IBDataSet1.Transaction.CommitRetained, pois, se não estou enganado, ApplayUpdates apenas grava as informações em cache para o banco, mas não a "commita". dê uma olhada nas observações que são feitas neste outro post a respeito de transações/commit/post/cachedupdate Abraços
-
Este é o tipo de pergunta em que a melhor sugestão é a mesma que dei em outro post: Há de se conhecer o básico da ferramenta através de algum livro, apostila ou pelo Help do programa (lá tem "todas" as respostas sobre a IDE) Abraços
-
robinhocne, e provavelmente este não deu certo porque eu acabei me atrapalhando com o lance do nome das colunas. Observe que utilizei o nome errado na cláusula WHERE, está: Sql.Add (' AND P.Categoria = ''B'''); e deveria ser: Sql.Add (' AND P.pCat = ''B'''); faça a alteração e mantenha apenas uma procedure - vai ficar mais correto. Abraços