Ir para conteúdo
Fórum Script Brasil

Jhonas

Monitores
  • Total de itens

    9.657
  • Registro em

Posts postados por Jhonas

  1. Tente isso

     fdQryFiltro.Close;
     fdQryFiltro.SQL.Clear;
     fdQryFiltro.sql.Add('Select * from clientes join
     grupo on grupo.id_grupo = clientes.id_grupo join
     subgrupo on subgrupo.id_subgrupo = clientes.id_subgrupo join
     fpagamento on fpagamento.id_fpagamento = clientes.id_fpagamento join
     conta on conta.id_conta = clientes.id_conta');
    
     fdQryFiltro.SQL.Add('WHERE (DATA >= '''+edtData1.Date+''' AND
     DATA <= '''+edtData2.Date+''' and 1=1 ');
    
     If edtData2.Date < edtData1.Date Then
        ShowMessage('Intervalo de datas inválido, a data inicial é maior que a data final!');

    Obs: Coloque as datas no formato string no filtro

    abraço

  2. Veja se esse exemplo te ajuda

    // Programa que calcula a idade média de um grupo de pessoas.
    // A finalização da entrada de números é dada por um -1
    
    int soma, quantidade, idade;
    
    float media;
    
    soma = 0;
    quantidade = 0; 
    
    do {
         printf("Idade da pessoa %d. (tecle -1 se quiser encerrar).\n",
                   quantidade+1);
         scanf("%d", &idade);
    
         if (idade >=0)
         { 
           soma = soma + idade;
           quantidade = quantidade + 1;
         }
       } while (idade != -1);
    
    // Faz o calculo da media de idade
    
    if (quantidade > 0)
    {
       media = (float) soma / quantidade;
       printf("A media de idade das %d pessoas é: %5.2f", quantidade,
                media);
    }
    else printf("Nenhum dado foi informado."); 

    abraço

  3.    if dm.CDS_LIVROS.Locate('ID_LIVRO',dm.CDS_RESERVA.FieldByName('TOMBO_LIVRO').AsInteger,[]) then // livro escolhido
          begin
             if dm.CDS_RESERVA.FieldByName('DT_RESERVA').AsDateTime =Strtodate(dbedit5.Text)  then // verifica se as datas são iguais
                begin
                   messagedlg('Livro reservado nesta data, escolha outra data!',mtInformation,[mbok],0);
                   DBLookupComboBox2.SetFocus;
                end
             else
                begin
                   falso();
                   tratabotoes();
                   dm.CDS_RESERVA.Post;
                   dm.CDS_LIVROS.Edit;
                   dm.CDS_LIVROS.FieldByName('STATUS_LIVRO').AsString:=('RESERVADO');
                   DM.CDS_LIVROS.Refresh;
                   messagedlg('Registro inserido com sucesso!',mtInformation,[mbok],0);
                   if messagedlg('Deseja imprimir o recibo?',MtConfirmation,[mbYes,mbNo],0)=mrYes then
                      begin
                         dm.recibo_reserva.ShowReport;
                      end
                   else
                      abort;
                end;
          end;

    Obs: Se não existirem cópias do mesmo livro está correto.

    Mas se tiver mais cópias do mesmo livro, então voce não pode usar dessa maneira, pois o comando Locate sempre vai encontrar a primeira ocorrencia ( nome do livro )  nos registros da tabela.

    Porem vale lembrar que o comando Locate ( em caso de tabelas muitos grandes )  não é aconselhavel usar, pois voce terá perda de performance ( tempo )  na localização do registro na tabela.

    Nesse caso, prefira usar o comando Select  dentro de um componente  Query.

    abraço

  4. voce não informou qual é o banco de dados que está usando.

    Se for o MYSQL o campo Data deve ser Date e não DateTime

    dm.CDS_RESERVA.FieldByName('DT_RESERVA').AsDateTime =Strtodate(dbedit5.Text)

    Me expressei mal....

    o comando acima está correto, voce só não pode definir o campo da tabela como DateTime e sim Date ... entendeu ?

    OBS: quando vode alterar o campo de sua tabela, voce deve apagar o campo do object inspector e coloca-lo novamente no componente ClientDataSet ou na Query ou no Table

    abraço

     

  5. dm.CDS_RESERVA.FieldByName('DT_RESERVA').AsDateTime =Strtodate(dbedit5.Text)  then // verifica se as datas são iguais

    lembre-se que  AsDateTime  testa a data e a hora .... se estiverem diferentes no segundo já não são iguais.

    então prefira usar somente AsDate ( ou seja use somente o campo data )

    defina o campo da tabela como Date somente

    abraço

  6. Pelo que eu entendi, quando voce clica no botão, são criados no form 6 Timages dinamicamente, e voce quando clicar em algum TImage, quer que apareça uma mensagem referente a esse TImage ...  é isso  ?

    o nome das imagens seriam : image0, image1... image6  ( isso todas as vezes que voce clicar nesse botão )

    se as imagens forem sempre as mesmas e carregadas sempre no mesmo TImage, não precisa nem usar matriz.

    serão diferentes todas as vezes que voce clicar no botão ?  

    Se forem, voce não pode atribuir um nome fixo ao TImage, mas teria que carregar o TImage com o nome da foto ( imagem )  e assim fazer a referencia ao nome dessa imagem.

    assim como voce criou um evento dinamico para os TImages voce tambem pode criar um evento dinamico para o Onclick

    como é que voce quer que isso funcione ?

    Veja nesses links, alguns exemplos que voce pode usar

    https://forum.imasters.com.br/topic/212535-evento-onclick-em-imagem-criada-dinamicamente/

    https://www.experts-exchange.com/questions/23448044/TForm-Create-onClick-TImage-TButton-Dynamically-created-form-with-buttons-and-events.html

    https://www.experts-exchange.com/questions/27313699/How-to-create-a-dynamic-event-handlers-for-components-created-at-runtime.html

    abraço

  7. experimenta dessa maneira

    var
       Resposta: String;
       fsParams: TFileStream;
    begin
    
       fsParams := TFileStream.Create('c:\temp\jason.txt', fmOpenRead or
       fmShareDenyNone);
    
       Handler := TIdSSLIOHandlerSocketOpenSSL.Create;
    
       JsonStreamRetorno := TStringStream.Create('');
    
       HTTPClient := TidHTTP.Create;
       HTTPClient.Request.Clear;
       HTTPClient.Request.ContentType := 'application/json';
       HTTPClient.ProtocolVersion := pv1_0;
       HTTPClient.Request.Accept := '*/*';
       HTTPClient.Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
       HTTPClient.Request.AcceptEncoding := 'gzip, deflate';
       HTTPClient.Request.Connection := 'keep-alive';
       HTTPClient.Request.CacheControl := 'no-cache';
       HTTPClient.Request.ContentEncoding := 'utf-8';
       HTTPClient.IOHandler := Handler;
       Handler.SendBufferSize := 250000;
       JSonRet := TlkJSONobject.Create;
    
       //AssignFile(myFile, 'c:\temp\jason.txt');
       //Reset(myFile);
       //myFileSize := FileSize(myFile);
       //HTTPClient.Request.ContentLength := MyFileSize;
       //CloseFile(myFile);
    
       Resposta := HTTPClient.post('https://api.emacro.com.br/fotos/criar',fsParams);
       ShowMessage(Resposta);
    
       JSonRet := TlkJSON.ParseText(Resposta) as TlkJSONobject;
       Memo2.Lines.Add(GenerateReadableText(JSonRet,i));
    
    end;

    abraço

  8. Voce pode fazer um teste simples no seu delphi com o quickreport

    abra um novo aplicativo

     coloque um botão e um QRCompositeReport no Form

    crie 3 quickreports ( QuickReport2, QuickReport3 e QuickReport4

    coloque em cada um deles as seguintes bands:

    No QuickReport2:

    PageHeader
    Title
    ColumnHeader
    Detail
    Summary
    PageFooter

    e coloque um Label em cada uma das bands com os nomes de cada band

    QRLabel1.Caption := PageHeader;

    QRLabel2.Caption := Title;

    QRLabel3.Caption := ColumnHeader;

    QRLabel4.Caption := Detail;

    QRLabel5.Caption := Summary;

    QRLabel6.Caption := PageFooter;

    Faça a mesma coisa nos demais, mudando somente o final de cada Label

    No QuickReport3:

    QRLabel1.Caption := PageHeader 1;

    QRLabel2.Caption := Title 1;

    QRLabel3.Caption := ColumnHeader 1;

    QRLabel4.Caption := Detail 1;

    QRLabel5.Caption := Summary 1;

    QRLabel6.Caption := PageFooter 1;

    No QuickReport4:

    QRLabel1.Caption := PageHeader 2;

    QRLabel2.Caption := Title 2;

    QRLabel3.Caption := ColumnHeader 2;

    QRLabel4.Caption := Detail 2;

    QRLabel5.Caption := Summary 2;

    QRLabel6.Caption := PageFooter 2;

    No botão voce põe o codigo:

    uses  Unit2, Unit3, Unit4;
    
    {$R *.dfm}
    
    procedure TForm1.QRCompositeReport1AddReports(Sender: TObject);
    begin
       ///  JUNTAR REPORTS
    
       with QRCompositeReport1.Reports do
         begin
             Add(QuickReport2);
             Add(QuickReport3);
             Add(QuickReport4);
         end;
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       ///  MOSTRAR REPORTS JUNTOS
    
       QRCompositeReport1.Prepare;
       QRCompositeReport1.Preview;
    
    end;

    Execute o código , se o resultado for

    PageHeader
    Title
    Detail
    Summary

    Title 1
    Detail 1
    Summary 1

    Title 2
    Detail 2
    Summary 2

    PageFooter 2

    OBS: veja que apareçe o PageHeader do QuickReport2 mas não o ColumnHeader dele, nem o PageHeader  e  o ColumnHeader do QuickReport3 e nem o PageHeader  e  o ColumnHeader do QuickReport4

    Por fim aparece somente o PageFooter 2 que é do QuickReport4.

    Ou voce muda a estrutura do QuickReport em relação as Bands ou cria uma rotina para imprimir todos os relatórios de uma só vez.

    abraço

     

  9. Marquei seu post como resolvido, porque achei que voce não iria responder....( como acontece com tantos outros, onde eu repondo a dúvida e não tenho o retorno  ou resposta ... isso indica para mim que a dúvida foi resolvida ... ok ? )

    A ordem entre as bandas Title e PageHeader, eu não consigo mudar, ao alterar o tipo da QRBand, ele já deixa na ordem citada automaticamente.

    Não sei se é bug da sua versão, mas para contornar esse problema, voce deve tirar todas as bandas do quickreport, salva-lo sem as bandas e fecha-lo.

    Depois voce deve abrir novamente o quickreport, e incluir as bandas novamente uma a uma, começando pelo Title.

    Mas ai voce vai perguntar.... se eu fizer isso, nou vou perder todos os componentes que estão na banda.?

    Sim... por isso voce deve criar uma cópia de cada report.

    Abra o report Original ( que tem toda a codificação mas sem as bandas )

    Depois inclua as bandas do report ( da cópia ) uma a uma, começando pelo Title

    Refaça os links das procedures que forem necessários e depois salve o report.

    OBS: Se voce tentar mudar a posição das bandas somente pelas proriedades do objeto, não vai dar muito certo.

    abraço

     

     

     

     

  10. exemplo:

    Os 2 reports tem todas as bandas que voce mencionou

    procedure TForm1.QRCompositeReport1AddReports(Sender: TObject);
    begin
       ///  JUNTAR REPORTS 
    
       with QRCompositeReport1 do
         begin
             Add(QRClientes);
             Add(QRProf);
         end;
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       /// MOSTRAR REPORT INDIVIDUAL
    
       Cadcli_IB.Active := false;
       CDS_Cadcli.Active := false;
       Cadcli_IB.Active := true;
       CDS_Cadcli.Active := true;
       CDS_Cadcli.Refresh;
    
       try
         if QRClientes = Nil then
            QRClientes := TQRClientes.Create(self);
       except
            ShowMessage('Erro na criação do relatório!!');
            exit;
       end;
       QRClientes.Preview;
    
    
       /// MOSTRAR REPORT INDIVIDUAL
    
       CadProf_IB.Active := false;
       CDS_CadProf.Active := false;
       CadProf_IB.Active := true;
       CDS_CadProf.Active := true;
       CDS_CadProf.Refresh;
    
       try
           if QRProf = Nil then
           QRProf := TQRProf.Create(self);
       except
           ShowMessage('Erro na criação do relatório!!');
           exit;
       end;
       QRProf.preview;
    
       
       ///  MOSTRAR REPORTS JUNTOS
      
       QRCompositeReport1.Prepare;
       QRCompositeReport1.Preview;
    end;

    OBS: o titulo do segundo report vai sair colocado ao final do primeiro.

    Se voce quiser , na propriedade OnEndPage do primeiro report, voce coloca o codigo abaixo  para o titulo do segundo reporte, sair em nova pagina quando ajuntar os 2.  ( faça isso para os demais tambem )

    // primeiro report
    procedure TQuickReport1.QuickRepEndPage(Sender: TCustomQuickRep);
    begin
       QuickReport1.ForceNewPage;
    end;

    Lembrando: A estrutura desses reports são:

    * Title

    * Page Header

    * Column Header

    * Detail

    * Summary

    abraço

  11. A URL do provedor teve uma modificação

    http://www.republicavirtual.com.br/cotacao/exemplos.php

    O resultado será mostrado na StringGrid em 25 a 30 segundos

    OBS: Acho que o provedor não está mais atualizando os valores.

    Código com a URL alterada

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        StringGrid1: TStringGrid;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses UrlMon;
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
       caminho, linha, s, f, g : string;
       arq : TextFile;
       cc, x, y, z : integer;
    
       Function Download(FSource, FDest: String): Boolean;
       begin
         try
           Result := UrlDownloadToFile(nil, PChar(Fsource),PChar(FDest), 0, nil) = 0;
         except
           Result := False;
         end;
       end;
    
    begin
       // WEB SERVICE DE COTAÇÃO DO DOLAR
    
       cc := 0; x := 0; y := 0; z := 0;
       caminho := 'C:\cotacao.htm';
       Download('http://cotacao.republicavirtual.com.br/web_cotacao.php?formato=javascript', caminho);
       AssignFile ( arq, caminho);
       Reset ( arq );
    
       while not Eof(arq) do
       begin
          inc(cc);
          Readln ( arq, linha);
          s := trim(linha);
          while Pos('''', S) > 0 do
             S[Pos('''', S)] := ' ';
    
          if cc > 2 then
             begin
    
                if Pos(':',s) > 0 then
                   begin
                      f := trim(copy(s,1,Pos(':',s)-1));
                      g := trim(copy(s,Pos(':',s)+1,20));
    
                      // MOSTRAR A COTAÇÃO EM UM STRINGGRID
                      StringGrid1.Cells[0,0]:= 'MOEDA';
                      StringGrid1.Cells[1,0]:= 'COTAÇÃO';
                      StringGrid1.Cells[0,cc-2]:= f;
                      StringGrid1.Cells[1,cc-2]:= g;
                   end;
             end;
       end;
       CloseFile ( arq );
    
    end;
    
    end.

    abraço

×
×
  • Criar Novo...