Fórum Loop desnecessário dentro do Filtro com SQL em Delphi #617410
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)