Loop desnecessário dentro do Filtro com SQL em Delphi

21/12/2021

0

bom dia pessoal. Abaixo segue um código que esta rodando direito sem o filtro. Mais quando eu coloco para executar o filtro ele não faz o processo corretamente. É o seguinte. Eu clico no botão e ele faz um sorteio randomicamente (o processo corre normal do começo ao fim). Mais quando eu coloco um filtro de soma pra ele me retornar apenas resultados que estejam com a soma dentro de um intervalo ele cria uma espécie de loop. Exemplo. Vamos supor que eu queira que ele me retorne resultados que a soma esteja entre 170 e 180. Eu dou click no botão e ele na primeira soma acha o valor 169, como não esta dentro do valor especificado ele refaz o processo. ai ele deu 1 volta. Depois ele acha o valor 181, não esta dentro ele da outra volta , 195, outra volta, (ate aqui já são 3 voltas). Ai acha o valor 179, esta dentro do especificado. Ele achou o valor dentro do especificado na 4 volta. Quando ele acha o valor é pra ele seguir o código normalmente. Acontece que ele esta dando 4 voltas quando chega no final do código. No código estou sinalizando onde ele faz esse loop desnecessário, quando acha o valor dentro da soma.

procedure Tfrm_Jogos_LF.btn_Sortear_BilheteClick(Sender: TObject);
var
  Aposta: TStringList;
  NumeroDeApostas, NumerosPorAposta, Sorteios, AddMemo, retorno, cor_inicial, copy_memo_inc, copy_memo_cont : Integer;
  seletor_inc, seletor_cont, dezenas_inc, dezenas_cont, i, soma, somaTotal, par, parTotal, impar, imparTotal : Integer;
  primo, primoTotal, pares, impares, primos : Integer;
  strSorteado, strAposta, valor, NomeComp, copy_000, seletor_NomeComp, selecao, dezenas_NomeComp, dezenas : string;
  SQLDezena : string;
  Total, totalPar, totalImpar, totalPrimo : Real;
  Qry: TFDQuery;

begin
  // limpando a stringlist e começando um novo sorteio aleatório inicio
  ListaDosNumerosSelecionados_LF1.Clear;

  num_par := 0;
  num_imp := 0;
  num_primos := 0;
  num_Soma := 0;
  cor_inicial := 0;
  lbl_Pares_Resultado.Caption := num_par.ToString;
  lbl_Impares_Resultado.Caption := num_imp.ToString;
  lbl_Primos_Resultados.Caption := num_primos.ToString;
  lbl_Soma_Resultado.Caption := num_Soma.ToString;

{$REGION 'LF_SELECAO_VOLTAR_COR'}
  for cor_inicial := 1 to 25 do
  begin
    NomeComp := 'selecao' + FormatFloat('000', cor_inicial);
    TPanel(FindComponent(NomeComp)).color := Color_Seletor_Normal;
  end;
{$ENDREGION 'LF_SELECAO_VOLTAR_COR'}
{$REGION 'LF_SELECAO_DEIXA_COM_001_025'}
  // Selecao001.Caption := '001'; //de 001 a 025 (abaixo codigo reduzido)
  cor_inicial := 0;

  for cor_inicial := 1 to 25 do
  begin
    NomeComp := 'selecao' + FormatFloat('000', cor_inicial);
    TPanel(FindComponent(NomeComp)).Caption := FormatFloat('000', cor_inicial);
  end;
{$ENDREGION 'LF_SELECAO_DEIXA_COM_001_025'}
  MemoApostas.Clear; // limpa o memo

  NumeroDeApostas := 1; // quantidade de apostas a serem geradas
  if ckb_Dezenas_15.Checked = True then
  begin
    NumerosPorAposta := 15; // quantidade de números por aposta
  end;

  Aposta := TStringList.Create; // cria a aposta

  for Sorteios := 1 to NumeroDeApostas do
  begin
    ListaDosNumerosSelecionados_Soma_LF.Clear;
    ListaDosNumerosSelecionados_Par_LF.Clear;
    ListaDosNumerosSelecionados_Impar_LF.Clear;
    ListaDosNumerosSelecionados_Primos_LF.Clear;
    Aposta.Clear; // limpa a aposta

    while Aposta.Count < NumerosPorAposta do
    begin
      strSorteado := FormatFloat('000', Random(25) + 1); // sorteia de 1 a 25
      if Aposta.IndexOf(strSorteado) < 0 then
        Aposta.Add(strSorteado);

      if ListaDosNumerosSelecionados_Soma_LF.IndexOf(strSorteado) < 0 then // string da soma
      begin
        ListaDosNumerosSelecionados_Soma_LF.Add(strSorteado);
      end;

      if ListaDosNumerosSelecionados_Par_LF.IndexOf(strSorteado) < 0 then // string pares
      begin
        if NOT Odd(strSorteado.ToInteger) then
        begin
          Inc(pares);
          ListaDosNumerosSelecionados_Par_LF.Add(strSorteado);
        end;
      end;

      if ListaDosNumerosSelecionados_Impar_LF.IndexOf(strSorteado) < 0 then // string impares
      begin
        if Odd(strSorteado.ToInteger) then
        begin
          Inc(impares);
          ListaDosNumerosSelecionados_Impar_LF.Add(strSorteado);
        end;
      end;

      if ListaDosNumerosSelecionados_Primos_LF.IndexOf(strSorteado) < 0 then // string primos
      begin
        if EhPrimo(strSorteado.ToInteger) then
        begin
          Inc(primos);
          ListaDosNumerosSelecionados_Primos_LF.Add(strSorteado);
        end;
      end;
    end;

    Aposta.Sort; // ordena os números da aposta
    ListaDosNumerosSelecionados_Soma_LF.Sort; // ordena os números da aposta
    ListaDosNumerosSelecionados_Par_LF.Sort; // ordena os números pares
    ListaDosNumerosSelecionados_Impar_LF.Sort; // ordena os números ímpares
    ListaDosNumerosSelecionados_Primos_LF.Sort; // ordena os números primos
  end;

  // loop para todas as linhas da stringlist (ListaDosNumerosSelecionados_Soma_LF)
  Total := 0;

  for soma := 0 to ListaDosNumerosSelecionados_Soma_LF.Count - 1 do
  begin
    Total := Total + StrToInt(ListaDosNumerosSelecionados_Soma_LF[soma]);
  end;

  edt_Bilhete_Soma.Text := FloatToStr(Total); // joguei o valor para o Edit

  somaTotal := StrToInt(edt_Bilhete_Soma.Text);

  // loop para todas as linhas da stringlist (ListaDosNumerosSelecionados_Par_LF)
  totalPar := 0;

  for par := 0 to ListaDosNumerosSelecionados_Par_LF.Count do
  begin
    totalPar := par; // caso haja linhas ñ numéricas ele desconsidera e continua contando
  end;

  edt_Bilhete_Par.Text := FloatToStr(totalPar); // joguei o valor para o Edit

  parTotal := StrToInt(edt_Bilhete_Par.Text);

  // loop para todas as linhas da stringlist (ListaDosNumerosSelecionados_Impar_LF)
  totalImpar := 0;

  for impar := 0 to ListaDosNumerosSelecionados_Impar_LF.Count do
  begin
    totalImpar := impar; // caso haja linhas ñ numéricas ele desconsidera e continua contando
  end;

  edt_Bilhete_Impar.Text := FloatToStr(totalImpar); // joguei o valor para o Edit

  imparTotal := StrToInt(edt_Bilhete_Impar.Text);

  // loop para todas as linhas da stringlist (ListaDosNumerosSelecionados_Primos_LF)
  totalPrimo := 0;

  for primo := 0 to ListaDosNumerosSelecionados_Primos_LF.Count do
  begin
    totalPrimo := primo; // caso haja linhas ñ numéricas ele desconsidera e continua contando
  end;

  edt_Bilhete_Primo.Text := FloatToStr(totalPrimo);  // joguei o valor para o Edit

  primoTotal := StrToInt(edt_Bilhete_Primo.Text);

  // aqui estou verificando se a soma esta dentro do filtro definido.
  if (set_soma_inicial.value > 0) and (set_soma_final.value > 0) then
  begin
    if (somaTotal >= set_soma_inicial.value) and (somaTotal <= set_soma_final.value) then
    begin

    end
    else
    begin
      cor_inicial := 0;

      // aqui estou voltando o caption de 001 para 01
      for cor_inicial := 1 to 25 do
      begin
        NomeComp := 'selecao' + FormatFloat('000', cor_inicial);
        TPanel(FindComponent(NomeComp)).Caption :=
          FormatFloat('00', cor_inicial);
      end;

      cor_inicial := 0;

      // aqui estou voltando a cor para modo inicial
      for cor_inicial := 1 to 25 do
      begin
        NomeComp := 'selecao' + FormatFloat('000', cor_inicial);
        TPanel(FindComponent(NomeComp)).color := Color_Seletor_Normal;
      end;
      btn_Sortear_Bilhete.Click;
    end;
  end;


// o código continua abaixo...
Rubens Pena

Rubens Pena

Responder

Posts

21/12/2021

Rubens Pena

// continuando o código acima...

// QUANDO PASSA PELOS FILTROS SELECIOCINADOs ELE SEGUE O CÓDIGO ABAIXO.
// MAIS QUANDO CHEGA NO FINAL ESTA VOLTANDO PRA CÁ DE NOVO.

  // aqui é feita a verificação se a sequência sorteada
  // randomicamente tem no banco de dados dos jogos que já foram sorteados
  // pela loteria. Se tiver uma sequência parecida ele volta para o começo
  // se não dar continuidade no processo.
  // (INICIO)
  SQLDezena := '';
  SQLDezena := SQLDezena + ' select * from lf_resultados where ';
  for i := 1 to 15 do
  begin
    if i <> 15 then
      SQLDezena := SQLDezena + 'dez' + FormatFloat('00', i) + ' = ' + IntToStr(Aposta[i - 1].ToInteger) + ' and ' + sLineBreak
    else
      SQLDezena := SQLDezena + 'dez' + FormatFloat('00', i) + ' = ' + IntToStr(Aposta[i - 1].ToInteger);
  end;

  Qry := TFDQuery.Create(Nil);
  Qry.Transaction := dadosLF.fdt_LF_Resultados;
  Qry.Connection := dadosLF.ConexaoLF;
  Qry.Close;
  Qry.SQL.Add(SQLDezena);
  Qry.Open;

  if Qry.RecordCount > 0 then // se tiver cai aq e n passa
  begin
    NumerosPorAposta := NumerosPorAposta + 1;
    btn_Sortear_Bilhete.Click;
  end;

  FreeAndNil(Qry);
  // (FIM)

  strAposta := '';
  for AddMemo := 0 to Aposta.Count - 1 do
  begin
    if strAposta <> EmptyStr then
      strAposta := strAposta + ' ';

    strAposta := strAposta + Aposta[AddMemo];
  end;

  MemoApostas.Lines.Add(strAposta);
  ListaDosNumerosSelecionados_LF2.Add(strAposta);

{$REGION 'copy'}
  copy_memo_inc := -3; // iniciando em -3 para que a primeira prosicao seja 1
  for copy_memo_cont := 1 to 20 do // numero de voltas
  begin
    // edt_B001.Text := Copy(MemoApostas.Lines[0], 1, 2);
    copy_000 := 'edt_B0' + FormatFloat('00', copy_memo_cont);

    Inc(copy_memo_inc, 4); // posicao esta subindo de 4 em 4
    TEdit(FindComponent(copy_000)).Text := Copy(MemoApostas.Lines[0],
      copy_memo_inc, 3);
    // edt_B020.Text := Copy(MemoApostas.Lines[0], 58, 2);
  end;
{$ENDREGION 'copy'}

  FkSelecao := 0;
  lbl_Valor_do_Jogo.Caption := '';

{$REGION 'LF_SORTEIO_SELETOR'}

  seletor_cont := 0;

  for seletor_cont := 1 to 25 do
  begin
    // aqui estou renomeando o nome do Caption do componente TPanel
    // Ex.: alterando o caption de 01 para 001
    seletor_NomeComp := FormatFloat('000', seletor_cont);
    selecao := 'Selecao' + FormatFloat('000', seletor_cont);
    TPanel(FindComponent(seletor_NomeComp)).Caption := seletor_NomeComp;

    // aqui estou inserindo um Text no componente TEdit
    dezenas_NomeComp := FormatFloat('000', seletor_cont);
    dezenas := 'edt_dezena_' + FormatFloat('000', seletor_cont);
    TEdit(FindComponent(dezenas_NomeComp)).Text := dezenas_NomeComp;

    // aqui estou pegando parte do nome do componente, apeana a parte numerica
    // edt_dezena_001 fica 001, como nao esta fortatada as casas da esquerda
    // pega apenas o numero 1, o mesmo processi ate o numero 100
    dezenas_cont := StrToInt(Copy(dezenas, 12, 3)); 

    valor := seletor_NomeComp; // Selecao001.Caption;
    retorno := Aposta.IndexOf(valor); // se o retorno for =0 entra no if

    if retorno = 0 then
    begin
      begin // edt_dezena_100 (14,1) (13,2) (12,3)
        if (dezenas_cont >= 1) and (dezenas_cont <= 9) then
        begin
          TEdit(FindComponent(dezenas)).Text := Copy(dezenas, 14, 1);
        end
        else if (dezenas_cont >= 10) and (dezenas_cont <= 99) then
        begin
          TEdit(FindComponent(dezenas)).Text := Copy(dezenas, 13, 2);
        end
        else if (dezenas_cont = 100) then
        begin
          TEdit(FindComponent(dezenas)).Text := Copy(dezenas, 12, 3);
        end;

        valor := valor;
        if ListaDosNumerosSelecionados_LF1.IndexOf(valor) < 0 then
          ListaDosNumerosSelecionados_LF1.Add(valor);
        ListaDosNumerosSelecionados_LF1.Sort; // ordena os números da aposta

        // aqui pega a selecao (ex.: selecao001) e pinta de LARANJA
        TPanel(FindComponent(selecao)).color := Color_LF_Lilas;

        // aqui faco uma contagem se de qtd dos numesos pares, impares, primos
        // e a soma total das dezenas selecionadas de LARANJA
        if Odd(valor.ToInteger) then
          Inc(num_imp) // se localizar um numero impar inclui na contagem
        else
          Inc(num_par); // se localizar um numero par inclui na contagem

        if EhPrimo(valor.ToInteger) then
          Inc(num_primos); // se localizar um numero primo inclui na contagem

        num_Soma := num_Soma + valor.ToInteger; // soma dos selecionados
 
        // aqui apago o retorno correspondente a selecao do numero escolhido
        // no sorteio
        Aposta.Delete(retorno);

        Inc(FkSelecao);

        if FkSelecao = 1 then
        begin // se tiver apenas uma dezena selecionada utiliza (dezena)
          lbl_Valor_do_Jogo.Caption := FormatFloat('0', FkSelecao) + ' dezena '
            + 'R$ ' + FormatFloat('##,###,##0.00',
            StrToFloat(edt_ValorUnitario.Text));
        end
        else
        begin // se tiver apenas uma dezena selecionada utiliza (dezenas)
          lbl_Valor_do_Jogo.Caption := FormatFloat('0', FkSelecao) + ' dezenas '
            + 'R$ ' + FormatFloat('##,###,##0.00',
            StrToFloat(edt_ValorUnitario.Text));
        end;
        lbl_Valor_do_Jogo.Font.color := clGreen;
        lbl_Valor_do_Jogo.Font.Style := [fsBold];
      end;
    end;
  end;

  lbl_Pares_Resultado.Caption := num_par.ToString;
  lbl_Impares_Resultado.Caption := num_imp.ToString;
  lbl_Primos_Resultados.Caption := num_primos.ToString;
  lbl_Soma_Resultado.Caption := num_Soma.ToString;

{$ENDREGION 'LF_SORTEIO_SELETOR'}
{$REGION 'QN_VOLTAR_SELETOR_PARA_01_25'}
  cor_inicial := 0;

  // aqui estou voltando o caption para a descriçao inicial
  // Ex.: alterando o caption de 001 para 01...25
  for cor_inicial := 1 to 25 do
  begin
    NomeComp := 'selecao' + FormatFloat('000', cor_inicial);
    TPanel(FindComponent(NomeComp)).Caption := FormatFloat('00', cor_inicial);
  end;

{$ENDREGION 'QN_VOLTAR_SELETOR_PARA_01_25'}
  pnl_Aposta_Gravar.Enabled := True;
  spb_Aposta_Gravar.Font.color := Color_LF_Lilas; // a dezena fica MARCADA
  spb_Aposta_Gravar.Font.Style := [fsBold];

  pnl_Aposta_Limpar.Enabled := True;
  spb_Aposta_Limpar.Font.color := Color_LF_Lilas;
  spb_Aposta_Limpar.Font.Style := [fsBold];
end;
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar