MODELAGEM DOS DADOS
Oi!!!!!!
Sem querer discordar das maravilhosas ajudas aqui obtidas, das dicas que me salvaram do inferno de Dante e das gargalhadas nascidas de boas situações vividas neste fórum, estou com este pequeno texto para analise de vocês...
Deixem-me explicar o “causoâ€ÂÂÂ
Sou programador a 20 anos e só de DOS tenho quase 18 anos.
Tenho TODOS os sistemas (comercial, farmácia, industria, contabilidade, posto de gasolina, etc) em DOS e a dois anos estou migrando para o VB.
Sou especialista em linguagens dinossáuricas (pascal, assembler, cobol, qbasic, gwbasic e turbo basic) e naquela prisca época, utilizávamos mais o cérebro para programar e varias centenas de linhas para obter um quadradinho piscando no meio da tela. Ate estranho hoje quando revejo minhas anotações em COBOL e rotinas em ASSEMBLER... mas por conta disso, eu criei em minha mente uma lógica estranha, sombria e confusa, hehehehehehehe... que me permitiu migrar para o VB e aqui desenvolver rotinas extensas que so depois de prontas eu descobri que já existiam em funções nativas do próprio vb!!!!!! Ate criei uma forma de se proteger o soft contra pirataria que faz com q o sistema só rode no hd em que foi instalado... (estou estudando a possibilidade de revisar o código (para não ficar igual ao meu e algum engraçadinho que ler isso no forum quebrar minha segurança) e repassar para os usuarios do VBMANIA.)
Já escutei um monte, me falando que o VB estava morrendo, que eu escolhi errado a linguagem (deveria ser o delphi), que deveria começar logo em VB.NET, etc.
Já migrei as aplicações contábeis e elas estão funcionando muito bem obrigado. Agora estou migrando a gestão comercial e estou tendo alguns problemas.
Esta dando um erro chamado RECORD TOO LONG
Ao apresentar meu problema no fórum, fui informado que minha normalização dos banco de dados estava errada. Após ler TODOS os artigos do site sobre banco de dados, cheguei a conclusão que talvez não seja este o caso.
-Estou usando o VB6, com service pack 5, rodando no windows 98
-As bases de dados são em access 2000 (*.mdb)
-Utilizo DAO e data control objects
-para cada cadastro (fornecedor, produtos, clientes, etc( existe um arquivo .MDB independente
-todos os campos de todos as tabelas são em formato texto, dentro do soft tem funções que trabalham mascaras, formatos, decimais e etc na hora em que se retira o foco do campo na tela (lost focus). Ou seja: meus MDB armazenam APENAS campos textos que já vão para o BD formatados e prontos...
- na hora de ler ou gravar as informações no BD, o sistema marca um campo especifico no cadastro e esta marca impede que ele seja alterado enquanto o registro esta sendo consultado por outroi usuário na rede.
-nenhum dos objetos dos formulários (tela) esta ligado ao data control (exceto o dbgrid), isso faz com que os dados seja jogados nos campos da tela e passados de lá para o bd através de funções que eu criei
-em testes, com 23 maquinas acessando a mesma base de dados em um servidor dedicado e efetuando consultas e alterações variadas, o BD se comportou muito bem obrigado devido a uma rotina criada dentro de cada sub de envio/recebimento de dados textbox/campos_tabela que impede o “crash†no trafego dos dados.
Public Sub MandaProdutoArquivo(formulario)
10 On Error GoTo MandaProdutoArquivo_Error
20 formulario!DtProduto.Recordset.Fields("nome") = UCase(formulario!TxProNom.Text)
30 formulario!DtProduto.Recordset.Fields("redução") = UCase(formulario!TxProRed.Text)
40 formulario!DtProduto.Recordset.Fields("descrição") = UCase(formulario!TxProDes.Text)
50 formulario!DtProduto.Recordset.Fields("código") = UCase(formulario!TxProCod.Text)
60 formulario!DtProduto.Recordset.Fields("origem") = UCase(formulario!TxProOri.Text)
70 formulario!DtProduto.Recordset.Fields("utilização") = UCase(formulario!TxProUti.Text)
80 SavePicture formulario!TxProFoto, DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\Produtos" + formulario!TxProCod + ".jpg"
90 On Error GoTo 0
100 Exit Sub
MandaProdutoArquivo_Error:
110 MsgBox "Ocorreu um Erro de número " & Err.Number & " (" & Err.Description & ") na linha " & Erl & " do(a) Sub MandaProdutoArquivo inserido no(a) Módulo MandaProdutoArquivo_ em Controle_Comercial," & Time & "," & Date & "," & NomeUsuario & ",Máquina " & MaquinaEstacao & ",Empresa " & Vnomefantasia & ",Drive " & DriveTrabalho
120 Call LogarErros("Ocorreu um Erro de número " + Str(Err.Number) + " (" + Err.Description + ") na linha " + Str(Erl) + " do(a) Sub MandaProdutoArquivo inserido no(a) Módulo MandaProdutoArquivo_ em Controle_Comercial," + Str(Time) + "," + Str(Date) + "," + NomeUsuario + ",Máquina " + Str(MaquinaEstacao) + "," + Vnomefantasia + "," + DriveTrabalho)
End Sub
Public Sub PegaProdutoArquivo(formulario)
10 On Error GoTo PegaProdutoArquivo_Error
20 formulario!TxProNom.Text = UCase(formulario!DtProduto.Recordset.Fields("nome"))
30 formulario!TxProRed.Text = UCase(formulario!DtProduto.Recordset.Fields("redução"))
40 formulario!TxProDes.Text = UCase(formulario!DtProduto.Recordset.Fields("descrição"))
50 formulario!TxProCod.Text = UCase(formulario!DtProduto.Recordset.Fields("código"))
60 formulario!TxProOri.Text = UCase(formulario!DtProduto.Recordset.Fields("origem"))
70 afff = ContarArquivos(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\", "Produtos" + formulario!TxProCod + ".jpg")
80 If afff = 1 Then
90 formulario!TxProFoto.Picture = LoadPicture(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\Produtos" + formulario!TxProCod + ".jpg")
100 Else
110 formulario!TxProFoto.Picture = LoadPicture(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\sem_foto.jpg")
120 End If
130 On Error GoTo 0
140 Exit Sub
PegaProdutoArquivo_Error:
150 If Err.Number = 3021 Then MsgBox "Este banco de dados ainda está vazio": formulario!BtGra.Enabled = False: formulario!BtDel.Enabled = False: formulario!BtLis.Enabled = False: formulario!BtEst.Enabled = False: formulario!DBGrid1.Visible = False: formulario!LabelBusca.Visible = False: formulario!TxNomeConsulta.Visible = False: formulario!BuscaAvancada.Visible = False: formulario!LabelCodigo.Visible = False: formulario!BuscaPorCodigo.Visible = False: formulario!TxBuscaPorCodigo.Visible = False: Exit Sub
160 MsgBox "Ocorreu um Erro de número " & Err.Number & " (" & Err.Description & ") na linha " & Erl & " do(a) Sub PegaProdutoArquivo inserido no(a) Módulo PegaProdutoArquivo_ em Controle_Comercial," & Time & "," & Date & "," & NomeUsuario & ",Máquina " & MaquinaEstacao & ",Empresa " & Vnomefantasia & ",Drive " & DriveTrabalho
170 Call LogarErros("Ocorreu um Erro de número " + Str(Err.Number) + " (" + Err.Description + ") na linha " + Str(Erl) + " do(a) Sub PegaProdutoArquivo inserido no(a) Módulo PegaProdutoArquivo_ em Controle_Comercial," + Str(Time) + "," + Str(Date) + "," + NomeUsuario + ",Máquina " + Str(MaquinaEstacao) + "," + Vnomefantasia + "," + DriveTrabalho)
End Sub
Me foi exposto uns troços meio estranhos, mas com fundamento.
00.os nomes dos campos das tabelas não devem ter espaços e caracteres nacionais, isso eu já estou mudando.. realmente notei que o findfirst não aceita a busca de um campo que contenha espaços em seu nome...
01.uma tabela não deveria ter mais que 1/3 dos campo como Ãndices (até ai tudo bem, no Maximo vou utilizar 4 ou cinco campos como Ãndices em tabelas que tem no mÃnimo 35 campos)
02.Uma tabela não deveria ter mais de 15 campos, pois isso deixava o tamanho do RECORD muito longo... isso é no mÃnimo estranho, para não dizer ridÃculo!!! Que tipo de cadastro se usa no VB??? Uma ficha de clientes apenas com 15 campos???? Isso é MUITO ridÃculo!!!! Em meu sistema, a ficha de clientes tem APENAS 71 campo, isso sem falar na ficha de produtos que tem APENAS 128 campos.
Não sei que tipo de empresas estão sendo informatizadas com o vb que só tem no Maximo 15 campos por ficha de cliente, produto, etc. seria uma barraca de cachorro quente??? Hehehehehehe...
Brincadeiras a parte... queria saber a quantidade máxima de campos por tabela... no caso da ficha do produto eu poderia dividir a ficha financeira (dados de constituição do preço do produto) em uma tabela, a ficha de constituição do produto(nos casos do produto ser produzido dentro da empresa) em outra tabela, os dados das ultimas compras e ultimas vendas em outra tabela e por ai vai... nos outros cadastros do sistema, eu também poderia dividir em varias tabelas, pois cada cadastro tem um MDB separado e independente.
Seria uma solução???
03.outra coisa que me foi dito, eu teria que relacionar tabelas para evitar redundà ¢ncias.... ISSO EU DISCORDO VEEMENTEMENTE!!!! Explico: tenho vários cadastros(tabelas) que são independente uns dos outros e outros cadastro que pegam informações de outros. Exemplo:
no cadastro de marcas, existem 40 campos onde com dois cliques, ele abre um outro form com a listagem de todos os fornecedores, ao escolher um deles, o campo onde eu cliquei 2 vezes é preenchido com a seguinte iNformação:â€ÂÂÂ0000000087-TRAMONTINA DO BRASIL SAâ€ÂÂÂ, este campo não permite mudanças a não ser clicando 2 vezes nele e exibindo a lista dos fornecedores cadastros e escolhendo um deles. Conclusão: qualquer referencia de consultas, listagens e etc, eu vou utilizar o CÓ“DIGO que esta no campo... qualquer mudança que eu fizer no cadastro de fornecedores, não vai implicar em NADA no cadastro de marcas, pois o sistema vai se basear APENAS no código para relacionar os dados entres as tabelas distintas que estão em arquivos MDB diferentes. Isso também se aplica na tabela de clientes que se comunica com a tabela de vendedores e convênios, com a tabela de produtos que se comunica com a tabela de marcas e setores, etc.
Foi baseado neste fatos que discordei da questão da NORMALIZAÇÃO dos bancos de dados... o que eu preciso, devo e vou fazer, é deixar de usar DAO e partir para o ADO e usar aqueles comandos estranho tipo “set db create from selecte #$%$$#%$#%$# % $ iuhfiuh3 4rffy74f wkjshkjdf hhhdhgdfh gjkhdfjklg hsdfk478yf78y†alem de começar a ler sobre SQL pq agora que finalmente depois de velho, ancião e acabado (35 anos para quem passou mais da metade da vida na frente de um micro , sem fazer exercÃcios, apenas levando uma vida sedentária regada a cigarros, coca-cola, cerveja e café, varando as madrugadas... isso te deixa com 35 de idade e corpinho de 58!!!) uma empresa distribuidora de soft (uma soft house) descobriu-me e acertamos que eu iria passar meus sistemas para o windows e eles iriam distribuir a bagaça pelo pais todo... e aqui estou eu!!!!!
para terem uma vaga idéia do tamanho e da quantidade de campos envolvidos num sistema comercial EFICIENTE, pus aqui uma lista com os principais cadastros e seus respectivos campos, acompanhados do tamanho de cada um. Vejam que é impossÃvel fazer um cadastro apenas 15 campos... quanto ao tamanho final dos MDB??? Ora... os servidores de hoje trabalham com hd de 500 giga, 2 tera, etc... dá para explorar estes recursos... concordam??? Ou existem uma barreira para tamanhos de arquivos também??? Se existir, eu juro que volto para o MS-DOS e o cobol e o turbo basic... tenho sistemas rodando hoje em empresas agregadas a OAS e a VOTORANTIM que tem mais de 7.000.000 (sete milhões) de registros, distribuÃdos em milhares de arquivos diferentes, locados em centenas de diretórios diferentes, tudo rodando no DOS... e rapidinho!!!!
posso ate ter 500 tabelas com 15 campos cada uma, mas acho q isso vai onerar o sistema. Estarei errado??? Eram os deus astronautas???
Arquivo: vendedores.mdb
Tabela : vendedores
à Ândices: código, nome, cpf
Código 10
Nome 60
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Banco (Nome.) 40
Banco (Número.) 10
Agência (Nome.) 40
Agência (Número.) 10
Número da conta 20
Comissão a vista 10
Comissão a prazo 10
Comissão após Recebimento 10
Lembrete 250
Arquivo: fornecedores.mdb
Tabela : fornecedores
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Vendedor_01 60
Fone do vendedor_01 20
Vendedor_02 60
Fone do vendedor_02 20
Vendedor_03 60
Fone do vendedor_03 20
Vendedor_04 60
Fone do vendedor_04 20
Lembrete 250
Arquivo: convenios.mdb
Tabela : convenios
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: marcas.mdb
Tabela : marcas
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Lembrete 250
Fornecedor01(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor02(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor03(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor04(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor05(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor06(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor07(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor08(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor09(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor10(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor11(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor12(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor13(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor14(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor15(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor16(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor17(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor18(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor19(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor20(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor21(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor22(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor23(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor24(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor25(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor26(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor27(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor28(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor29(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor30(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor31(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor32(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor33(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor34(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor35(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor36(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor38(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor39(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor40(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Arquivo: clientes.mdb
Tabela : clientes
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
à Ârea 20
Tipo de cliente 1
MunicÃpio 40
UF 2
CEP 10
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Nome do pai 40
Nome da mãe 40
Limite de crédito 15
Crédito utilizado 15
Crédito disponÃvel 15
E-Mail 60
Home-Page 60
Vendedor (código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Lembrete 250
Referência_01 60
Fone referência_01 20
Referência_02 60
Fone referência_02 20
Referência_03 60
Fone referência_03 20
Nome do banco-01 40
Numero do Banco-01 10
Nome da agencia-01 40
Numero da agencia-01 10
Numero da conta-01 20
Cliente desde-01 10
Nome do banco-02 40
Numero do Banco-02 10
Nome da agencia-02 40
Numero da agencia-02 10
Numero da conta-02 20
Cliente desde-02 10
Nome do banco-03 40
Numero do Banco-03 10
Nome da agencia-03 40
Numero da agencia-03 10
Numero da conta-03 20
Cliente desde-03 10
Empresa conveniada (código+nome, vai buscar na tabela convenio e comunicasse pelo código) 60
Situação do convênio 1
Tipo de convênio 1
Limite de crédito 15
Crédito Utilizado 15
Crédito disponÃvel 15
Tipo de cliente 30
Não pode comprar na loja 1
Não pode comprar a vista com cheque, em carteira, com duplicata, com promissórias ou carnê 1
Não pode comprar a prazo 1
Não pode comprar através de terceiros 1
Não permite repassar dados a terceiros 1
Não permite receber correspondência 1
Não pode emprestar equipamentos 1
Não pode alugar equipamentos 1
Motivo das restrições 250
Arquivo: setores.mdb
Tabela : setores
à Ândices: código, nome do setor
Código 10
Nome do setor 40
Ligado ao setor 40
Lembrete 250
Vendedor01(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor02(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor03(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor04(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor05(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor06(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor07(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor08(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor09(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor10(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor11(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor12(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor13(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor14(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor15(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor16(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor17(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor18(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor19(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor20(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor21(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor22(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor23(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor24(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor25(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor26(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor27(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor28(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor29(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor30(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor31(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor32(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor33(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor34(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor35(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor36(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor38(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor39(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor40(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor41(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor42(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor43(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor44(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor45(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor46(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor47(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor48(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor49(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor50(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor51(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor52(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor53(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor54(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor55(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor56(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor57(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor58(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor59(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor60(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Arquivo: transportadoras.mdb
Tabela : transportadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: prestadoras.mdb
Tabela : prestadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: prestadoras.mdb
Tabela : prestadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome do Produto 60
Nome do produto reduzido 30
Descrição do produto 200
Setor (Código+nome, vai buscar na tabela setores e comunicasse pelo código) 60
marca (Código+nome, vai buscar na tabela marcas e comunicasse pelo código) 60
Preço de custo básico 15
IPI percentual 10
IPI valor 15
embalagem percentual 10
embalagem valor 15
frete percentual 10
frete valor 15
icms percentual 10
icms valor 15
outros percentual 10
outros valor 15
subtotal valor 15
icms fisica percentual 10
icms fisica valor 15
icms juridica percentual 10
icms juridica valor 15
pis percentual 10
pis valor 15
cofins percentual 10
cofins valor 15
contribuição social percentual 10
contribuição social valor 15
comisao percentual 10
comissao valor 15
outros percentual 10
outros valor 15
preço de custo real valor 15
margem de lucro percentual 10
margem de lucro valor 15
reajuste percentual 10
reajuste valor 15
arredondamento valor 15
preço de venda 15
preço de venda mÃnimo 15
promoção 3
promoção percentual 10
promocao valor 15
Estoque MÃnimo 10
Estoque Atual 10
Data de cadastro 10
Codificação Fiscal 10
Situação Tributária 10
Código de Barras 40
Lembrete 250
Data da última compra 10
Quantidade da última compra 10
Fornecedor da última compra 60
Número do pedido da última compra 20
Número da Nota Fiscal da última compra 20
Quantida_produto_01 10
Código+nome_produ_01 60
Quantida_produto_02 10
Código+nome_produ_02 60
Quantida_produto_03 10
Código+nome_produ_03 60
Quantida_produto_04 10
Código+nome_produ_04 60
Quantida_produto_05 10
Código+nome_produ_05 60
Quantida_produto_06 10
Código+nome_produ_06 60
Quantida_produto_07 10
Código+nome_produ_07 60
Quantida_produto_08 10
Código+nome_produ_08 60
Quantida_produto_09 10
Código+nome_produ_09 60
Quantida_produto_10 10
Código+nome_produ_10 60
Quantida_produto_11 10
Código+nome_produ_11 60
Quantida_produto_12 10
Código+nome_produ_12 60
Quantida_produto_13 10
Código+nome_produ_13 60
Quantida_produto_14 10
Código+nome_produ_14 60
Quantida_produto_15 10
Código+nome_produ_15 60
Quantida_produto_16 10
Código+nome_produ_16 60
Quantida_produto_17 10
Código+nome_produ_17 60
Quantida_produto_18 10
Código+nome_produ_18 60
Quantida_produto_19 10
Código+nome_produ_19 60
Quantida_produto_20 10
Código+nome_produ_20 60
Quantida_produto_21 10
Código+nome_produ_21 60
Quantida_produto_22 10
Código+nome_produ_22 60
Quantida_produto_23 10
Código+nome_produ_23 60
Quantida_produto_24 10
Código+nome_produ_24 60
Quantida_produto_25 10
Código+nome_produ_25 60
Quantida_produto_26 10
Código+nome_produ_26 60
Quantida_produto_27 10
Código+nome_produ_27 60
Quantida_produto_28 10
Código+nome_produ_28 60
Quantida_produto_29 10
Código+nome_produ_29 60
Quantida_produto_30 10
Código+nome_produ_30 60
Quantida_produto_31 10
Código+nome_produ_31 60
Quantida_produto_32 10
Código+nome_produ_32 60
Quantida_produto_33 10
Código+nome_produ_33 60
Quantida_produto_34 10
Código+nome_produ_34 60
Quantida_produto_35 10
Código+nome_produ_35 60
Quantida_produto_36 10
Código+nome_produ_36 60
Quantida_produto_37 10
Código+nome_produ_37 60
Quantida_produto_38 10
Código+nome_produ_38 60
Quantida_produto_39 10
Código+nome_produ_39 60
Quantida_produto_40 10
Código+nome_produ_40 60
Quantida_produto_41 10
Código+nome_produ_41 60
Quantida_produto_42 10
Código+nome_produ_42 60
Quantida_produto_43 10
Código+nome_produ_43 60
Quantida_produto_44 10
Código+nome_produ_44 60
Origem 30
Referência 20
Tamanho 20
Tipo de embalagem 20
Estado de conservação 20
Data de Fabricação 10
Data de Validade 10
Utilização 20
cor 20
Unidade para venda 20
Unidade para confecção 20
Quantidade por embalagem 20
Sem querer discordar das maravilhosas ajudas aqui obtidas, das dicas que me salvaram do inferno de Dante e das gargalhadas nascidas de boas situações vividas neste fórum, estou com este pequeno texto para analise de vocês...
Deixem-me explicar o “causoâ€ÂÂÂ
Sou programador a 20 anos e só de DOS tenho quase 18 anos.
Tenho TODOS os sistemas (comercial, farmácia, industria, contabilidade, posto de gasolina, etc) em DOS e a dois anos estou migrando para o VB.
Sou especialista em linguagens dinossáuricas (pascal, assembler, cobol, qbasic, gwbasic e turbo basic) e naquela prisca época, utilizávamos mais o cérebro para programar e varias centenas de linhas para obter um quadradinho piscando no meio da tela. Ate estranho hoje quando revejo minhas anotações em COBOL e rotinas em ASSEMBLER... mas por conta disso, eu criei em minha mente uma lógica estranha, sombria e confusa, hehehehehehehe... que me permitiu migrar para o VB e aqui desenvolver rotinas extensas que so depois de prontas eu descobri que já existiam em funções nativas do próprio vb!!!!!! Ate criei uma forma de se proteger o soft contra pirataria que faz com q o sistema só rode no hd em que foi instalado... (estou estudando a possibilidade de revisar o código (para não ficar igual ao meu e algum engraçadinho que ler isso no forum quebrar minha segurança) e repassar para os usuarios do VBMANIA.)
Já escutei um monte, me falando que o VB estava morrendo, que eu escolhi errado a linguagem (deveria ser o delphi), que deveria começar logo em VB.NET, etc.
Já migrei as aplicações contábeis e elas estão funcionando muito bem obrigado. Agora estou migrando a gestão comercial e estou tendo alguns problemas.
Esta dando um erro chamado RECORD TOO LONG
Ao apresentar meu problema no fórum, fui informado que minha normalização dos banco de dados estava errada. Após ler TODOS os artigos do site sobre banco de dados, cheguei a conclusão que talvez não seja este o caso.
-Estou usando o VB6, com service pack 5, rodando no windows 98
-As bases de dados são em access 2000 (*.mdb)
-Utilizo DAO e data control objects
-para cada cadastro (fornecedor, produtos, clientes, etc( existe um arquivo .MDB independente
-todos os campos de todos as tabelas são em formato texto, dentro do soft tem funções que trabalham mascaras, formatos, decimais e etc na hora em que se retira o foco do campo na tela (lost focus). Ou seja: meus MDB armazenam APENAS campos textos que já vão para o BD formatados e prontos...
- na hora de ler ou gravar as informações no BD, o sistema marca um campo especifico no cadastro e esta marca impede que ele seja alterado enquanto o registro esta sendo consultado por outroi usuário na rede.
-nenhum dos objetos dos formulários (tela) esta ligado ao data control (exceto o dbgrid), isso faz com que os dados seja jogados nos campos da tela e passados de lá para o bd através de funções que eu criei
-em testes, com 23 maquinas acessando a mesma base de dados em um servidor dedicado e efetuando consultas e alterações variadas, o BD se comportou muito bem obrigado devido a uma rotina criada dentro de cada sub de envio/recebimento de dados textbox/campos_tabela que impede o “crash†no trafego dos dados.
Public Sub MandaProdutoArquivo(formulario)
10 On Error GoTo MandaProdutoArquivo_Error
20 formulario!DtProduto.Recordset.Fields("nome") = UCase(formulario!TxProNom.Text)
30 formulario!DtProduto.Recordset.Fields("redução") = UCase(formulario!TxProRed.Text)
40 formulario!DtProduto.Recordset.Fields("descrição") = UCase(formulario!TxProDes.Text)
50 formulario!DtProduto.Recordset.Fields("código") = UCase(formulario!TxProCod.Text)
60 formulario!DtProduto.Recordset.Fields("origem") = UCase(formulario!TxProOri.Text)
70 formulario!DtProduto.Recordset.Fields("utilização") = UCase(formulario!TxProUti.Text)
80 SavePicture formulario!TxProFoto, DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\Produtos" + formulario!TxProCod + ".jpg"
90 On Error GoTo 0
100 Exit Sub
MandaProdutoArquivo_Error:
110 MsgBox "Ocorreu um Erro de número " & Err.Number & " (" & Err.Description & ") na linha " & Erl & " do(a) Sub MandaProdutoArquivo inserido no(a) Módulo MandaProdutoArquivo_ em Controle_Comercial," & Time & "," & Date & "," & NomeUsuario & ",Máquina " & MaquinaEstacao & ",Empresa " & Vnomefantasia & ",Drive " & DriveTrabalho
120 Call LogarErros("Ocorreu um Erro de número " + Str(Err.Number) + " (" + Err.Description + ") na linha " + Str(Erl) + " do(a) Sub MandaProdutoArquivo inserido no(a) Módulo MandaProdutoArquivo_ em Controle_Comercial," + Str(Time) + "," + Str(Date) + "," + NomeUsuario + ",Máquina " + Str(MaquinaEstacao) + "," + Vnomefantasia + "," + DriveTrabalho)
End Sub
Public Sub PegaProdutoArquivo(formulario)
10 On Error GoTo PegaProdutoArquivo_Error
20 formulario!TxProNom.Text = UCase(formulario!DtProduto.Recordset.Fields("nome"))
30 formulario!TxProRed.Text = UCase(formulario!DtProduto.Recordset.Fields("redução"))
40 formulario!TxProDes.Text = UCase(formulario!DtProduto.Recordset.Fields("descrição"))
50 formulario!TxProCod.Text = UCase(formulario!DtProduto.Recordset.Fields("código"))
60 formulario!TxProOri.Text = UCase(formulario!DtProduto.Recordset.Fields("origem"))
70 afff = ContarArquivos(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\", "Produtos" + formulario!TxProCod + ".jpg")
80 If afff = 1 Then
90 formulario!TxProFoto.Picture = LoadPicture(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\" + Viniciais + "\fotos\Produtos" + formulario!TxProCod + ".jpg")
100 Else
110 formulario!TxProFoto.Picture = LoadPicture(DriveTrabalho + "\Arquivos de programas\Down_Ups\dados\sem_foto.jpg")
120 End If
130 On Error GoTo 0
140 Exit Sub
PegaProdutoArquivo_Error:
150 If Err.Number = 3021 Then MsgBox "Este banco de dados ainda está vazio": formulario!BtGra.Enabled = False: formulario!BtDel.Enabled = False: formulario!BtLis.Enabled = False: formulario!BtEst.Enabled = False: formulario!DBGrid1.Visible = False: formulario!LabelBusca.Visible = False: formulario!TxNomeConsulta.Visible = False: formulario!BuscaAvancada.Visible = False: formulario!LabelCodigo.Visible = False: formulario!BuscaPorCodigo.Visible = False: formulario!TxBuscaPorCodigo.Visible = False: Exit Sub
160 MsgBox "Ocorreu um Erro de número " & Err.Number & " (" & Err.Description & ") na linha " & Erl & " do(a) Sub PegaProdutoArquivo inserido no(a) Módulo PegaProdutoArquivo_ em Controle_Comercial," & Time & "," & Date & "," & NomeUsuario & ",Máquina " & MaquinaEstacao & ",Empresa " & Vnomefantasia & ",Drive " & DriveTrabalho
170 Call LogarErros("Ocorreu um Erro de número " + Str(Err.Number) + " (" + Err.Description + ") na linha " + Str(Erl) + " do(a) Sub PegaProdutoArquivo inserido no(a) Módulo PegaProdutoArquivo_ em Controle_Comercial," + Str(Time) + "," + Str(Date) + "," + NomeUsuario + ",Máquina " + Str(MaquinaEstacao) + "," + Vnomefantasia + "," + DriveTrabalho)
End Sub
Me foi exposto uns troços meio estranhos, mas com fundamento.
00.os nomes dos campos das tabelas não devem ter espaços e caracteres nacionais, isso eu já estou mudando.. realmente notei que o findfirst não aceita a busca de um campo que contenha espaços em seu nome...
01.uma tabela não deveria ter mais que 1/3 dos campo como Ãndices (até ai tudo bem, no Maximo vou utilizar 4 ou cinco campos como Ãndices em tabelas que tem no mÃnimo 35 campos)
02.Uma tabela não deveria ter mais de 15 campos, pois isso deixava o tamanho do RECORD muito longo... isso é no mÃnimo estranho, para não dizer ridÃculo!!! Que tipo de cadastro se usa no VB??? Uma ficha de clientes apenas com 15 campos???? Isso é MUITO ridÃculo!!!! Em meu sistema, a ficha de clientes tem APENAS 71 campo, isso sem falar na ficha de produtos que tem APENAS 128 campos.
Não sei que tipo de empresas estão sendo informatizadas com o vb que só tem no Maximo 15 campos por ficha de cliente, produto, etc. seria uma barraca de cachorro quente??? Hehehehehehe...
Brincadeiras a parte... queria saber a quantidade máxima de campos por tabela... no caso da ficha do produto eu poderia dividir a ficha financeira (dados de constituição do preço do produto) em uma tabela, a ficha de constituição do produto(nos casos do produto ser produzido dentro da empresa) em outra tabela, os dados das ultimas compras e ultimas vendas em outra tabela e por ai vai... nos outros cadastros do sistema, eu também poderia dividir em varias tabelas, pois cada cadastro tem um MDB separado e independente.
Seria uma solução???
03.outra coisa que me foi dito, eu teria que relacionar tabelas para evitar redundà ¢ncias.... ISSO EU DISCORDO VEEMENTEMENTE!!!! Explico: tenho vários cadastros(tabelas) que são independente uns dos outros e outros cadastro que pegam informações de outros. Exemplo:
no cadastro de marcas, existem 40 campos onde com dois cliques, ele abre um outro form com a listagem de todos os fornecedores, ao escolher um deles, o campo onde eu cliquei 2 vezes é preenchido com a seguinte iNformação:â€ÂÂÂ0000000087-TRAMONTINA DO BRASIL SAâ€ÂÂÂ, este campo não permite mudanças a não ser clicando 2 vezes nele e exibindo a lista dos fornecedores cadastros e escolhendo um deles. Conclusão: qualquer referencia de consultas, listagens e etc, eu vou utilizar o CÓ“DIGO que esta no campo... qualquer mudança que eu fizer no cadastro de fornecedores, não vai implicar em NADA no cadastro de marcas, pois o sistema vai se basear APENAS no código para relacionar os dados entres as tabelas distintas que estão em arquivos MDB diferentes. Isso também se aplica na tabela de clientes que se comunica com a tabela de vendedores e convênios, com a tabela de produtos que se comunica com a tabela de marcas e setores, etc.
Foi baseado neste fatos que discordei da questão da NORMALIZAÇÃO dos bancos de dados... o que eu preciso, devo e vou fazer, é deixar de usar DAO e partir para o ADO e usar aqueles comandos estranho tipo “set db create from selecte #$%$$#%$#%$# % $ iuhfiuh3 4rffy74f wkjshkjdf hhhdhgdfh gjkhdfjklg hsdfk478yf78y†alem de começar a ler sobre SQL pq agora que finalmente depois de velho, ancião e acabado (35 anos para quem passou mais da metade da vida na frente de um micro , sem fazer exercÃcios, apenas levando uma vida sedentária regada a cigarros, coca-cola, cerveja e café, varando as madrugadas... isso te deixa com 35 de idade e corpinho de 58!!!) uma empresa distribuidora de soft (uma soft house) descobriu-me e acertamos que eu iria passar meus sistemas para o windows e eles iriam distribuir a bagaça pelo pais todo... e aqui estou eu!!!!!
para terem uma vaga idéia do tamanho e da quantidade de campos envolvidos num sistema comercial EFICIENTE, pus aqui uma lista com os principais cadastros e seus respectivos campos, acompanhados do tamanho de cada um. Vejam que é impossÃvel fazer um cadastro apenas 15 campos... quanto ao tamanho final dos MDB??? Ora... os servidores de hoje trabalham com hd de 500 giga, 2 tera, etc... dá para explorar estes recursos... concordam??? Ou existem uma barreira para tamanhos de arquivos também??? Se existir, eu juro que volto para o MS-DOS e o cobol e o turbo basic... tenho sistemas rodando hoje em empresas agregadas a OAS e a VOTORANTIM que tem mais de 7.000.000 (sete milhões) de registros, distribuÃdos em milhares de arquivos diferentes, locados em centenas de diretórios diferentes, tudo rodando no DOS... e rapidinho!!!!
posso ate ter 500 tabelas com 15 campos cada uma, mas acho q isso vai onerar o sistema. Estarei errado??? Eram os deus astronautas???
Arquivo: vendedores.mdb
Tabela : vendedores
à Ândices: código, nome, cpf
Código 10
Nome 60
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Banco (Nome.) 40
Banco (Número.) 10
Agência (Nome.) 40
Agência (Número.) 10
Número da conta 20
Comissão a vista 10
Comissão a prazo 10
Comissão após Recebimento 10
Lembrete 250
Arquivo: fornecedores.mdb
Tabela : fornecedores
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Vendedor_01 60
Fone do vendedor_01 20
Vendedor_02 60
Fone do vendedor_02 20
Vendedor_03 60
Fone do vendedor_03 20
Vendedor_04 60
Fone do vendedor_04 20
Lembrete 250
Arquivo: convenios.mdb
Tabela : convenios
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: marcas.mdb
Tabela : marcas
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Lembrete 250
Fornecedor01(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor02(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor03(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor04(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor05(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor06(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor07(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor08(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor09(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor10(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor11(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor12(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor13(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor14(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor15(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor16(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor17(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor18(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor19(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor20(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor21(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor22(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor23(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor24(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor25(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor26(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor27(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor28(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor29(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor30(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor31(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor32(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor33(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor34(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor35(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor36(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor38(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor39(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Fornecedor40(Código+nome, vai buscar na tabela Fornecedores e comunicasse pelo código) 60
Arquivo: clientes.mdb
Tabela : clientes
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
à Ârea 20
Tipo de cliente 1
MunicÃpio 40
UF 2
CEP 10
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Nome do pai 40
Nome da mãe 40
Limite de crédito 15
Crédito utilizado 15
Crédito disponÃvel 15
E-Mail 60
Home-Page 60
Vendedor (código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Lembrete 250
Referência_01 60
Fone referência_01 20
Referência_02 60
Fone referência_02 20
Referência_03 60
Fone referência_03 20
Nome do banco-01 40
Numero do Banco-01 10
Nome da agencia-01 40
Numero da agencia-01 10
Numero da conta-01 20
Cliente desde-01 10
Nome do banco-02 40
Numero do Banco-02 10
Nome da agencia-02 40
Numero da agencia-02 10
Numero da conta-02 20
Cliente desde-02 10
Nome do banco-03 40
Numero do Banco-03 10
Nome da agencia-03 40
Numero da agencia-03 10
Numero da conta-03 20
Cliente desde-03 10
Empresa conveniada (código+nome, vai buscar na tabela convenio e comunicasse pelo código) 60
Situação do convênio 1
Tipo de convênio 1
Limite de crédito 15
Crédito Utilizado 15
Crédito disponÃvel 15
Tipo de cliente 30
Não pode comprar na loja 1
Não pode comprar a vista com cheque, em carteira, com duplicata, com promissórias ou carnê 1
Não pode comprar a prazo 1
Não pode comprar através de terceiros 1
Não permite repassar dados a terceiros 1
Não permite receber correspondência 1
Não pode emprestar equipamentos 1
Não pode alugar equipamentos 1
Motivo das restrições 250
Arquivo: setores.mdb
Tabela : setores
à Ândices: código, nome do setor
Código 10
Nome do setor 40
Ligado ao setor 40
Lembrete 250
Vendedor01(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor02(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor03(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor04(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor05(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor06(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor07(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor08(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor09(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor10(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor11(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor12(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor13(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor14(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor15(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor16(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor17(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor18(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor19(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor20(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor21(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor22(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor23(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor24(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor25(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor26(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor27(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor28(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor29(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor30(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor31(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor32(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor33(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor34(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor35(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor36(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor38(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor39(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor40(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor41(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor42(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor43(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor44(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor45(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor46(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor47(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor48(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor49(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor50(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor51(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor52(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor53(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor54(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor55(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor56(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor57(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor58(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor59(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Vendedor60(Código+nome, vai buscar na tabela Vendedores e comunicasse pelo código) 60
Arquivo: transportadoras.mdb
Tabela : transportadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: prestadoras.mdb
Tabela : prestadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome Fantasia 60
Razão Social 60
CNPJ 20
Inscrição Estadual 20
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Nome do banco 40
Numero do Banco 10
Nome da agencia 40
Numero da agencia 10
Numero da conta 20
Lembrete 250
Arquivo: prestadoras.mdb
Tabela : prestadoras
à Ândices: código, nome fantasia, cnpj, cpf
Código 10
Nome do Produto 60
Nome do produto reduzido 30
Descrição do produto 200
Setor (Código+nome, vai buscar na tabela setores e comunicasse pelo código) 60
marca (Código+nome, vai buscar na tabela marcas e comunicasse pelo código) 60
Preço de custo básico 15
IPI percentual 10
IPI valor 15
embalagem percentual 10
embalagem valor 15
frete percentual 10
frete valor 15
icms percentual 10
icms valor 15
outros percentual 10
outros valor 15
subtotal valor 15
icms fisica percentual 10
icms fisica valor 15
icms juridica percentual 10
icms juridica valor 15
pis percentual 10
pis valor 15
cofins percentual 10
cofins valor 15
contribuição social percentual 10
contribuição social valor 15
comisao percentual 10
comissao valor 15
outros percentual 10
outros valor 15
preço de custo real valor 15
margem de lucro percentual 10
margem de lucro valor 15
reajuste percentual 10
reajuste valor 15
arredondamento valor 15
preço de venda 15
preço de venda mÃnimo 15
promoção 3
promoção percentual 10
promocao valor 15
Estoque MÃnimo 10
Estoque Atual 10
Data de cadastro 10
Codificação Fiscal 10
Situação Tributária 10
Código de Barras 40
Lembrete 250
Data da última compra 10
Quantidade da última compra 10
Fornecedor da última compra 60
Número do pedido da última compra 20
Número da Nota Fiscal da última compra 20
Quantida_produto_01 10
Código+nome_produ_01 60
Quantida_produto_02 10
Código+nome_produ_02 60
Quantida_produto_03 10
Código+nome_produ_03 60
Quantida_produto_04 10
Código+nome_produ_04 60
Quantida_produto_05 10
Código+nome_produ_05 60
Quantida_produto_06 10
Código+nome_produ_06 60
Quantida_produto_07 10
Código+nome_produ_07 60
Quantida_produto_08 10
Código+nome_produ_08 60
Quantida_produto_09 10
Código+nome_produ_09 60
Quantida_produto_10 10
Código+nome_produ_10 60
Quantida_produto_11 10
Código+nome_produ_11 60
Quantida_produto_12 10
Código+nome_produ_12 60
Quantida_produto_13 10
Código+nome_produ_13 60
Quantida_produto_14 10
Código+nome_produ_14 60
Quantida_produto_15 10
Código+nome_produ_15 60
Quantida_produto_16 10
Código+nome_produ_16 60
Quantida_produto_17 10
Código+nome_produ_17 60
Quantida_produto_18 10
Código+nome_produ_18 60
Quantida_produto_19 10
Código+nome_produ_19 60
Quantida_produto_20 10
Código+nome_produ_20 60
Quantida_produto_21 10
Código+nome_produ_21 60
Quantida_produto_22 10
Código+nome_produ_22 60
Quantida_produto_23 10
Código+nome_produ_23 60
Quantida_produto_24 10
Código+nome_produ_24 60
Quantida_produto_25 10
Código+nome_produ_25 60
Quantida_produto_26 10
Código+nome_produ_26 60
Quantida_produto_27 10
Código+nome_produ_27 60
Quantida_produto_28 10
Código+nome_produ_28 60
Quantida_produto_29 10
Código+nome_produ_29 60
Quantida_produto_30 10
Código+nome_produ_30 60
Quantida_produto_31 10
Código+nome_produ_31 60
Quantida_produto_32 10
Código+nome_produ_32 60
Quantida_produto_33 10
Código+nome_produ_33 60
Quantida_produto_34 10
Código+nome_produ_34 60
Quantida_produto_35 10
Código+nome_produ_35 60
Quantida_produto_36 10
Código+nome_produ_36 60
Quantida_produto_37 10
Código+nome_produ_37 60
Quantida_produto_38 10
Código+nome_produ_38 60
Quantida_produto_39 10
Código+nome_produ_39 60
Quantida_produto_40 10
Código+nome_produ_40 60
Quantida_produto_41 10
Código+nome_produ_41 60
Quantida_produto_42 10
Código+nome_produ_42 60
Quantida_produto_43 10
Código+nome_produ_43 60
Quantida_produto_44 10
Código+nome_produ_44 60
Origem 30
Referência 20
Tamanho 20
Tipo de embalagem 20
Estado de conservação 20
Data de Fabricação 10
Data de Validade 10
Utilização 20
cor 20
Unidade para venda 20
Unidade para confecção 20
Quantidade por embalagem 20
Vamulá!
A quantidade de campos que uma tabela PODE possuir varia em função do engine de dados adotado.
No caso do MS-Access, a quatidade de campos de uma tabela pode chegar á 255 (0 á 254), sendo que nenhuma consulta armazenada poderá representar mais do que 250 campos (versão 2002/2003). Vamos ampliar mais esses dados?
As especificações atuais para o engine do MS-Access, usado pelo VB, são:
- Tamanho do arquivo de dados: Até 2 Gbytes menos o espaço ocupado pelos objetos de sistema;
- Campos por tabela: 255;
- Campos por consulta armazenada: 250;
- Tamanho máximo por tabela: 2 Gbytes menos o espaço ocupado pelos objetos de sistema, ou seja, uma tabela pode ocupar toda a base de dados;
- Caracteres em um campo do tipo texto: Até 255;
- Caracteres em um campo memo:: 65535 (restrito apenas pela entrada de dados manual, uma vez que os objetos de texto do VB têm esse limite) ou até 1 Gbyte (quando a alimentação do campo é codificada);
- Caracteres máximos em uma célula de consulta (ou grade): 1024;
- Número máximo de caracteres em um campo para entrada de dados (form): 65535;
- Número máximo de sub-consultas aninhadas: 7
- Número de bases diferentes (ou áreas de trabalho concomitantes) abertas: 255;
E o principal, para o seu caso, deve ser esse último limite do MS-Access:
- Capacidade máxima de caracteres por registro: 2000 (excluindo campos dos tipos Memo e OLE);
Se você estivesse utilizando um SQL Server ou ainda um MSDE, só para exemplificar, o número máximo de campos por tabela subiria para 1024, nas versões 7 e posteriores.
Mas esses são os limite do engine, ou seja, representam uma quantidade hipotética de campos e quantidades de caracteres como limitação de trabalho. Se fosse esse o caso, você estaria com tudo perfeito. Só olhar esses limites indica que você poderia trabalhar com até 510GBytes em dados intercalados, sendo que para cada área aberta há a RECOMENDAÇÃO de até 160 usuários, portanto, até 40800 usuários "on-line" (ufa!).
Já trabalhei com bases de dados MS-Access com mais de 2GBytes e conheço bem esses limites do engine, seus problemas de tráfego de rede, suas falhas de segurança e até alguns macetes geniais, capazes de tornar o MS-Access bastante interessante, estável e seguro, graças ao dia-á-dia de três anos na segunda maior empresa de transportes marÃtimos do mundo. Já discuti e "troquei figurinhas" por muito tempo com o pessoal da Microsoft, apenas para manter as aplicações "afinadas" e funcionando em tempo real com bases sincronizadas em 6 estados diferentes (SP, RJ, RS, SC, ES e PE), pois não se podia perder tempo na captação de fretes.
Observe que a questão não reside, porém, na capacidade máxima de armazenamento de um engine qualquer, nem em seus limites de uso, mas sim na maneira como esse armazenamento é administrado.
Vamos tentar um exemplo para ilustrar. Primeiramente, vamos entender como é administrado o espaço de trabalho, ok? Suponha que você tenha uma tabela com apenas três campos, dois deles do tipo Text e um do tipo Memo. Os campos do tipo memo podem armazenar, por registro, até 1GByte em informação, como vimos. Mas ao criar um campo memo, sua primeira idéia é a de possibilitar a armazenagem de pequenos textos, entrados não por formulário mas por selecionamento de arquivos pelo usuário, com até 150K. Com o uso, a média dos campos memo continua dentro das espectativas e isso não acarreta nenhum problema. Em dado instante, um usuário resolve inserir texto suficiente para ocupar toda a capacidade do campo. O que acontecerá?
1 - O engine realizará cálculos para determinar a média de tamanho por registro, contabilizando essa última entrada.
2 - O espaço de trabalho tentará alocar recursos para que a média por registro esteja disponÃvel por estação de trabalho, tornando o sistema um pouco mais lento.
3 - Em controles multi-registro, como os DataControl, os recursos á serem alocados serão multiplicados pelo default de registros em carga, que é de 50.
4 - Em algumas telas, o sistema cliente irá travar.
5 - O travamento do sistema em alguns pontos da rede poderá acarretar novas chamadas ao serviço de dados, empilhando mais processos na rede e possibilitando a ocorrência de crashes e consequentemente a "quebra" da base de dados (quando isso ocorre, a mensagem de erro ao tentar acessar a base de dados pode variar entre "Formato de Dados Não Reconhecido", "Formato Inválido da Base de Dados", "Base de Dados Corrompida" etc).
Ora, o erro apresentado acima não chegou nem perto de infringir os limites do engine. Ocorreu apenas por um "deslize" na administração dos dados.
Então, de princÃpio, sabemos que as sessões ativas e as áreas de trabalho são efetivamente ambientes preparados pelo engine para tratamento dos dados, não sendo de forma alguma estáticas, como acontecia no DOS. Uma área de trabalho MS-Access (não é apenas o Workspace do DAO, mas também a sessão ativa em ADO para engine do Jet) é dinà ¢mica, expandindo-se e retraindo-se á medida em que a própria base de dados evolui.
No caso especÃfico do MS-Access, essa área de trabalho é um tanto diferente das dos demais engines comerciais de dados, por lidar SEMPRE com volumes de informação maiores. Você, neste ponto, deve estar se perguntando: "Poxa, se o MS-Access é menos robusto do que o Oracle, por exemplo, como sua área de trabalho lida com maior volume de informação? Não é lógico..."
Bem, esse é o segundo ponto. O MS-Access transita TODO o conjunto de dados, sempre, não apenas os subconjuntos representados por uma consulta solicitada. Isso quer dizer (principalmente se ainda está adotando o DAO) que ao abrir a base, a aplicação-cliente estará carregando localmente todos os dados, sempre que abrir um recordset, para realizar as filtragens e seleções na própria estação. Tanto a área de trabalho do MS-Access é mais pesada como também o fluxo de dados na rede, se comparados á outros engines. Não se desespere, o ADO ajuda MUITO neste ponto.
Então temos agora mais um ponto, que foi aquele levantado por nós em seu post anterior. é o relacionado a normatização de dados.
Não é (nem deve ser) LEI que uma tabela tenha no máximo 15 campos. Quando se fala em quantidade média de campos, isto leva em conta apenas estruturas de dados coerentemente normatizadas, onde se prima por uma quantidade de campos menor em nome de três fatores: Tamanho final do conjunto de dados, desempenho e segurança da informação.
Como eu disse, não tenho a ilusão de que você respire a normatização da noite para o dia, isso seria inviável para a maioria de nós. Mas com o tempo, acredito ainda que irá perceber as vantagens dessa metodologia, que facilita a manutenção, a criação de objetos de negócio, de stored procedures, de views, de controles de usuário especialistas etc.
Ainda assim, vamos dar uma passada rápida no que você, hoje, considera como ideal para o conjunto de informações sobre vendedores? Isso pode lhe dar uma idéia mais próxima do que eu tento lhe passar. Hoje você tem:
Arquivo: vendedores.mdb
Tabela : vendedores
à Ândices: código, nome, cpf
Código 10
Nome 60
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Banco (Nome.) 40
Banco (Número.) 10
Agência (Nome.) 40
Agência (Número.) 10
Número da conta 20
Comissão a vista 10
Comissão a prazo 10
Comissão após Recebimento 10
Lembrete 250
Não se "esquente" com as crÃticas á seguir, não o faço de forma pejorativa.
1 - Caso o vendedor apresente mais de um conjunto de informações relacionadas aos contatos e/ou endereços, a estrutura acima exige que ele seja cadastrado novamente, com as informações complementares.
2 - O campo Banco será repetido indefinidas vezes, ocupando um espaço precioso da base de dados, sendo que só precisaria existir uma única vez e ser referenciado por um inteiro longo, de tamanho bem menor.
3 - Para "deixar por aqui" (não quero entrar em méritos como gravar ou não máscaras de texto etc), os dados financeiros de cada vendedor estão juntos na mesma tabela, de forma que, sob o ponto de vista de segurança da informação, é muito mais simples "roubar" tais dados do que se eles estivessem em tabelas vinculadas.
Aà você pode pensar: "Oras, se é assim, como é que eu poderia fazer essa estrutura, então???" Mãos á obra!
TB_VENDEDORES
===============
ID_VENDEDOR INTEIRO LONGO AUTONUMERAÇÃO
NOME TEXTO 60
IDENTIDADE TEXTO 20
CPFJ TEXTO 20
DT_CADASTRO DATE/TIME
DT_NASCIMENTO DATE/TIME
TB_ENDERECOS
=============
ID_ENDERECO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_TIPO_LOGR INTEIRO LONGO (*) - VIDE ABAIXO
LOGRADOURO TEXTO 40
NUMERO TEXTO 10
COMPLEMENTO TEXTO 40
CEP TEXTO 10
BAIRRO TEXTO 40
CIDADE TEXTO 40
UF TEXTO 02
FONE TEXTO 20
CELULAR TEXTO 20
FAX TEXTO 20
CONTATO TEXTO 40
TB_ELETRONICO
==============
ID_ENDEREÇO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ENDERECO TEXTO 60
ID_TIPO INTEIRO LONGO (*) - VIDE ABAIXO
TB_PARAMETROS_FIN
===================
ID_PARAMETRO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_BANCO INTEIRO LONGO
AGENCIA_NOME TEXTO 40
AGENCIA_NUMERO TEXTO 10
CONTA TEXTO 20
TB_COMISSOES
=============
ID_COMISSAO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_TIPO_COMISSAO INTEIRO LONGO
COMISSAO DUPLO
LEMBRETE TEXTO 250
TB_TIPOS_ELETRONICOS
=====================
ID_TIPO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 60
TB_TIPOS_LOGRADOUROS
=======================
ID_LOGRADOURO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 25
SIGLA TEXTO 04
TB_BANCOS
===========
ID_BANCO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 40
SIGLA TEXTO 10
CODIGO TEXTO 04
TB_TIPOS_COMISSOES
===================
ID_TIPO_COMISSAO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 60
Foram adicionadas tabelas de suporte.
- TB_TIPOS_COMISSOES permite ao usuário do sistema cadastrar um número indefinido de comissões, de forma que nem todo vendedor precisará ter um dado tipo de comissão, nem a aplicação estará eternamente "amarrada" aos tipos pré-definidos pela estrutruraanterior.
- TB_BANCOS, obviamente mantém o cadastro de todos os bancos, de forma que não haverão entradas discrepantes e que acabam com qualquer bom trabalho, como registros de "intenção" (237 - BRADESCO / 237 - BANCO BRASILEIRO DE DESCONTOS, por exemplo).
- TB_TIPOS_LOGRADOUROS permite, da mesma forma que a TB_BANCOS, reduzir a massa de textos á ser digitada, sem manter a aplicação com dados fixados por código, o que é bastante incoerente. Da mesma forma que evita a redundà ¢ncia, também evita entradas "falsas", como a do exemplo anterior.
- TB_TIPOS_ELETRONICOS permitirá que não apenas um e-mail e um site sejam cadastrados por vendedor, e não apenas mais de um endereço, mas também tipos diferentes, como endereços UIN (ICQ) e IDs MSN, AOL etc. Se amanhã surgir uma nova modalidade de endereçamento ou contato eletrà 'nico, a aplicação continuará trabalhando sem quaisquer alterações, ao contrario do que ocorre com a estrutura colossal.
Como dá para perceber, com esta reestruturação, cada vendedor poderá ter mais de um endereço, conta bancária, tipos de comissão e endereços eletrà 'nicos, sem que seja necessário repetir a massa de dados de campos-texto por todo o conjunto. A base de dados fica menor, a quantidade de Ãndices possÃveis, mais estáveis, aumenta e a carga de cada informação é mais rápida.
Em têrmos de normatização, essa pequena alteração está longe ainda de ser um exemplo perfeito, mas já dá para formar uma idéia da coisa. Como você vai notar, nenhuma das tabelas tem mais de 15 campos, todas serão funcionais, rápidas e "enxutas". E no momento de carregar á grade TODAS as informações, simultaneamente, você ainda poderá fazer uso do MSHFlexGrid, que dá uma excelente apresentação de dados hierárquica, usando apenas uma única instrução SQL.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Relativamente ao uso de diversos DB MS-Access:
Utilizar um DB por tabela, á primeira vista, pode parecer até exagero. Mas não é, caso as previsões de expansão dos dados sejam maciças.
Vários cuidados devem ser levados em consideração, para evitar problemas com a manutenção DBA e com a integridade.
Por exemplo, isso você já deve saber e usar de forma corrente, encerrar todas as conexões e atribuir um Nothing á todos os objetos de acesso á dados, assim que os deixar de utilizar.
A estrutura fÃsica da rede também é de importà ¢ncia relevante, dado que pontos de rede com falhas esporádicas de conexão podem corromper as bases de dados.
Ao trabalhar com várias bases, com o tempo, elas se "encorpam". Com esse crescimento, o desempenho tende á diminuir, o que é visto pelos usuários como uma deficiência da aplicação e não do engine de dados.
Para minimizar esse impacto, existem formas alternativas de trabalho com o MS-Access / ADO, que oneram um pouco seu trabalho de codificação, mas garantem a qualidade de seu produto. Uma delas, a mais complicadinha, porém mais eficiente, é a geração de componentes de serviço, na forma de DLLs ou EXEs, residentes em um equipamento servidor. O acesso aos dados é realizado por esses componentes, nunca pela aplicação-cliente. A aplicação-cliente, por sua vez, requisita aos componentes citados que executem instruções SQL, retornando ou não recordsets do tipo ADO.
Outra forma é a de utilizar-se de uma base de dados local, por exemplo, na pasta TEMP, vinculando todas as tabelas das demais bases de dados nesta primeira. A base é criada na inicialização do sistema e a vinculação das tabelas garante que todos os objetos estarão presentes e no local esperado antes de o usuário começar seu trabalho. No encerramento do aplicativo, os vÃnculos são removidos e a base local é eliminada. O inconveniente deste processo é que há uma certa demora na inicialização do sistema, mas que pode ser compensada visualmente com um formulário de Splash, posicionando o usuário sobre os processos em andamento, da mesma forma que trabalham aplicações como o Adobe ou o Corel Draw.
Mas se até o presente momento você não se deparou com quaisquer perdas sensÃveis de desempenho, em minha opinião pessoal, o melhor é manter as bases separadas exatamente como estão hoje. Quando fà 'r o caso, se optar pelo ADO mais tarde, aà sim, talvês notará o problema. De qualquer forma, fica a dica.
Ah, mais uma: Caso venha a adotar o ADO, evite utilizar-se de ODBC para acessar os dados. Prefira sempre utilizar o DSN do servidor e a string de conexão completa do driver do MS-Access, pois o desempenho é bem melhor.
E por hoje é só, creio. Estou de saÃda para a Alfà ¢ndega e depois aos terminais, então, mais uma vez, não dá tempo de entrar em maiores detalhes. Sorry.
A quantidade de campos que uma tabela PODE possuir varia em função do engine de dados adotado.
No caso do MS-Access, a quatidade de campos de uma tabela pode chegar á 255 (0 á 254), sendo que nenhuma consulta armazenada poderá representar mais do que 250 campos (versão 2002/2003). Vamos ampliar mais esses dados?
As especificações atuais para o engine do MS-Access, usado pelo VB, são:
- Tamanho do arquivo de dados: Até 2 Gbytes menos o espaço ocupado pelos objetos de sistema;
- Campos por tabela: 255;
- Campos por consulta armazenada: 250;
- Tamanho máximo por tabela: 2 Gbytes menos o espaço ocupado pelos objetos de sistema, ou seja, uma tabela pode ocupar toda a base de dados;
- Caracteres em um campo do tipo texto: Até 255;
- Caracteres em um campo memo:: 65535 (restrito apenas pela entrada de dados manual, uma vez que os objetos de texto do VB têm esse limite) ou até 1 Gbyte (quando a alimentação do campo é codificada);
- Caracteres máximos em uma célula de consulta (ou grade): 1024;
- Número máximo de caracteres em um campo para entrada de dados (form): 65535;
- Número máximo de sub-consultas aninhadas: 7
- Número de bases diferentes (ou áreas de trabalho concomitantes) abertas: 255;
E o principal, para o seu caso, deve ser esse último limite do MS-Access:
- Capacidade máxima de caracteres por registro: 2000 (excluindo campos dos tipos Memo e OLE);
Se você estivesse utilizando um SQL Server ou ainda um MSDE, só para exemplificar, o número máximo de campos por tabela subiria para 1024, nas versões 7 e posteriores.
Mas esses são os limite do engine, ou seja, representam uma quantidade hipotética de campos e quantidades de caracteres como limitação de trabalho. Se fosse esse o caso, você estaria com tudo perfeito. Só olhar esses limites indica que você poderia trabalhar com até 510GBytes em dados intercalados, sendo que para cada área aberta há a RECOMENDAÇÃO de até 160 usuários, portanto, até 40800 usuários "on-line" (ufa!).
Já trabalhei com bases de dados MS-Access com mais de 2GBytes e conheço bem esses limites do engine, seus problemas de tráfego de rede, suas falhas de segurança e até alguns macetes geniais, capazes de tornar o MS-Access bastante interessante, estável e seguro, graças ao dia-á-dia de três anos na segunda maior empresa de transportes marÃtimos do mundo. Já discuti e "troquei figurinhas" por muito tempo com o pessoal da Microsoft, apenas para manter as aplicações "afinadas" e funcionando em tempo real com bases sincronizadas em 6 estados diferentes (SP, RJ, RS, SC, ES e PE), pois não se podia perder tempo na captação de fretes.
Observe que a questão não reside, porém, na capacidade máxima de armazenamento de um engine qualquer, nem em seus limites de uso, mas sim na maneira como esse armazenamento é administrado.
Vamos tentar um exemplo para ilustrar. Primeiramente, vamos entender como é administrado o espaço de trabalho, ok? Suponha que você tenha uma tabela com apenas três campos, dois deles do tipo Text e um do tipo Memo. Os campos do tipo memo podem armazenar, por registro, até 1GByte em informação, como vimos. Mas ao criar um campo memo, sua primeira idéia é a de possibilitar a armazenagem de pequenos textos, entrados não por formulário mas por selecionamento de arquivos pelo usuário, com até 150K. Com o uso, a média dos campos memo continua dentro das espectativas e isso não acarreta nenhum problema. Em dado instante, um usuário resolve inserir texto suficiente para ocupar toda a capacidade do campo. O que acontecerá?
1 - O engine realizará cálculos para determinar a média de tamanho por registro, contabilizando essa última entrada.
2 - O espaço de trabalho tentará alocar recursos para que a média por registro esteja disponÃvel por estação de trabalho, tornando o sistema um pouco mais lento.
3 - Em controles multi-registro, como os DataControl, os recursos á serem alocados serão multiplicados pelo default de registros em carga, que é de 50.
4 - Em algumas telas, o sistema cliente irá travar.
5 - O travamento do sistema em alguns pontos da rede poderá acarretar novas chamadas ao serviço de dados, empilhando mais processos na rede e possibilitando a ocorrência de crashes e consequentemente a "quebra" da base de dados (quando isso ocorre, a mensagem de erro ao tentar acessar a base de dados pode variar entre "Formato de Dados Não Reconhecido", "Formato Inválido da Base de Dados", "Base de Dados Corrompida" etc).
Ora, o erro apresentado acima não chegou nem perto de infringir os limites do engine. Ocorreu apenas por um "deslize" na administração dos dados.
Então, de princÃpio, sabemos que as sessões ativas e as áreas de trabalho são efetivamente ambientes preparados pelo engine para tratamento dos dados, não sendo de forma alguma estáticas, como acontecia no DOS. Uma área de trabalho MS-Access (não é apenas o Workspace do DAO, mas também a sessão ativa em ADO para engine do Jet) é dinà ¢mica, expandindo-se e retraindo-se á medida em que a própria base de dados evolui.
No caso especÃfico do MS-Access, essa área de trabalho é um tanto diferente das dos demais engines comerciais de dados, por lidar SEMPRE com volumes de informação maiores. Você, neste ponto, deve estar se perguntando: "Poxa, se o MS-Access é menos robusto do que o Oracle, por exemplo, como sua área de trabalho lida com maior volume de informação? Não é lógico..."
Bem, esse é o segundo ponto. O MS-Access transita TODO o conjunto de dados, sempre, não apenas os subconjuntos representados por uma consulta solicitada. Isso quer dizer (principalmente se ainda está adotando o DAO) que ao abrir a base, a aplicação-cliente estará carregando localmente todos os dados, sempre que abrir um recordset, para realizar as filtragens e seleções na própria estação. Tanto a área de trabalho do MS-Access é mais pesada como também o fluxo de dados na rede, se comparados á outros engines. Não se desespere, o ADO ajuda MUITO neste ponto.
Então temos agora mais um ponto, que foi aquele levantado por nós em seu post anterior. é o relacionado a normatização de dados.
Não é (nem deve ser) LEI que uma tabela tenha no máximo 15 campos. Quando se fala em quantidade média de campos, isto leva em conta apenas estruturas de dados coerentemente normatizadas, onde se prima por uma quantidade de campos menor em nome de três fatores: Tamanho final do conjunto de dados, desempenho e segurança da informação.
Como eu disse, não tenho a ilusão de que você respire a normatização da noite para o dia, isso seria inviável para a maioria de nós. Mas com o tempo, acredito ainda que irá perceber as vantagens dessa metodologia, que facilita a manutenção, a criação de objetos de negócio, de stored procedures, de views, de controles de usuário especialistas etc.
Ainda assim, vamos dar uma passada rápida no que você, hoje, considera como ideal para o conjunto de informações sobre vendedores? Isso pode lhe dar uma idéia mais próxima do que eu tento lhe passar. Hoje você tem:
Arquivo: vendedores.mdb
Tabela : vendedores
à Ândices: código, nome, cpf
Código 10
Nome 60
RG 20
CPF 20
Endereço 40
Número 10
Complemento 40
Bairro 40
MunicÃpio 40
UF 2
CEP 10
E-Mail 60
Home-Page 60
Fone 20
Celular 20
Fax 20
Contato 40
Data de cadastro 10
Data de nascimento 10
Banco (Nome.) 40
Banco (Número.) 10
Agência (Nome.) 40
Agência (Número.) 10
Número da conta 20
Comissão a vista 10
Comissão a prazo 10
Comissão após Recebimento 10
Lembrete 250
Não se "esquente" com as crÃticas á seguir, não o faço de forma pejorativa.
1 - Caso o vendedor apresente mais de um conjunto de informações relacionadas aos contatos e/ou endereços, a estrutura acima exige que ele seja cadastrado novamente, com as informações complementares.
2 - O campo Banco será repetido indefinidas vezes, ocupando um espaço precioso da base de dados, sendo que só precisaria existir uma única vez e ser referenciado por um inteiro longo, de tamanho bem menor.
3 - Para "deixar por aqui" (não quero entrar em méritos como gravar ou não máscaras de texto etc), os dados financeiros de cada vendedor estão juntos na mesma tabela, de forma que, sob o ponto de vista de segurança da informação, é muito mais simples "roubar" tais dados do que se eles estivessem em tabelas vinculadas.
Aà você pode pensar: "Oras, se é assim, como é que eu poderia fazer essa estrutura, então???" Mãos á obra!
TB_VENDEDORES
===============
ID_VENDEDOR INTEIRO LONGO AUTONUMERAÇÃO
NOME TEXTO 60
IDENTIDADE TEXTO 20
CPFJ TEXTO 20
DT_CADASTRO DATE/TIME
DT_NASCIMENTO DATE/TIME
TB_ENDERECOS
=============
ID_ENDERECO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_TIPO_LOGR INTEIRO LONGO (*) - VIDE ABAIXO
LOGRADOURO TEXTO 40
NUMERO TEXTO 10
COMPLEMENTO TEXTO 40
CEP TEXTO 10
BAIRRO TEXTO 40
CIDADE TEXTO 40
UF TEXTO 02
FONE TEXTO 20
CELULAR TEXTO 20
FAX TEXTO 20
CONTATO TEXTO 40
TB_ELETRONICO
==============
ID_ENDEREÇO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ENDERECO TEXTO 60
ID_TIPO INTEIRO LONGO (*) - VIDE ABAIXO
TB_PARAMETROS_FIN
===================
ID_PARAMETRO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_BANCO INTEIRO LONGO
AGENCIA_NOME TEXTO 40
AGENCIA_NUMERO TEXTO 10
CONTA TEXTO 20
TB_COMISSOES
=============
ID_COMISSAO INTEIRO LONGO AUTONUMERAÇÃO
ID_VENDEDOR INTEIRO LONGO
ID_TIPO_COMISSAO INTEIRO LONGO
COMISSAO DUPLO
LEMBRETE TEXTO 250
TB_TIPOS_ELETRONICOS
=====================
ID_TIPO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 60
TB_TIPOS_LOGRADOUROS
=======================
ID_LOGRADOURO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 25
SIGLA TEXTO 04
TB_BANCOS
===========
ID_BANCO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 40
SIGLA TEXTO 10
CODIGO TEXTO 04
TB_TIPOS_COMISSOES
===================
ID_TIPO_COMISSAO INTEIRO LONGO AUTONUMERAÇÃO
DESCRICAO TEXTO 60
Foram adicionadas tabelas de suporte.
- TB_TIPOS_COMISSOES permite ao usuário do sistema cadastrar um número indefinido de comissões, de forma que nem todo vendedor precisará ter um dado tipo de comissão, nem a aplicação estará eternamente "amarrada" aos tipos pré-definidos pela estrutruraanterior.
- TB_BANCOS, obviamente mantém o cadastro de todos os bancos, de forma que não haverão entradas discrepantes e que acabam com qualquer bom trabalho, como registros de "intenção" (237 - BRADESCO / 237 - BANCO BRASILEIRO DE DESCONTOS, por exemplo).
- TB_TIPOS_LOGRADOUROS permite, da mesma forma que a TB_BANCOS, reduzir a massa de textos á ser digitada, sem manter a aplicação com dados fixados por código, o que é bastante incoerente. Da mesma forma que evita a redundà ¢ncia, também evita entradas "falsas", como a do exemplo anterior.
- TB_TIPOS_ELETRONICOS permitirá que não apenas um e-mail e um site sejam cadastrados por vendedor, e não apenas mais de um endereço, mas também tipos diferentes, como endereços UIN (ICQ) e IDs MSN, AOL etc. Se amanhã surgir uma nova modalidade de endereçamento ou contato eletrà 'nico, a aplicação continuará trabalhando sem quaisquer alterações, ao contrario do que ocorre com a estrutura colossal.
Como dá para perceber, com esta reestruturação, cada vendedor poderá ter mais de um endereço, conta bancária, tipos de comissão e endereços eletrà 'nicos, sem que seja necessário repetir a massa de dados de campos-texto por todo o conjunto. A base de dados fica menor, a quantidade de Ãndices possÃveis, mais estáveis, aumenta e a carga de cada informação é mais rápida.
Em têrmos de normatização, essa pequena alteração está longe ainda de ser um exemplo perfeito, mas já dá para formar uma idéia da coisa. Como você vai notar, nenhuma das tabelas tem mais de 15 campos, todas serão funcionais, rápidas e "enxutas". E no momento de carregar á grade TODAS as informações, simultaneamente, você ainda poderá fazer uso do MSHFlexGrid, que dá uma excelente apresentação de dados hierárquica, usando apenas uma única instrução SQL.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Relativamente ao uso de diversos DB MS-Access:
Utilizar um DB por tabela, á primeira vista, pode parecer até exagero. Mas não é, caso as previsões de expansão dos dados sejam maciças.
Vários cuidados devem ser levados em consideração, para evitar problemas com a manutenção DBA e com a integridade.
Por exemplo, isso você já deve saber e usar de forma corrente, encerrar todas as conexões e atribuir um Nothing á todos os objetos de acesso á dados, assim que os deixar de utilizar.
A estrutura fÃsica da rede também é de importà ¢ncia relevante, dado que pontos de rede com falhas esporádicas de conexão podem corromper as bases de dados.
Ao trabalhar com várias bases, com o tempo, elas se "encorpam". Com esse crescimento, o desempenho tende á diminuir, o que é visto pelos usuários como uma deficiência da aplicação e não do engine de dados.
Para minimizar esse impacto, existem formas alternativas de trabalho com o MS-Access / ADO, que oneram um pouco seu trabalho de codificação, mas garantem a qualidade de seu produto. Uma delas, a mais complicadinha, porém mais eficiente, é a geração de componentes de serviço, na forma de DLLs ou EXEs, residentes em um equipamento servidor. O acesso aos dados é realizado por esses componentes, nunca pela aplicação-cliente. A aplicação-cliente, por sua vez, requisita aos componentes citados que executem instruções SQL, retornando ou não recordsets do tipo ADO.
Outra forma é a de utilizar-se de uma base de dados local, por exemplo, na pasta TEMP, vinculando todas as tabelas das demais bases de dados nesta primeira. A base é criada na inicialização do sistema e a vinculação das tabelas garante que todos os objetos estarão presentes e no local esperado antes de o usuário começar seu trabalho. No encerramento do aplicativo, os vÃnculos são removidos e a base local é eliminada. O inconveniente deste processo é que há uma certa demora na inicialização do sistema, mas que pode ser compensada visualmente com um formulário de Splash, posicionando o usuário sobre os processos em andamento, da mesma forma que trabalham aplicações como o Adobe ou o Corel Draw.
Mas se até o presente momento você não se deparou com quaisquer perdas sensÃveis de desempenho, em minha opinião pessoal, o melhor é manter as bases separadas exatamente como estão hoje. Quando fà 'r o caso, se optar pelo ADO mais tarde, aà sim, talvês notará o problema. De qualquer forma, fica a dica.
Ah, mais uma: Caso venha a adotar o ADO, evite utilizar-se de ODBC para acessar os dados. Prefira sempre utilizar o DSN do servidor e a string de conexão completa do driver do MS-Access, pois o desempenho é bem melhor.
E por hoje é só, creio. Estou de saÃda para a Alfà ¢ndega e depois aos terminais, então, mais uma vez, não dá tempo de entrar em maiores detalhes. Sorry.
P.S.: O erro é, como eu disse, haver um REGISTRO muito grande. A quantidade de caracteres somada entre todos os campos de um registro NÃO deve ser superior á 2000. Em algum momento, supostamente há uma quantidade superior.
Oi, olá e boas tardes!
KPELLAJR: A pretensão foi unica e apenas a de exemplificar como poderia ser normatizada a tabela de vendedores. Em hipótese alguma esse processo finda exatamente como o exemplo, pode ser indefinidamente remodelado. Em relação ao conjunto CIDADE / BAIRRO, é uma opção excelente, juntamente aos campos CEP, LOGRADOURO, UF etc, todos vinculados á tabela de CEP dos Correios, validando também a entrada de dados.
E não discordo de você LAERTE, não há quaisquer normas que obriguem o desenvolvedor a se favorecer de uma boa normatização. Aliás, meu ganha-pão vem justamente das milhares de estruturas mal dimensionadas em empresas dos mais variados portes. Dessa forma, até agradeço se ninguém se valer da ferramenta da normatização, pois garantem meu dia-á-dia.
O que eu coloquei é apenas uma pequena parte de um resumo do que tenho assimilado ao longo de 25 anos de atividades em desenvolvimento de sistemas, desde o saudosÃssimo CP/M (alguém lembra do comando PIP?), entre análise e programação. Não pretendi em momento algum criar nenhuma plataforma de espelhamento, menos ainda alguma tábua de regras invioláveis.
Aliás, o que eu escrevà é como o Sol, aqui em Santos: Ele existe sempre e brilha todos os dias, mas só vai á praia quem quer, quem gosta ou quem pode.
KPELLAJR: A pretensão foi unica e apenas a de exemplificar como poderia ser normatizada a tabela de vendedores. Em hipótese alguma esse processo finda exatamente como o exemplo, pode ser indefinidamente remodelado. Em relação ao conjunto CIDADE / BAIRRO, é uma opção excelente, juntamente aos campos CEP, LOGRADOURO, UF etc, todos vinculados á tabela de CEP dos Correios, validando também a entrada de dados.
E não discordo de você LAERTE, não há quaisquer normas que obriguem o desenvolvedor a se favorecer de uma boa normatização. Aliás, meu ganha-pão vem justamente das milhares de estruturas mal dimensionadas em empresas dos mais variados portes. Dessa forma, até agradeço se ninguém se valer da ferramenta da normatização, pois garantem meu dia-á-dia.
O que eu coloquei é apenas uma pequena parte de um resumo do que tenho assimilado ao longo de 25 anos de atividades em desenvolvimento de sistemas, desde o saudosÃssimo CP/M (alguém lembra do comando PIP?), entre análise e programação. Não pretendi em momento algum criar nenhuma plataforma de espelhamento, menos ainda alguma tábua de regras invioláveis.
Aliás, o que eu escrevà é como o Sol, aqui em Santos: Ele existe sempre e brilha todos os dias, mas só vai á praia quem quer, quem gosta ou quem pode.
Comentário sobre engine de dados x biblioteca de acesso á dados:
Ao optar pelo MS-Access, que tem, sem dúvidas, suas vantagens, o mecanismo DAO permite, em uma só biblioteca, realizar todas as operações necessárias de acesso e manutenção de dados, coisa que a ADOX não faz sem o uso ao menos da ADOX. Além desse fator, a DAO apresenta invariavelmente resultandos de melhor desempenho, frente a ADO, pois trata-se de uma biblioteca especializada, focada ao MS-Access e demais engines Jet.
Ao projetar uma aplicação que utiliza a DAO, a mesma poderá utilizar-se de linguagem DDL da SQL para criar, alterar e manter os dados, bem como utilizar os objetos próprios da bilbioteca. Em ambos os casos, os resultados serão satisfatórios, portanto, se deseja "fechar questão" no MS-Access, os objetos DAO podem ser uma alternativa bastante interessante. Se, por outro lado, desejar manter compatibilidade com os demais engines, incluindo aqueles não abrangidos pela DAO, mesmo que não se utilize inicialmente da ADO, o passo mais importante será a familiaridade com a linguagem SQL, tanto no que tange a formação de consultas de tipos variados (consultas simples ou parametrizadas, de retorno ou de ação), quanto ao tópico de manutenção da base de dados e suas estruturas.
Com relação aos dados.
Normalmente se fornece apenas as informações mais usuais, abrindo as possibilidades de o cliente incluir as suas próprias informações. Isto varia em acordo com o modelo de projeto, ou seja, em se tratando de um sistema comercial fechado para qualquer empresa, fornecer dados mais amplos é interessante por reduzir o volume de trabalho na customização, mas em se tratando de desenvolvimento mais especÃfico, empresa á empresa, apenas os dados básicos são o mais conveniente, desde que o cliente seja suprido com mecanismos para moldar os dados ao seu modo.
Apesar de ser a idéia mais comum, a de ter a base de dados inicial já formada por todos os registros de tipos de logradouro e cidades, não considero como a melhor idéia. Explico: Como a aplicação será utilizada e por quem são pontos-chave nessa questão. Normalmente não há efetivo interesse de um cliente em manter tipos de logradouro pouco comuns, nem itens que não serão utilizados. Assim, havendo a abertura da composição de endereços, por exemplo, uma empresa de pequeno porte na cidade de São Paulo pode não se interessar por um cadastro com todas as cidades do estado, assim como uma empresa de médio porte pode solicitar cidades e códigos de endereçamento internacionais. Cada coisa têm seu lugar próprio. Se seu sistema não é um sistema especialista em B.I. em têrmos nacionais, adir nele uma série completa de tabelas com todos os códigos de ruas do paÃs só fará com que o mesmo ocupe mais espaço, sendo que o cliente nem sempre irá reconhecer o poder de tal ferramenta. Em minha opinião, o ideal é o estudo de caso, com a inclusão do básico para que o sistema possa evoluir em acordo com as necessidades do cliente, e não antes dele.
Para traçar um paralelo, a maioria dos clientes, ao receber um sistema bem completo e com dados já equacionados para um crescimento maior do que a empresa suspeita, a visão do cunjunto acaba passando a falsa idéia de uma complexidade maior e de uma operacionalidade difÃcil de manter. O sistema passa á ser subutilizado e suas potencialidades normalmente são nati-mortas.
é como abrir uma auto-escola com uma frota de Ferrari. Os alunos querem aprender a dirigir, não se darão ao trabalho de apreciar o veÃculo que estarão utilizando e, caso algum o faça, levará muito mais tempo para aprender. O melhor é ensinar com um bom carro popular, fazer o aluno passar por todas as agruras e apertos que o dia-á-dia trará e, somente quando o aluno sentir-se capaz, passar para um veÃculo mais "interessante".
Procure manter Ãndices simples unÃvocos como chave primária, ou seja, evite sempre que possÃvel o uso de chaves compostas.
Você cita:
"...ou seja: teriamos as tabelas TbTipoLogradouro, TbLogradouros, Tbbairros, TbCidades, TbUfs, TbBancos e etc que seriam usadas por todas as outras tabelas... é isso???..."
Sim, é essa a idéia. Uma só tabela com os dados de todos os bancos (por exemplo) e em cada tabela que utilize esses dados, apenas o campo de chave primária da tabela de bancos, ao invés de todos os demais dados, repetidamente.
Não há a necessidade de gerar relacionamentos explÃcitos via MS-Access, uma vez que você pode apenas relacionar as tabelas com as devidas instruções SQL necessárias e isso também poupa espaço e aumenta desempenho.
"...e assim que eu mudasse um dado de um vendedor, ele sairia alterando todos os registros em todas as tabelas por causa das relações??? (tipo, vendedor relaciona com clientes que relaciona com vendas que relaciona com fornecedor q relacina com financeiro, etc) ..."
Bem, este é um modo de trabalho que pode / deve ser ajustado por você. Por exemplo, em um primeiro nÃvel, se em sua tabela de Bancos um nome de banco for alterado, por estar vinculada á outras tabelas, não alterará absolutamente nada além disso, mas a alteração estará espelhada em todas as tabelas relacionadas. Em um segundo nÃvel, você pode ter um campo com o ID do vendedor e outro do cliente na tabela de faturas. Ao tentar excluir esse cliente ou esse vendedor, você pode fazer com que o engine não permita essa exclusão, senão quando as faturas vinculadas á eles estiverem completamente quitadas, saindo da tabela de faturas e entrando em uma tabela de arquivo-morto. Caso o nome do vendedor seja alterado, da mesma forma que o explicado para a tabela de bancos, a ação será espelhada na fatura, apesar de somente haver sido feita.alteração na tabela de vendedores.
"...e na hora de mostrar por exemplo, as contas bancarias de um cliente que podem variar de 1 a 10, 20, mil, sei lá... que controle utilizo, um grid que vai filtrar apenas as contas bancarias relacionadas com aquele cliente? e para fazer isso??? tem apostila de flexgrid no site??? pois eu só uso o DbGrid... (Dinossauro... eu sei... podem xingar...) ...."
Olha, o dbGrid é dinossauro, sim, mas não um dinossaurozinho qualquer como os Sherindan 3D. Trata-se de um excelente mecanismo de apresentação de dados, bastante customizável e totalmente editável. Um dinossauro "de peso". Para o uso com o DAO, é a melhor escolha (sem contar controles de terceiros como o TdBGrid ou o VSGrid, que só podem ser distribuidos com as devidas licenças, não tão baratas). Já com o ADO, os controles DataGrid, MSFlexGrid e MSHFlexGrid são as opções mais frequêntes. As capacidades mais interessantes do MSHFlexGrid dizem respeito á apresentação de dados hierárquica, ou seja, uma célula pode apresentar, por exemplo, a data de hoje e ser hierarquicamente dividida em várias linhas, cada qual com um vendedor diferente, que realizou alguma operação de venda no dia, e essa linha com o vendedor, por sua vez, pode ser subdividida em diversas outras linhas, cada qual com uma fatura diferente, emitidas no mesmo dia, pelo mesmo vendedor. Mas nem a MSFlexGrid nem a MSHFlexGrid são diretamente editáveis. Esta capacidade (edição) só se consegue com artifÃcios, que são apresentados, sim, aqui no site. Há, portanto, bom e farto material para sua "degustação" aqui presente.
"...que tipo de controle eu devo utilizar para mostrar todos os bairros cadastrados??..."
Você pode optar por controles DataCombo (ADO) / dbCombo (DAO), populando-os durante a carga do formulário, diretamente com as tabelas de suporte em questão. As propriedades RowSource (ligada ao recordset), ListField (ligada ao campo que deverá ser listado, como o nome do banco por exemplo) e BoundColumn (ligada ao campo com conteúdo á ser gravado, como 237 por exemplo) são as utilizadas para essa tarefa e o valor de retorno, quando devidamente selecionado, estará na propriedade BoundText dos controles. Ligando BoundColumn á um campo numérico unÃvoco, como um de Autonumeração, você irá obter os melhores resultados. Para saber se a escolha é inválida, verifique se a propriedade BoundText é Empty e em seguida, se é um valor numérico.
Outra dica que poucos adotam é evitar á todo custo o uso de DataControls ou adodcDatas, que fazem conexão direta e paralela com os serviços de dados. Eu peguei uma aplicação recentemente com poucas telas, que mantinha 4200 conexões diferentes simultà ¢neas ao serviço. O problema, quando me contataram, era que o servidor estava exaurido. Hoje, o número máximo de conexões simultà ¢neas caiu para 320, ou seja, duas por máquina e mesmo assim, porque eu ainda não terminei o trabalho.
O Renato cita:
"...No VB até tem ocx que faz a consulta para vc e tal, já vi, mas eu não uso, prefiro fazer tudo na mão mesmo...." - Preste muita atenção nessa dica, pois ela vale ouro.Tudo aquilo que você desenvolve, você controla, adapta, altera. Tudo o que você apenas usa, depende de outras empresas para melhorar e, muitas vezes, acaba sumindo do mercado, sem suporte nenhum. Ano passado acabou o suporte ao Microsoft Visual Basic for Dos 1.0, o que é um tempo bastante bom, desde 1987, mas várias linguagens e engines sumiram sem deixar vestÃgios nesse mesmo perÃodo, sem que os fabricantes desse maiores explicações.
E, respondendo sua outra questão, acho que não é ressaca, só. Assim que deu dia 31, eu praticamente "desmaiei", só acordei há pouco. Mas é cansaço, mesmo. E depois de amanhã é "dia de briga" novamente.
Valew?
Ao optar pelo MS-Access, que tem, sem dúvidas, suas vantagens, o mecanismo DAO permite, em uma só biblioteca, realizar todas as operações necessárias de acesso e manutenção de dados, coisa que a ADOX não faz sem o uso ao menos da ADOX. Além desse fator, a DAO apresenta invariavelmente resultandos de melhor desempenho, frente a ADO, pois trata-se de uma biblioteca especializada, focada ao MS-Access e demais engines Jet.
Ao projetar uma aplicação que utiliza a DAO, a mesma poderá utilizar-se de linguagem DDL da SQL para criar, alterar e manter os dados, bem como utilizar os objetos próprios da bilbioteca. Em ambos os casos, os resultados serão satisfatórios, portanto, se deseja "fechar questão" no MS-Access, os objetos DAO podem ser uma alternativa bastante interessante. Se, por outro lado, desejar manter compatibilidade com os demais engines, incluindo aqueles não abrangidos pela DAO, mesmo que não se utilize inicialmente da ADO, o passo mais importante será a familiaridade com a linguagem SQL, tanto no que tange a formação de consultas de tipos variados (consultas simples ou parametrizadas, de retorno ou de ação), quanto ao tópico de manutenção da base de dados e suas estruturas.
Com relação aos dados.
Normalmente se fornece apenas as informações mais usuais, abrindo as possibilidades de o cliente incluir as suas próprias informações. Isto varia em acordo com o modelo de projeto, ou seja, em se tratando de um sistema comercial fechado para qualquer empresa, fornecer dados mais amplos é interessante por reduzir o volume de trabalho na customização, mas em se tratando de desenvolvimento mais especÃfico, empresa á empresa, apenas os dados básicos são o mais conveniente, desde que o cliente seja suprido com mecanismos para moldar os dados ao seu modo.
Apesar de ser a idéia mais comum, a de ter a base de dados inicial já formada por todos os registros de tipos de logradouro e cidades, não considero como a melhor idéia. Explico: Como a aplicação será utilizada e por quem são pontos-chave nessa questão. Normalmente não há efetivo interesse de um cliente em manter tipos de logradouro pouco comuns, nem itens que não serão utilizados. Assim, havendo a abertura da composição de endereços, por exemplo, uma empresa de pequeno porte na cidade de São Paulo pode não se interessar por um cadastro com todas as cidades do estado, assim como uma empresa de médio porte pode solicitar cidades e códigos de endereçamento internacionais. Cada coisa têm seu lugar próprio. Se seu sistema não é um sistema especialista em B.I. em têrmos nacionais, adir nele uma série completa de tabelas com todos os códigos de ruas do paÃs só fará com que o mesmo ocupe mais espaço, sendo que o cliente nem sempre irá reconhecer o poder de tal ferramenta. Em minha opinião, o ideal é o estudo de caso, com a inclusão do básico para que o sistema possa evoluir em acordo com as necessidades do cliente, e não antes dele.
Para traçar um paralelo, a maioria dos clientes, ao receber um sistema bem completo e com dados já equacionados para um crescimento maior do que a empresa suspeita, a visão do cunjunto acaba passando a falsa idéia de uma complexidade maior e de uma operacionalidade difÃcil de manter. O sistema passa á ser subutilizado e suas potencialidades normalmente são nati-mortas.
é como abrir uma auto-escola com uma frota de Ferrari. Os alunos querem aprender a dirigir, não se darão ao trabalho de apreciar o veÃculo que estarão utilizando e, caso algum o faça, levará muito mais tempo para aprender. O melhor é ensinar com um bom carro popular, fazer o aluno passar por todas as agruras e apertos que o dia-á-dia trará e, somente quando o aluno sentir-se capaz, passar para um veÃculo mais "interessante".
Procure manter Ãndices simples unÃvocos como chave primária, ou seja, evite sempre que possÃvel o uso de chaves compostas.
Você cita:
"...ou seja: teriamos as tabelas TbTipoLogradouro, TbLogradouros, Tbbairros, TbCidades, TbUfs, TbBancos e etc que seriam usadas por todas as outras tabelas... é isso???..."
Sim, é essa a idéia. Uma só tabela com os dados de todos os bancos (por exemplo) e em cada tabela que utilize esses dados, apenas o campo de chave primária da tabela de bancos, ao invés de todos os demais dados, repetidamente.
Não há a necessidade de gerar relacionamentos explÃcitos via MS-Access, uma vez que você pode apenas relacionar as tabelas com as devidas instruções SQL necessárias e isso também poupa espaço e aumenta desempenho.
"...e assim que eu mudasse um dado de um vendedor, ele sairia alterando todos os registros em todas as tabelas por causa das relações??? (tipo, vendedor relaciona com clientes que relaciona com vendas que relaciona com fornecedor q relacina com financeiro, etc) ..."
Bem, este é um modo de trabalho que pode / deve ser ajustado por você. Por exemplo, em um primeiro nÃvel, se em sua tabela de Bancos um nome de banco for alterado, por estar vinculada á outras tabelas, não alterará absolutamente nada além disso, mas a alteração estará espelhada em todas as tabelas relacionadas. Em um segundo nÃvel, você pode ter um campo com o ID do vendedor e outro do cliente na tabela de faturas. Ao tentar excluir esse cliente ou esse vendedor, você pode fazer com que o engine não permita essa exclusão, senão quando as faturas vinculadas á eles estiverem completamente quitadas, saindo da tabela de faturas e entrando em uma tabela de arquivo-morto. Caso o nome do vendedor seja alterado, da mesma forma que o explicado para a tabela de bancos, a ação será espelhada na fatura, apesar de somente haver sido feita.alteração na tabela de vendedores.
"...e na hora de mostrar por exemplo, as contas bancarias de um cliente que podem variar de 1 a 10, 20, mil, sei lá... que controle utilizo, um grid que vai filtrar apenas as contas bancarias relacionadas com aquele cliente? e para fazer isso??? tem apostila de flexgrid no site??? pois eu só uso o DbGrid... (Dinossauro... eu sei... podem xingar...) ...."
Olha, o dbGrid é dinossauro, sim, mas não um dinossaurozinho qualquer como os Sherindan 3D. Trata-se de um excelente mecanismo de apresentação de dados, bastante customizável e totalmente editável. Um dinossauro "de peso". Para o uso com o DAO, é a melhor escolha (sem contar controles de terceiros como o TdBGrid ou o VSGrid, que só podem ser distribuidos com as devidas licenças, não tão baratas). Já com o ADO, os controles DataGrid, MSFlexGrid e MSHFlexGrid são as opções mais frequêntes. As capacidades mais interessantes do MSHFlexGrid dizem respeito á apresentação de dados hierárquica, ou seja, uma célula pode apresentar, por exemplo, a data de hoje e ser hierarquicamente dividida em várias linhas, cada qual com um vendedor diferente, que realizou alguma operação de venda no dia, e essa linha com o vendedor, por sua vez, pode ser subdividida em diversas outras linhas, cada qual com uma fatura diferente, emitidas no mesmo dia, pelo mesmo vendedor. Mas nem a MSFlexGrid nem a MSHFlexGrid são diretamente editáveis. Esta capacidade (edição) só se consegue com artifÃcios, que são apresentados, sim, aqui no site. Há, portanto, bom e farto material para sua "degustação" aqui presente.
"...que tipo de controle eu devo utilizar para mostrar todos os bairros cadastrados??..."
Você pode optar por controles DataCombo (ADO) / dbCombo (DAO), populando-os durante a carga do formulário, diretamente com as tabelas de suporte em questão. As propriedades RowSource (ligada ao recordset), ListField (ligada ao campo que deverá ser listado, como o nome do banco por exemplo) e BoundColumn (ligada ao campo com conteúdo á ser gravado, como 237 por exemplo) são as utilizadas para essa tarefa e o valor de retorno, quando devidamente selecionado, estará na propriedade BoundText dos controles. Ligando BoundColumn á um campo numérico unÃvoco, como um de Autonumeração, você irá obter os melhores resultados. Para saber se a escolha é inválida, verifique se a propriedade BoundText é Empty e em seguida, se é um valor numérico.
Outra dica que poucos adotam é evitar á todo custo o uso de DataControls ou adodcDatas, que fazem conexão direta e paralela com os serviços de dados. Eu peguei uma aplicação recentemente com poucas telas, que mantinha 4200 conexões diferentes simultà ¢neas ao serviço. O problema, quando me contataram, era que o servidor estava exaurido. Hoje, o número máximo de conexões simultà ¢neas caiu para 320, ou seja, duas por máquina e mesmo assim, porque eu ainda não terminei o trabalho.
O Renato cita:
"...No VB até tem ocx que faz a consulta para vc e tal, já vi, mas eu não uso, prefiro fazer tudo na mão mesmo...." - Preste muita atenção nessa dica, pois ela vale ouro.Tudo aquilo que você desenvolve, você controla, adapta, altera. Tudo o que você apenas usa, depende de outras empresas para melhorar e, muitas vezes, acaba sumindo do mercado, sem suporte nenhum. Ano passado acabou o suporte ao Microsoft Visual Basic for Dos 1.0, o que é um tempo bastante bom, desde 1987, mas várias linguagens e engines sumiram sem deixar vestÃgios nesse mesmo perÃodo, sem que os fabricantes desse maiores explicações.
E, respondendo sua outra questão, acho que não é ressaca, só. Assim que deu dia 31, eu praticamente "desmaiei", só acordei há pouco. Mas é cansaço, mesmo. E depois de amanhã é "dia de briga" novamente.
Valew?
Tópico encerrado , respostas não são mais permitidas