AdsSetScopedRelation
Establece una relación padre-hijo que además acota el hijo al grupo de clave coincidente.
Sintaxis
UNSIGNED32 AdsSetScopedRelation(ADSHANDLE hTableParent, ADSHANDLE hTableChild, UNSIGNED8 *pucExpr);
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
hTableParent |
ADSHANDLE |
Handle de la tabla padre (controladora). |
hTableChild |
ADSHANDLE |
Handle de la tabla hija (relacionada). |
pucExpr |
UNSIGNED8* |
Expresión de relación, evaluada sobre el registro actual del padre para producir la clave del hijo. |
Valor de Retorno
AE_SUCCESS (0) en caso de éxito. AE_FUNCTION_NOT_AVAILABLE (5004) para tablas remotas. AE_INTERNAL_ERROR (5000) si la expresión es nula o el handle es desconocido.
Descripción
AdsSetScopedRelation funciona igual que AdsSetRelation —al mover el padre, el hijo se reposiciona evaluando la expresión de relación sobre el registro actual del padre—, pero además acota el hijo de modo que solo son visibles los registros cuya clave coincide con el valor del padre.
Cuando el padre se mueve, al orden controlador del hijo se le fija el scope superior e inferior igual a la clave de relación, y el hijo se posiciona en el primer registro de ese grupo. La navegación sobre el hijo (AdsGotoTop, AdsGotoBottom, AdsSkip) permanece entonces dentro del grupo coincidente, que es la forma natural de recorrer el lado “muchos” de una relación uno-a-muchos.
El hijo debe tener un orden controlador para que el scope surta efecto; sin él, la relación degrada a un simple movimiento por número de registro (igual que AdsSetRelation). AdsClearRelation elimina la relación y libera el scope impuesto. Cerrar cualquiera de las tablas también libera el scope. No está disponible para tablas remotas.
Ejemplo
// Por cada FACTURA, recorrer solo sus propias LÍNEAS.
AdsSetScopedRelation(hFacturas, hLineas, "INV_NO");
AdsGotoTop(hFacturas);
AdsGotoTop(hLineas);
while (1) {
UNSIGNED16 bEof;
AdsAtEOF(hLineas, &bEof); // EOF al final de las líneas de ESTA factura
if (bEof) break;
// ... procesar la línea ...
AdsSkip(hLineas, 1);
}