DUVIDA - ROTINA UPDATE

DANILODEIRO 22/08/2012 00:20:48
#408309
Olá Prezados(a),

estou quebrando minha cabeça para criar uma rotina de update para um form que contem o seguinte :

CODIGO = Cod_venda
VENDEDOR = Text_vendavendedor
CLIENTE = Text_vendacliente
PRODUTO = Text_produto1
Text_produto2
Text_produto3
Text_produto4
QUANTIDADE ENTREGUE = Text_QTAE1
Text_QTAE2
Text_QTAE3
Text_QTAE4

e estes dados são gravados na tabela [Ô]vendasprodutos[Ô] que contem as seguintes celulas:

cod_venda
vendedor
cliente
produto
quantidade_entregue
Por favor poderiam me ajudar ?
PROFESSOR 23/08/2012 23:46:18
#408500
Resposta escolhida
Mesmo ?
Veja, você não diz qual é o mecanismo de dados, quais são os tipos de dados de cada campo da tabela, quais os limites/tamanhos desses campos quando do tipo texto, se está sando DAO ou ADO ou RDO ou nada mais?
Hehehe, complica que eu gosto!

E ao que parece, você cometeu mais algumas [Ô]gafes[Ô] ao criar seu banco de dados.

Repare que seu cliente só poderá comprar até 4 itens á cada [Ô]venda[Ô], usando o mesmo [Ô]código de venda[Ô] para os três registros.
Além de ser limitado, isso indica que não há um campo de identidade de registro em sua tabela, o que é bastante inadequado.

O correto seria manter uma tabela para as notas/pedidos e outra, vinculada, só para os ítens, quantidades e valores, e ambas com PrimaryKey e preferencialmente auto-numeração, ok?

Mas vamos lá, ainda é possível (inadequado, mas á título de aprendizado, possível) fazer, então, mãos á obra:

Supondo que [Ô]vendedor[Ô], [Ô]cliente[Ô] e [Ô]produto[Ô] sejam do tipo Texto, até 255 caracteres, que cod_venda seja do Inteiro, e que quantidade_entregue seja do tipo Float ou Numeric, e ainda, que você esteja usando a ADO, com uma base SQL Server, você fará uma instrução mais ou menos como a seguinte:

...
Dim oConn As ADODB.Connection
Set oConn = New [ô]... ... ...
oConn.Open
...
[ô] Dimensionamento da instrução SQL
Dim minhaInstrução As String
[ô]Passo 1: Apagar os registros que tenham o código de venda especificado, pois não é possível atualizar apenas.
minhaInstrução = [Ô]DELETE FROM [vendasprodutos] WHERE (cod_venda=[Ô] & & [Ô]);[Ô]
oConn.Execute minhaInstrução
[ô]Passo 2: Inserir um registro com o código de vendas especificado, para o produto 1:
minhaInstrução = [Ô]INSERT INTO [vendasprodutos] (cod_venda,vendedor,cliente,produto,quantidade_entregue) SELECT [ô][Ô] & Cod_venda.Text & [Ô][ô] , [ô][Ô] & Text_vendavendedor.Text & [Ô][ô], [ô][Ô] & Text_vendacliente & [Ô][ô], [ô][Ô] & Text_produto1.Text & [Ô][ô], [Ô] & Text_QTAE1.Text & [Ô];[Ô]
oConn.Execute minhaInstrução
[ô]Passo 3: Inserir um registro com o código de vendas especificado, para o produto 2:
minhaInstrução = [Ô]INSERT INTO [vendasprodutos] (cod_venda,vendedor,cliente,produto,quantidade_entregue) SELECT [ô][Ô] & Cod_venda.Text & [Ô][ô] , [ô][Ô] & Text_vendavendedor.Text & [Ô][ô], [ô][Ô] & Text_vendacliente & [Ô][ô], [ô][Ô] & Text_produto2.Text & [Ô][ô], [Ô] & Text_QTAE2.Text & [Ô];[Ô]
oConn.Execute minhaInstrução
[ô]Passo 4: Inserir um registro com o código de vendas especificado, para o produto 3:
minhaInstrução = [Ô]INSERT INTO [vendasprodutos] (cod_venda,vendedor,cliente,produto,quantidade_entregue) SELECT [ô][Ô] & Cod_venda.Text & [Ô][ô] , [ô][Ô] & Text_vendavendedor.Text & [Ô][ô], [ô][Ô] & Text_vendacliente & [Ô][ô], [ô][Ô] & Text_produto3.Text & [Ô][ô], [Ô] & Text_QTAE3.Text & [Ô];[Ô]
oConn.Execute minhaInstrução
[ô]Passo 5: Inserir um registro com o código de vendas especificado, para o produto 4:
minhaInstrução = [Ô]INSERT INTO [vendasprodutos] (cod_venda,vendedor,cliente,produto,quantidade_entregue) SELECT [ô][Ô] & Cod_venda.Text & [Ô][ô] , [ô][Ô] & Text_vendavendedor.Text & [Ô][ô], [ô][Ô] & Text_vendacliente & [Ô][ô], [ô][Ô] & Text_produto4.Text & [Ô][ô], [Ô] & Text_QTAE4.Text & [Ô];[Ô]
oConn.Execute minhaInstrução
[ô]Operação finalizada.
MsgBox [Ô]Gravação efetuada com sucesso![Ô]
...


Observe que o código acima é apenas uma referência, um exercício mental, pois a primeira parte da tarefa, que é a elaboração da base de dados, está (bastante) incompleta.

Eu faria, apenas para iniciar um exercício simples de criação da base de dados, baseado na sua proposta, algo como:

USE [meuCatalogo] -- em lugar de [ô]meuCatalogo[ô], use o nome adequado.
GO

CREATE TABLE [Vendas] (cod_venda INT IDENTITY(1,1) NOT NULL, vendedor VARCHAR(255) NOT NULL DEFAULT [ô]-[ô], cliente VARCHAR(255) NOT NULL DEFAULT [ô]-[ô], CONSTRAINT pk_Vendas PRIMARY KEY(cod_venda))
GO

CREATE INDEX ix_VendasVendedor ON [Vendas] (vendedor)
GO

CREATE INDEX ix_VendasCliente ON [Vendas] (cliente)
GO

CREATE TABLE [VendasProdutos] (cod_item INT IDENTITY(1,1) NOT NULL, cod_venda INT NOT NULL DEFAULT 1,produto VARCHAR(255) NOT NULL DEFAULT [ô]-[ô], quantidade FLOAT NOT NULL DEFAULT 1, CONSTRAINT pk_VendasProdutos PRIMARY KEY(cod_item), CONSTRAINT fk_ProdutoDaVenda FOREIGN KEY(cod_venda) REFERENCES [Vendas](cod_venda) ON UPDATE NO ACTION ON DELETE CASCADE);
GO

CREATE UNIQUE INDEX uk_ProdutosProduto ON [VendasProdutos] (cod_venda,produto)
GO


Com isso, no mínimo:
1. - O cliente poderá efetuar cada compra com vários produtos;
2. - Será possível atualizar cada produto individualmente, sem o excluir da base de dados;
3. - Não será permitida a inclusão de um mesmo produto mais do que apenas uma vêz por compra;
4. - Será mais fácil gerar relatórios mais tarde.

é claro, essa estrutura acima ainda é [bastante] insuficiente para um uso menos [Ô]hobista[Ô], mas já dá para brincar um pouco.

Dê uma analisada nas tabelas resultantes para conferir / entender as diferências.

Valew!!
DANILODEIRO 24/08/2012 00:05:11
#408501
ave jesus é mesmo é que me formei no fundão .. esqueço de certas coisas mas é errando que se busca solução e ouvindo conselhos alheios que encontramos certas respostas !

então fiz em vba no excel !
realmente a quantidade de produtos é limitada.
a minha ideia era criar um botão com uma rotina update que alterra-se apenas lá na tabela vendasprodutos - a area de quantidade_entregue
para criar um campo update eu usei a rotina
BANCO.Execute [Ô]update [vendasprodutos$] set quantidade_entregue = [ô][Ô] & Me.Text_QTAE1 & [Ô][ô] where COD_VENDA = [ô][Ô] & Me.Text_codvenda & [Ô][ô][Ô]

porem, como sou muito do extremo iniciante em vba , não sei como continuar para por os outros [Ô]text_qtae2..3..4. e assim sucessivamente !
PROFESSOR 24/08/2012 03:20:33
#408511
Excel como base de dados.

Já melhorou bastante, hehehehe!

Agora cabe inclusive que eu peça desculpas, pois se eu houvesse me atentado mais detalhadamente, teria visto o têrmo [Ô]célula[Ô] bem colocado no texto.

Bom, agora mais bem colocado, e olhando por essa ótica, acredito que neste caso o que falta é um filtro na instrução SQL, que seria o filtro do produto. Desta forma, o [Ô]UPDATE[Ô] iria afetar a quantidade apenas da linha correta. E novamente, mediante 3 instruções [Ô]Execute[Ô] seguidas, variando-se apenas os TextBoxes. Algo como

BANCO.Execute [Ô]update [vendasprodutos$] set quantidade_entregue = [ô][Ô] & Me.Text_QTAE1 & [Ô][ô] where COD_VENDA = [ô][Ô] & Me.Text_codvenda & [Ô][ô] and produto=[ô][Ô] & Text_produto1 & [Ô][ô][Ô]
BANCO.Execute [Ô]update [vendasprodutos$] set quantidade_entregue = [ô][Ô] & Me.Text_QTAE2 & [Ô][ô] where COD_VENDA = [ô][Ô] & Me.Text_codvenda & [Ô][ô] and produto=[ô][Ô] & Text_produto2 & [Ô][ô][Ô]
BANCO.Execute [Ô]update [vendasprodutos$] set quantidade_entregue = [ô][Ô] & Me.Text_QTAE3 & [Ô][ô] where COD_VENDA = [ô][Ô] & Me.Text_codvenda & [Ô][ô] and produto=[ô][Ô] & Text_produto3 & [Ô][ô][Ô]


Ainda assim, estou bastante curioso com o desfecho.

Pretendo voltar ao seu tópico nesta segunda-feira, para acompanhar o andamento, para tentar ajudar no que der se não houver solucionado ainda, e já estou imaginando aqui, quem sabe, se não vou aprender mais uma novidade.


Valew!!!
DANILODEIRO 26/08/2012 19:40:53
#408681
caramba acordei pensando nisto que estava faltando um filtro apontando para algo que seria o produto só nao sabia como elabora
porem, Obrigado professor funcionou perfeitamente !
Realmente eu preciso muito aprender a cada dia mais uma vez me falaram que o access é sensacional porem, melhor lugar ara se aprender programação é no excel.
estou com uma outra duvida que é como criar uma api para o botão maximinizar e minimizar... já que o Visual Basic apresenta apenas o botão [Ô]x[Ô] de fechar
mas isto é em outro tópico para não bagunçar !
Muito obrigado professor, e obrigado a todos que leram. mas, não puderam responder !

eu estava pensando em usar também o
Cells(linha, 2) = ....
Cells(linha, 3) = ....
Cells(linha, 4) = ....

porem o filtro de instrução SQL apresentou uma melhor performance !
Tópico encerrado , respostas não são mais permitidas