
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
[resolvido] Somar Campo Timer (horas Extras) Paradox
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
Agora que você pôs o código, isto está bem claro. Você tem apenas um dataset (Query1) no seu relatório, certo?! Então, só para lembrar, você nunca deve manipular ele em qualquer parte do código quando ele estiver vinculado ao QuickRep - captou?! É assim: o quick report obtém os dados do dataset para imprimir as informações do groupheader e em seguida banda detalhe, então, ele mostrar os dados do primeiro registro. Após imprimir este registro, no groupheader ele executará o procedimento BeforePrint da banda detail e aí vem o problema: você move o dataset até seu final. Na sequência, ele imprime o groupfooter e verifica se o final do arquivo chegou, e como isto é verdade, encerra o relatório com apenas um registro e o somatório total. O que você tem que fazer é mudar o BeforePrint da banda detalhe para: procedure TForm2.QRBand5BeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin HEPAG := HEPAG + Hora_Seg( TimeToStr( Query1.FieldByName('HE_DIURNA').AsDateTime ) ); end; Abraços -
Yoda, como o colega Jonas mencionou, um dos métodos é através de mensagens (via SendMessage, PostMessage). Outra possibilidade seria através de DDE (Dynamic Data Exchange).Em qualquer um dos casos, se forem troca de informações específicas, ambas aplicações deverão estar preparadas para "conversar" uma com a outra. p.s. Yoda, eu alterei o título do seu tópico porque ele não deixa claro a sua real questão.
-
[resolvido] Buscando Os Valores De Coluna Escondida Para Itens Selecio
pergunta respondeu ao Giba_ti de Micheus em Delphi, Kylix
Giba_ti, dê uma olhada neste post.O código mostra como movimentar-se pelas linhas selecionadas no DBGrid. A questão de acessar uma coluna oculta (na verdade um field do dataset ligado ao DBGrid que possui sua propriedade Visible = false) não apresenta qualquer problema, já que como você pode ver no exemplo, acessamos o campo no dataset (via fieldbyname) e não via propriedade Colunms do DBGrid. -
gardenal, sempre que você selecionar vários componentes, em que pelo menos um deles não seja igual aos demais, isto ocorrerá. Apenas aparecerão no Object Inspector as propriedades comuns (mesmo nome e tipo).
-
Cesar, dê uma olhada neste documento - Acesso Firebird via Internet - acho que ele pode lhe ajudar.
-
[resolvido] Somar Campo Timer (horas Extras) Paradox
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
Eder, veja que você mesmo já colocou a origem de seu problema. Você totaliza as horas antes da impressão do relatório (QuickRep1.BeforePrint) e inicializa o QrLabel4 que mostrará este total, logo, para cada usuário o total só poderá ser o mesmo! Voce precisará é definir esta sua variável HEPAG na sessão private do seu form, de modo que você possa utilizá-lo nos seguintes pontos: - no GroupHeade, você inicializa (zera) ela; - no BeforePrint da banda detalhe, você soma a hora sendo impressa ao valor já armazenado em HEPAG; - no BeforePrint da banda GroupFooter, você converte o total de horas do empregado e atribui a QrLabel4. Só para constar, naquela sua rotina no BeforePrint, a atribuição ao QrLabel4 deve ficar fora do WHILE para que não seja constantemente atribuído. ;) Na verdade, este procedimento não seria mais utilizado, pela forma como mencionei acima. -
Jonas, por esta parte do código você está sugerindo o desenho de uma imagem em uma coluna do DBGrid. Mas, pelo que o colega Carlosjunior postou (ele disse no fundo de um DBGrid), parece que o que ele quer mesmo é uma espécie de "marca d'água" no DBGrid. Isto é um pouquinho mais complexo - não lembro-me de ver um componente deste, com esta característica. Dica: Apenas a título de informação, o procedimento para desenho de uma imagem numa determinada coluna de um DBGrid não exige que tenha que ser criado um componente para este fim. Basta escrever o procedimento no evento OnDrawColumnCell (segundo o help, OnDrawDataCell é obsoleto - está mantido apenas para compatibilidade) e alterar a propriedade DefaultDraw para False. Abraços
-
[resolvido] Somar Campo Timer (horas Extras) Paradox
pergunta respondeu ao Eder de Micheus em Delphi, Kylix
Eder, realmente não dá para fazer assim. Mas... Supondo que você grave apenas hh:mm (não grava os segundos), poderia ser feita uma continha fácil no seu select. Siga o meu exemplo: Estamos transformando o Time em um Float que possui na parte inteira a quantidade de horas e na fracionária, os minutos. Ou seja, você poderá obter na parte inteira as "n" horas e multiplicando a parte fracionária por 60, terá os "n" minutos. Se preferir transformar este campo para um equivalente ao TDateTime (ou TTime) no Delphi, divida o valor do campo por 24 que é o número de horas de um dia. Se você leu o que rolou semana passada sobre esta questão de TDateTime, você deve ter lido o post que fiz há algum tempo sobre o formato deste tipo (TDateTime). Se tiver que formatar horas além de 23:59:59, dê uma olhada em Tutoriais & Dicas, procurando pela função que lá já postei há algum tempo. Abraços -
Eu dou preferência por utilizar o TQRGroup, mas ambas deverão resultar na mesma coisa - são iguais na verdade. Acredito que co-existam por questões de compatibilidade, porque na versão inicial, adicionava-se uma banda e utilizava-se a propriedade BandType para definir de qual se tratava) Idem. Lembre-se apenas que estes dataset's ligados a subdetail, deverão estar vinculados ao dataset master - seja via propriedade MasterSource ou outro método que filtre cada despesa e abastecimento para cada veículo. Abraços
-
Esta poderia ser sua banda detalhe, pois contém os dados do veículo (seu dataset mestre neste relatório): AJUSTE DE VIAGEM PLACA_VEICULO =========== Aqui teríamos um GroupBand para o 1º SubDetail---------------------------------------------------------------------- ABASTECIMENTOS ---------------------------------------------------------------------- data litros ---------------------------------------------------------------------- Esta seria a sua banda SubDetail ligada ao dataset Abastecimentos e com a propriedade GroupHeader apontando para o groupband anterior e FooterBand apontando para a banda footer mais abaixo30/06/07 20 01/07/07 30 Aqui teríamos um GroupFooter para o 1º SubDetail------------------ TOTAL........50 Aqui teríamos um GroupBand para o 2º SubDetail---------------------------------------------------------------------- DESPESAS DE VIAGEM ---------------------------------------------------------------------- data valor ---------------------------------------------------------------------- Esta seria a sua banda SubDetail ligada ao dataset Despesas e com a propriedade GroupHeader apontando para o groupband anterior e FooterBand apontando para a banda footer mais abaixo30/06/07 15,00 01/07/07 30,00 Aqui teríamos um GroupFooter para o 2º SubDetail---------------------- TOTAL.........45,00 ---------------------------------------------------------------------- R.: Não...eu só tenho uma Banda Group e 2 QRSubDetail SubDetail e não adicionei... Amigão..afinal na sua opinião...quais as bandas e quais as ligações devo usar pra montar este relatorio? Eu estou usando como menciono lá em cima deste tópico....Parece que é diferente do seu raciocionio Veja se com a explicação acima isto fica claro
-
Se o campo é timestamp, funciona sim. Vai depender do que você pretende fazer com ele. Por exemplo, se eu tiver a data/hora final e inicial como segue: DT_INICIO = 02/07/2007 15:30:00 DT_FIM = 06/07/2007 15:50:09 valor esperado: 4 dias, 20 minutos e 9 segundos utilizando o cálculo direto no SQL eu obtenho: VL_DECORRIDO = 4,013993055 Como chegar ao esperado: note que são 4 dias e 0,013993055 horas onde cada valor inteiro corresponde a 24:00 (um dia), certo. então, se multiplicar 0,013993055 por 24, você deverá obter o total de horas a que corresponde: 24 * 0,013993055 = 0,33583332; No resultado você nota que tem 0 horas (parte inteira) + 0,33583332 de uma hora, ou seja 60 minutos. Então, novamente você multiplica e terá o tempo em minutos: 60 * 0,33583332 = 20,1499992; No resultado você já vê que tem 20 minutos + 0,1499992 de um minuto, ou seja 60 segundos. Novamente você multiplica e terá o tempo em segundos: 60 * 0,1499992 = 8,999952; O que temos denovo? 8 segundos e 0,999952 de um segundo, ou seja 1000 mili-segundos. Mas se não precisar da precisão é só parar por aqui e arredondar os 8,999952 para ter 9 segundos. este foi o exemplo "forçado" que crie no IBExpert para testar - note que eu simplesmente subtrai um timestamp do outro: deve ser utilizada uma tabela para que o select funcione - eu usei uma das minhas. Abraços
-
Aqui estamos nós denovo com problemas de comunicação. :huh: Se o Iniciante Programador partiu do exemplo do robinho, que NÃO utilizou componentes data-aware (os tal TDB...), então o exemplo bem detalhado do felipe não vai ajudar muito. Já se ele utilizou apenas partes do exemplo do robinho, mas trabalhou com componentes data-aware, então seria bom ter informado, por que utilizando eles todo o processo é simples, e a questão de evitar edição acidental fica fácil controlar apenas definindo a propriedade AutoEdit=false do datasouce ligado aos componentes.
-
desde que DiskExists armazena o tipo byte, seria interessante verificar exatamente o que é armazenado nele. Imagino que seja 0 (false) ou 1 (true). Se for isto então é só fazer o type-cast: if(Boolean(pOutBufVxD.DiskExists[i]) and (pOutBufVxD.IDEExists[i div 2])) then seria isso?
-
Eu fiz nessa ação, mas o que eu vou colocar nas outras ações?.Esta dando uma revisada nos post zerados, então, vou por uma resposta aqui... ROBINHOCNE, o que você espera que aconteça quando você executar a ação Clientes, Fornecedore, ... ? Se você consegue responder a esta pergunta, saberá o que fazer. ;) Vamos supor (apenas supor) que ao executar a opção Clientes, voce esteja querendo acessar a tela de consulta de clientes (digamo que seu nome seja BrwClientes), então, supondo ainda que você crie seu form dinamicamente, você teria o seguinte código: procedure TMainFormActClientes.OnExecute(Sender :TObject); begin BrwClientes := TBrwClientes.Create(Self); try BrwClientes.ShowModal; finally BrwClientes.Free; end; end; já se você não cria os forms dinamicamente, ou seja, você não removeu eles nas opções de Projeto da caixa Auto-create form, então o código ficaria assim:procedure TMainFormActClientes.OnExecute(Sender :TObject); begin BrwClientes.ShowModal; end; Abraços p.s. já que você tem participado bastante do forum, não gostaria de se registrar?
-
Se você pegou com ele, você deve ter algo parecido com isto em seu código: procedure Tfrmalunos.leregistro; begin if consultaregistros('alunos', 'codigo, nome, cpf, processos', 'codigo =' + retorno) then begin txtmat.text := ledados ('codigo'); txtnom.text := ledados ('nome'); txtcpf.text := ledados ('cpf'); txtpro.text := ledados ('processos'); end; if consultaregistros('usuarios', 'codigo, nome', 'codigo =' + retorno) then begin txtcodi.text := ledados ('codigo'); txtusu.text := ledados ('nome'); end; end;O que este procedimento faz é, após encontrar a informação (via função consultaregistros), utilizar o dataset por ela aberto (e que está posicionado no registro desejado) para retornar as informações utilizando uma função chamada ledados, onde ele move o valor do campo lido para o respectivo edit. O que a função consultaregistros faz é montar uma consulta SQL para procurar na tabela "alunos", os campos "codigo, nome, cpf, processos" com a cláusula where "codigo = <valor em retorno>". Se você pegou com ele, você deve ter este procedimento em seu código. Eu não tenho como adivinhar todo o malabarismo que há nos códigos de vocês, mas o conceito é este (denovo): - em algum momento o usuário seleciona um item para editar (é o que você irá utilizar na cláusula where, ou seja, na procedure é o valor em retorno); - após selecionado, ao pressionar um botão edit, você chamará o seu LeRegitro, que irá obter todos os dados na tabela e mover para os respectivos Edit; - ao final da edição, deve haver um botão gravar. É sabendo que você está editando e não inserindo, que você chamará o procedimento que move os valores dos edit's para a lista de campos e valores e chama o procedimento AlteraRegistro. posso perguntar por que você começou a aprender (já que se diz iniciante) delphi com banco de dados utilizando justo esta abordagem - não utilização de componentes data-aware (os TDB...)? Abraços
-
Do post de onde você tirou essa "encrenca" (link), tem o procedimento LeRegistro que aparentemente faz isto. É bem verdade que ele ainda chama uma procedure Consultaregistros que vai realmente efetivar a consulta, mas é bem óbvio o que tem lá dentro - dê uma olhada no post que fiz em resposta ao questionamento dele - é praticamente o código que lhe falta.
-
Isto sugere executar uma aplicação que irá carregar outra aplicação dentro dela. Isto sugere abrir forms a partir de um form principal. Afinal, qual é realmente o problema? O primeiro não pode ser resolvido. Já o segundo, se bem explicado, sim.
-
coloquei nele pra funcionar: tudo certinho...o relatorio..... mas agora alem de listar os ABASTECIMENTOS eu preciso lançar no mesmo relatorio as DESPESAS Da placa...logo abaixo dos abastecimentos....Mas ai eu não sei quais bandas incluir.....neste caso é uma outra tabela...que traz estas despesas. alguém poderia me dar uma dica? muito Grato Podemos continuar no outro tópico? É que você vai precisar continuar com aquela abordagem (duas sub-detail) para chegar aonde quer. Veja que é justamente o que você tem: uma tabela mestre - Veiculo e duas detalhes Abastecimento e Despesas.
-
Voce ligou as bandas Group nas respectivas SubDetail (propriedade FooterBand)?
-
Bom, este já parece ser um exemplo de função para alterar os valores dos campos na tabela - eu diria que é um salvar alterações. a ideía de clicar me um botão Editar deve ser mais ou menos essa: - clica no botão editar; - no evento OnClick do botão, você localiza na tabela o registro a ser editado; - uma vez localizado, move os valores dos campos para seus edit's no form; - mostra o form para que seja feita a edição/altração; - ao final, cancela ou grava as alterações.
-
O usuário consegue fazer isso através da caixa de diálogo da impressão. Na janela de preview, é clicar no botão Printer Setup, selecionar página inicial e final, clicar Ok e a seguir clicar no botão Print.
-
Voce pode também utilizar o between: with query1 do begin close; sql.clear; sql.add('select * from tabela1 where data1 between :A and :B'); parambyname('A')asdate := DateTimePicker1.date; parambyname('B')asdate := DateTimePicker2.date; open; end;
-
o caminho no BDE Administrator para selecionar e alternar as DLL's Como você pode ver, haverão as DLL's disponíveis/possíveis onde uma delas pode ser selecionada. Quanto ao "quando eu testo dá erro", você deve colocar a mensagem de erro, porque pode ser um problema na configuração, mas também pode ser algo que você esqueceu. Quanto a paleta ADO no D3, eu verifico mais tarde (pois em casa não tenho esta versão) e coloco aqui. Verifiquei e realmente não tem. O único modo é este da sua apostila Abraços
-
Está correto, mas façamos um favor a lógica, use "until FileExists(pik);" ao invés de "until FileExists(pik)=true;".Veja o que já comentei, e o Churc complementou, sobre isto num outro post. Veja o que o Help diz sobre isso:Use the InputBox function when there is a default value that should be used when the user chooses the Cancel button (or presses Esc) to exit the dialog. ou seja, o valor que você passa como default será o mesmo retornado pela função quando o cara cancelar a entrada. Abraços
-
Tenho a impressão que você deveria utilizar áspas como delimitar a data. Sugestão, utilize parâmetros, simplifica muito as coisas. Dê uma olhada neste post