
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
VDLR, se conseguir montar a consulta, no formato "tabela", dê uma olhada neste exemplo (em anexo) para ver como o relatório fica bem simples. Eu usei os componentes IB, mas não consegui sucesso na execução do programa, então a visualização foi feita apenas em modo design-time (ativada consulta, botão direito no QuickTep1, opção Preview do menu). Veja se você configura para rodar no seu PC. RelTeste.zip
-
:huh: Na codificação hexa-decimal do código HTML, que é indicada pelo uso do #, cada par de caracteres representa a seqüência de cores RGB (Red, Green e Blue, ou seja Vermelho, Verde e Azul) - 6 caracteres -> #RRGGBB. No Delphi, a propriedade Color, também aceita codificação hexa-decimal, o que é indicado pelo $, porém, a seqüência é invertida e ainda tem a adição de um outro elemento, o qual pode ser ignorado (atribuindo-se zero). Sendo assim, cada par de caracteres representa a seqüência de cores BGR (Blue, Green e Red) - ou seja, o inverso da utilizada no HTML - 6 caracteres -> $BBGGRR. Exemplo: +---------+---------+ |..HTML...|.Delphi..| +---------+---------+ | #FF0000 | $0000FF | Vermelho "puro" | #FFA500 | $00A5FF | Alaranjado +---------+---------+ Obs:Você vai observar que, ao digitar apenas os 6 dígitos no Delphi, automaticamente será inserido o par inicial de zeros inicial, tornando-se a cor -> $00BBGGRR) (isto quando ela não tornar-se um "nome", tipo clYellow ou clRed) O par de zeros iniciais, que eu disse poder ser desconsiderado, é na verdade um tipo de flag. Conforme é possível verificar no help do TColor: If the highest-order byte is zero, the color obtained is the closest matching color in the system palette. If the highest-order byte is one ($01 or 0x01), the color obtained is the closest matching color in the currently realized palette. If the highest-order byte is two ($02 or 0x02), the value is matched with the nearest color in the logical palette of the current device context. E significa mais ou menos isto: se a cor "retornada" da paleta do sistema, deve ser que mais se aparenta com a "solicitada", se é a mais próxima obtida a partir da paleta "realizada" (?) ou se é a mais próxima obtida a partir da paleta lógica do DC atual. Após definir uma cor em hexa-decimal, experimente substituir o par de zeros inicial por $01. Abraços
-
Walter Gazzarrini Neto, parece que você não leu esta linha no meu post: a única coisa da qual falei fou um componente TDataSource, logo, o evento só poderia ser dele. Não?! :huh: Ainda acho que o jeito é o que sugeri, então, segue um exemplo anexo. (é bem idiota, mas funciona) ;) ChangeLabel.zip
-
coloque um TDataSource no seu form (caso já não tenha um) para ligá-lo ao seu dataset ZTpecas (via propriedade Dataset do TDatasource). Feito isto, no Object Inspector, vá na guia Events e dê um duplo click no evento OnDataChange. Coloque o seu código naquele evento. Deste modo, para cada linha do DBGrid que você posicionar o "cursor", o label será ajustado. (se não for um DBGrid, também funciona)
-
Aproveitando o exemplo do colega marcio.theis... Ainda dependendo do banco que utiliza, se for Firebird, poderia no lugar de UPPER + LIKE utilizar simplesmente CONTAINING: procedure TfrmConsultaDVD.btGenClick(Sender: TObject); begin qrDVD.Close; qrDVD.SQL.Clear; qrDVD.SQL.Add('Select *'); qrDVD.SQL.Add('From DVD'); qrDVD.SQL.Add('Where GenDVD CONTAINING ''' + edtGen.Text + ''''); qrDvd.Open; end;
-
Este é um assunto, de certo modo polêmico, porque é difícil fechar todas as possibilidades. Dê uma lida neste tópico (ref. ActiveDelphi) - há algumas sugestões lá (eu mesmo dei a minha). p.s. você deve utilizar uma resolução de vídeo bem alta, não?! porque essas letras em tamanho 4 ficam gigantes na minha tela. :D
-
Mas isto não impedirá de o usuário desplugar o cabo USB da câmera. :blink:
-
"quem" pode dar uma grande ajuda é o botão Pesquisar. Aqui no forum tem muitos tópicos relacionados ao assunto, mas se você não tem a menor idéia de como proceder, você pode começar dando uma olhada no post que está na seção Tutoriais & Dicas -> Criando Um Relatório no QuickReport Passo a Passo
-
Walter Gazzarrini Neto, enquanto editava seu post notei que, para o que você pretende, tem uma coisa que não está legal: - "if date=strtodate('04/10/2007') then" => você deve verificar se a data é <=, caso contrário, apenas naquele dia será pedido a senha, no demais não;
-
completando... ao chamar a opção, o mais sensato é que a conexão com o banco também seja fechada.
-
Jhonas, neste caso não influencia não.Ocorre que EXTRACT estará retornando um número inteiro, o qual será transformado em "string" pelo uso do operador de concatenação de textos do Firebird ("||"). supondo que você esteja montando este valor de algum modo (talvez através de edit), seria conveniente que você montasse da forma como o Firebird espera. se o campo utilizado for do tipo data, converta ele para string utilizando a função FormatDateTime: FormatDateTime('yyyym', Date); com este formato, o mês não terá o zero inicial quando form menor que 10.
-
(Resolvido) Tratamento De Erro No Ado Acessando O Postgres
pergunta respondeu ao Samuelsjn de Micheus em Delphi, Kylix
É o mais usual. Há um componente (não lembro qual) que até tem um evento para quando ocorrem erros no banco. Mas o usual é isto: utilizar um try..except..end Veja também este post. Há diferenças em tratar o try..except e utilizar um ShowMessage para mostrar a mensagem. Como a exceção não ocorrerá, o programa continua a execução após o "end" do try..except. Isto não ocorre no exemplo que postei: o raise fará com que a execução pare naquele ponto. (normalmente é o desejável). Vai do caso. -
Fabio, acho que ficamos na mesma. Você não entendeu o que coloquei no posta anterior? :huh:
-
(Resolvido) Como Criar Um Relatório No Delphi 7?
pergunta respondeu ao phdorocha de Micheus em Delphi, Kylix
Ele acompanha algumas versões do Delphi. Veja neste post como instalar ele, caso já esteja acompanhando sua versão. -
Como Saber O Nome Da Janela Em Que O Cursor Do Mouse Está Posicionado
pergunta respondeu ao Denso de Micheus em Delphi, Kylix
Jhonas, supondo que ele citou "saber qual é o nome da janela em que a seta do mouse está posiicionada", acho que este código traria apenas o nome da tela atualmente com o foco - possivelmente, a janela em que o cursor (chama-se ponto de inserção, na verdade) está posicionado. (me corrija se estiver errado). -
Não manjo desse negócio, mas enquanto mais alguém não se manifesta, vai dando uma lida nesta página da Secretaria de Estado da Fazenda (Rio de Janeiro) - ECF - Emissor de Cupom Fiscal Tem também esta resolução Dispõe sobre a autorização de equipamento Emissor de Cupom Fiscal (ECF), onde os Art. 7° a Art. 11 podem ser aproveitáveis. E lendo o que um cara respondeu neste post (ref. Firebase-br) similar ao seu, parece que é algo que pode variar de estado para estado.
-
Xprata, editei seu post para deixar este tópico em ordem, ok?! Xprata, isto é muito relativo. Como a impressão com o quickreport é em modo gráfico (não em caracter), só dá para dizer que o espaço é para "n" caracteres, quando estiver utilizando um font de tamanho fixo - como o Courier. Pelo que entendi ele não pega por letra e sim por palavra....portatno se a palabra ultrapassar 25 posições ele ignora....ele imprime apenas as palavras que cabem inteiras na área designada para sua "impressão". que eu saiba, não. Mas não seria estranho você listar um texto cortado? Porque você não habilita ele a aumentar a altura do retângulo de impressão? Deste modo, as palavras que não coubessem na largura, seriam automaticamente desenhadas numa linha abaixo. Se for o caso, é só mexer nestas propriedades: - AutoSize = False; - AutoStretch = True. Abraços
-
Como Salvar Todo O Conteúdo De Um Listbox Para Uma Tabela
pergunta respondeu ao Júnior programador de Micheus em Delphi, Kylix
Vamos complicar um pouquinho, porque senão, não vai funcionar. ;) Vamos fazer um "up-date" no código do Alessandro: - Adicionar o novo registro; - Gravar o novo registro. procedure TForm1.BitBtn1Click(Sender: TObject); var i : Integer; begin // se a query não for aberta em outro pronto do programa // então, é só retirar o comentário da linha abaixo para abrí-la // query.Open; // * abre a consulta begin query.Append; // inicia um novo registro "em branco" querydescricao.asstring := ListBox1.Items.Strings[i]; query.Post; // Grava registro na tabela end; // assim como para abrir, se for o caso, // remover o comentário da linha abaixo // query.Close; // fechar a consulta end; Falta ainda observar o seguinte: A menos que você possa utilizar este componente TQuery com a propriedade RequestLive = TRUE (que o driver do banco suporte), você não conseguirá gravar nada (ocorrerá erro), já que este componente ("a princípio") se presta apenas para consultas (leitura). Se isto ocorrer, troque por um TTable. Abraços -
Que erro está dando? O erro é na compilação ou na execução? Qual a mensagem de erro(original, não sua interpretação)? Dica a todos que postam dúvidas: Lembrem-se sempre, quem está como o programa é você não quem quer ajudar (como eu). Então, informações mais claras são necessárias. ;)
-
Não saberia explicar adequadamente, não. Mas alguns procedimentos que implicam em mudanças visuais antes de o form ser mostrado (OnShow), não funcionam muito bem se você colocar em outro evento que ocorra antes de ele estar realmente preparado para ser mostrado. Só verificando a seqüência em que os eventos estão ocorrendo para tentar entender o porque de não funcionar. Abraços
-
gsguma, voce deve fazer algo como o que está neste fragmento que retirei de outro post:Conexao.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;DataSource=' +ExtractFilePath(Application.ExeName)+'\Banco.mdb;Persist Security info=False;JetOLEDB:Database Passoword=Senha'; este tipo de comando deve ser colocado, tipo, no evento OnCreate do form principal e depois de definida a string de conexão, você pode ativar o banco.
-
isto é bem basicão, mas vamos lá: quando você dá dois clickes lá no evento do item de menu, você vai "cair" no editor código do programa com algo mais ou menos assim: procedure TForm1.MenuItem1Click(Sender :TBoject); begin | <== * Com o cursor piscando aqui * end; daí você vai ter que utilizar os métodos para exibição do fom em questão. Pode ser Show e ShowModal. A principal diferença é que quando você utilizar ShowModal, a janela é apresentada e as linhas de comando que existirem após este comando, só serão executadas depois que a janela for fechada. Então, supondo que seu form se chamer FormClientes, você teria que acrescentar no código acima: procedure TForm1.MenuItem1Click(Sender :TBoject); begin FormClientes.ShowModal; end; este procedimento só funciona se o form estiver criado anteriormente (normalmente já em design-time, menu Project->Options Auto-create forms) Caso você não esteja deixando o form criado em design-time, então você terá que criá-lo em run-time (tempo de execução). Para isto o código teria que ficar com esta "cara": procedure TForm1.MenuItem1Click(Sender :TBoject); begin FormClientes := TFormClientes.Create(Self); // Cria o form antes do uso try FormClientes.ShowModal; // mostra o form finally FormClientes.Release; // libera a memória alocada para o form end; end; Se for utilizar o método Show, o procedimento é um pouco diferente porque, como disse, o programa continuará executando e depois do Show ele fechará a janela (vai ser só uma "piscadinha"). Então, tem que utilizar outro método. Dê uma olhada neste outro post. Abraços
-
VDLR, desculpe a demora em dar alguma resposta. Estive pensando em como exemplificar, de forma simples, o uso do recurso proposto pelo colega paulobergo para uma situação como a sua. Como acho que pode ser útil a outros colegas ainda iniciantes no assunto, acabei por construir um pequeno artigo tentando explicar cada etapa do processo para a obtenção da consulta que buscaria este tipo de informação. Então, dê uma olhada nele e veja se vai realmente ajudar na compreensão do processo -> "Construindo Uma Consulta Sql Passo-a-passo, Obtendo uma matriz como resultado" Abraços
-
Construindo Uma Consulta Sql Passo-a-passo
uma questão postou Micheus Tutoriais & Dicas - Delphi, Kylix
Este "artigo" ficou meio longo, mas para quem não tem muita afinidade com a construção de um SQL mais complexo, talvez vala a pena lê-lo até o final. A performance de consultas deste tipo dependerá de vários fatores, dentre eles: "tamanho" da base, existência de índices pelos campos envolvidos nas consultas, banco de dados utilizado. Uma pequena avaliação comparativa entre o método utilizado aqui e uma segunda alternativa a este tipo de consulta pode ser baixado para avaliação: Estatistica de resultado de uma consulta SQL Eu vou utilizar como exemplo o banco de dado EMPLOYEE que acompanha o FireBird (o qual, se não me engano, também vem com o INTERBASE). É uma base pequeníssima, mas que servirá para o propósito. Ao final do artigo estão anexos a base de dados e o script da consulta completa. Inicialmente devo considerar que o Firebird passou a dar suporte a sub-selects, no formato proposto, apenas com o lançamento da versão 2.0. Assim, para versões anteriores, haveria a alternativa de criar uma procedure para retornar os resultados que seriam obtidos com o sub-select - este recurso (consultar no resultado de uma procedure) já estaria disponível na versão anterior. Eu não saberia dizer em que versão do Interbase este recurso foi implementado, mas sendo o Firebird (sua primeira versão) derivado da versão 6, até esta versão, com certeza não foi implementado. Das tabelas utilizadas - EMPLOYEE (empregado) - nos interessam os campos *EMP_NO e FIRST_NAME; - SALES (vendas) - nos enteressam os campos *SALES_REP, SHIP_DATE e TOTAL_VALUE. Objetivo da consulta - Totalizar, no período de um ano (de Jan a Dez), as vendas mês-a-mês realizadas e agrupadas por empregados. Considerações sobre o problema - Precisamos "enumerar" todos os empregados que realizaram alguma venda no período; - Para cada empregado, devemos totalizar as vendas para cada mês no período; - Desejamos obter o resultado no formato de planilha: Linha (Empregado), Coluna (Mês no período) e Intercessão (Valores totais). Construindo a consulta SQL 1) Obtenção da relação dos empregados que efetuaram vendas Como queremos apenas os empregados que realizaram vendas num período, deveremos "buscar" esta informação na tabela SALES. Mas, como sabemos que esta é uma tabela onde a relação é N, ou seja, existem vários registros para um mesmo empregado, então precisaremos fazer a consulta de modo a obtermos apenas uma ocorrência (linha resultado) para cada empregado. Este efeito pode ser obtido através do uso da palavra reservada DISTINCT. Assim, já temos como partida a seguinte consulta: Precisaremos ainda restringir o resultado para apenas os empregados que fizeram a vendas no período desejado (início e fim). Para isto, utilizaremos a cláusula WHERE: Agora já temos uma consulta que retorna os empregados que realizaram vendas num período desejado. A título de referência, vamos chamá-la de CnsEmpregadoVenda. 2) Obtenção do valor total vendido por um determinado vendedor Para montar nossa consulta final, precisaremos avaliar como será montada a consulta para obtermos os totais das vendas, num mês, para cada empregado. Estaremos novamente fazendo uso da tabela SALES. Esta totalização é obtida através da combinação de funções de agregação (tais como SUM, COUNT e MAX) e uso da cláusula GROUP BY, já que desejamos fazer um somatório agrupando o resultado por empregado. Assim, nossa consulta ficaria inicialmente como segue: OBS: Na cláusula GROUP BY devem ser adicionados todos os campos definidos na cláusula SELECT e que não seja uma função de agregação. Porém, da mesma forma como na etapa anterior, precisamos restringir o período a ser avaliado o resultado. Como nosso objetivo é uma totalização mês-a-mês, a cláusula WHERE deverá restringir o resutado de acordo com o mês e ano informados e para tanto temos duas formas de fazermos isto: a - utilizando BETWEEN e indicando dia inicial e final do mês em questão; b - utilizando uma função que extraia o número do mês e do ano a partir da data da venda - esta função é EXTRACT. Eu acredito que a forma mais simples seja a opção "b", assim não teremos nehuma preocupação com relação a ano bissexto ou se o mês termina com 30 ou 31. Alterando nossa consulta para utilizarmos o filtro, ela ficará assim: Observe que utilizei <MES> na consulta para indicar que deveremos alí colocar o número referente ao mês que queremos obter o resultado e, também, utilizei <DAT_INICIAL> como referência para obtenção do ano. Como nossa proposta é avaliar os doze meses do ano, isto significa que em nossa consulta final, teremos que utilizar 12 consultas como esta para obter o resulltado esperado - uma coluna para cada mês do ano. A título de referência, vou chamar esta consulta de CnsVenda<MES_NOME> (p. e. CnsVendaJAN, CnsVendaFEV, ...). Observe também, que estamos apenas totalizando as vendas por mês. Mas, em nosso resultado final, queremos o total de vendas por ano para cada empregado. Então, precisaremos fazer a combinação de ambas consultas CnsEmpregadoVenda e CnsVenda<MES_NOME>. Montando uma consulta na forma "esquemática" Vamos começar a juntar tudo, montando a consulta para obtenção das informações do mês de janeiro apenas. Incialmente vamos entender que queremos ligar (filtrar) as consultas CnsVenda<MES_NOME> (vendas no mês) com CnsEmpregadoVenda (empregados que venderam no período). Sabemos que: - CnsEmpregadoVenda, nos retorna a coluna SALES_REP; - CnsVenda<MES_NOME>, nos retorna as colunas SALES_REP e TOTAL_VALUE. Também, queremos mostrar o nome do empregado, então buscaremos o campo FIRST_NAME da tabela EMPLOYEE, referenciando o campo EMP_NO. Isto posto poderíamos montar a seguinte consulta esquemática: seguindo este esquema, a consulta para Janeiro, ficaria: continuando, para os meses Janeiro e Fevereiro: e esta analogia se segue até o mês de Dezembro. Transformando a consulta "esquemática" em uma consulta prática Para efetivamente construirmos a consulta final, vamos apenas substituir as consultas SQL onde aparecem as "consultas de referência", mas mantendo o nome de referência sob a forma de ALIASES (necessário para identificar as consultas no relacionamento), começando pela consulta para os meses de janeiro e fevereiro: SELECT SALES_REP, FIRST_NAME, TOTAL_VALUE_JAN, TOTAL_VALUE_FEV FROM (SELECT DISTINCT S.SALES_REP FROM SALES S WHERE S.SHIP_DATE BETWEEN '1993-01-01' AND '1993-12-31') AS CnsEmpregadoVenda LEFT OUTER JOIN (SELECT SALES_REP AS SALES_REP_JAN, SUM(TOTAL_VALUE) AS TOTAL_JAN FROM SALES WHERE EXTRAC(MONTH FROM SHIP_DATE) = 1 /* Mês de Janeiro apenas, do ano de 1993 */ AND EXTRAC(YEAR FROM SHIP_DATE) = EXTRAC(YEAR FROM CAST('1993-01-01' AS DATE)) GROUP BY SALES_REP) AS CnsVendaJAN ON (CnsVendaJAN.SALES_REP_JAN = CnsEmpregadoVenda.SALES_REP) LEFT OUTER JOIN (SELECT SALES_REP AS SALES_REP_FEV, SUM(TOTAL_VALUE) AS TOTAL_FEV FROM SALES WHERE EXTRAC(MONTH FROM SHIP_DATE) = 2 /* Mês de Fevereiro apenas, do ano de 1993 */ AND EXTRAC(YEAR FROM SHIP_DATE) = EXTRAC(YEAR FROM CAST('1993-01-01' AS DATE)) GROUP BY SALES_REP) AS CnsVendaFEV ON (CnsVendaJAN.SALES_REP_FEV = CnsEmpregadoVenda.SALES_REP) LEFT JOIN EMPLOYEE E ON (E.EMP_NO = CnsEmpregadoVenda.SALES_REP) e procedimento segue-se para os demais meses. Definindo a consulta final para ser utilizada no Delphi Após testada a consulta, precisamos ajustá-la para uso na aplicação Delphi. A melhor forma é parametrizá-la: SELECT SALES_REP, E.FIRST_NAME, TOTAL_JAN, TOTAL_FEV, ..., TOTAL_DEZ FROM (SELECT DISTINCT S.SALES_REP FROM SALES S WHERE S.SHIP_DATE BETWEEN :DAT_INICIO AND :DAT_FIM) AS CNSVENDEDORES LEFT OUTER JOIN (SELECT SALES_REP AS SALES_REP_JAN, SUM(TOTAL_VALUE) TOTAL_JAN FROM SALES WHERE EXTRACT(MONTH FROM SHIP_DATE) = 1 AND EXTRACT(YEAR FROM SHIP_DATE) = EXTRACT(YEAR FROM :DAT_INICIO) GROUP BY SALES_REP) AS CnsVendaJAN ON (CnsVendaJAN.SALES_REP_JAN = CNSVENDEDORES.SALES_REP) LEFT OUTER JOIN (SELECT SALES_REP AS SALES_REP_FEV, SUM(TOTAL_VALUE) TOTAL_FEV FROM SALES WHERE EXTRACT(MONTH FROM SHIP_DATE) = 2 AND EXTRACT(YEAR FROM SHIP_DATE) = EXTRACT(YEAR FROM :DAT_INICIO) GROUP BY SALES_REP) AS CnsVendaFEV ON (CnsVendaFEV.SALES_REP_FEV = CNSVENDEDORES.SALES_REP) : : : LEFT OUTER JOIN (SELECT SALES_REP AS SALES_REP_DEZ, SUM(TOTAL_VALUE) TOTAL_DEZ FROM SALES WHERE EXTRACT(MONTH FROM SHIP_DATE) = 12 AND EXTRACT(YEAR FROM SHIP_DATE) = EXTRACT(YEAR FROM :DAT_INICIO) GROUP BY SALES_REP) AS CnsVendaDEZ ON (CnsVendaDEZ.SALES_REP_DEZ = CNSVENDEDORES.SALES_REP) LEFT JOIN EMPLOYEE E ON (E.EMP_NO = CNSVENDEDORES.SALES_REP) Adicionamos esta consulta à propriedade SQL de um componente do tipo Query, adicionamos todos os fields ao componente e depois ao executar a query basta passar o parâmetros DAT_INICIO e DAT_FINAL. A consulta está pronta para ser apresentada num DBGrid ou em um relatório. Querendo buscar o total do período para cada empregado, basta substituir a parte inicial da consulta: Bom, era "só" isso por hora. Espero que seja útil e qualquer comentário ou sugestão pode ser me enviado por MP. Abraços EMPLOYEE.zip Cosulta_Completa.txt -
Emulandron, acabei passando o link de uma versão bem fuleira deste componente.Neste link para o Torry's Delphi, são listados vários componentes do tipo e eu peguei o que tinha nome de download LinkLabel.zip, só que deveria ter sido pelo nome na tela LinkLabel (sendo o download jslinklabel.zip). :blink: Mas, já que você parece precisar de um exemplo, dê então uma olhada neste outro componente - rwLinkLabel (é do mesmo site). Ele vem com um demo. Com ele, além de poder definir links do tipo ftp, http, mailto, você pode também fazer link até para contados skype. Abraços