Validar repetición entre tablas

Hola Víctor, ¿puedo hacerte una consulta?
Estoy haciendo una aplicación en FOX 2.6 DOS ( en realidad es un cambio)
Tengo dos tablas guarda.dbf y jugada.dbf
Cargo 5 números de dos cifras
Y luego válido
Abro la primer tabla y comparo si no hay repetición abro la segunda si no hay repetición grabo de lo contrario pongo en blanco y debe cargar otra jugada.
Ahora bien... El problema es que la repetición debe ser sin ordenar, enton ces no se como hacer ese procedimiento.
Puede hacerlo pero solo si no hay repetición de números
es decir:
Cargo: 01 02 03 04 05
Busco en tabla 1: si hay un registro: 01 03 02 05 04 da repetición
pero si encuentra: 01 02 03 04 04 también da repetición
no se como resolver esto.
El segundo problema es que a veces se cuelga y no da error y no se el motivo.
Este es el proceso... Y lo resolví así pero es muy extenso, imaginate cuando tenga que cargar 20 números.
PROCEDURE verirepe1
proceso = 0
ON ERROR
SELECT 9
USE GUARDABO
GOTO TOP
IF RECCOUNT('GUARDABO') = 0
DO verirepe2
ENDIF
IF proceso = 1
RETURN
ENDIF
DO WHILE .NOT. EOF()
igual = 0
IF punto <> '1'
SKIP
ENDIF
*IF LEN(ALLTRIM(loterias))<> LEN(ALLTRIM(lote))
*SKIP
*ENDIF
FOR L1 = 1 TO LEN(ALLTRIM(lote))
FOR L2 = 1 TO LEN(ALLTRIM(loterias))
IF SUBSTR(lote, L1, 1) = SUBSTR(loterias, L2, 1)
igual = igual + 1
ELSE
ENDIF
ENDFOR
ENDFOR
ENDIF
IF igual > 0
numin1 = 0
numin2 = 0
numin3 = 0
IF numerobo.num1 = num1
numin1 = 1
ELSE
IF numerobo.num1 = num2
numin1 = 2
ELSE
IF numerobo.num1 = num3
numin1 = 3
ELSE
SKIP
ENDIF
ENDIF
ENDIF
IF numin1 = 1
IF numerobo.num2 = num2
numin2 = 2
ELSE
IF numerobo.num2 = num3
numin2 = 3
ELSE
SKIP
ENDIF
ENDIF
ENDIF
IF numin1 = 2
IF numerobo.num2 = num1
numin2 = 1
ELSE
IF numerobo.num2 = num3
numin2 = 3
ELSE
SKIP
ENDIF
ENDIF
ENDIF
IF numin1 = 3
IF numerobo.num2 = num1
numin2 = 1
ELSE
IF numerobo.num2 = num2
numin2 = 2
ELSE
SKIP
ENDIF
ENDIF
ENDIF
IF numin1 = 1 and numin2 = 2
IF numerobo.num3 = num3
numin3 = 3
ENDIF
ENDIF
IF numin1 = 1 and numin2 = 3
IF numerobo.num3 = num2
numin3 = 2
ENDIF
ENDIF
IF numin1 = 2 and numin2 = 1
IF numerobo.num3 = num3
numin3 = 3
ENDIF
ENDIF
IF numin1 = 2 and numin2 = 3
IF numerobo.num3 = num1
numin3 = 2
ENDIF
ENDIF
IF numin1 = 3 and numin2 = 1
IF numerobo.num3 = num2
numin3 = 2
ENDIF
ENDIF
IF numin1 = 3 and numin2 = 2
IF numerobo.num3 = num1
numin3 = 1
ENDIF
ENDIF
IF numin1 > 0 AND numin2 > 0 AND numin3 > 0
WAIT WINDOW ' NO PUEDE CARGAR REPETIDAS.'
RETURN TO cargabo1
ENDIF
ELSE
SKIP
Endif
¿Qué estoy haciendo mal?
Gracias desde ya víctor!

1 respuesta

Respuesta
1
Para lo primero te sugiero que implementes algo similar a:
Function BusRep
    Parameter cCadena
    Local cBusca1, cBusca2, cBusca3, cBusca4, cBusca5
cBusca1 = Left( cCadena, 2 )
    cBusca2 = SubStr( cCadena, 4, 2 )
    cBusca3 = SubStr( cCadena, 7, 2 )
    cBusca4 = SubStr( cCadena, 10, 2 )
    cBusca5 = Right( cCadena, 2 )
    Select guarda
    Locate For cBusca1 $ guarda.campo .And. cBusca2 $ guarda.campo .And. cBusca3 $ guarda.campo .And. cBusca4 $ guarda. Campo And cBusca5 $ guarda. Campo
    If !Found()
        Select jugada
        Locate For cBusca1 $ jugada.campo .And. cBusca2 $ jugada.campo .And. cBusca3 $ jugada.campo .And. cBusca4 $ jugada. Campo And cBusca5 $ jugada. Campo
        If !Found()
            Append Blank
            Replace campo With cBusca1 + " " + cBusca2 + " " + cBusca3 + " " + cBusca4 + " " + cBusca5
            Return .T.
        Else
            Return .F.
        EndIf
    Else
        Return .F.
    EndIf
End Func

Si la función te regreas un valor verdadero entonces los datos se grabaron, si te regresa un valor falso deberás solicitar nuevos.
Y respecto al código, tiene demasiadas variables no definidas, no sé si porque lo fueron previamente o son campos, por lo que no puedo entender bien lo que se supone hace y por lo tanto no puedo opinar al respecto.
Millón de gracias por tu pronta respuesta Víctor!
¿Puede ser que se cuelgue por no definir algunas variables?
Segundo:
Cada numero ingresado es un campo
Lo que se carga es numerobo.num1...
Y las tablas tienen un campo por numero que es num1...
La comparación es campo a campo
es decir comparo numerobo.num1 con num1, num2, num3, num4, num5 de la primera tabla, si no hay registros repetidos, busco en la segunda.
Gracias!
Puede que se cuelgue por eso, aunque más bien debería alentarse y no colgarse.
Gracias por tu tiempo, lo ultimo y no te molesto más.
Creo que no entendí lo de
Parameter cCadena
Local cBusca1, cBusca2, cBusca3, cBusca4, cBusca5
cBusca1 = Left( cCadena, 2 )
cBusca2 = SubStr( cCadena, 4, 2 )
cBusca3 = SubStr( cCadena, 7, 2 )
cBusca4 = SubStr( cCadena, 10, 2 )
cBusca5 = Right( cCadena, 2 )
por eso te puse que son campos cada numero de dos cifras, y no una cadena de numeros.
Por eso no logro hacerlo...
Modifica el código a:
Function BusRep
    Parameter cCampo1, cCampo2, cCampo3, cCampo4, cCampo5
    Select numerobo
    Locate For numerobo.num1 = cCampo1 .And. numerobo.num1 = cCampo2 .And. numerobo.num1 = cCampo3 .And. numerobo.num1 = cCampo4 .And. numerobo.num1 = cCampo5
    If !Found()
        Select jugada
        Locate For jugada.num1 = cCampo1 .And. jugada.num1 = cCampo2 .And. jugada.num1 = cCampo3 .And. jugada.num1 = cCampo4 .And. jugada.num1 = cCampo5
        If !Found()
            Append Blank
            Replace jugada.num1 With cCampo1 + " " + cCampo2 + " " + cCampo3 + " " + cCampo4 + " " + cCampo5
            Return .T.
        Else
            Return .F.
        EndIf
    Else
        Return .F.
    EndIf
End Func

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas