CODIGO DE PRODUTO
Olá pessoal estou retomand a minha atividade de programador e gostaria de ler as opiniões sobre os seguinte:
Vou desenvolver o cadastro de produtos onde o código código é formado:
99.99.9999
| | +--> Numero sequencial
| +-------> Sub-Grupo
+----------> Grupo
Estou pensando em criar uma tabela chamada Grupo e outra SubGrupo com campo que será incrementado a cada novo cadastro de produto.
Quero saber se esta pratica é boa para o banco de dados SQL? Pergunto isso porque é deste jeito que fazia no Clipper não conheço nenhuma outra técnica.
Obrigado a todos.
Vou desenvolver o cadastro de produtos onde o código código é formado:
99.99.9999
| | +--> Numero sequencial
| +-------> Sub-Grupo
+----------> Grupo
Estou pensando em criar uma tabela chamada Grupo e outra SubGrupo com campo que será incrementado a cada novo cadastro de produto.
Quero saber se esta pratica é boa para o banco de dados SQL? Pergunto isso porque é deste jeito que fazia no Clipper não conheço nenhuma outra técnica.
Obrigado a todos.
Ronaldo,
Eu vejo isso melhor para o próprio sistema doque para o banco(que na minha opnião não interfere muito em resultados de pesquisa ou acesso aos dados).
Já se faz naturalmente semelhante a isso, ou seja, um produto tem um grupo e um subgrupo, mas estes grupos e subgrupos não precisam estar necessariamente expostos no código do produto.
Se você tiver em seu cadastro de produto os campos Grupo e SubGrupo, poderá realizar uma busca com maior facilidade no banco utilizando esses critérios em separados.
Imagine uma select onde vc queria os produtos do GRUPO A e do SUBGRUPO B.
Select * from produtos where grupo = X and subgrupo = Y , seria algo assim.
Agora se vc desejar deixar essa informação já no codigo do produto teria um pouco mais de trabalho.
Eu vejo isso melhor para o próprio sistema doque para o banco(que na minha opnião não interfere muito em resultados de pesquisa ou acesso aos dados).
Já se faz naturalmente semelhante a isso, ou seja, um produto tem um grupo e um subgrupo, mas estes grupos e subgrupos não precisam estar necessariamente expostos no código do produto.
Se você tiver em seu cadastro de produto os campos Grupo e SubGrupo, poderá realizar uma busca com maior facilidade no banco utilizando esses critérios em separados.
Imagine uma select onde vc queria os produtos do GRUPO A e do SUBGRUPO B.
Select * from produtos where grupo = X and subgrupo = Y , seria algo assim.
Agora se vc desejar deixar essa informação já no codigo do produto teria um pouco mais de trabalho.
Ok! Entâo esta pratica poder ser aplicada.
Quanto ao grupo e subgrupo já tenho um cadastro com mais de 20.000 itens e devo importar com o codigo atual, mas posso fazer o select pelo inicio do codigo.
Agora incrementar um campo manualmente como devo travar o registro do banco para colocar o código correto? Não tenho certeza do comando que devo usar. No caso vou desenvolver em VB .Net
Quanto ao grupo e subgrupo já tenho um cadastro com mais de 20.000 itens e devo importar com o codigo atual, mas posso fazer o select pelo inicio do codigo.
Agora incrementar um campo manualmente como devo travar o registro do banco para colocar o código correto? Não tenho certeza do comando que devo usar. No caso vou desenvolver em VB .Net
Citação:RDR17 escreveu:
Ok! Entâo esta pratica poder ser aplicada.
Quanto ao grupo e subgrupo já tenho um cadastro com mais de 20.000 itens e devo importar com o codigo atual, mas posso fazer o select pelo inicio do codigo.
Agora incrementar um campo manualmente como devo travar o registro do banco para colocar o código correto? Não tenho certeza do comando que devo usar. No caso vou desenvolver em VB .Net
Depende muito do banco que vc irá utilizar, no caso do mysql , existe uma função chamada LAST_INSERT_ID(CAMPO+1) que retorna o proximo numero do campo.
Criei no banco uma tabela que gerencia todos os codigos do sistema, e no sistema criei uma função que gera o codigo . Ficou assim :
Public Function geracodigo(ByVal id As String) As String
Try
Dim ssql As String
ssql = [Ô]UPDATE sequencia SET [Ô] & id & [Ô]=LAST_INSERT_ID([Ô] & id & [Ô]+1);[Ô]
ExecSqlSemRetorno(ssql)
ssql = [Ô]SELECT [Ô] & id & [Ô] FROM SEQUENCIA[Ô]
geracodigo = ExecSql(ssql)
Return geracodigo
Catch ex As Exception
MsgBox(ex.Message & [Ô] - [Ô] & ex.StackTrace)
End Try
Return Nothing
End Function
Ronaldo, Bom Dia.
Os comandos a utilizar será do próprio SQL, e não do VB.NET.
VC pode fazer um processamento de importação dos registros da sua tabela PARADOX [Ô]aproveitando[Ô] todos os dados, inclusive o codigo.
Apos fazer a importação, para fazer um novo INSERT, faça antes um SELECT MAX (codigo) + 1 as cod from TABELA, e terá o último valor inserido na sua tabela + 1.
Os comandos a utilizar será do próprio SQL, e não do VB.NET.
VC pode fazer um processamento de importação dos registros da sua tabela PARADOX [Ô]aproveitando[Ô] todos os dados, inclusive o codigo.
Apos fazer a importação, para fazer um novo INSERT, faça antes um SELECT MAX (codigo) + 1 as cod from TABELA, e terá o último valor inserido na sua tabela + 1.
Muito obrigado Fox!!!
Valeu pela dica, vou escrever as tabelas e retorno com mais dúvidas.
Abraço.
Valeu pela dica, vou escrever as tabelas e retorno com mais dúvidas.
Abraço.
Bom dia LCSD! Quanto tempo! Precisamos combinar um dia para conversarmos!
Retornei ao projeto WUTZL, parece brincadeira mas não consigo ficar longe da programação.
Quanto ao comando acima vou testar junto com a dica do FOX, e volto a postar os resultados.
Um forte abraço Amigo.
Retornei ao projeto WUTZL, parece brincadeira mas não consigo ficar longe da programação.
Quanto ao comando acima vou testar junto com a dica do FOX, e volto a postar os resultados.
Um forte abraço Amigo.
Olá RONALDO........
Realmente, estou vendo que mesmo [Ô]tentando[Ô] (e por muito tempo) ficar longe da programação, VC não consegue se afastar mesmo hein!!!
SUCESSO neste retorno a área de programação, e precisamos sim, marcar alguma coisa para conversarmos e quem sabe, trocarmos [Ô]figurinha[Ô] sobre o projeto WUTZL (já que ainda me lembro um pouco do que VC's por aà sonham em fazer ainda, via sistema).
A vantagem é que HJ, minha [Ô]bagagem[Ô] é bem maior, do que a uns 6/7 anos atrás quando aà estive.
Um forte abraço amigo....
Realmente, estou vendo que mesmo [Ô]tentando[Ô] (e por muito tempo) ficar longe da programação, VC não consegue se afastar mesmo hein!!!
SUCESSO neste retorno a área de programação, e precisamos sim, marcar alguma coisa para conversarmos e quem sabe, trocarmos [Ô]figurinha[Ô] sobre o projeto WUTZL (já que ainda me lembro um pouco do que VC's por aà sonham em fazer ainda, via sistema).
A vantagem é que HJ, minha [Ô]bagagem[Ô] é bem maior, do que a uns 6/7 anos atrás quando aà estive.
Um forte abraço amigo....
Citação:RDR17 escreveu:
Muito obrigado Fox!!!
Valeu pela dica, vou escrever as tabelas e retorno com mais dúvidas.
Abraço.
OK.
Vou dar mais uma dica.
Considerando q vc tenha uma tabela para controlar os codigos de todos os cadastros, ela seria mais ou mentos assim :
'IdAbertura' int(11) DEFAULT NULL,
'IdVendas' int(11) DEFAULT NULL,
'IdCompras' int(11) DEFAULT NULL,
'idBalanco' int(11) DEFAULT NULL,
'IdProdutos' varchar(13) DEFAULT NULL,
'IdCliente' int(11) DEFAULT NULL,
'idCheques' int(10) unsigned DEFAULT NULL,
'idNf' int(11) DEFAULT NULL,
'idVendedor' int(11) DEFAULT NULL,
'idTransportador' int(11) DEFAULT NULL,
Todos os campos são do tipo inteiro e inicialmente terão de ter um valor = 0.
Nesta tabela não terá inclusão de dados, apenas atualização.
Abaixo segue as outras duas funções que vc poderá adaptar para qualquer finalidade no seu sistema
Função ExecSql retorna apenas um valor atraves do comando ExecuteScalar.
Public Function ExecSql(ByVal sql As String) As String
Try
System.Windows.Forms.Cursor.Current = New System.Windows.Forms.Cursor(My.Application.Info.DirectoryPath & [Ô]\sql.cur[Ô])
Dim dr As String
[ô]Verificando se existe uma conexão ativa, se houver eu destruo a conexão e inicio uma nova conexão, fiz isso para que um usuario tenha sempre uma unica conexão ativa por pc.
If IsNothing(Conexao) Then
Dim Conexao As New MySqlConnection(mStrConnectionString)
Conexao.Close()
Conexao.Dispose()
conectado = False
Con()
Else
Conexao.Close()
Conexao.Dispose()
conectado = False
Con()
End If
[ô]Como trabalho com transações utilizei essa condição para saber se era uma instrução de visualização(select) ou alteração(<> de Select)
If UCase(Mid(sql, 2, 6)) = UCase([Ô]Select[Ô]) Then
usatrans = False
Else
mytrans = Conexao.BeginTransaction
usatrans = True
End If
Dim objCommand = New MySqlCommand(sql, Con)
dr = objCommand.ExecuteScalar
System.Windows.Forms.Cursor.Current = Cursors.Default
If usatrans = True Then
mytrans.Commit()
usatrans = False
End If
Conexao.Close()
Conexao.Dispose()
Return dr
Catch ex As MySqlException
... Tratamento de erro
End Try
End Function
[ô]Função ExecSqlSemRetorno, executa uma instrução sql sem retorno de dados ou seja atualização, exclusão e inserção.
Public Function ExecSqlSemRetorno(ByVal sql As String) As Boolean
Try
System.Windows.Forms.Cursor.Current = New System.Windows.Forms.Cursor(My.Application.Info.DirectoryPath & [Ô]\sql.cur[Ô])
Dim dr As String
Conexao.Close()
Conexao.Dispose()
conectado = False
Con()
If UCase(Mid(sql, 2, 6)) = UCase([Ô]Select[Ô]) Then
usatrans = False
Else
mytrans = Conexao.BeginTransaction
usatrans = True
End If
Dim objCommand = New MySqlCommand(sql, Con)
dr = objCommand.ExecuteScalar
If usatrans = True Then
mytrans.Commit()
usatrans = False
End If
System.Windows.Forms.Cursor.Current = Cursors.Default
Conexao.Close()
Conexao.Dispose()
[ô]If dr = Nothing Then
[ô]Return False
[ô]Else
Return True
[ô]End If
Catch ex As MySqlException
.....Tratamento de erro.
End Try
End Function
O que vc precisa fazer agora eh migrar as funções para o tipo de banco de dados que vc esta utilizando.
Fox, obrigado mesmo, vou fazer o teste e coloco o resultado aqui,
Brigado mesmo.....
Brigado mesmo.....
Tópico encerrado , respostas não são mais permitidas