D_E_L_E_T_Flag de eliminación lógica. Blanco indica registro activo; asterisco indica registro eliminado lógicamente.
Guía AdvPLD_E_L_E_T_ = espaço → registro ativo | D_E_L_E_T_ = "*" → registro excluído logicamenteComprende 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.
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.
D_E_L_E_T_ = espaço → registro ativo | D_E_L_E_T_ = "*" → registro excluído logicamenteD_E_L_E_T_Flag de eliminación lógica. Blanco indica registro activo; asterisco indica registro eliminado lógicamente.
R_E_C_N_O_Identificador físico usado para posicionamiento y compatibilidad con Recno() en ambientes SQL.
R_E_C_D_E_L_Apoya la composición de claves únicas para registros eliminados lógicamente al recibir R_E_C_N_O_ durante la eliminación.
No es una función; es una convención de persistencia en las tablas Protheus.
#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())
ReturnLa consulta devuelve solo clientes activos de la filial correcta y cierra el área temporal.
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_ = ' ' "El filtro aparece tanto en SA1 como en SE1, evitando mezclar registros activos con eliminados lógicamente.
// Conceito simplificado:
// CODIGO R_E_C_N_O_ D_E_L_E_T_ R_E_C_D_E_L_
// 001 1 "*" 1
// 001 2 " " 0El 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.
Desarrollado con Usina Docs · Alpha
© 2026 Usina.BR. Todos los derechos reservados. TOTVS, Protheus, Microsiga y sus respectivos logotipos son marcas de sus titulares. Guía AdvPL es independiente y utiliza citas limitadas, atribuidas y justificadas por fines educativos. Consulta los Términos de Uso. Términos de Uso
Comentarios
Todavía no hay comentarios aprobados.
Inicia sesión con Google o Microsoft para comentar.