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.
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.
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.
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