Boa noite caros,
Possuo um software de sorteio de bingos e para quantidades de cartelas baixo até 30.000 esta tudo muito bom. Mas agora me vejo diante de um desafio muito maior e 500.000 cartelas de teste se tornou lento para trabalhar com DBFCDX diretamente e já testados vários tipo de soluções como:
ORDWILDSEEK()
SET FILTER MEMORY ADDITIVE
SEEK
SET RELATION
ORDSCOPE()
Então tive a última cartada para array na esperança de ser mais rápida e me deparei com algumas dificuldades neste setor que pouco uso.
A ideia é pegar informações do banco de dado original e somente retornar ao mesmo quando alguma cartela já sorteada acontecer.
Comecei com...
PRIVATE aCartelas := {" "," "," "}
SELECT Cartelas
Cartelas->(DBGOTOP())
DbEVal({||AADD(aCartelas,{ALLTRIM(STR(Cartelas->numero)),Cartelas->seqcar,STR(Cartelas->falta)})})
com informações por exemplo...
NUMERO______SEQUENCIA__________________________________________________FALTA
33349________04 07 08 09 11 12 20 22 24 25 33 34 35 40 46 50 51 52 56 59_________20
onde:
NUMERO = Numero da cartela
SEQUENCIA = Sequencia de 20 de numeros da cartela
FALTA = Número de que iá indicar se estará armada ou sorteada (diminuir a cada número encontrado em SEQUENCIA)
A rotina é a cada bola sorteada ele procura se esta contido em SEQUENCIA, caso sim, ele diminui um valor em FALTA (ou seja o valor é substituido no array) isso em cada um elemento de aCartelas
Caso um FALTA esteja com valor 1, ele soma 1 a uma variavel ARMADAS
Caso FALTA fique 0 (zero) atribui-se .T. (verdadeiro) a uma variável GANHOU e atribui-se a uma variável GNUMERO do NUMERO e neste momento darei um SEEK gnumero no campo número do DBFCDX e marcarei o registro (cartela) como sorteada.
Rotina essa dentro de um...
FOR a := 1 TO LEN(aCartelas)
....
NEXT
Parece ser simples mas as sintaxes me fogem a lógica no momento e acredito para experts em arrays isso já deve ser bem simples.
Obrigado pela atenção
Ladinilson Sousa
FWH 13.12/xHarbour/Pelles C/DBFCDX/MySQL