Jump to content
Fivewin Brasil

Quantidade Máxima de Campos Num Arquivo DBF ou Tabela SQL


Valdir

Recommended Posts

Boas...

 

Alguém saberia me dizer se existem alguns limites para adicionar "Campos" em Arquivos Dbf ou em Tabelas Sql ?

Estou desenvolvendo uma rotina de acesso para cada atividade dentro do meu Sistema e já foram consumidos 280 campos.

Como ainda estou na metade do trabalho, gostaria de ter certeza que não ocorrerá erros se houver essas limitações.

Obrigado

 

 

Link to comment
Share on other sites

Usando o FOX.EXE 2.1, ele te informará que estourou o limite de campos, não sei informar como é o cálculo dele. 

Se usar o DBCREATE() para criar os CAMPOS em FiveWin, não tem limite pelo que eu pude observar, porém, não poderás mais abrir o BANCO pelo FOX.EXE, somente via programa for windows, pero não vejo motivo para que você não tenha quantos *.DBFS, sejam necessários para se ter um CONTROLE DE ACESSOS dos usuários por exemplo, bastando usar o SELECT() e ir incorporando nos bancos os dados necessários. Espero ter ajudado. Abs.

Link to comment
Share on other sites

Valdir, nao quero me meter na forma como está desenvolvendo seu sistema e a estrutura da sua tabela.

Mas 280 campos eu nunca vi nenhuma tabela em nenhum sistema.

Apenas por curiosidade e caso possa abrir essa informação, pode colocar como está a estrutura atualmente? de repente vendo isso eu consigo dar uma sugestão que possa melhorar isso pra vc.

Link to comment
Share on other sites

Prezados amigos...

Obrigado pelas respostas.

Eduardo, a estrutura é muito simples.

Em Dbf:

Código do Colaborador, N, 3,0

Aces01, C, 1, 0

Aces02, C, 1, 0...

E assim sucessivamente até os atuais 280 campos.

Cada campo será preenchido por um carácter, oriundo de uma CheckBox para cada opção.

Tentei fazer através da Tree, mas infelizmente não consegui.

 

Abraços.

Link to comment
Share on other sites

 

Prezados amigos...

Obrigado pelas respostas.

Eduardo, a estrutura é muito simples.

Em Dbf:

Código do Colaborador, N, 3,0

Aces01, C, 1, 0

Aces02, C, 1, 0...

E assim sucessivamente até os atuais 280 campos.

Cada campo será preenchido por um carácter, oriundo de uma CheckBox para cada opção.

Tentei fazer através da Tree, mas infelizmente não consegui.

 

Abraços.

Valdir então não faça assim, crie uma tabela apenas com DOIS campos sendo:

ID CARACTER  TAMANHO: 2

CHECK CARACTER TAMANHO: 1

 

Desta forma a tabela terá apenas dois campos porem pra cada identificador (ID) terá um registro. Deixe como chave principal da tabela o ID. Pra saber se está com CHECK basta fazer um SEEK nesta tabela pelo ID e se existir vc verifica se o campo CHECK está preenchido. Se estiver preenchido ele está com o CHECK e se nao existir ou estiver em branco está SEM CHECK.

Não crie a tabela desta forma que está fazendo não, é muito mais complicado pra se manter assim. É minha dica.

 

 

Link to comment
Share on other sites

Eu faço assim, para controlar todos os acessos do usuário, pois cada um pode ter níveis de poderes diferentes. E áreas diferentes. 

 


/*
* MODULO CRIARDBF.PRG Criar o Banco de Dados
* Pode-se Criar Quantos CAMPOS/FIELDS Novos se Quiser, Em Qualquer Banco.
*ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍË
*º°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°º
*º°°ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍË°°º
*º°°º PLANO DE TRABALHO  : CRIA€ÇO DOS BANCOS        MASTER: WINORCAM.EXE  º°°º
*º°°º PROGRAMA           : CRIARDBF.PRG                                    º°°º
*º°°º FUN€ŽO             : CRIA€ÇO DOS ARQUIVOS DBF                        º°°º
*º°°º PROGRAMADOR        : JOŽO SANTOS               (011)3106-2832        º°°º
*º°°º CLIENTE DESTINO    : DIVERSOS     PARTIC. ESPECIAL:                  º°°º
*º°°º DATA               : 20/04/2017 - LOCAL: CONTATO SISTEMAS LTDA.      º°°º
*º°°º ULTIMA ATUALIZA€ŽO : 14/05/2020   POR:  JOŽO                         º°°º
*º°°ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊ°°º
*º°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°º
*ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊ
*-----------------------------------------------------------------------------*
*/

#include "FiveWin.ch"

//-> Criar Novos Bancos, Ja na Entrada do Menu Principal.

FUNCTION CRIARNOVOS( oMeter, oText, oDlg, lEnd )

   LOCAL nTotal := 100
   LOCAL DEONDEVEM
   LOCAL lExiste := .T. , cAlias, nConta
   LOCAL oDlgBak, oFnt, oFont, IDCor, oSaida2, oIco, oGroup, cBackupWiki, ;
         cGoogleDrive, oGoogleDrive, oBackupWiki, oFntGr, oBrush
   LOCAL nColor := GetSysColor( COLOR_BTNFACE ),  aGrad
   LOCAL lContinua := .F., oExecutar

   oMeter:Refresh()

   IF .NOT. FILE( "OPERADOR.DBF" ) 

      oText:SetText( " Processando, Aguarde... Criando OPERADOR.DBF " )

      DbCreate( "OPERADOR.DBF", { { "CODIGO",     "C", 02, 00 }, ;
                                  { "NOME",       "C", 50, 00 }, ;
                                  { "END",        "C", 50, 00 }, ;
                                  { "BAIRRO",     "C", 30, 00 }, ;
                                  { "CIDADE",     "C", 30, 00 }, ;
                                  { "CEP",        "C", 10, 00 }, ;
                                  { "EST",        "C", 02, 00 }, ;
                                  { "REGIAO",     "C", 20, 00 }, ;
                                  { "CGC",        "C", 18, 00 }, ;
                                  { "RG",         "C", 30, 00 }, ;
                                  { "CPF",        "C", 14, 00 }, ;
                                  { "TEL",        "C", 18, 00 }, ;
                                  { "TEL2",       "C", 18, 00 }, ;
                                  { "CELULAR",    "C", 18, 00 }, ;
                                  { "ASSINATURA", "C", 20, 00 }, ;
                                  { "CAIXA",      "N", 03, 00 }, ;
                                  { "DESC",       "N", 05, 02 }, ;
                                  { "TIPO",       "C", 01, 00 }, ;
                                  { "EQUIPE",     "C", 07, 00 }, ;
                                  { "SALARIO",    "N", 15, 02 }, ;
                                  { "COMIS",      "N", 12, 02 }, ;
                                  { "COMISB",     "N", 12, 02 }, ;
                                  { "COMISC",     "N", 12, 02 }, ;
                                  { "COMISD",     "N", 12, 02 }, ;
                                  { "CHAVE",      "C", 15, 00 }, ;
                                  { "APAGARVEND", "L", 01, 00 }, ;
                                  { "CADASTCLIE", "L", 01, 00 }, ;
                                  { "DESCPRECO",  "L", 01, 00 }, ;
                                  { "ABRIRVENDA", "L", 01, 00 }, ;
                                  { "RECVALVEND", "L", 01, 00 }, ;
                                  { "VENDAPRAZO", "L", 01, 00 }, ;
                                  { "VENDACLIEN", "L", 01, 00 }, ;
                                  { "NOVOPRODUT", "L", 01, 00 }, ;
                                  { "APAGARDADO", "L", 01, 00 }, ;
                                  { "ALTERADADO", "L", 01, 00 }, ;
                                  { "CONFSISTEM", "L", 01, 00 }, ;
                                  { "CONFCAIXAS", "L", 01, 00 }, ;
                                  { "IMPREDUCAZ", "L", 01, 00 }, ;
                                  { "TELAVENDAS", "L", 01, 00 }, ;
                                  { "RELATVALOR", "L", 01, 00 }, ;
                                  { "OUTSAIESTO", "L", 01, 00 }, ;
                                  { "ENTRAESTOQ", "L", 01, 00 }, ;
                                  { "FAZERORCAM", "L", 01, 00 }, ;
                                  { "VENFORALIM", "L", 01, 00 }, ;
                                  { "FAZSANGRIA", "L", 01, 00 }, ;
                                  { "VERQTDEEST", "L", 01, 00 }, ;
                                  { "ALTTITULOS", "L", 01, 00 }, ;
                                  { "BUSCAPRODU", "L", 01, 00 }, ;
                                  { "ACESINTERN", "L", 01, 00 }, ;
                                  { "LIMPBACKUP", "L", 01, 00 }, ;
                                  { "PODERSUPER", "L", 01, 00 }, ;
                                  { "BAIXACOMAN", "L", 01, 00 }, ;
                                  { "TROCAMERCA", "L", 01, 00 }, ;
                                  { "VERVENDASP", "L", 01, 00 }, ;
                                  { "PERMISSA30", "L", 01, 00 }, ;
                                  { "PERMISSA31", "L", 01, 00 }, ;
                                  { "PERMISSA32", "L", 01, 00 }, ;
                                  { "PERMISSA33", "L", 01, 00 }, ;
                                  { "PERMISSA34", "L", 01, 00 }, ;
                                  { "PERMISSA35", "L", 01, 00 }, ;
                                  { "PERMISSA36", "L", 01, 00 }, ;
                                  { "PERMISSA37", "L", 01, 00 }, ;
                                  { "PERMISSA38", "L", 01, 00 }, ;
                                  { "PERMISSA39", "L", 01, 00 }, ;
                                  { "PERMISSA40", "L", 01, 00 }, ;
                                  { "PERMISSA41", "L", 01, 00 }, ;
                                  { "PERMISSA42", "L", 01, 00 }, ;
                                  { "PERMISSA43", "L", 01, 00 }, ;
                                  { "PERMISSA44", "L", 01, 00 }, ;
                                  { "PERMISSA45", "L", 01, 00 }, ;
                                  { "PERMISSA46", "L", 01, 00 }, ;
                                  { "PERMISSA47", "L", 01, 00 }, ;
                                  { "PERMISSA48", "L", 01, 00 }, ;
                                  { "PERMISSA49", "L", 01, 00 }, ;
                                  { "PERMISSA50", "L", 01, 00 }, ;
                                  { "PERMISSA51", "L", 01, 00 }, ;
                                  { "PERMISSA52", "L", 01, 00 }, ;
                                  { "PERMISSA53", "L", 01, 00 }, ;
                                  { "PERMISSA54", "L", 01, 00 }, ;
                                  { "PERMISSA55", "L", 01, 00 }, ;
                                  { "PERMISSA56", "L", 01, 00 }, ;
                                  { "PERMISSA57", "L", 01, 00 }, ;
                                  { "PERMISSA58", "L", 01, 00 }, ;
                                  { "PERMISSA59", "L", 01, 00 }, ;
                                  { "PERMISSA60", "L", 01, 00 }, ;
                                  { "PERMISSA61", "L", 01, 00 }, ;
                                  { "PERMISSA62", "L", 01, 00 }, ;
                                  { "PERMISSA63", "L", 01, 00 }, ;
                                  { "PERMISSA64", "L", 01, 00 }, ;
                                  { "PERMISSA65", "L", 01, 00 }, ;
                                  { "PERMISSA66", "L", 01, 00 }, ;
                                  { "PERMISSA67", "L", 01, 00 }, ;
                                  { "PERMISSA68", "L", 01, 00 }, ;
                                  { "PERMISSA69", "L", 01, 00 }, ;
                                  { "PERMISSA70", "L", 01, 00 }, ;
                                  { "PERMISSA71", "L", 01, 00 }, ;
                                  { "PERMISSA72", "L", 01, 00 }, ;
                                  { "PERMISSA73", "L", 01, 00 }, ;
                                  { "PERMISSA74", "L", 01, 00 }, ;
                                  { "PERMISSA75", "L", 01, 00 }, ;
                                  { "PERMISSA76", "L", 01, 00 }, ;
                                  { "PERMISSA77", "L", 01, 00 }, ;
                                  { "PERMISSA78", "L", 01, 00 }, ;
                                  { "PERMISSA79", "L", 01, 00 }, ;
                                  { "PERMISSA80", "L", 01, 00 }, ;
                                  { "PERMISSA81", "L", 01, 00 }, ;
                                  { "PERMISSA82", "L", 01, 00 }, ;
                                  { "PERMISSA83", "L", 01, 00 }, ;
                                  { "PERMISSA84", "L", 01, 00 }, ;
                                  { "PERMISSA85", "L", 01, 00 }, ;
                                  { "PERMISSA86", "L", 01, 00 }, ;
                                  { "PERMISSA87", "L", 01, 00 }, ;
                                  { "PERMISSA88", "L", 01, 00 }, ;
                                  { "PERMISSA89", "L", 01, 00 }, ;
                                  { "PERMISSA90", "L", 01, 00 }, ;
                                  { "PERMISSA91", "L", 01, 00 }, ;
                                  { "PERMISSA92", "L", 01, 00 }, ;
                                  { "PERMISSA93", "L", 01, 00 }, ;
                                  { "PERMISSA94", "L", 01, 00 }, ;
                                  { "PERMISSA95", "L", 01, 00 }, ;
                                  { "PERMISSA96", "L", 01, 00 }, ;
                                  { "PERMISSA97", "L", 01, 00 }, ;
                                  { "PERMISSA98", "L", 01, 00 }, ;
                                  { "PERMISSA99", "L", 01, 00 }, ;
                                  { "PERMISS100", "L", 01, 00 }, ;
                                  { "PERMISSAO",  "L", 01, 00 }, ;
                                  { "DATAENTRAD", "D", 08, 00 }, ;
                                  { "PODERES",    "L", 01, 00 } } )

      CLOSE DATABASE

   ENDIF

RETURN NIL

//-> FIM DO PROGRAMA
[code]
 

Abs.

 

Link to comment
Share on other sites

 

Valdir então não faça assim, crie uma tabela apenas com DOIS campos sendo:

ID CARACTER  TAMANHO: 2

CHECK CARACTER TAMANHO: 1

 

Desta forma a tabela terá apenas dois campos porem pra cada identificador (ID) terá um registro. Deixe como chave principal da tabela o ID. Pra saber se está com CHECK basta fazer um SEEK nesta tabela pelo ID e se existir vc verifica se o campo CHECK está preenchido. Se estiver preenchido ele está com o CHECK e se nao existir ou estiver em branco está SEM CHECK.

Não crie a tabela desta forma que está fazendo não, é muito mais complicado pra se manter assim. É minha dica.

 

 

Assim não teria que ter mais um campo então,um ID para o operador (Codigo do Usuario)? assim poderia checar o acesso para cada usuário.

ID_OP      Space(02)

ID_CHK,  Numeric 4     0

CHECK  Logical

 

 

Link to comment
Share on other sites

 

Assim não teria que ter mais um campo então,um ID para o operador (Codigo do Usuario)? assim poderia checar o acesso para cada usuário.

ID_OP      Space(02)

ID_CHK,  Numeric 4     0

CHECK  Logical

 

 

Sim, isso mesmo Theotokos. 

Criar campos desta maneira das tabelas (ACES01,ACES02,...,ACES99) ou (PERMISSA01,PERMISSA02,...,PERMISSA99) é uma falha de normatização e dificulta muito a manutenção.

Veja bem, isso não é uma critica ao programa pois quebrar normatização é parte do processo. Mas fica apenas uma observação pra vocês. Eu aconselho a criar uma tabela filho e resolver isso da forma indicada mas claro, cada um sabe a realidade do que precisa, eu mesmo já criei tabelas desta maneira (criando vários campos) e que era necessário assim mas tem que saber que isso é um erro.

Abraços

Link to comment
Share on other sites

Bom dia amigos...

Inicialmente, agradeço novamente as respostas.

Eduardo, após analisar a sua sugestão, fiquei com uma dúvida:

Imaginemos que tenhamos um BD ou Arquivo DBF com aproximadamente 100 usuários que acessam os módulos do Sistema de acordo com suas permissões.

Usuário 01 Pode Incluir e Alterar Registros na Tabela Clientes, más não pode Excluir e nem Extrair Relatórios

Usuário 02 Pode Alterar Registros, más não pode Incluir, Excluir e Extrair Relatórios

Usuário 03 Pode Extrair Relatórios restrito a impressão de Etiquetas, más não pode Incluir,Alterar,Excluir e Extrair  outros Relatórios

Usuário 05 Pode Incluir,Alterar,Excluir e Extrais todos os Relatórios...

e assim sucessivamente para cada Módulo do Sistema.

Se criarmos as Tabelas com apenas 3 campos, teríamos que percorrer toda a tabela, filtrada pelo ID do Código do Usuário. Certo ?

Neste caso, o consumo de recursos da Rede não seria maior justamente por ter que verificar cada ID de Acesso ?

Por outro lado, se criarmos várias Tabelas com um número limitado de 60 Campos e as vincularmos através de uma Join, não seria a mesma coisa ?

E no Caso dos Arquivos DBF, também não se aplicariam as mesmas regras ?

Obrigado pela aula.

 

Abraços

 

 

 

 

Link to comment
Share on other sites

Nesta questão de permissões eu faço assim

Um campo memo para cada usuario e apenas um flag composto de caracteres para todas as permissões, ex:

cada pipe é uma ação, e o conteudo um numero com regra de bites

0 - nào permitido
1 - Permissão direta depois de logado
2 - Permissão com senha
4 - Permissão com Digital
8 - Permissão com PenDrive privado
16 - Permissão com Certificado digital
32 - Permissão inclusão
64 - Permissão alteração
128 - Permissão Exclusão
256 - Permissão Visualização
512 - Permissão Relatorios
1024 - Permissão Copia
2048 - Permissão privada 

Flag

240|358

Cadastro de usuario  seria o primeiro fpipe
240 > 16,32,64,128

Cadastro de clientes seria o segundo pipe
358 > 2,4,32,64,256

 

Desta maneira vc pode controlar as permissões com um numero apenas.

Link to comment
Share on other sites

 

Bom dia amigos...

Inicialmente, agradeço novamente as respostas.

Eduardo, após analisar a sua sugestão, fiquei com uma dúvida:

Imaginemos que tenhamos um BD ou Arquivo DBF com aproximadamente 100 usuários que acessam os módulos do Sistema de acordo com suas permissões.

Usuário 01 Pode Incluir e Alterar Registros na Tabela Clientes, más não pode Excluir e nem Extrair Relatórios

Usuário 02 Pode Alterar Registros, más não pode Incluir, Excluir e Extrair Relatórios

Usuário 03 Pode Extrair Relatórios restrito a impressão de Etiquetas, más não pode Incluir,Alterar,Excluir e Extrair  outros Relatórios

Usuário 05 Pode Incluir,Alterar,Excluir e Extrais todos os Relatórios...

e assim sucessivamente para cada Módulo do Sistema.

Se criarmos as Tabelas com apenas 3 campos, teríamos que percorrer toda a tabela, filtrada pelo ID do Código do Usuário. Certo ?

Neste caso, o consumo de recursos da Rede não seria maior justamente por ter que verificar cada ID de Acesso ?

Por outro lado, se criarmos várias Tabelas com um número limitado de 60 Campos e as vincularmos através de uma Join, não seria a mesma coisa ?

E no Caso dos Arquivos DBF, também não se aplicariam as mesmas regras ?

Obrigado pela aula.

 

Abraços

 

 

 

 

Não Valdir, não precisa percorrer a tabela toda...

 

Crie um indice USUARIO + ID e pra saber a permissão de determinado usuário para determinado ID vc apenas da um SEEK

A sugestão do Giovany também é boa também. 

Em meus programas faço da forma como descrevi pra vc, nunca tive problemas.

 

Link to comment
Share on other sites

Aqui na Decla e também o Evandro na Skill, fazemos da seguinte forma:

Criamos uma tabela chamada perfil, onde o cara apenas coloca o nome deste perfil e atribuimos um ID pra ele.

Depois criamos a tabela acessos, onde temos em um array todas as opções do sistema onde podem ser acessadas (inclusive determinados botões) vinculadas a este perfil.

Daí relacionamos o perfil ao usuário, e temos uma função que verifica se o perfil daquele usuário pode operar naquela opção escolhida. Com isso, o menu/botão fica congelado caso o usuário não possa ter acesso.

Temos que usar assim até porque o sistema tem mais de 1.000 opções, imagina colocar um campo pra cada opção.

 

Um abraço,

Alexandre Pereira

Link to comment
Share on other sites

  • 5 weeks later...

Bom dia Sr. emotta,

Tenho controle de Acessos em meus Sistemas e sua estrutura é CodSIs, CodUser, CodProg e CodPar. Todo o Controle de Acessos é formado por um Programa que monta um Árvore dos Menus do um Sistema, onde tudo é mostrado ao Usuário que vai Controlar os Acessos através de Browses estruturados como se fosse o TREE. 

Link to comment
Share on other sites

3 horas atrás, informax disse:

Bom dia Sr. emotta,

Tenho controle de Acessos em meus Sistemas e sua estrutura é CodSIs, CodUser, CodProg e CodPar. Todo o Controle de Acessos é formado por um Programa que monta um Árvore dos Menus do um Sistema, onde tudo é mostrado ao Usuário que vai Controlar os Acessos através de Browses estruturados como se fosse o TREE. 

exatamente... tenho uma estrutura semelhante tb

Link to comment
Share on other sites

Me Desculpe, mas não consigo entender porque tem que criar tantos campos.

Se puder me explicar talvez possa lhe ajudar. Trabalho há quase 30 anos com Sistemas de Engenharia e desenvolvo muitas Árvores, bem como, Explosões de  Estruturas e apesar de serem Muito Grandes, exigem pouquíssimos campos. Me explique o que exatamente você precisa e tentarei lhe ajudar. Meu fone é 11 4563-2047, talvez seja mais interessante para que eu entenda e depois de resolvido postarei no Fórum para que não fique Oculta a Solução.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...