Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Validar Dois Campos

    se o nome do componente(ADOQuery) fosse QryUser, a instrução deveria ficar, em linha de código: QryUser.Close; QryUser.SQL.Text := 'SELECT * FROM cad_atendentes WHERE Usuario = ' +QuotedStr(eUser.Text) +' and Senha = ' +quotedstr(eSenha.text); QryUser.Open; if not QryUser.EOF then begin // Encontrou o usuário e a respectiva senha end; se não for em linha de código, poderia ser assim A propriedade SQL do QryUser, em design-time, seria escrita: SELECT * FROM cad_atendentes WHERE Usuario = :Usuario and Senha = :Senha no código do programa ficaria assim: QryUser.Close; QryUser.Params.ParamByName('Usuario').AsString := eUser.Text; QryUser.Params.ParamByName('Senha').AsString := eSenha.Text; QryUser.Open; if not QryUser.EOF then begin // Encontrou o usuário e a respectiva senha end; []s
  2. Eder, acredito que você possa utilizar o TQRCompositeReport. A idéia é a seguite, você adiciona dois componentes TQuickRep ao form e faz o "desenho" do contas a receber em um deles e no outro o do contas a pagar. Depois você adiciona no form o TQRCompositeReport. Então, no evento OnAddReports, você adiciona os dois relatórios; ex.: procedure TFormReport.QRCompositeReport1AddReports(Sender: TObject); begin QRCompositeReport1.Reports.Add(QuickRep1); // contas a receber QRCompositeReport1.Reports.Add(QuickRep2); // contas a pagar end; no momento de mostrar o preview, ao invés de utilizar o QuickRep1.Preview, você deverá utilizar: ex. ... QRCompositeReport1.Prepare; QRCompositeReport1.Preview; end; O QRCompositeReport fará com que os dois relatórios saiam "grudados" um após o outro, como se fosse um só. Acho que era disto que você estava falando, não?! []s
  3. Paulo Nobre, caso não apareça nada mais... Se utilizar o D7, talvez você considere fazer um teste com os componentes da paleta Additional: TActionMainMenuBar, TActionManager e TXPColorMap Com eles é possível manipular a cor de menus (TXPColorMap - propriedade Color). Tem um exemplo neste link (precisa se cadastrar para ter acesso) []s
  4. Micheus

    Erros No Button

    traira007, cara você não deixou claro qual o problema, entretanto acho que o problema está nas atribuições. você não pode mover Float para Text; para fazer isto você deverá utilizar algo como FloatToStr(strtofloat(edit1.text) +1); Quando colocar o código aqui no forum, ele fica mais legível se utilizar a TAG (o botãozinho com o #) []s
  5. Micheus

    Validar Dois Campos

    Lafey, normalmente o que você faz é no evento OnExit do Edit testar o seu conteúdo utilizando uma query auxiliar para isto. Tipo, coloca um componente uma instrução SQL mais ou menos assim: 'SELECT NomComprador FROM compradores WHERE NomComprador = :NomComprador' Daí no exit do Edit, você passa o texto digitado como parâmetro para a consulta. Essa é uma sugestão: procedure TForm1edtCompradorExit(Sender :TObject); var TextoExiste :Boolean; begin ADOComprador.Params.ParamByName('NomComprador').AsString := edtComprador.Text; ADOComprador.Open; TextoExiste := ADOComprador.EOF; ADOComprador.Close; if not TextoExiste then // faz algo se não existe texto digitado begin // move o foco devolta para o componente Edit edtComprador.SetFocus; // apresenta uma mensagem de erro e pára execução do programa raise Exception.Create('Deve ser informado um comprador válido'); end else begin // faz algo se o texto existe ou simplesmente não utilize a opção 'else' end; // se o texto existir não ocorrerá o raise e a execução do programa // continuará e passará por aqui de qualquer modo end; []s
  6. Micheus

    Paradox

    reniltoamaral, quando usava Paradox, já tive este tipo de problema e lembro que tem a ver com caminho configurado no BDE. Então dei uma pesquisada e encontrei um "paper" bem interessante, explicando como solucionar este problema (não leve em conta o nome da aplicação - Sispetro) -> link []s
  7. Micheus

    Duvidas

    gfav, é simples. A seleção em um combobox é definida pela propriedade ItemIndex. Então, fedit.CB1.ItemIndex := <indice da posiçao da string na lista> seleciona a string; É possível obter a posição que uma determinada string na lista, do ComboBox, através do método IndexOf(<string a procurar>) do TStrings: fedit.CB1.ItemIndex := fedit.CB1.IndexOf(<nome da categoria>); []s
  8. Micheus

    Duvidas

    gfav, pelo seu comando select ('select categoria from categorias') parece que você tem apenas um campo descritivo (categoria) - não tem um de código, certo?! Então neste caso vamos ter que mudar algumas coisas: => AddObject requer uma string (aquela que aparece na lista e um ponteiro - que eu havia utilizado para guardar o código). Como você tem apenas o campo descritivo, teremos que utilizar outro método Add. Então, substitua a linha: fedit.CB1.Items.AddObject(zrqcatCATEGORIA.asstring); por fedit.CB1.Items.Add(zrqcatCATEGORIA.asstring); Isto ocorre pro que, provavelmente, você não adicionou os campos ao componente. Para fazer isto, dê um duplo click no componente zrqcat; Deverá aparecer uma pequena janela com botões de navegação(4) desabilitados; Click com o botão direito do mouse sobre ela e selecione a opção All Fields. Isto fará com que os campos que você incluiu no select apareçam na lista.Se tudo correu corretamente(não havendo erro na sua instrução select), neste momento você já tem o tal campo - componente TField com o nome zrqcatCATEGORIA (note que é a concatenação do nome do dataset +nome do campo). Eu prefiro esta abordagem por diversas questões, mas há outro meio de fazer isto (sempre há) sem que seja adicionado o campo ao formulário(o que fizemos no passo anterior). você utiliza o método FieldByName(<nome campo>): fedit.CB1.Items.Add(zrqcat.FieldByName('CATEGORIA').asstring); => Para adiantar um pouco as coisas, já lhe informo que a parte do exemplo que postei que utiliza a seleção deste ComboBox precisará ser modificada: var Categoria :string; begin ... Categoria := fedit.CB1.Items[CbxCategorias.ItemIndex]); QryVerCliente.Close; QryVerCliente.ParamByName('NomCli').AsString := EdtNomCliente.Text +'%'; QryVerCliente.ParamByName('Categoria').AsString := Categoria; QryVerCliente.Open; ... end; a consulta que postei antes estaria escrita desta forma: Observe que como não armazenamos informação de código na propriedade Objects, então utilizaremos apenas a lista de strings(Items[<indice>] ou Items.Strings[<indice>], usei do 1º modo). []s
  9. Micheus

    Duvidas

    Então, para este caso talvez você possa utilizar um comando SQL em um componente TZReadOnlyQuery tipo 'SELECT CodCategoria, DscCategoria FROM Categorias', o qual resultará em todos os registros da tabela categorias. Para mostrar numa caixa de lista, se não estou enganado, é possível utilizar um TDBLookupComboBox de modo que facilitaria muito as coisas. Se utilizar este componente, não são configuradas as propriedades DataSource e DataField - apenas as de Lookup. O valor selecionado seria disponibilizado em KeyValue; Mas, se utilizar um TComboBox, você deverá popular esta lista antes de o form ser apresentado. Também utilizo esta abordagem da seguinte forma: begin QryCategorias.Open; while not QryCategorias.EOF do begin CbxCategorias.Items.AddObject(QryCategoriasDSC_CATEGORIA.AsString, Pointer(QryCategoriasCOD_CATEGORIA.AsInteger)); QryCategorias.Next; end; QryCategorias.Close; ... end; depois, para utilizar, eu obtenho o Código devolta e passo à consulta: begin ... CodCategoria := LongInt(CbxCategorias.Items.Objects[CbxCategorias.ItemIndex]); QryVerCliente.Close; QryVerCliente.ParamByName('NomCli').AsString := EdtNomCliente.Text +'%'; QryVerCliente.ParamByName('CodCategoria').AsInteger := CodCategoria; QryVerCliente.Open; ... end; A esta altura o exemplo da consulta que postei antes estaria escrita desta forma: []s
  10. Micheus

    Duvidas

    gfav, basicamente você vai obter os dados nesta situação, através de um componente para consulta apenas (TZReadOnlyQuery). A questão é: de que forma você pretende utilizar esses dados e quais são os campos do qual você está falando. De um ComboBox, você poderá apenas obter o texto selecionado e em alguns casos um campo Inteiro (tipo um código - é como normalmente uso). Se der mais detalhes fica mais fácil de dar sugestão. Ao que parece você utilizará duas informações para fazer o seu filtro (valor do Edit e do ComboBox). Informações sobre este recurso são bastante comuns de encontrar nos foruns; Uma coisa a ter em mente é que quando a consulta inicial (sem filtro) retorna muitos registros, você pode ter uma performance ruim (mas cada caso é um caso); Basicamente o que pode ser feito é escrever no evento OnChange do Edit, um código onde você passe para a consulta os dados a serem utilizados como filtros de modo que, a cada vez que o texto ou a seleção do combo mudarem, a consulta seja refeita. Para o caso de o valor do Edit representar um campo texto em sua consulta, na SQL que você escreve será utilizado o comando LIKE. A título de exemplo, um componente TZReadOnlyQuery poderia conter a seguinte SQL: 'SELECT CodCliente, NomCliente, bla...bla FROM Clientes WHERE NomCliente LIKE :NomCli ORDER BY NomCliente' então, para informar o parâmetro (:NomCli), dentro do evento OnChange do Edit, você faria algo como: procedure TBrwClienteEdtNomClienteChange(Sender :TObject); begin QryVerCliente.Close; QryVerCliente.ParamByName('NomCli').AsString := EdtNomCliente.Text +'%'; QryVerCliente.Open; end; onde QryVerCliente é o componente responsável pela consulta que será mostrada no seu DBGrid. O '%' adicionado ao texto digitado, funciona como um '*' no DOS, serve para "dizer" ao SQL que traga todos os clientes que contenham o nome começando com o texto passado em EditNomCliente.Text e terminando com qualquer outra coisa (é possível colocar o % no início também); Mas, como no item anterior, mais informações sobre a consulta que você pretende mostrar no grid ajudam a melhor a exemplificação (tabelas, campos, ...) Para estes casos, costumo implementar no segundo form, os métodos Incluir e Editar de tal modo que passando como parâmetro as informções necessárias (normalmente o Código) e utilizando outro dataset (desta vez um que permita update - TZQuery) onde tenho condições de posicionar no registro a ser manipulado. A título de exemplo, supondo que na consulta que você tem associada ao DBGrid (QryVerCliente - no meu exemplo), esteja o campo CodCliente, então ao clicar num botão 'Alterar' colocaria um código mais ou menos assim: procedure TBrwClienteBtnAlterarClick(sender :TObject); begin CadCliente := TCadCliente.Create(Self); try if CadCliente.Alterar(QryVerClienteCOD_CLIENTE.AsInteger) = mrOk then begin // caso cadastro alterado, refaz consulta para atualizar DBGrid EdtNomClienteChange(Sender); end; finally CadCliente.Free; end; end; Daí no form CadCliente, o procedimento Alterar ficaria mais ou menos assim: function TCadCliente.Alterar(CodCliente :LongInt) :TModalResult; begin QryUpdCliente.ParamByName('CodCliente').AsInteger := CodCliente; QryUpdCliente.Open; if not QryUpdCliente.EOF then Result := ShowModal // mostrará o form e retornará conforme botão pressionado OK ou Cancel else Result := mrCancel; // fechará o form com opção de cancelar end; Observe que para este form utilizamos um componente que permite update na tabela e que a consulta SQL dele é similar ao anterior, sendo que aqui passamos como parâmetro o CodCliente com o objetivo de "posicionar" específicamente no cliente selecionado. Eu gosto de utilizar ModalResult para que apenas se a tela de cadastro sair pela opção mrOk (configuo para quando for clicado em gravar registros) e daí eu atualizo a consulta no Grid. Caso contrário, não há necessidade de refazer a mesma. Bom, este e mais ou menos o "conceito" que eu utilizo. Existem várias formas de fazer. É apenas para dar uma noção. []s
  11. Micheus

    Campo Blob (access)

    Colega, evite duplicar o post, dê continuidade ao mesmo: http://scriptbrasil.com.br/forum/index.php?showtopic=85614 E pela nova pergunda, ao que parece, você leu o que respondí no outro post. Para ser carregado e posto em execução - até onde sei - o arquivo tem que existir. []s p.s. Evite enviar post em letras GARRAFAIS - significa que você está gritando, além de desagradável a leitura.
  12. com certeza o procedimento para criação do indice não funcionará, já que é válido para o Paradox. Mas quando trabalhei com SQLServer e TTable, era fácil criar índices se sem qualquer ferramenta. você não seleciona qualquer índice para a tabela, apenas na propriedade IndexFieldNames você define os campos que deseja para a ordenação: Ex. CodCliente;DatVencimento Só não estou lembrado se você separa com vírgula ou ponto e vírgula. O SetRange vai funcionar corretamente apenas com o índice definido na sequência CodCliente e DatVencimento, já que ele trabalha encima do índice definido. []s
  13. Micheus

    Sistema De Login

    Lafey, uma opção é a validação no banco a outra é a utilização de uma tabela de usuários gerenciada por você. Na validação no banco, são passados nas propriedades user e password do Database o nome do usuário e senha que deve existir na tabela de usuarios do banco. Se não conferir, o Database não é aberto e uma exceção ocorrerá; No caso de validação por você, o Database conecta-se ao banco utilizando o usuário e senha de administrador (do banco), e na sua aplicação você utiliza uma tela de login onde obtém o nome de usuário e senha para validá-lo numa tabela mantida por você (não a do banco); Utilizando a validação no banco, em seu caso, quando incluir um usuário na sua tela Cad_Atendentes, você deverá incluí-lo na tabela de usuários do banco de dados. Isto pode ser feito via programação, utilizando um componente de execução de SQL com a função que o banco oferece para tal (CREATE USER / GRANT - veja documentação). você pode utilizar variáveis globais (definidas em uma unit - normalmente do form principal - fora da definição da classe do form e antes do implementation), então, no evento AfterConnect do Database, você salva estes valores, bem como no AfterDisconnect pode limpá-los. Que componentes você vai utilizar? Normalmente após estes processos utilizo o CommitRetained.Não utilizo o MySQL com Delphi, então acho provável que outros colegas tenham mais a opnar sobre esse assunto. []s
  14. Acredito que você terá que extraí-lo do campo e salvá-lo(utilizando a forma inversa da que gravou no campo), temporariamente, para então utilizar funções como WinExec para executá-lo. Uso do WinExe -> exemplo aqui no forum []s
  15. simoesluciano, mas você conseguiu implementar isto corretamente. Por que em eventos como o OnEndPage e OnStartPage você vai obter um StackOverflow. Verificando a possibilidade de incluir no OnAfterPrint, no meu relatório este evento não ocorre. Acho que esta é situação pode ser complicada de contornar. Qualquer coisa que se tente provavelmente será uma "gambiarra". []s
  16. Parece razoável não acha? A principal utilidade do CompositeReport é justamente concatenar relatórios. Assim, se você tem um relatório curto e deseja que um segundo relatório contendo outras informações continue a partir do anterior (sem quebra da página), basta adicionar os dois ao CompositReport e ele fará isto. É uma boa aplicação quando você quer imprimir 2 boletos por página, onde você adiciona o mesmo "relatório" (boleto) e terá impresso o boleto principal e a cópia (tipo a via do cliente e do banco). Se não desejar esta funcionalidade então utiliza o NewPage. Parece que é exatamente o que ocorre. Então se você deseja que o page header seja o mesm para ambos os relatórios, sugiro que você adicione a ambos esta banda. []s
  17. simoesluciano, ainda esses dias fiz um relatório utilizando o TQRCompositeReport e sabe que eu nem tinha notado isto. Então, para contornar este problema, coloque o seguinte no BeforePrint do primeiro relatório do composite: procedure TRelEstatisticas.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean); begin Sender.QRPrinter.Title := QRCompositeReport1.ReportTitle; end; No meu caso resolvel o problema. Verifique. []s
  18. Illuminati, você utiliza Paradox? - crie um índice composto por dois campos: o primeiro sendo o Código do Cliente e o segundo a data de vencimento (ascendente ou descendente conf. você queira); você pode fazer isto utilizando o Database Desktop - no seu programa selecione na propriedade IndexName o índice que você criou; - após a seleção do cliente (código) no combobox, utilize SetRange para filtrar o cliente na sua tabela: TabCliente.SetRange(....) - veja help Daí você deverá estar vendo todos os dados do cliente ordenado pela data de vencimento. Se for outro banco, podem haver alternativas.
  19. Micheus

    Tranferencia

    Carlos, tem um tópico sobre o assunto aqui no forum - link Dê uma olhada e veja se continua com dúvidas. []s
  20. A questão é que deve haver um campo (coluna) na sua consulta com valor diferente. O distinct vai, digamos, "agrupar" o resultado retornando apenas a 1ª ocorrência de dos valores repetidos (avaliando todas as colunas). Assim, se houver uma coluna diferente numa outra linha do resultado, esta será retornada já que é diferente da anterior. Se eu não estou enganado, talvez você tenha que modificar sua abordagem. Dá uma olhada neste link na parte que fala do DISTINCT []s
  21. É, não reparei se você já estava respondendo também. Foi mal. :rolleyes: Pelo menos a resposta foi basicamente a mesma. :D []s
  22. Vivendo&Aprendendo, está faltando a cláusula FROM. A título de sugestão, seria mais conveniente você fazer uso do WITH <DM> DO e utilizar ALIAS no SQL, fica mais claro de ler o código: with DmDados do begin ContasReceber.SQL.Add('Select Distinct(C.CodSaidas), C.Codigo,'); ContasReceber.SQL.Add('C.DataCad, C.Cliente, C.MeuCodigo,'); ContasReceber.SQL.Add('C.Cnpj, C.Ie, C.Cpf, C.Rg,'); ContasReceber.SQL.Add('C.Orgao, C.Endereco, C.Numero,'); ContasReceber.SQL.Add('C.Bairro, C.FormaPgto, C.TipoPgto,'); ContasReceber.SQL.Add('C.DataVencimento, C.Parcela, C.Valor,'); ContasReceber.SQL.Add('C.Desconto, C.ValorRecebido, C.Troco, C.ValorTotal, C.Situacao, C.Promissoria, C.Descricao'); ContasReceber.SQL.Add('FROM ContasReceber C'); *** <==== AQUI ContasReceber.SQL.Add('Where C.CodSaidas = '+IntToStr(Cod)); ContasReceber.Open; end; ... No seu caso, inclusive, que tem apenas uma tabela, não seria necessário o uso do alias. Apenas o nome dos campos da tabela definida na cláusula FROM. []s
  23. Micheus

    Quickreport

    Só a título de curiosidade, também dá para utilizar o QRExpr, onde na expressão você pode testar ser há conteúdo no campo para então concatená-lo ou não - ás vezes é útil. Utilizando parte do exemplo do colega Progr'amador: 'Rua: '+Query.FieldByName('Rua').AsString+', '+Query.FieldByName('Numero').AsString+', '+Query.FieldByName('Complemento').AsString A menos que você teste o conteúdo do campo antes de concatenar, pode ocorrer de, se Numero estiver nulo, ficar uma lacuna estranha (em vermelho): 'Rua: Maranguape, , próximo da vendinha' QRExpr2.Expression ficaria com: 'Rua: '+QryCliente.RUA +IF(QryCliente.NUMERO <> '', ', '+QryCliente.NUMERO, '') +IF(QryCliente.COMPLEMENTO <> '', ', '+QryCliente.COMPLEMENTO, '') Já com nesta situação, o teste é realizado pelo componente que resulta numa concatenação mais correta. Observe que o caracter delimitador é concatenado (em verde) apenas se o campo não for nulo: 'Rua: Maranguape, próximo da vendinha' []s
  24. Pelo fato de que ela é forçada a operar em modo gráfico ao invez de utilizar o conjunto de caracteres internos. Se você pretende fazer um relatório simples, utilizando os recursos de caracter da impressora, então a melhor opção é mesmo utilizar os comandos ESCAPE's. Apenas, que com eles você vai ter que preocupar-se com o lay-out de saída (planejar) para poder ter um bom resultado. Terá que introduzir os caracteres de controle da impressora que ativam/desativam Negrito, Itálico, mudança de Fonte, tamanho dos fontes, preocupar-se com o tamanho da página, salto de página.... Essas coisas. (mas em se tratando de matricial - vale a pena)Já se você pretende utilizar gráficos na saída (bitmap's, p.e.), então não vai dar não. Acho que há componentes que facilitam um pouco esse trabalho. Neste link da X-Maker (é open-source, mas precisa se registrar) tem um "pacote" de componente para impressão direta. Na verdade o que imprime no Spool (como sugere o colega kmkg) é apenas um deles VDODmPrinter (para Delphi 4 a 7). Eu não testei não mas as referências são boas. Dê uma testada. Para você não ter que se registrar, vou postar o download neste link (VDOPrint_3_0_0.zip) []s
  25. ZueRa, acho até que entendi um pouco mais, mesmo assim desculpe-me, mas acho que encontrei um limite em minha compreensão. :( Espero que algum outro colega consiga ajudá-do a passar essa etapa. []s
×
×
  • Criar Novo...