Tabelas Z* customizadas — criar e usar
Como criar tabela customizada (prefixo Z) sem quebrar update padrao TOTVS. SX2/SX3, indices, IxBExp e boas praticas.
Tabelas com prefixo Z* (Z01, ZA1 etc) sao o jeito oficial de criar tabelas customizadas sem conflito com nomes padrao TOTVS. Em update, a TOTVS nunca toca em tabelas Z.
Convencao
| Prefixo | Uso |
|---|---|
Z01..Z99 | Tabela customizada generica |
ZA0..ZZZ | Mais espaco — alfanumerico no 2-3 digito |
SZ* | Tabela "tipo padrao" customizada (raro) |
Passos pra criar Z01
- SX2 — definicao da tabela: nome, modo (compartilhado/exclusivo), arquivo fisico
- SX3 — campos: nome (Z01_FILIAL, Z01_COD...), tipo, tamanho, descricao
- SIX — indices: chaves de busca (Z01_FILIAL+Z01_COD)
- Atualizador (rotina UPDDistr): garante criacao em multiplos ambientes
Exemplo: criacao programatica via UPDDistr
User Function CriaZ01()
Local aEstrut := {}
Local aIndices := {}
// ----- Campos (SX3) -----
aAdd(aEstrut, {"Z01_FILIAL", "C", TamSx3("M0_CODIGO")[1], 0, "Filial", ".F.", "", "G", "", "S", "", "", ""})
aAdd(aEstrut, {"Z01_COD", "C", 6, 0, "Codigo", ".F.", "", "S", "", "S", "", "", ""})
aAdd(aEstrut, {"Z01_DESC", "C", 50, 0, "Descricao", ".F.", "", "S", "", "S", "", "", ""})
aAdd(aEstrut, {"Z01_DTINI", "D", 8, 0, "Data inicio", ".F.", "", "S", "", "S", "", "", ""})
// ----- Indices (SIX) -----
aAdd(aIndices, {"Z01", "1", "Z01_FILIAL+Z01_COD", "Codigo", 1, .F.})
// Mecanismo padrao TOTVS pra criar tabela customizada
U_AjusteSXs("Z01", "Tabela Custom", aEstrut, aIndices)
Return
Pegadinhas
- Sempre prefixo Z — usar A-Y quebra em update porque TOTVS pode introduzir conflito.
- Campo X_FILIAL obrigatorio — mesmo em tabela "global", pra compatibilidade com o framework.
- Tamanho de filial dinamico — use
TamSx3("M0_CODIGO")[1], nao hardcode 2. - Update da TOTVS apaga SIX/SX3 do que e padrao — Z01 sobrevive.
- Indices novos — sempre criar com IxBExp pra atender particularidades de Top.
Acessar a tabela criada
Z01->(DBSetOrder(1))
If Z01->(DBSeek(xFilial("Z01") + "000001"))
ConOut(Z01->Z01_DESC)
EndIf
// Inclusao
RecLock("Z01", .T.)
Z01->Z01_FILIAL := xFilial("Z01")
Z01->Z01_COD := "000001"
Z01->Z01_DESC := "Teste"
Z01->Z01_DTINI := dDataBase
Z01->(MsUnlock())