DEFINE CLASS Comp as Custom olepublic FUNCTION GetProximoCodigo() LOCAL lnNovoCodigo lnNovoCodigo = -1 IF !USED("codigos") USE codigos IN 0 SHARED ENDIF * Vamos tentar bloquear indefinidamente, assim nos livramos de * configurações de SET REPROCESS eventualmente diferentes. Se vc quiser * pode adotar outra estratégia... DO WHILE NOT FLOCK() ENDDO REPLACE Codigos.Codigo WITH codigos.Codigo + 1 IN Codigos * Vamos atualizar o valor de retorno logo aqui que ainda temos o Lock lnNovoCodigo = Codigos.Codigo * O FLUSH aqui pode ajudar, visto que não precisamos nos preocupar com * questões de buffer do sistema operacional FLUSH * Tá resto do mundo... é teu! UNLOCK RETURN lnNovoCodigo ENDFUNC ENDDEFINEOk, compile este projeto em uma MTDLL.
CREATE TABLE Codigos (Codigo I) INSERT INTO Codigos VALUES (1)Para a tabela de saídas (na qual colocaremos os códigos gerados), teremos o seguinte script:
CREATE TABLE Saida (Codigo I, IDComp C(5))O campo "Codigo" será o código gerado e o campo "IDComp" será um identificador de qual instância do componente gerou o código.
DECLARE Sleep in WIN32API INTEGER USE Saida SHARED LOCAL loComp loComp = CREATEOBJECT("comp.comp") DO WHILE .T. INSERT INTO Saida VALUES (loComp.GetProximoCodigo(), "COMP1") IF LASTKEY() = 27 EXIT ENDIF Sleep(1000) && Pára por 1 segundo para dar oportunidade dos outros rodarem ENDDOQuando você cansar ou o espaço do seu disco rígido for para a cucuia ;-) dê um ESC em cada uma das sessões.
SELECT Codigo, COUNT(Codigo) as Ocorrencias ; FROM Saida ; GROUP BY Codigo HAVING Ocorrencias > 1 INTO CURSOR RepetidosSe aqui retornar algum registro, é pq repetiu uma numeração.