Páginas filhas
  • Estrutura de tabelas de CHs, Help e Campos (SX3)

Tabelas de CHs:

  • ZB0
  • ZB1

Neste diagrama, demonstramos as tabelas do AtuSX que guardam as informações referentes aos CHs. A tabela ZB0 representa o cabeçalho (podemos entender como sendo os próprios arquivos de CH, por exemplo FATA010.CH), a ZB1 os itens (as strings de tradução de cada CH), a ZA0 contém os owners e a tabela ZA4 os países.

Para efetuas buscas nas tabelas ZB0 e ZB1 devermos utilizar o R_E_C_N_O_ da ZB0 e o ZB1_IDZB0 como relacionamento, e para a ZA0 deveremos usar o R_E_C_N_O_ com o ZB0_IDZA0. Também é importante lembrar que buscas nas tabelas do AtuSX têm que, obrigatoriamente, levar em conta os campos de Versão (_CODVER), Pacote (_CODPAC) e Projeto (_CODPRJ), para facilitar a criação desses filtros pode-se utilizar a função ASXVerFil¹.

A função ASXVERFIL constrói um trecho de query implementando o conceito de herança do ATUSX. É capaz de considerar até 4 níveis na estrutura de pacote, projetos e versões priorizando os itens presentes nos projetos de nível mais baixo, caso existam itens de mesma chave em diferentes níveis da estrutura.

A tabela ZA4 seve como auxilio para filtrar o país.

 

Textos do sistema (CHs)
user function AtuSXStrQuery()
	Local cVersion := "000001"
	Local cProject := "000001"
	Local cPackage := Space( 6 )
	Local cTable   := "ZB1"
	Local cQuery   := ""
	Local cAliasTmp := ""
	
	//Aqui faremos a Query para retornar as Strings do AtuSX
	//Os campos Filial foram incluídos principalmente para melhorar a performance da query
	cQuery += "SELECT * FROM "+RetSqlName("ZB1")+" ZB1 "
	cQuery += "INNER JOIN "+RetSqlName("ZB0")+" ZB0 "
	cQuery += "ON ZB1.ZB1_IDZB0 = ZB0.R_E_C_N_O_ "
	cQuery += "INNER JOIN "+RetSqlName("ZA0")+" ZA0 "
	cQuery += "ON ZB1.ZB1_FILIAL = '" + xFilial("ZB1") + "' AND "
	cQuery += "ZB0.ZB0_FILIAL = '" + xFilial("ZB0") + "' AND "
	cQuery += "ZA0.ZA0_FILIAL = '" + xFilial("ZA0") + "' AND ZB0.ZB0_IDZA0 = ZA0.R_E_C_N_O_ AND "
	
	//A função ASXVerFil retorna o filtro de versão, projeto e pacote levando em consideração as heranças
	cQuery += ASXVerFil(3, cTable, cVersion, cProject, cPackage, AsxUniqKey( cTable ), cTable ) + " AND "
	
	//Aqui filtro apenas o pais Brasil, módulo SIGAFAT e textos em portogues que estão iguais em espanhol
	cQuery += " ZB1.ZB1_IDZA4 = 1 AND ZA0.ZA0_NOME = 'SIGAFAT' AND ZB1.ZB1_TXTPOR = ZB1.ZB1_TXTSPA " 
	
	cAliasTmp := getNextAlias()
	dbUseArea( .T., "TOPCONN", TcGenQry( ,, ChangeQuery( cQuery ) ), cAliasTmp, .F., .T. )  
	
return

 

Tabelas de help:

  • ZXH
  • ZXT

Para criarmos uma query para filtrar as tabelas de Help devemos primeiro entender um conceito diferente na sua arquitetura. Primeiro, o cabeçalho, representado na tabela ZXH, nele podemos ter 2 referências a tabelas de itens, ZXT, tanto pelo campo ZXH_IDPROB (ID do problema) quanto pelo ZXH_IDSOL (ID da solução).

Já na tabela de itens, também temos uma diferença estrutural importante de levarmos em consideração, diferente das outras tabelas que cada registro possui todos as traduções pra todos os idiomas (em diferentes colunas) na ZXT temos uma linha para cada idioma.

As tabelas ZA4 e ZA8 são as tabelas de Países e idioma respectivamente.

Assim como no exemplo anterior os relacionamentos são representados usando a representação do MER.

 

Helps
user function AtuSXHelpQuery()
	Local cVersion := "000003"
	Local cProject := "000017"
	Local cPackage := Space( 6 )
	Local cTable   := "ZXH"
	Local cQuery   := ""
	Local cAliasTmp := ""
	
	//Aqui faremos a Query para retornar os Helps
	//Os campos Filial foram incluídos principalmente para melhorar a performance da query
	//nessa primeira parte da query retorno os Helps do Brasil
	cQuery += "SELECT * FROM " + RetSQLName("ZXH") + " ZXH "
	cQuery += "INNER JOIN " + RetSQLName("ZXT") + " ZXT ON ZXH.ZXH_IDPRB = ZXT.ZXT_COD AND "
	cQuery += "ZXT.ZXT_IDZA8 = 1 AND ZXT.ZXT_FILIAL = '" + xFilial("ZXT") + "' AND "
	cQuery += "ZXH.ZXH_FILIAL = '" + xFilial("ZXH") + "' AND "
	
	//A função ASXVerFil retorna o filtro de versão, projeto e pacote levando em consideração as heranças
	cQuery += ASXVerFil(3, cTable, cVersion, cProject, cPackage, AsxUniqKey( cTable ), cTable ) + " AND "
	
	//Aqui filtro apenas os helps que tabém existem na subquery, a qual retorna o helps do idioma 3, comparando
	//seus textos, ou seja o texto no idioma 1 tem que ser igual ao idioma 3
	//Como armazenamos os helps em binário, utilizamos a função Cast para converter o tipo de dado 
	cQuery += "EXISTS " 
	cQuery += "( SELECT * from " + RetSQLName("ZXT") + " ZXT2 WHERE "
	cQuery += 	"ZXT2.ZXT_IDZA8 = 3 AND ZXT2.ZXT_COD = ZXT.ZXT_COD AND D_E_L_E_T_ =' ' AND "
	cQuery += 	"CAST( ZXT2.ZXT_TEXTO AS VARBINARY )  = CAST( ZXT.ZXT_TEXTO AS VARBINARY ) )" 
	
	cAliasTmp := getNextAlias()
	dbUseArea( .T., "TOPCONN", TcGenQry( ,, ChangeQuery( cQuery ) ), cAliasTmp, .F., .T. )  
	
return

 

Textos de Campos:

  • ZY3
  • ZX3

Para retornarmos as strings da SX3 precisamos fazer o relacionamento entre as tabelas ZY3 (cabeçalho dos campos), a ZX3 com os itens de tradução de cada campo, a ZY2 com as tabelas e a ZA0 com os owners. Podemos utilizar a tabela ZA4 caso seja necessário filtrar o país.

Os relacionamentos entre as tabelas estão destacados pelas linhas de relacionamento do modelo do MER.

Textos de campos
user function AtuSXSX3Query()
	Local cVersion := "000003" // versão 12
	Local cProject := "000017" // projeto release incremental
	Local cPackage := Space( 6 )
	Local cTable   := "ZY3"
	Local cTable2  := "ZX3"
	Local cTable3  := "ZY2"
	Local cQuery   := ""
	Local cAliasTmp := ""
	
	//Aqui faremos a Query para retornar os textos da SX3
	//Os campos Filial foram incluídos principalmente para melhorar a performance da query
	cQuery += "Select * from " + RetSQLName("ZY3") + " ZY3 "
	cQuery += "INNER JOIN " + RetSQLName("ZX3") + " ZX3 ON ZY3.ZY3_CAMPO = ZX3.ZX3_CAMPO AND "
	cQuery += " ZX3.ZX3_FILIAL = '" + xFilial("ZX3") + "' AND ZY3.ZY3_FILIAL = '" + xFilial("ZY3") + "' AND "
	
	// cria um trecho de query implementando o conceito de herança do ATUSX
	cQuery += ASXVerFil(3, cTable, cVersion, cProject, cPackage, AsxUniqKey( cTable ), cTable ) + " AND "
	cQuery += ASXVerFil(3, cTable2, cVersion, cProject, cPackage, AsxUniqKey( cTable2 ), cTable2 ) + " "
	
	cQuery += "INNER JOIN " + RetSQLName("ZY2") + " ZY2 ON ZY2.ZY2_ALIAS = ZY3.ZY3_ALIAS AND "
	cQuery += " ZY2.ZY2_FILIAL = '" + xFilial("ZY2") + "' AND "
	
	// cria um trecho de query implementando o conceito de herança do ATUSX
	cQuery += ASXVerFil(3, cTable3, cVersion, cProject, cPackage, AsxUniqKey( cTable3 ), cTable3 ) + " "
	
	//Aqui filtro por Owner e vejo se o titulo em portugues é igual ao ingles
	cQuery += "INNER JOIN " + RetSQLName("ZA0") + " ZA0 ON ZA0.R_E_C_N_O_ = ZY2.ZY2_IDZA0 AND "
	// Exemplo filtrando por onwer SIGAFAT
	cQuery += "ZA0.ZA0_NOME = 'SIGAFAT' AND ZX3.ZX3_TITPOR = ZX3.ZX3_TITENG"
	
	cAliasTmp := getNextAlias()
	dbUseArea( .T., "TOPCONN", TcGenQry( ,, ChangeQuery( cQuery ) ), cAliasTmp, .F., .T. )  
	
return

 

 

 

 

¹ - Os parâmetros da função são: ASXVerFil(nTipo, cAlias, cCodVer, cCodPrj, cCodPac, aKey, cPrefix, lExact, lInvAsp, lDescSep)

@param nTipo     Tipo : 1 - ISAM, 2 - SQL browse, 3 - SQL Query

@param cAlias    Alias

@param cVerId    Código da versão

@param cPrjId    Código do projeto

@param cPacId    Código do pacote

@param aKey      Array contendo a chave de relacionamento ( apenas tipo 3 )

@param cPrefix   Prefixo do alias da query que chamou a função ( apenas tipo 3 )

@param lExact    Pesquisa exatamente a versão, projeto e pacote, sem herança

@param lInvAsp   Inverte aspas simples por aspas duplas

@param lDescSep  Desconsidera a configuração de projeto separado

 

@return   cFiltro String de filtro

 

 

 

 

  • Sem rótulos