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

    Formato Da Data

    Se o campo DATS_NASC em suas tabelas for do tipo Date, lhe aconselho a utilizar os parâmetos neste formato e não como string, assim você foge desta questão de formatação. Seria algo assim: Sql.Add('Where P.Codigo=J.Posicao and '); Sql.Add('Data_Nasc >= :Data_Inicial and'); Sql.Add('Data_Nasc <= :Data_Final'); Sql.ParamByName('Data_Inicial').AsDate := StrToDate(edit1.text); Sql.ParamByName('Data_Fianal').AsDate := StrToDate(edit2.text); Open; ou Sql.Add('Where P.Codigo=J.Posicao and '); Sql.Add('Data_Nasc between :Data_Inicial and :Data_Final'); Sql.ParamByName('Data_Inicial').AsDate := StrToDate(edit1.text); Sql.ParamByName('Data_Fianal').AsDate := StrToDate(edit2.text); Open;
  2. Depois de longa busca na net (um verdadeiro garimpo :o), acho que achei um código que pode dar uma pista sobre o questionamento que você postou. Neste link está o código de um programa que mostra detalhes das portas com seus respectivos processos. Para rodar no D3 (o D7 não tem aqui onde estou), foi necessário fazer uma correção na declaração de uma variável: na declaração da function GetName, onde aparece MyAddress: in_addr; deve ser substituído por MyAddress: TInAddr; É programação "a moda antiga" (Borland Pascal for windows), nada de form e eventos, todo o código para tratamento das janelas/mensagens é processado "na mão", mas dá para compreender e até atualizar para uma versão Delphi.
  3. Micheus

    Jogo Em Delphi

    Dê uma olhada neste link, quem sabe você encontre o fio-da-meada. Dê uma olhada no que se refere ao pacote de componentes DelphiX.
  4. Micheus

    Calculadora

    - link 1 aqui tem só 4; - link 2 mais uma - esta mostra gráficos.
  5. Gafanhoto, não sei se você está utilizando uma query para obter os dados, mas seria uma opção. você poderia então, fazer um SUM do campo VALOR, agrupando por Cliente. E, se o que você quer é listar o nome do cliente e valor pago, com este resultado você precisará utilizar apenas uma banda do tipo rbDetal, já que haverá apenas uma linha para cada cliente com seu respectivo valor pago já totalizado. Mas se você está utilizando duas tabelas, relacionadas via propriedade mastersource..., então precisará mesmo utilizar mais bandas para montar seu relatório. Provavelmente o dataset principal do QuickRep será a tabela pagamento, então: - uma GroupHeader, para realizar a quebra por cliente (com altura = 0 pois não deverá ter nada nele) - uma Detail para percorrer os registros filtrados da tabela (com altura = 0 pois não deverá ter nada nele) - uma GroupFooter para apresentar o nome do cliente (QRDBText) e valor somado (QRExpr - sum de Valor) - ligar a propriedade FooterBand do GroupHeader para a respectiva banda e a propriedade Expression para o campo cliente - ativar a propriedade ResetAfterPrint do QRExpr e a propriedade Expression deve conter o SUM do campo valor Acho que pode ser isto. Sem mais informações é difícil dar sugestões. :huh:
  6. hermes_barrasoft, apenas exclarecendo, a diferença entre os dois métodos é o seguinte: - no 1º você tem todos os registros no grid e navega (posiciona) para o registro mais próximo daquele que você está digitando - no 2º, cada caracter digitado, vai restringindo o seu resultado de modo que terá apenas os registros que começam com o texto digitado. O caracter % concatenado ao parâmetro indica que serão listados todos os registros que começam com o conteúdo digitado e sejam seguidos por qualquer coisa. Se você desejar procurar por registros que contenham o texto digitado em qualquer posição do campo, deve colocar também um % no início do parâmetro (Parambyname('Varnome').asstring:= '%'+Edit1.text+'%'). O uso de um ou outro método, depende de como você pretende apresentar sua consulta. Também, mais um item de otimização: Quando você tem sua consulta (query) estática (um componente TQuery com o SQL pronto, necessitando apenas do parâmeto), no momento de modificar a consulta não há necessidade de "zerar" seu conteúdo (SQL.Clear); Basta que seja fechada a consulta (Close), inicializado o parâmetro e aberta a consulta (Open). Adaptando o exemplo do colega FalconSoft Desenvolvimento: procedure TForm1.EditChange(Sender :TObject); begin whith datamodule.sqlconsulta do begin Close; Parambyname ('Varnome').asstring:= Edit1.text +'%' Open; End; End;
  7. Desculpe minha falha. Eu deveria ter posto em modo edição e depois postar a alteração: procedure TForm1.ButtonClick(Sender :TObject); begin Query1.DisableControls; // evita que o seu dbgrid mostre a movimentação do cursor na tabela Query1.First; while Query1.EOF do begin Query1.Edit; Query1SITUACAO.Value := 1; // supondo que o nome do campo seja SITUACACAO e 1=Pago Query1.Post; Query1.Next; end; Query1.First; Query1.EnableControls; end
  8. Micheus

    Links

    GameDev - Português (link) DelphiGameDev.com - Inglês (link)
  9. ftAutoInc ftFloatpara retirar as outras dúvidas (a resposta é encontrada no mesmo lugar), sugiro que você posicione o cursor do mouse sobre o texto FieldDefs (na linha do código: with Table1.FieldDefs do) e tecle F1 (ajuda), no texto que aparece deve ter algo como property FieldDefs: TFieldDefs;, clicando no link TFieldDefs, você procura pelo link referente aos metodos (methods); na lista que aparece é só procurar pelo método Add e lá estarão todos os tipos de campos que você pode utilizar. É o que eu sempre faço quando necessito de mais detalhes (não dá para lembrar de tudo né) :D
  10. Sobre a questão segurança, tem alguns comentários neste outro post => link
  11. Realmente este é o motivo pelo qual sua primeira tentativa não estava funcionando (open = index.html). A sessão Open de um arquivo autorun.ini exige como argumento um programa executável, que pode ser seguido por seus respectivos parâmtros, veja as referências de autorun.inf no MSDN (link). Os links indicados no post anterior auxiliam no contorno deste problema). Talvez possa ser algum detalhe com os parâmetros que você passa no WinExec. Você está montando e passando o caminho do arquivo html? Tipo concatenando o path do seu executável à index.html ou está simplesmente passando index.html, supondo que o IE considere o drive de CD como o caminho atual? Talvez quando o autorun não faça da raiz de seu CD o diretório atual (não sei). De qualque modo, vale observar o que é dito no MSDN sobre o uso da sessão shellexecute em relação a Open: Com ela você poderá fazer o que queria: indicar apenas o nome index.html e na execução do autorun.inf; e o IE (ou outro navegador que seja o padrão) é iniciado.
  12. Bom, não sei que banco você utiliza, nem os componentes de acesso, assim vou supor que você esteja utilizando tabelas Paradox, um componente TQuery (Query1 com RequestLive = true) ligado ao seu TDBGrid (TDBGrid1) e que estejam filtrados apenas os registros no período que você mencionou(abaixo). Então, no evento OnClick do botão adicione o seguinte código:procedure TForm1.ButtonClick(Sender :TObject); begin Query1.DisableControls; // evita que o seu dbgrid mostre a movimentação do cursor na tabela Query1.First; while Query1.EOF do begin Query1SITUACAO.Value := 1; // supondo que o nome do campo seja SITUACACAO e 1=Pago Query1.Next; end; Query1.First; Query1.EnableControls; end Veja se é isto que você queria.
  13. Micheus

    Dbgrid

    Crie um campo calculado no dataset que está ligado ao DBGrid; Então no evento OnCalcFields deste dataset adicione o seu código. Algo como isto, deve funcionar: procedure TForm1.Table1CalcFields(DataSet: TDataSet); begin DM.SqlChave.CommandText := 'Select VALOR from preço PRE, VENDEDOR V, PRODUTO P where V.NOME = ' + chr(39) + DBLookupComboBox1.Text + chr(39) + ' and P.NOME = ' + chr(39) + RxDBGrid1.Fields[1].Text + chr(39) +' and P.ID_PROD = PRE.ID_PROD and V.ID_VENDEDOR = PRE.ID_VENDEDOR'; DM.SqlChave.Open; // abaixo o Table1VALOR.Value corresponde ao campo calculado Table1VALOR.Value := DsChave.DataSet.Fields[0].AsCurrency; DM.SqlChave.Close; end;
  14. Micheus

    Evento No Dbgrid

    Seria isto talvez? procedure TfrmCliente.DBLookupComboBox1Change(Sender: TObject); begin inherited; DM.SqlkCidade.Filtered := False; DM.SqlkCidade.Filter := ''; DBLookupComboBox2.KeyValue := 0; DM.SqlkCidade.Filter := 'ID_UF = ' + IntToStr(DBLookupComboBox1.KeyValue); DM.SqlkCidade.Filtered := True; DM.SqlkCidade.Refresh; end;
  15. Thales, dê uma olhada nestes link 1, link 2 tem algumas opções e comentários prós/contras. Quem sabe alguma lhe sirva.
  16. Eu pensei a mesma coisa. Desde que o colega tiberiusart tenha substituido o código que você passou (a linha: ADOQuery1.Next; estava fora do loop), não parece mesmo que haja outro motivo para permanecer em loop "infinito".
  17. Se você está digitando o conteúdo parcial e espera posicionar no item mais próximo do digitado, então tente adicionar as opções do locate: - loCaseInsensitive => não diferencia maiúscula de minúsculas - loPartialKey => procura no compo desejado, o valor que inicia com o informado (Edti1.Text) Query.Locate('nome_do_campo', edit.text, [loCaseInsensitive, loPartialKey]);
  18. - Este valor atribuido seria mantido (atualizado) na sua tabela ou seria apenas utilizado no momento da impressão?- Que componente você utiliza para impressão? QuickReport? - Há a possibilidade de as letras restantantes (O a Z) serem insuficientes?
  19. Se entendi direito seria o seguinte: Se sua query (dataset) permitir alteração (tipo propriedade RequestLive = true), basta que você, após pressionar o tal botão, percorra todos os registros da query (tipo while not query.EOF do) e, dentro deste loop, coloque a query em modo de edição (edit), altere o campo pago de acordo com sua necessidade e grave (post). Se não for possivel utilizar a query para a alteração, então inclua no seu select os campos que são a chave primária na tabela de origem da query e utilize-os para posicionar num table (TTable p.e., que você deverá adicionar em seu form e configurar adequadamente). Assim, no loop mensionado anteriormente, para cada item da query você não irá mais tentar editar a query, mas sim posicionar a tabela, colocando ela em modo edição, alterando o campo desejado e gravando as informações, em seguida passa a próxima linha da query e assim sucessivamente.
  20. Micheus

    Maskedit

    Está um pouco confusa sua pergunta. Você está querendo copiar o conteúdo do MaskEdit, para o datafield que irá associar ao DBEdit apenas após você selecionar a opção no ComboBox? É isso?
  21. Neste caso, considerando dois processos seria: 1) Criação da tabela -> seria todo o código do link que lhe passei, alterando apenas os nomes, tipos e tamanhos dos compos da tabela e eliminando os comandos Update os quais geram exception. Melhorando ele um pouco: procedure TForm1.CriaTabelaImportacao(TableNome :string); begin try Table1.Close; {o mesmo que Active:=False } Table1.DatabaseName := TableNome; { um alias BDE ou diretório} Table1.TableName := 'client.DB'; { extensão .DB é opcional} Table1.TableType := ttParadox; { deve ser especificado quando se cria uma tabela} { definindo alguns campos} with Table1.FieldDefs do begin Clear; { limpa a tabela antiga} { a chave primária deve ser criada com o atributo "required" como true: } Add('Codigo', ftString, 5, true); // o TRUE significa que é requerido - não pode ser nulo Add('CodProd', ftString, 5, true); Add('Nome', ftString, 20, false); Add('Cidade', ftString, 10, false); Add('UF', ftString, 2, false); end; { "with Table1.FieldDefs" } { adiciona a chave primária e três secundárias} with Table1.IndexDefs do begin Clear; {limpa os antigos} { A chave priária Paradox não tem nome.} { Nunca de o mesmo nome do campo ao índice se fizer isso não poderá usar ixCaseInsensitive } Add('', 'codigo', [ixPrimary]); { A opção ixCaseInsensitive não é valida para chaves primárias} { Nunca crie mais indices do que você precisar. Você poderá fazer isso depois} Add('NomeIDX', 'Nome', [ixCaseInsensitive]); Add('CidadeIDX', 'Cidade', [ixCaseInsensitive]); { combinando um índice com dois campos: } Add('TesteIDX', 'Cidade;Nome', [ixCaseInsensitive]); end; { with "Table1.IndexDefs" } Table1.CreateTable; Table1.Open; Except MessageDlg('Error na Criação da Tabela ou Índice', mtError, [mbOK],0); end; { try...except } end; 2) Importação dos dados -> é a sua rotina, adaptada para recriar a tabela (chamada para o procedimento acima):procedure TForm1.Button2Click(Sender: TObject); var Txt : TextFile; Entrada : String; begin Assignfile(Txt,'Clientes.Txt'); Reset(Txt); CriaTabelaImportacao('c:\temp\cliente.db'); // ajustar o nome While not Eoln(Txt) do begin Readln(Txt,Entrada); Table1.Insert; Table1.FieldByName('Codigo').Value := Trim(Copy(Entrada,01,05)); Table1.FieldByName('CodProd').Value := Trim(Copy(Entrada,06,05)); Table1.FieldByName('Nome').Value := Trim(Copy(Entrada,11,20)); Table1.FieldByName('Cidade').Value := Trim(Copy(Entrada,31,10)); Table1.FieldByName('UF').Value := Trim(Copy(Entrada,41,02)); Table1.Post; end; CloseFile(Txt); Button3.Enabled := True; end; E agora deve funcionar. Dê uma verificada, falou?!
  22. EDER Na verdade como parece-me que sua tabela já está criada (você não a cria a cada importação), acredito que você deva criar os índices via Database Desktop mesmo. O exemplo do link faz referência a criação dos indices logo após a criação da tabela, se for criar dinamicamente, primeiro deverá eliminar os que já existem (table1.deleteindex(nome_indice) - mas é só para as secundárias). Veja se para o seu caso o Database Desktop não é a solução. É, empatamos. :D
  23. Descupe, entendi errado o que você queria fazer. Nesta situação eu faria algo parecido com: update produto P set P.qtd_estoque = P.qtd_estoque + 10 where exists(select MP.id_produto from materia_prima MP where MP.id_produto = P.id_produto) and P.nome = 'PORCA' acho que é assim.
  24. O erro está correto. você não pode utilizar um comando UPDATE para atualizar duas tabela ao mesmo tempo. Provavelmente você deverá criar dois updates, um para cada tabela envolvida. Se os campos que você deseja atualizar são chaves e fazem parte da integridade referencial (relacionamento), ai a coisa complica um pouco - mas tem jeito.
×
×
  • Criar Novo...