O compartilhamento de arquivos é baseado no conceito de filiais. Cada empresa cadastrada pode ter n filiais onde os dados inseridos por cada filial - como cadastro de produtos, cliente, etc. - podem ou não ser compartilhados com as demais filiais. Este recurso somente é possível devido à existência do campo “XX_FILIAL” (“XX” representa o nome do arquivo) em todos os arquivos do sistema.
O modo de operação de cada arquivo - compartilhado ou exclusivo - está definido no arquivo SX2 do dicionário de dados.
Caso o modo de acesso seja compartilhado, quando um novo registro for inserido, o campo XX_FILIAL receberá o valor “ “ (dois caracteres em branco) e o seu conteúdo será visível por qualquer usuário de qualquer filial.
Caso o modo seja exclusivo, quando um novo registro for inserido, o campo receberá o código - alfanumérico - da filial ( no exemplo abaixo, “01” ou “02” ) e será visível apenas para os usuários da filial que inseriu o mesmo.
Exemplo:
O arquivo XX está com o modo de acesso definido como exclusivo no SX2, portanto seus registros serão visíveis somente para a filial que os inseriu. Vide exemplo abaixo:
XX_FILIAL | XX_CODIGO | XX_DESCRI |
01 | 30 | CHAVE DE FENDA |
01 | 22 | CHAVE PHILLIPS |
02 | 21 | FURADEIRA BOSCH |
02 | 12 | FURADEIRA BLACK & DECKER |
01 | 31 | DREMEL |
01 | 90 | SERRA TICO-TICO |
02 | 48 | PRUMO |
02 | 13 | SERROTE |
Os usuários da Filial 01 terão acesso somente aos dados cujo registro possua o conteúdo “01” no campo XX_FILIAL. Já os usuários da Filial 02, acessarão os dados dos registros com o valor “02” no campo XX_FILIAL.
Na Gestão de Empresas, existem algumas particularidades, que se deve se atentar no desenvolvimento. Para um melhor entendimento sobre a funcionalidade Gestão de Empresas, segue uma breve explicação dos níveis que estarão disponíveis na Linha de Produtos Microsiga Protheus.
- Grupo de Empresas: Nível superior que controla o dicionário de dados no Microsiga Protheus. Exemplo: SX1??0.DBF – os pontos de interrogação serão substituídos pelo código do grupo.
- Empresas: Nível que identifica as empresas que fazem parte do grupo, ou seja, agora é possível utilizar mais de uma empresa para o mesmo dicionário de dados.
- Unidades de negócios: Nível que identifica as unidades de negócios das empresas. Desta forma, é possível definir um nível de controle entre as empresas e filiais.
- Filial: Nível que identifica as filiais das unidades de negócios ou das empresas
Criando estes níveis, podemos utilizar diversas empresas, unidades de negócios e filiais compartilhando informações entre si.
O único nível obrigatório para a Linha de Produtos Microsiga Protheus é a filial de no mínimo dois dígitos podendo chegar a doze dígitos, os demais níveis deverão ser utilizados de acordo com a necessidade de cada cliente.
A partir deste momento, iremos explicar o relacionamento entre os níveis:
No cadastro de Grupo de Empresas, o administrador do Sistema deverá definir o leiaute utilizado para preenchimento da empresa, unidade de negócios e filial, que não deverá ultrapassar doze caracteres.
Exemplo: EEUUFFFF
No exemplo acima, definimos que as informações gravadas nos campos filiais serão identificadas da seguinte maneira:
EE – Dois dígitos para a empresa
UU – Dois dígitos para a unidade de negócios
FFFF – Quatro dígitos para a filial
Algumas regras que devem ser seguidas pelos desenvolvedores:
- Utilizar as diretivas abaixo para que o programa aceite as alterações de tamanho do campo Filial:
FWGETTAMFILIAL-> Retorna o tamanho utilizado para a Filial (Substitui o Tamanho fixo de 2)
Exemplo:
// FWGETTAMFILIALSample.prw
AAdd(aStr, {"XU_FILIAL", "C", FWGETTAMFILIAL, 0})
Neste caso, todos os lugares que estiverem utilizando o tamanho 2 fixo deverão ser alterados para que se torne flexível a mudança do tamanho.
FWGETCODFILIAL -> Retorna o código da Filial posicionada (Substitui a utilização do M0_CODFIL)
A partir do momento que for definido que o tamanho do campo FILIAL pode ser aumentado, o tamanho físico do campo M0_CODFIL será 12, desta maneira, para utilizar o conteúdo correto a variável FWGETCODFILIAL deverá ser utilizada no lugar do campo M0_CODFIL.
Exemplo:
// FWGETCODFILIALSample.prw
FWGETCODFILIAL = "1234"
Filial com tamanho 4 e sem os caracteres especiais - CERTO
Para tratamento em dicionários de dados, não é possível a utilização das strings informadas, pois, esta é substituída somente em tempo de compilação. Desta forma, em caso de dicionário de dados deve utilizar as seguintes funções:
- FWSizeFilial() -> Retorna o tamanho utilizado para a Filial (Substitui o Tamanho fixo de 2)
- FWCodFil() -> Retorna o código da Filial posicionada (Substitui a utilização do M0_CODFIL)
- Todos os novos campos referente a Filial deverão ser inseridos no grupo de campo “033” (Filial).
- Para a atualização de campos concatenados, no qual, a filial faz parte do conteúdo do campo, deverá ser criada uma função com a sigla do módulo + “UpdFConj()” que retornará um array com a seguinte estrutura:
aArray[n,1]=Alias
aArray[n,2]=Campo
aArray[n,3]=Tamanho original do campo (Deve ser informado o tamanho padrão e não deve ser considerado o aumento ou diminuição do campo filial)
aArray[n,4]=Indica a posição em que inicia a gravação do campo filial (Opcional. No caso de não existir este nível, o campo será apenas aumentado.)
aArray[n,5]=Bloco de códigos com a função de atualização dos dados a ser executada quando a posição 4 for igual a 0 (zero).
Este bloco de códigos recebera como parâmetro as seguintes informações:
cAlias,cField,nRealSize,nFilIni,nOldSize,nNewSize.
Exemplo de preenchimento:
// ConcatenatedBranchUpdateSample.prw
{ |cAlias,cField,nRealSize,nFilIni,nOldSize,nNewSize|FunUpdRA( cAlias,cField,nRealSize,nFilIni,nOldSize,nNewSize ) }
Function GPEUpdFConj()
Local aFields := {}
Aadd(aFields, { "SRA", "RA_P1FILP2", 14, 7 } ) // Exemplo: "PARTE101PARTE2"
Aadd(aFields, { "SRA", "RA_FILUSR", 8, 1 } ) // Exemplo: "01PARTE2"
Aadd(aFields, { "SRA", "RA_123456", 8, 0, { cAlias, cField, nRealSize, nFilIni, nOldSize, nNewSize| FunUpdRA(cAlias, cField,n RealSize, nFilIni, nOldSize, nNewSize) }} )
Return aFieds
Function FunUpdRA(cAlias, cField, nRealSize, nFilIni, nOldSize, nNewSize)
// Tratamentos necessários e atualização do conteúdo no banco de dados
Return
- Funções auxiliares para o desenvolvimento e padronização dos programas:
- FWSizeFilial - Retorna o tamanho do campo Filial
- FWCodFil - Retorna o código da filial
- FWModeAccess - Retorna o modo de compartilhamento
- FWGrpCompany - Retorna o grupo
- FWAllGrpCompany - Retorna os grupos de empresas
- FWCompany - Retorna a empresa
- FWAllCompany - Retorna as empresas do grupo de empresas
- FWUnitBusiness - Retorna a unidade de negócio
- FWAllUnitBusiness - Retorna as unidades de negócios para o grupo e empresa
- FWFilial - Retorna a filial
- FWAllFilial - Retorna as filiais para o grupo de empresas
- FWLoadSM0 - Carrega as informações das filiais
- FWSM0Layout - Retorna o leiaute
- FWXFilial - Retorna a string
- FWGrpName - Retorna o nome do grupo de empresas
- FWFilialName - Retorna o nome da filial
- FWFilRazSocial - Retorna a Razão Social
- FWArrFilAtu - Retorna todas informações referente a empresa, unidade de negócio e filial
- FWFilialStatus - Retorna o status da filial posicionada
- FWCodEmp - Retorna o código da empresa
- FWPesqSM0 - Exibe a filiais disponíveis para o grupo de empresa atual
- FWUnitName - Retorna o nome da Unidade de Negócios
- FWCompanyName - Retorna o nome da empresa
- FWFilExist - Verifica se a filial existe
- FWEmpName - Nome da empresa
- FWFilName - Nome da filial
- Os programas que utilizam a varredura na tabela SM0 (While), devem utilizar a função FWLoadSM0() que retorna um array com todas as informações do SIGAMAT.
Exemplo:
// FWLoadSM0Sample.prw
aSM0 := FWLoadSM0()
For nI := 1 To Len(aSM0)
//Tratamentos desejados com as informações do SIGAMAT
Next nI
- Para retornar informações de uma filial específica, utilize a função FWArrFilAtu().
Exemplo:
// FWArrFilAtuSample.prw
aFil := FWArrFilAtu(cEmpAnt, cFilAnt)
aFil := FWArrFilAtu("04", "E01U01F03")
7. O ambiente de Gestão de Pessoal já utilizava o conceito de multi empresas, sendo assim, para utilizar a empresa deve-se verificar se existe a empresa configurada para o grupo e caso não esteja configurada pegar o conteúdo do próprio grupo para manter o legado.
Exemplo:
// FWLoadSM0LegacySample.prw
aSM0 := FWLoadSM0()
For nI := 1 To Len(aSM0)
If !Empty(aSM0[nI,SM0_EMPRESA])
cEmp := aSM0[nI,SM0_EMPRESA]
Else
cEmp := aSM0[nI,SM0_GRPEMP]
EndIf
// Utiliza a variável cEmp
Next nI
Estas regras devem ser utilizadas no sistema e customizações. Desta forma, é muito importante revisar as customizações dos clientes antes de começar a utilizar a Gestão de Empresas.
Concluindo, a Gestão de Empresas, presente na Linha de Produtos Microsiga Protheus, permite compartilhar as definições do “Modelo de dados” entre as empresas configuradas no sistema, além de introduzir o conceito de Unidade de Negócio.