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.
// o código continua abaixo...
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
Curtir tópico
+ 0
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.
// 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
Clique aqui para fazer login e interagir na Comunidade :)