
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
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
-
(Resolvido) QUERY + Dbgrid + Filtro Edits
pergunta respondeu ao pimpocvl de Micheus em Delphi, Kylix
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 -
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
-
Usando Turbo Pascal for windows 1.5
pergunta respondeu ao Edson Duarte de Micheus em Outras Linguagens de Programação
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 -
claudyo, em design-time, use a propriedade Items para inserir os valores que serão apresentados ao usuário. Abraços
-
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
-
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
-
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
-
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
-
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
-
Usando Turbo Pascal for windows 1.5
pergunta respondeu ao Edson Duarte de Micheus em Outras Linguagens de Programação
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 -
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
-
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
-
Vivendo&Aprendendo, veja se este post lhe ajuda. Abraços
-
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
-
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
-
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
-
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
-
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
-
Antonio Anselmo, já fiz este post para você na sessão Banco de Dados > Demais Bancos. Evite duplicar tópicos ;) Abraços
-
FireBird 1.5 Pesquisa utilizando a função upper() - Dúvidas
pergunta respondeu ao Dávila Patrícia de Micheus em Demais Bancos
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 -
: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
-
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
-
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
-
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