DELPHI x MYSQL - QUAL O MÉTODO CORRETO PARA TRABALHAR OS DADOS?

05/08/2016

0

Bom dia pessoal,

Estou com uma duvida, estava programando em delphi com base Firebird. Até então tudo bem, mas resolvi deixar de usar o firebird e passar a usar o MySQL por que vou fazer um sistema para acesso online e o MySQL tem um suporte melhor para web sem contar a velocidade, então veio o problema.

Com firebird usava os componentes da paleta Interbase, com MySQL passei a usar o nativo DBExpress.

Segue as duvidas.

1 - Qual a forma correta de inserir os dados de uma DBgrid na base? Fiz a ligação usando os componetes TSQLDataSet, DataSet Provider, ClienteDataSet e o DataSource.
Quando vou inserindo os dados na dbgrid assim que passo para segunda linha ele já da um erro de KeyViolation, o que quer dizer q eu violei a chave primaria colocando o mesmo valor. o Que eu queria era Fazer por exemplo uma compra, onde insiro todos os itens da compra na grid e depois posto de uma só vez na base. Como contornar esse problema?

2 - Como obter o valor do autoincremento antes de postar os dados? Na situação de uma Entrada de estoque por exemplo eu tenho a tabela ENTRADA e ITENSENTRADA,
quando eu posto algum item na tabela itens entrada eu preciso saber o valor da ENTRADA para colocar o numero dela na tabela ITENSENTRADA.
Casa

Casa

Responder

Posts

05/08/2016

Raimundo Pereira

Supomos Tabela entrada seja

TAB_ENTRADA
ID_ENTRADA= NÃO PODE SER AUTOINC. // Será informados números variados como NF-e, Recibos entre outros.
DATA



Supomos Tabela entrada seja
TAB_ENTRADA_ITENS

COD_PRODUTO
QTD
ID_ENTRADA_ITENS=TAB_ENTRADA.ID_ENTRADA //NÃO PODE SER AUTOINC.

Pois numa NF-e com o mesmo número você tem vários produtos

Espero que ajude
Responder

05/08/2016

Casa

Mas como eu vou saber qual numero utilizar na ID_ENTRADA? É um sistema que vai funcionar em rede, não posso fazer via programação e nem deixar por conta do usuario.

Se duas pessoas fizerem um cadastro de cliente ao mesmo tempo vai da erro de chave primaria.
Responder

05/08/2016

Raimundo Pereira

Minha resposta foi em relação a entrada;

2 - Como obter o valor do autoincremento antes de postar os dados? Na situação de uma Entrada de estoque por exemplo eu tenho a tabela ENTRADA e ITENSENTRADA,
quando eu posto algum item na tabela itens entrada eu preciso saber o valor da ENTRADA para colocar o numero dela na tabela ITENSENTRADA.



A questão abaixo já é cadastro de favorecido.

Onde existe N formas de barrar,

Geralmente o cadastro de clientes possui um campo como chave primária
Eu pessoalmente uso o campo DOCUMENTO qual armazena CPF E CNPJ no mesmo campo.

Antes de executar o comando de insert realizo verificações para verificar se o número do documento já existe na tabela

Mas como eu vou saber qual numero utilizar na ID_ENTRADA? É um sistema que vai funcionar em rede, não posso fazer via programação e nem deixar por conta do usuario.
Se duas pessoas fizerem um cadastro de cliente ao mesmo tempo vai da erro de chave primaria.


Você citou dois casos, entrada e cadastro de cliente.

Talvez não tenha compreendido direito o que realmente você está em duvida.
Responder

05/08/2016

Casa

O nome dos camos foi so pra exemplificar amigo...o que eu quero dizer é que preciso ter um campo de valor único que gere de forma automatica ou seja....auto incremento....mas eu preciso desde número antes de gravar no banco

Clientes tem numero de documentos únicos que posso usar mas uma entrada de mercadorias? Essas nao tem numeros...nota fiscal? Duas empresas podem emitir o mesmo número de nota...como fazer nesses casos?
Responder

05/08/2016

Raimundo Pereira

Para isso na sua tabela de entrada você colocaria os campos: ID_FORNECEDOR,NUMERO_ENTRADA,SERIE

ID_FORNECEDOR=30
NUMERO_ENTRADA=25
SERIE=0
Em uma nova entrada rodaria um select para verificar se existe no BD.

Sql.text:='select * from entrada where numero_entrada=25 and serie=0 and ID_FORNECEDOR=30

Então você cria a rotina para verificar se a consulta retorna dados caso não retorne você permite a gravação.
Responder

05/08/2016

Raimundo Pereira

Para isso na sua tabela de entrada você colocaria os campos: ID_FORNECEDOR,NUMERO_ENTRADA,SERIE

ID_FORNECEDOR=30
NUMERO_ENTRADA=25
SERIE=0
Em uma nova entrada rodaria um select para verificar se existe no BD.

Sql.text:=''select * from entrada where numero_entrada=25 and serie=0 and ID_FORNECEDOR=30

Então você cria a rotina para verificar se a consulta retorna dados caso não retorne você permite a gravação.
Responder

05/08/2016

Casa

E o usuario vai ter que ficar inventando codigo e testando pra v se da certo?
Responder

05/08/2016

Raimundo Pereira

E o usuario vai ter que ficar inventando codigo e testando pra v se da certo?

Esse código a qual você se refere seria no caso o ID_FORNECEDOR ?
Responder

05/08/2016

Casa

Não, esse codigo seria o numero da entrada. Imagina como se fosse uma venda, vc teria a tabela de venda e itens_venda...quando vc inicia a venda vc precisa do numero da venda para poder colocar na tabela itens_venda pra depois saver quais sao os itens da venda...
Responder

05/08/2016

Raimundo Pereira

Pronto, agora estamos falando de vendas ótimo.
Vou dizer como eu uso.

Tenho uma tabela TMP_VENDAS.
Nela tenho os campos

ID_VENDA auto inc.
FLAG_USADO = char

Meu button nova venda =

Gera um novo ID_VENDA = Resguardo o ID gerado e retornado para o edit, então na minha tabela venda_itens eu tenho também meu ID_VENDA que será informado
todas vez que eu passar um item referente a esta venda.

Se um novo usuário for realizar uma nova venda ele vai automaticamente ter um ID_VENDA diferente do meu
Responder

05/08/2016

Casa

Correto é exatamente isso que eu queria, só não sei como pegar o ID_VENDA com o auto_increment. a tabela do banco de dados já ta configurada e funcionando certinha.
Mas eu só consigo ter esse numero depois de postar os dados, eu não queria postar os dados antes pois se o usuário desisite de fazer a venda suja a tabela.

E ainda na minha primeira duvida, como faço pra inserir varias linhas no DBgrid, no caso ITENS_VENDA, ele tem uma chave primaria ID_ITENS_VENDA (Auto_inc). O que acontece é que quando eu coloco a segunda linha ele da erro KEY VIOLATION, configurei o SQLDataSET e o ClienteDataSet, no campo ID_ITENS_VENDA como REQUIRE = False;
Responder

05/08/2016

Raimundo Pereira

Add no skype, vou vê se posto um modelo.
raimundo.ti
rcp@outlook.com.br
Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar