CODIGO DE PRODUTO

RDR17 24/08/2009 17:12:45
#320842
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.
FOXMAN 24/08/2009 17:37:56
#320843
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.

RDR17 24/08/2009 17:51:08
#320845
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
FOXMAN 24/08/2009 19:32:32
#320847
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


LCSD 25/08/2009 08:40:07
#320868
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.
RDR17 25/08/2009 08:41:13
#320869
Muito obrigado Fox!!!

Valeu pela dica, vou escrever as tabelas e retorno com mais dúvidas.

Abraço.
RDR17 25/08/2009 08:50:29
#320871
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.

LCSD 25/08/2009 09:13:14
#320876
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....
FOXMAN 25/08/2009 13:50:12
#320917
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.
RDR17 27/08/2009 08:46:01
#321085
Fox, obrigado mesmo, vou fazer o teste e coloco o resultado aqui,

Brigado mesmo.....
Tópico encerrado , respostas não são mais permitidas