TRANSAçõES USANDO VB6 E MARIADB

 Tópico anterior Próximo tópico Novo tópico

TRANSAçõES USANDO VB6 E MARIADB

VB / VBA

 Compartilhe  Compartilhe  Compartilhe
#495492 - 28/10/2020 08:57:05

JOAOARCOS
ARCOS
Cadast. em:Outubro/2020


Última edição em 28/10/2020 08:59:59 por JOAOARCOS

Bom dia pessoal, sou novato aqui no Forum, e procurando ajuda pelo google encontrei esse forum.

Estou implantando meu sistema em uma loja de auto peças, multiusuários, e de vez enquando, aparentemente, uma venda que é para um cliente x, aparece em outra venda.
queria saber quais as formas de tentar bloquear isso.
Procurei algumas informações sobre TRANSAÇÃO, mas não sei se isso é o correto e se vai resolver.

Estou usando esse metodo para conectar e editar os registros no banco

   'conexão com o banco
   Global ws As Workspace
   Global db As database

    ' abri o banco de dados MySQL
    Set ws = DBEngine.Workspaces(0)
    ' funcionando
    Set db = ws.OpenDatabase('MySQL', dbOpenDynaset, False, 'Driver={MySQL ODBC 3.51 Driver};Server=' & servidor & ';Database=' & banco & '; User=' & usuario & ';Password=' & senha & ';Option=3;')



      'Botão Salvar
     Set upVendas = db.OpenRecordset('SELECT * FROM tabvendas Where id = ' & id_nota & '')
  
      upVendas.Edit
    
        upVendas.Fields('Codigo_Cliente') = '' & txtCodigoCliente.Text
        upVendas.Fields('id_cliente') = id_cliente ' pega o id do cliente
        upVendas.Fields('Nome_Cliente') = '' & txtcliente.Text
    
     upVendas.update


   'botão Criar Venda
  Set tbvendas = db.OpenRecordset('SELECT * FROM tabVendas WHERE Codigo_Emitente = '' & codigo_emitente & '' ORDER BY codigo Asc')
  
   'Set tbVendas = db.OpenRecordset('select max(codigo) from tabvendas')

   If tbvendas.RecordCount > 0 Then
    tbvendas.MoveLast
    id = tbvendas.Fields('codigo') 'codigo
    id = id + 1
    lblNumeroPed.Caption = Format(Date, 'yyyy') & Format(codigo_emitente, '') & Format(id, '000000')
   Else
    lblNumeroPed.Caption = 1
    id = 1
    lblNumeroPed.Caption = Format(Date, 'yyyy') & Format(codigo_emitente, '') & Format(id, '000000')
   End If
  
    txtDataVencimento.Text = Date
    
    tbvendas.AddNew
      
      lblStatus.Caption = 'Nota Aberta'
      lblStatus.ForeColor = &H8000& 'verde
      
      txtdatahora.Text = Now

      tbvendas.Fields('Codigo_venda') = lblNumeroPed.Caption
      tbvendas.Fields('codigo') = CInt(id)
      tbvendas.Fields('Codigo_emitente') = codigo_emitente
      tbvendas.Fields('Data') = Date
      tbvendas.Fields('hora') = Time
      tbvendas.Fields('1_vencimento') = Date
      tbvendas.Fields('tipo_nota') = 1 'inicia a nota sempre como venda
      
    tbvendas.Update 'SALVA NOVO REGISTRO





#495493 - 28/10/2020 10:24:20

ALVAROVB2009
GUARULHOS
Cadast. em:Maio/2009


bom dia

Tem que rever a estrutura do seu banco, pois como o sistema é multiusuários e como vc disse que de vez enquando isso acontece , pode estar ocorrendo na criação da venda no banco
'botão Criar Venda
  Set tbvendas = db.OpenRecordset('SELECT * FROM tabVendas WHERE Codigo_Emitente = '' & codigo_emitente & '' ORDER BY codigo Asc')
  
   'Set tbVendas = db.OpenRecordset('select max(codigo) from tabvendas')

   If tbvendas.RecordCount > 0 Then
    tbvendas.MoveLast   <----- com essa ação existe a possibilidade de 2 ou mais usuários pegar o mesmo número de venda
    id = tbvendas.Fields('codigo') 'codigo
    id = id + 1
    lblNumeroPed.Caption = Format(Date, 'yyyy') & Format(codigo_emitente, '') & Format(id, '000000')
   Else
    lblNumeroPed.Caption = 1
    id = 1
    lblNumeroPed.Caption = Format(Date, 'yyyy') & Format(codigo_emitente, '') & Format(id, '000000')
   End If

O correto seria vc deixar o campo como autonumérico, com o comando
        Dim Rs2 As New ADODB.Recordset
        StrSql = 'select last_insert_id()'  <----  aqui vc pega o número que a estação do usuário gerou
        Rs2.Open StrSql, Db
        lblNumeroPed.Caption = Rs2.Fields(0) < --- aqui joga ela para o seu label

Dessa forma garante que não tem como pegarem o mesmo número

Isso é uma coisa que pode ser feita de imediato, que é o que vejo, se o seu banco estiver como automático o código dele, use o meu comando para pegar o número automaticamente, e não somar como vc esta fazendo, multiusuários não pode fazer isso


Teoria quando se sabe tudo, e nada funciona. Prtica e quando tudo funciona e ningum sabe porque.
[]Aquele que quer aprender gosta que lhe digam quando esta errado;
s o tolo no gosta de ser corrigido -[]Prov.12:1


#495498 - 28/10/2020 11:53:06

JOAOARCOS
ARCOS
Cadast. em:Outubro/2020


Última edição em 28/10/2020 12:00:57 por JOAOARCOS

na verdade eu tenho o campo ID(alto increment) e codigo(int,11)
eu faço a soma é só no campo codigo.

blz vou melhorar isso no meu codigo no botão criar nova venda.
Obrigado pela dica




#495507 - 28/10/2020 16:12:04

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Essa é uma das razões de eu usar GUID como Id's nos meus registros. Você não depende do banco de dados para ter um, você pode simplesmente gerar(a chance de duplicidade é de uma em 10^38, ou seja, uma chance em 1(seguido de 38 zeros), muito, mas muito baixa. Como os Id's são só mesmo para tornar os registros únicos e ligação entre pais e filhos, é bem seguro de usar.
Não uso VBA faz décadas, mas é possível gerar GUID nele também(com uso de API).
O fluxo é bem simples: Gero um GUID para o objeto pai e um para cada filho, em seguida coloco nos filhos o GUID do pai e só então gravo no banco. Desse jeito, garanto que cada registro é único e seus vínculos estão corretos e de quebra, não dependo do banco de dados pra isso.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495521 - 29/10/2020 11:51:37

JOAOARCOS
ARCOS
Cadast. em:Outubro/2020


Última edição em 29/10/2020 12:14:56 por JOAOARCOS

Citação:
:
Essa é uma das razões de eu usar GUID como Id's nos meus registros. Você não depende do banco de dados para ter um, você pode simplesmente gerar(a chance de duplicidade é de uma em 10^38, ou seja, uma chance em 1(seguido de 38 zeros), muito, mas muito baixa. Como os Id's são só mesmo para tornar os registros únicos e ligação entre pais e filhos, é bem seguro de usar.
Não uso VBA faz décadas, mas é possível gerar GUID nele também(com uso de API).
O fluxo é bem simples: Gero um GUID para o objeto pai e um para cada filho, em seguida coloco nos filhos o GUID do pai e só então gravo no banco. Desse jeito, garanto que cada registro é único e seus vínculos estão corretos e de quebra, não dependo do banco de dados pra isso.


Interessante, ai neste caso quando vc associa um cliente, vendedor, Itens, da Nota de venda, cada um fica gravado com o mesmo GUID criado, e faz o relacionamento entre essas tabelas pelo GUID?
achei no site do http://www.macoratti.net/d130402.htm uma rotina para criar GUID no VB6.

Uma outra duvida, no caso eu tenho uma tabela de vendas que contem os campos, data, hora, codigo, id_cliente, nome_cliente, valor_itens, Valor_serviços, valor venda.

entao fica assim o relacionamento

Tabela_Vendas          Tabela de Cadastro do Cliente(tabCliente)
id_cliente                   id

O ideal seria eu criar uma outra tabela auxiliar para fazer o relacionamento da tabela Vendas com a tabela Cliente ex:
assim eu poderia informar a mesma venda para dois ou mais cliente, ou seja em caso de sócios etc.

Tabela_Vendas            Tabela Vendas_cliente
Id_venda                     GUID
GUID
....




#495522 - 29/10/2020 15:50:31

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
1 - Só por ter data e hora separados já é um erro de design de dados, data e hora é uma coisa só
2 - Totalizadores são condicionais e são parte dos ítens. A soma desses valores pode ser dinâmica e não deve ser dados do cabeçalho das vendas, mas sim calculados

Venda, você precisa dos dados da venda em si: Id do cliente, data/hora... e os ítens sim, conteriam valores. Tipo id item, valor venda, tipo item(produto ou serviço) e etc. Essa separação deve ser muito bem arquitetada para não dar dores de cabeça no futuro.
A ligação entre venda e itens de venda, se dá por um campo relacional, tanto a venda quando o item, teriam seu próprio ID(GUID ou número, tanto faz) e em cada item de venda, teria um campo que consta qual venda ele pertence. No caso da identificação do cliente na venda, é o mesmo caso, a venda tem um campo que é o GUID do cliente.

Entenda que GUID não é nada especial, é simplesmente um identificador, por isso o nome GUID que quer dizer 'Global Unique IDentifier'

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495524 - 29/10/2020 16:30:07

MRSILVA
MARINGA
Cadast. em:Julho/2015


Última edição em 29/10/2020 16:32:03 por MRSILVA

Olá.
Kerplunk achei interessante utilizar o GUID como chave primaria, depois que vi seu poste pesquisei sobre o assunto e achei este artigo no endereço abaixo. Nos bancos de dados SQLSERVER você registra o GUID puro ou faz algum procedimento como explica no artigo?

https://www.codeproject.com/Articles/388157/GUIDs-as-fast-primary-keys-under-multiple-database

Desde já agradeço.




#495525 - 29/10/2020 17:34:08

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Não faço nada especial, simplesmente gera uma GUID e pronto. O desempenho é muito similar mesmo sem mudanças. GUID é indexável e tecnicamente é um valor numérico.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495526 - 29/10/2020 17:47:28

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
E nem é no banco de dados, uso Guid.NewGuid() mesmo.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495527 - 29/10/2020 17:53:01

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Aqui, tem um teste de performance comparando GUID e Int. Otimizando certinho, a performance é virtualmente idêntica.

_______________________________________________________________________
Virei Orculo!
The end is nigh, be ready for the nukes!


#495528 - 29/10/2020 17:56:29

MRSILVA
MARINGA
Cadast. em:Julho/2015


Última edição em 29/10/2020 17:59:25 por MRSILVA

Obrigado Kerpplunk.

Só mais uma dúvida (rsss) você armazena como string ou  manter como GUID mesmo?




 Tópico anterior Próximo tópico Novo tópico


Para responder este tópico o login é requerido
Se você já possui uma conta de usuário por favor faça seu login
Se você não possui uma conta de usuário use a opção Criar usuário