Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Januário mendes, a palavra chave é JOIN. Dê uma olhada neste artigo de Thiago Caserta: Consultas com JOINS (ref. Informe Access) Procure ler um pouco sobre a linguagem SQL do seu banco de dados. ;) Abraços
  2. pimpocvl, uma outra abordagem, seria construir a consulta dinamicamente, conforme os parâmetros informados. O objetivo é evitar o uso da cláusula OR que degrada a consulta. var Filtro, Param1, Param2 :string; begin Filtro := ''; Param1 := Trim(Edit1.Text); Param2 := Trim(Edit2.Text); if Param1 <> '' then Filtro := ' WHERE NUMEROATENDIMENTO = :pParametro1 '; if Param2 <> '' then begin if Param1 <> '' then Filtro := Filtro +'AND ' else Filtro := ' WHERE '; Filtro := Filtro +'CODIGOCLIENTE = :pParametro2 '; end; IBQueryfiltro.Close; IBQueryfiltro.SQL.Clear; IBQueryfiltro.SQL.Add('SELECT *'); IBQueryfiltro.SQL.Add('FROM CADASTRO_ATENDIMENTO'); IBQueryfiltro.SQL.Add(Filtro); if Param1 <> '' then IBQueryfiltro.ParamByName('pParametro1').AsString := Param1; if Param2 <> '' then IBQueryfiltro.ParamByName('pParametro2').AsString := Param2; IBQueryfiltro.Open; end;Observe os espaços usados no início/fim da string atribuida a Filtro - são necessários para que o texto não fique "grudado" e gere erro de sintax na execução da query. Eventualmente, também poderá ser necessário definir o tipo do parâmetro no código. Abraços
  3. Frega, talvez você não tenha observado, mas Screen.ActiveForm, não se refere a janela filha (fsMDIChild) ativa, mas sim ao form principal (fsMDIForm) Na classe TForm, há a propriedade MDIChildren que é a lista das janelas filhas da sua aplicação MDI. Se você usar ela ao invés da propriedade Forms, não estará desabilitando seu form principal junto com os filhos. A partir do que comentei, o procedimento a seguir desabilita todos os forms filhos de uma aplicação MDI procedure DesabilitaMDIChilds; var I : integer; begin for I := 0 to Screen.ActiveForm.MDIChildCount - 1 do Screen.ActiveForm.MDIChildren[i].Enabled := False; end; Para habilitar e dar o foco a um form child em específico, basta que o habilitemos e usemos a mensagem WM_MDIACTIVATE conforme indicado no help Win32 API: enviar mensagem para o handle da janela cliente MDI (ClientHandle) - opção mais simples (há outra, ver help citado). Neste caso, podemos usar a propriedade Forms, MDIChildren ou mesmo Self - conforme a situação: ... DesabilitaMDIChilds; Screen.Forms[3].Enabled := True; SendMessage(Screen.ActiveForm.ClientHandle, WM_MDIACTIVATE, Screen.Forms[3].Handle, 0); ... ou ... DesabilitaMDIChilds; Screen.ActiveForm.MDIChildren[2].Enabled := True; SendMessage(Screen.ActiveForm.ClientHandle, WM_MDIACTIVATE, ActiveForm.MDIChildren[2].Handle, 0); ... ou ... DesabilitaMDIChilds; Self.Enabled := True; SendMessage(Screen.ActiveForm.ClientHandle, WM_MDIACTIVATE, Self.Handle, 0); ... Veja se era isto. Abraços
  4. Se voce tiver o código fonte, talvez - mas acho pouco provável que seja de simples solução. Veja neste link as procedures/funções que ela emula - são muito poucas mesmo. (ref. coding.derkeiler.com) Não seria possível você utilizar a unit CRT e mudar a opção de compilação (Compile->Traget...-> Real ou Protected mode application)? Abraços
  5. claudyo, em design-time, use a propriedade Items para inserir os valores que serão apresentados ao usuário. Abraços
  6. Jhonas, isto é JavaScript... :blink: Lube, supondo que esteja usando o QuickReport (como em outros posts), esta seleção (no preview) é feita através do botão de configuração da impressão (aquele com a impressora e uma chave de boca).Veja se era a isto que você se referia. Abraços
  7. Micheus

    SOCKET e Conexao

    Acrescentando mais uma perguntinha: Você vai simplesmente enviar algo para o tal PC, mas tem uma aplicação sua rodando naquela máquina, que esteja esperando esta informação? Se tiver, esta "conexão p2p" poderia usar o nome da máquina (que não está sujeito a mudança) ao invés do IP. Abraços
  8. Micheus

    Entre < e >

    Exceto o fato de que você esteja mesmo querendo queimar pestana e aumentar seus conhecimentos, voce provavelmente poderia fazer uso do componente TScintilla (Freeware). Não o utilizo, por não ter uma aplicação para ele, apenas o tenho em minha lista de componentes interessantes - veja em Delphi Scintilla Interface Components Você pode também encontrar outros componentes para syntax highligth neste link do Torry's (alguns são freeware) Se não for o caso, o que você quer fazer pode ser feito justamente utilizando os links que citei. Entretanto, lá o exemplo mostra como destacar apenas o texto Var, e para fazer o que você quer, talvez você precise criar uma tabela de palavras reservadas ou mesmo, monitorar quando é digitado um "<" e captura sua posição +1 e quando for teclado ">" você terá a sua posição -1. Com estas informações, você pode setar as porpriedades SelStart e SelLength aplicar a formatação usando a função que está no segundo post de referência (ou mistura tudo num procedimento só - fica a seu gosto). Abraços
  9. Micheus

    Entre < e >

    phelipe, se considerar que você vai digitar seu texto em um Memo ou similar, o único jeito de você poder colorir algo em um texto é usando um TRichEdit. Agora, se isto não serve, é melhor você dizer o que está realmente pretendendo implementar. Abraços
  10. Micheus

    Entre < e >

    phelipe, sua dúvida é muito parecida com a deste outro tópico resolvido: Formatação Automatica No Richedit Este outro também pode ser útil: Richedit (linhas Coloridas) Abraços
  11. Edson Duarte, o comando citado está declarado na unit Crt, e funcionará quando você estiver compilando seu programa com a opção Real ou Protected, ou seja, você estará gerando uma aplicação DOS. Conforme consta do help, a procedure utiliza a função de scroll da BIOS: All lines below the inserted line are moved down one line, and the bottom line scrolls off the screen (using the BIOS scroll routine). A unit WinCrt tem algumas das funcionalidades da Crt, emuladas, já que tudo ocorre dentro de uma janela gráfica. Abraços
  12. Micheus

    DBLookupComboBox

    Eder, implementei uma combinação das duas opções e teve como resultado um beep quando você está com a lista aberta e seleciona um item utilizando as setas de navegação e, em seguida, tecla o ENTER. Como havia dito, não tinha 100% certeza de que funcionaria. procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var NaoLimpaKey :Boolean; begin if Key = #13 then begin if ActiveControl is TDBLookupComboBox then NaoLimpaKey := TDBLookupComboBox(ActiveControl).ListVisible else if ActiveControl is TCustomComboBox then NaoLimpaKey := TCustomComboBox(ActiveControl).DroppedDown else NaoLimpaKey := False; if not NaoLimpaKey then Key := #0; Perform(WM_NextDlgCtl, 0, 0); end; end; Abraços
  13. Micheus

    DBLookupComboBox

    funciona porque neste caso, a caixa de lista está fechada e teclando ENTER o seu procedimento executa a ação de mudar o foco para outro controle. e não funciona porque neste caso, quando a caixa de lista está aberta, e você usa o teclado, apenas a tecla ENTER tem a função de mudar a seleção - de acordo com a programação do componente - mas como você trata o ENTER sem se preocupar com esta situação, ocorre que o foco é mudado para outro controle, sem que o processo de seleção (implementado no componente) seja executado. Aliás, este procedimento (não selecionar se não usar o ENTER) é o padrão, caso não tenha observado anteriormente. Uma opção pode ser, ao processar o ENTER, verificar se o componente ativo (ActiveControl) é um destes componentes com caixa de lista (TComboBox, TDBComboBox, TDBLookupComboBox) e verificar se a caixa de listas está aberta. (não estou 100% certo de que ela ainda será True no momento do processamento do ENTER - tem que testar). No caso do TDBLookupComboBox, voce pode testar se a caixa de lista está visível através da propriedade ListVisible. Já no caso das TComboBox e TDBComboBox, voce poderá utilizar a propriedade DroppedDown. Como efeito, com a caixa aberta, o primeiro ENTER, selecionaria o item e um segundo ENTER, mudaria o foco para o próximo componente. Outra opção, poderia ser permitir que a tecla continuasse sendo processada quando o componente se tratar deste em questão, ou seja, você não mudaria o valor de Key para #0 (também tem que testar, pois não estou 100% certo de que funcionaria como o esperado). Bom, são opções a verificar. Abraços
  14. Vivendo&Aprendendo, veja se este post lhe ajuda. Abraços
  15. Micheus

    DBGrid

    Rodrigao, só há mesmo este código no evento OnDrawColumnCell? Aparentemente não haveria nada de errado com ele, exceto que podemos otimizá-lo. Vamos melhorar isto? Quando você testa uma condição onde possam haver diferentes avaliações para uma determinada variável, use if..then..else. Você usou dois if's seguidos e mesmo que a primeira condição seja validada, ainda assim, quantas outras avaliações (if's) você faça, também serão testados (se uma condição foi satisfeita, não há porque testar outra - que não será). Também observe que DefaultDrawColumnCell apenas precisa ser chamado uma única vez antes do end final do evento - todas as definições do canvas devem ter sido alteradas antes: begin if Date > DMX.IBChequeDataVencimento.Value then begin if DMX.IBChequeVENCEU.Value = 'S' then DBGrid1.Canvas.Font.Color:= clBlue else DBGrid1.Canvas.Font.Color:= clred; end; DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State); end;Este código funcina independente de você ter, ou não, definido a propriedade DefaulDraw=False do DBGrid. Abraços
  16. raphael_suporte, trocar a "/" por "-" na formatação da data não deverá mudar o resultado. Citei deste modo, justo por ter testado: By micheus at 2008-11-11 Na verdade, estamos com o foco na coisa errada. Vamos voltar a mensagem de erro citada incialmente pelo colega Thiago B.: Como não é muito comum passarmos horas junto com datas na cláusula where, acaba-se por não perceber que este erro possa acontecer. Na verdade, isto é fruto da forma como o componente é implementado, ou seja, é previsto que a definição de parâmetro (parameter) ocorra através da colocação do caracter ":" a frente (e junto) de um identificador. Logo, o que está ocorrendo é que o componente está tentando tratar a hora como sendo um parâmetro e, em geral, um identificador não deve começar com número - provável motivo da mensagem informar: definido incorretamente. Assim, caímos naquela situação que sugeri anteriormente: ... Localizador = "SELECT * FROM CurvaCargaUsuario WHERE USUARIO = " + usuarios + " AND DATA_HORA_INTEGRACAO >= :dataHoraInicial AND DATA_HORA_INTEGRACAO <= :dataHoraFinal"; ADOQuerySTC2008->Close(); ADOQuerySTC2008->SQL->Clear(); ADOQuerySTC2008->SQL->Add(Localizador); ADOQuerySTC2008->Parameters->ParamByName('dataHoraInicial').Value := StrToDateTime(dataHoraInicial); ADOQuerySTC2008->Parameters->ParamByName('dataHoraFinal').Value := StrToDateTime(dataHoraFinal); ADOQuerySTC2008->Open();Dê uma verificada, pois deve haver uma função para transformação da data-hora string em um TDateTime (é o que faz a função StrToDateTime e neste caso, ela usa o formato: MM/DD/YY HH:MM:SS - veja help) Eu também troquei no exemplo a chamada ao método ExecSQL() por Open(), porque em princípio a primeira é utilizada para execução de SQL's que não retornam linhas (resultados), como é o caso de INSERT, UPDATE, DELETE e outras. Abraços
  17. Micheus

    problema com quick

    Lube, desculpe a demora em retornar (estava pensando a respeito...) Pelo que percebi o problema basicamente se dá pelo fato de você utilizar de 3 bandas para gerar uma informação visual. Nesta condição, não tem como obter o resultado que você quer sem que seja utilizado de algum artifício, porque as colunas não são tratadas de forma independente. (e o único que me vem a mente seria utilizar de QRRichEdit para o histórico e detalhe, mas não estou certo quanto ao benefício, visto que seriam necessárias algumas modificações) Se não for algo crítico, sugiro que mantenha da forma como está. Abraços
  18. dependendo dos componentes que você utilizou para conexão com o access, pode ocorrer de não haver grande mudança. Um artigo para começar: Migração Access / SQL Server . Prepare-se. no Google: migra access sql server Bom estudo ;) Abraços
  19. fernando_vip, já que é um exercício para aprendizado, deixo outras opções com otimização do recurso. Como você irá colocar o número em um ListBox, você pode utilizar do próprio ListBox para a verificação - não há necessidade da lista auxiliar (TList). Veja: procedure TForm1.BitBtn1Click(Sender: TObject); var sena: integer; begin Randomize; ListBox1.Items.Clear; while ListBox1.Items.Count < 15 do begin repeat sena := Random(100); until ListBox1.Items.IndexOf(IntToStr(sena)) = -1; ListBox1.Items.Add(IntToStr(sena)); end; end; ou usando a propriedade Objects de forma similar a sua implementação: procedure TForm1.BitBtn1Click(Sender: TObject); var sena: integer; begin Randomize; ListBox1.Items.Clear; while ListBox1.Items.Count < 15 do begin repeat sena := Random(100); until ListBox1.Items.IndexOfObject(Pointer(sena)) = -1; ListBox1.Items.AddObject(IntToStr(sena), Pointer(sena)); end; end; Abraços
  20. Antonio Anselmo, já fiz este post para você na sessão Banco de Dados > Demais Bancos. Evite duplicar tópicos ;) Abraços
  21. Dávila Patrícia, imagino que você também não esteja conseguindo uma ordenação correta quando há acentuação. Há duas coisas envolvidas: Character Set e Collate Dê uma olhada neste post, veja comentário e link que há nele. Abraços
  22. :blink:A estas alturas, voce não deve estar utilizando a primeira versão do Firebird, então, dê uma verificada com que Dialeto (dialect) você criou seu banco. Nas versões atuais, por default, seria 3 - quando foi introduzido o tipo TIME e TIMESTAMP. Neste artigo você encontra informações sobre isto. Caso precise mudar o dialect do seu banco: Trocando Dialeto/Dialect - Firebird parece mesmo que você está usando dialec 1. Tanto o client quanto o server devem estar configurados com o mesmo dialect, logo você deverá definir o dialect em uso, no componente de conexão que você está utilizando no seu programa (client). Uma apostila que pode ser útil Apostila do FireBird 2.0 com IBExpert (também fala um pouco sobre os tipos de dados do Firebird) Abraços
  23. Thiago B., não vejo esse problema como uma questão necessariamente de SQL em si, mas é coisa do MS Access mesmo. O access consegue ser chato com o fato de usar delimitadores de data diferentes do padrão (que poderia ser aspas duplas). Então, entra outra questão que, esta sim, é comum em outros bancos: a data usada no formato inverso. Parece-me que esta é a origem do seu problema. Assim, ela deve ser concatenada no formato: yyyy/mm/dd hh:mm:ss. O filtrar apenas data, no MS Access, não ocorre erro na consulta se você pensar em utilizar o formato dd/mm/yyyy - mas a data pode ser tratada no formato mm/dd/yyyy. Por exemplo, uma data gravada com este valor: 9/11/2008 04:04:49 (hoje), se for filtrada a tabela deste modo - supondo dd/mm/yyyy: select * from Tabela1 where data_hora between #01/11/2008# and #10/11/2008# o resultado é vazio, porque na verdade foi interpretado como mm/dd/yyyy. No entanto, uma salada de formatos também é aceita. Note que pelos valores passados, a data inicial estaria no formato mm/dd/yyyy e a data final no formato dd/mm/yyyy. select * from Tabela1 where data_hora between #10/20/2008# and #30/11/2008#e o resultado é retornado corretamente. Então, para não ter erro, é mais seguro que use o formato yyyy/mm/dd. Na sessão Delphi, eu costumo recomendar que não seja feita a concatenação, mas sim a parametrizaçao, justamente para evitar esta situação e pelo fato de que, se você mudar de banco de dados, o código não vai ter que ser ajustado. Não programo em C++, mas por analogia da classe apresentada, imagino que você possa usar o recurso de parametros de forma similar. Caso você já não o conheça, procure verificar na documentação sobre a classe ADOQuery - deve haver uma propriedade Parameters A título de informação: Jet: Date, Time, and Timestamp Literals Abraços
  24. Micheus

    problema com quick

    Lube, no primeiro registro eu visualizei sim a questão do espaço, mas no 5º não. Parece-me que você tem uma outra banda para mostrar as informações com no caso de "HONORÁRIO - JULHO/2008" - isto é correto? Se for, você teria que mudar a forma como monta seu histórico, assim, ele seria um único campo que estaria presente apenas na banda principal. Mas precisa dizer que bandas está usando e como está juntando estas informações do histórico, daí eu imagino poder lhe sugerir algo. Abraços
  25. Micheus

    problema com quick

    Lube, ficaria mais fácil de entender a situação se você postar uma imagem do seu form em desing-time e do problema durante a execução - use um destes sites de compartilhamento de imagens para hospedar as figuras. Abraços
×
×
  • Criar Novo...