Valdir Posted May 12, 2020 Report Share Posted May 12, 2020 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 13, 2020 Report Share Posted May 13, 2020 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. Valdir 1 Quote Link to comment Share on other sites More sharing options...
emotta Posted May 13, 2020 Report Share Posted May 13, 2020 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. Valdir 1 Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 14, 2020 Author Report Share Posted May 14, 2020 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. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 14, 2020 Report Share Posted May 14, 2020 Não seria melhor usar LOGICAL? Quote Link to comment Share on other sites More sharing options...
emotta Posted May 14, 2020 Report Share Posted May 14, 2020 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. Valdir and Theotokos 2 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted May 14, 2020 Report Share Posted May 14, 2020 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. Quote Link to comment Share on other sites More sharing options...
Theotokos Posted May 14, 2020 Report Share Posted May 14, 2020 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 Quote Link to comment Share on other sites More sharing options...
emotta Posted May 14, 2020 Report Share Posted May 14, 2020 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 Theotokos 1 Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 15, 2020 Author Report Share Posted May 15, 2020 Amigos... Obrigado pelas respostas. No momento estou fora, devendo retornar na próxima Segunda feira. Irei estudar as opções. Valeu. Abraços. Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 18, 2020 Author Report Share Posted May 18, 2020 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 Quote Link to comment Share on other sites More sharing options...
giovanyvecchi Posted May 18, 2020 Report Share Posted May 18, 2020 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted May 18, 2020 Report Share Posted May 18, 2020 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. Valdir 1 Quote Link to comment Share on other sites More sharing options...
Valdir Posted May 19, 2020 Author Report Share Posted May 19, 2020 Caríssimos amigos... Obrigado pelas Respostas. Eduardo... perfeito. Valeu. Abraços. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted May 25, 2020 Report Share Posted May 25, 2020 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 Valdir 1 Quote Link to comment Share on other sites More sharing options...
informax Posted June 24, 2020 Report Share Posted June 24, 2020 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. Quote Link to comment Share on other sites More sharing options...
emotta Posted June 24, 2020 Report Share Posted June 24, 2020 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 Quote Link to comment Share on other sites More sharing options...
informax Posted June 24, 2020 Report Share Posted June 24, 2020 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.