Usina BRGuía AdvPL
Ingresar
← Todos los temas
FUNDAMENTOPublicado

Campo D_E_L_E_T_ y eliminación lógica en Protheus

D_E_L_E_T_ = espaço → registro ativo | D_E_L_E_T_ = "*" → registro excluído logicamente

Comprende cómo Protheus representa la eliminación lógica en bases SQL y por qué las consultas deben filtrar D_E_L_E_T_ en cada tabla.

Base de datosSQLDBAccessTopConnEliminación lógicaD_E_L_E_T_
01 · DESCRIPCIÓN GENERAL

Descripción general

En Protheus, el modelo estándar de eliminación es lógico: el registro permanece físicamente en la tabla, pero el campo D_E_L_E_T_ indica que ya no debe ser considerado por la aplicación. Las consultas SQL directas deben tratar esto explícitamente, de lo contrario el banco puede devolver filas que Protheus considera eliminadas. El material histórico Programación ADVPL X SQL también relaciona D_E_L_E_T_ con R_E_C_N_O_ y R_E_C_D_E_L_, campos de control de DBAccess usados para compatibilidad ISAM y manejo de claves únicas tras la eliminación lógica.

02 · SINTAXIS

Sintaxis

D_E_L_E_T_ = espaço → registro ativo | D_E_L_E_T_ = "*" → registro excluído logicamente

Parámetros

D_E_L_E_T_
Campo de controleObligatorio

Flag de eliminación lógica. Blanco indica registro activo; asterisco indica registro eliminado lógicamente.

R_E_C_N_O_
Campo de controleOpcional

Identificador físico usado para posicionamiento y compatibilidad con Recno() en ambientes SQL.

R_E_C_D_E_L_
Campo de controleOpcional

Apoya la composición de claves únicas para registros eliminados lógicamente al recibir R_E_C_N_O_ durante la eliminación.

Retorno

No es una función; es una convención de persistencia en las tablas Protheus.

03 · EJEMPLO PRÁCTICO

Consulta simple retornando solo registros activos

#Include "TOTVS.ch"
#Include "TopConn.ch"

User Function ExDelLogico()
    Local cAlias := GetNextAlias()
    Local cQuery := ""

    cQuery := "SELECT SA1.A1_COD, SA1.A1_LOJA, SA1.A1_NOME "
    cQuery += "FROM " + RetSqlName("SA1") + " SA1 "
    cQuery += "WHERE SA1.A1_FILIAL = '" + xFilial("SA1") + "' "
    cQuery += "AND SA1.D_E_L_E_T_ = ' ' "
    cQuery += "ORDER BY SA1.A1_COD, SA1.A1_LOJA"
    cQuery := ChangeQuery(cQuery)

    TCQUERY (cQuery) ALIAS (cAlias) NEW

    While !(cAlias)->(Eof())
        ConOut((cAlias)->A1_COD + " - " + (cAlias)->A1_NOME)
        (cAlias)->(DbSkip())
    EndDo

    (cAlias)->(DbCloseArea())
Return
Resultado esperado

La consulta devuelve solo clientes activos de la filial correcta y cierra el área temporal.

04 · EJEMPLO PRÁCTICO

JOIN filtrando eliminación lógica en cada tabla

cQuery := "SELECT SA1.A1_COD, SA1.A1_NOME, SE1.E1_NUM, SE1.E1_SALDO "
cQuery += "FROM " + RetSqlName("SA1") + " SA1 "
cQuery += "INNER JOIN " + RetSqlName("SE1") + " SE1 "
cQuery += "ON SE1.E1_FILIAL = '" + xFilial("SE1") + "' "
cQuery += "AND SE1.E1_CLIENTE = SA1.A1_COD "
cQuery += "AND SE1.E1_LOJA = SA1.A1_LOJA "
cQuery += "AND SE1.D_E_L_E_T_ = ' ' "
cQuery += "WHERE SA1.A1_FILIAL = '" + xFilial("SA1") + "' "
cQuery += "AND SA1.D_E_L_E_T_ = ' ' "
Resultado esperado

El filtro aparece tanto en SA1 como en SE1, evitando mezclar registros activos con eliminados lógicamente.

05 · EJEMPLO PRÁCTICO

R_E_C_D_E_L_ y reutilización de clave

// Conceito simplificado:
// CODIGO  R_E_C_N_O_  D_E_L_E_T_  R_E_C_D_E_L_
// 001     1           "*"          1
// 001     2           " "          0
Resultado esperado

El registro eliminado lógicamente permanece almacenado, mientras R_E_C_D_E_L_ ayuda a liberar la clave única para una nueva inclusión activa.

BUENAS PRÁCTICAS
  • Filtra la eliminación lógica en cada tabla Protheus consultada directamente por SQL.
  • Califica D_E_L_E_T_ con el alias de la tabla.
  • Usa RetSqlName() y ChangeQuery() para nombres físicos y portabilidad.
  • Trata eliminación lógica y eliminación física como operaciones distintas.
ERRORES COMUNES
  • Olvidar D_E_L_E_T_ puede devolver registros que Protheus considera eliminados.
  • Filtrar solo la tabla principal no basta cuando hay JOIN con tablas Protheus.
  • Un DELETE físico directo en el banco puede romper rastreabilidad y rutinas estándar.
  • No actualices manualmente D_E_L_E_T_, R_E_C_N_O_ o R_E_C_D_E_L_ sin validación controlada.

Contenido relacionado

REFERENCIAS
  1. MICROSIGA. Programación ADVPL — Uso de Query. Documento Programación ADVPL X SQL, proporcionado al proyecto, 27 ago. 2006. Sección "Particularidades Protheus".
  2. TOTVS. Comandos DML en SQL/DBAccess para ADVPL. Central de Atención TOTVS.
  3. TOTVS. Desarrollo de queries en Protheus. TDN.
  4. TOTVS. Comando TCQUERY. TDN.
Estado
Publicado
Página creada el
Última revisión el
Idioma original
Portugués
Revisión
Usina.BR
0 comentario(s) aprobado(s)

Comentarios

Todavía no hay comentarios aprobados.

Inicia sesión con Google o Microsoft para comentar.

Desarrollado con Usina Docs · Alpha